DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_REP_UTIL_PVT

Source


1 PACKAGE BODY OKC_REP_UTIL_PVT AS
2 /* $Header: OKCVREPUTILB.pls 120.30.12010000.2 2008/10/24 08:05:05 ssreekum ship $ */
3 
4 
5   ------------------------------------------------------------------------------
6   -- GLOBAL EXCEPTION
7   ------------------------------------------------------------------------------
8   E_Resource_Busy               EXCEPTION;
9   PRAGMA EXCEPTION_INIT(E_Resource_Busy, -00054);
10 
11   ---------------------------------------------------------------------------
12   -- GLOBAL CONSTANTS
13   ---------------------------------------------------------------------------
14 
15   G_RETURN_CODE_SUCCESS     CONSTANT NUMBER := 0;
16   G_RETURN_CODE_WARNING     CONSTANT NUMBER := 1;
17   G_RETURN_CODE_ERROR       CONSTANT NUMBER := 2;
18 
19 
20   ---------------------------------------------------------------------------
21   -- START: Procedures and Functions
22   ---------------------------------------------------------------------------
23   -- Start of comments
24   --API name      : check_contract_access_external
25   --Type          : Private.
26   --Function      : Checks access to a external contract by the current user.
27   --Pre-reqs      : None.
28   --Parameters    :
29   --IN            : p_api_version         IN NUMBER       Required
30   --              : p_init_msg_list       IN VARCHAR2     Required
31   --              : p_contract_id         IN NUMBER       Required
32   --                   Id of the contract to be checked
33   --              : p_contract_type       IN VARCHAR2       Required
34   --                   Type of the contract to be checked
35   --OUT           : x_has_access          OUT  VARCHAR2(1)
36   --              : x_return_status       OUT  VARCHAR2(1)
37   --              : x_msg_count           OUT  NUMBER
38   --              : x_msg_data            OUT  VARCHAR2(2000)
39   -- End of comments
40   PROCEDURE check_contract_access_external(
41     p_api_version     IN  NUMBER,
42     p_init_msg_list   IN VARCHAR2,
43     p_contract_id     IN  NUMBER,
44     p_contract_type   IN  VARCHAR2,
45     x_has_access      OUT NOCOPY  VARCHAR2,
46     x_msg_data        OUT NOCOPY  VARCHAR2,
47     x_msg_count       OUT NOCOPY  NUMBER,
48     x_return_status   OUT NOCOPY  VARCHAR2)
49   IS
50 
51   l_api_name VARCHAR2(30);
52   l_org_id  OKC_REP_CONTRACTS_ALL.ORG_ID%type;
53   l_result  VARCHAR2(1);
54 
55   CURSOR intents_csr(p_contract_type IN VARCHAR2) IS
56     SELECT NULL
57     FROM okc_bus_doc_types_b
58     WHERE document_type = p_contract_type
59     AND (INSTR( FND_PROFILE.VALUE('OKC_REP_INTENTS'), intent) <> 0
60         OR FND_PROFILE.VALUE('OKC_REP_INTENTS') IS NULL);
61 
62   CURSOR po_contract_csr(p_contract_id IN NUMBER, p_contract_type IN VARCHAR2) IS
63     SELECT
64       h.org_id
65     FROM
66       po_headers_all h
67       ,okc_template_usages t
68     WHERE  h.po_header_id = t.document_id
69     AND  t.document_type IN ('PA_BLANKET','PA_CONTRACT','PO_STANDARD')
70     AND  t.document_type = p_contract_type
71     AND  h.po_header_id = p_contract_id;
72 
73   CURSOR neg_contract_csr(p_contract_id IN NUMBER, p_contract_type IN VARCHAR2) IS
74     SELECT
75       h.org_id
76     FROM
77       pon_auction_headers_all h
78       ,okc_template_usages t
79     WHERE  h.auction_header_id = t.document_id
80     AND  t.document_type IN ('AUCTION','RFI','RFQ')
81     AND  t.document_type = p_contract_type
82     AND  h.auction_header_id = p_contract_id;
83 
84   CURSOR bsa_contract_csr(p_contract_id IN NUMBER, p_contract_type IN VARCHAR2) IS
85     SELECT
86       h.org_id
87     FROM
88       oe_blanket_headers_all h
89       ,okc_template_usages t
90     WHERE  h.header_id = t.document_id
91     AND  t.document_type = 'B'
92     AND  t.document_type = p_contract_type
93     AND  h.header_id = p_contract_id;
94 
95   CURSOR so_contract_csr(p_contract_id IN NUMBER, p_contract_type IN VARCHAR2) IS
96     SELECT
97       h.org_id
98     FROM
99       oe_order_headers_all h
100       ,okc_template_usages t
101     WHERE  h.header_id = t.document_id
102     AND  t.document_type = 'O'
103     AND  t.document_type = p_contract_type
104     AND  h.header_id = p_contract_id;
105 
106   CURSOR quote_contract_csr(p_contract_id IN NUMBER, p_contract_type IN VARCHAR2) IS
107     SELECT
108       h.org_id
109     FROM
110       aso_quote_headers_all h
111       ,okc_template_usages t
112     WHERE  h.quote_header_id = t.document_id
113     AND  t.document_type = 'QUOTE'
114     AND  t.document_type = p_contract_type
115     AND  h.quote_header_id = p_contract_id;
116 
117   CURSOR quote_security_csr(p_contract_id IN NUMBER) IS
118     SELECT
119       NULL
120     FROM
121       aso_quote_headers_all h
122     WHERE  h.quote_header_id = p_contract_id
123     AND  get_quote_access(
124       (SELECT s.resource_id
125       FROM jtf_rs_salesreps s
126       WHERE s.person_id = fnd_global.employee_id()),
127       h.quote_number) <> 'NONE';
128 
129   CURSOR mo_check_csr(p_org_id in number) IS
130      SELECT organization_id
131      FROM   mo_glob_org_access_tmp
132      WHERE  organization_id = p_org_id;
133 
134   BEGIN
135 
136     l_api_name  := 'check_contract_access_external';
137 
138     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
139       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
140                 '100: Entered OKC_REP_UTIL_PVT.check_contract_access');
141         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
142                 '101: Contract Id is: ' || to_char(p_contract_id));
143         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
144                 '102: Contract Type is: ' || p_contract_type);
145     END IF;
146     -- Initialize message list if p_init_msg_list is set to TRUE.
147     IF FND_API.to_Boolean( p_init_msg_list ) THEN
148       FND_MSG_PUB.initialize;
149     END IF;
150 
151     IF     (p_contract_type = 'PA_BLANKET')
152         OR (p_contract_type = 'PA_CONTRACT')
153         OR (p_contract_type = 'PO_STANDARD') THEN
154 
155       OPEN  po_contract_csr(p_contract_id, p_contract_type);
156       FETCH po_contract_csr  INTO  l_org_id;
157       CLOSE po_contract_csr;
158 
159     ELSIF  (p_contract_type = 'AUCTION')
160         OR (p_contract_type = 'RFI')
161         OR (p_contract_type = 'RFQ') THEN
162 
163       OPEN  neg_contract_csr(p_contract_id, p_contract_type);
164       FETCH neg_contract_csr  INTO  l_org_id;
165       CLOSE neg_contract_csr;
166 
167     ELSIF p_contract_type = 'B' THEN
168 
169       OPEN  bsa_contract_csr(p_contract_id, p_contract_type);
170       FETCH bsa_contract_csr  INTO  l_org_id;
171       CLOSE bsa_contract_csr;
172 
173     ELSIF p_contract_type = 'O' THEN
174 
175       OPEN  so_contract_csr(p_contract_id, p_contract_type);
176       FETCH so_contract_csr  INTO  l_org_id;
177       CLOSE so_contract_csr;
178 
179     ELSIF p_contract_type = 'QUOTE' THEN
180 
181       OPEN  quote_contract_csr(p_contract_id, p_contract_type);
182       FETCH quote_contract_csr  INTO  l_org_id;
183       CLOSE quote_contract_csr;
184 
185     END IF;
186 
187     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
188       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
189         'Values from contract_csr: l_org_id = ' || l_org_id );
190     END IF;
191 
192     x_return_status := FND_API.G_RET_STS_SUCCESS;
193     x_has_access := FND_API.G_FALSE;
194 
195     --  Call multi-org API to check access to contract's organization by current user
196     OPEN  mo_check_csr(l_org_id);
197     FETCH mo_check_csr INTO l_org_id;
198 
199     IF (mo_check_csr%FOUND) THEN
200       l_result := 'Y';
201     ELSE
202       l_result := 'N';
203     END IF;
204 
205     CLOSE mo_check_csr;
206 
207     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
208       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
209         'Values after mo_check_csr fetch: l_org_id = ' || l_org_id || ', from mo_check_csr%FOUND: l_result = ' || l_result);
210     END IF;
211 
212     IF (l_result = 'Y') THEN
213 
214       --  Check for allowed intents
215       OPEN  intents_csr(p_contract_type);
216       FETCH intents_csr INTO l_result;
217 
218       IF (intents_csr%FOUND) THEN
219         l_result := 'Y';
220       ELSE
221         l_result := 'N';
222       END IF;
223 
224       CLOSE intents_csr;
225 
226       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
227         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
228           'Values after intents_csr fetch: l_result = ' || l_result);
229       END IF;
230 
231       IF (l_result = 'Y') THEN
232 
233         x_has_access := FND_API.G_TRUE;
234 
235         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
236           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
237             'intents check passed');
238         END IF;
239 
240         IF p_contract_type = 'QUOTE' THEN
241 
242           OPEN  quote_security_csr(p_contract_id);
243           FETCH quote_security_csr  INTO  l_result;
244 
245           IF quote_security_csr%FOUND THEN
246             l_result := 'Y';
247           ELSE
248             l_result := 'N';
249           END IF;
250 
251           CLOSE quote_security_csr;
252 
253           IF l_result = 'Y' THEN
254 
255             x_has_access := FND_API.G_TRUE;
256 
257             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
258               FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
259                 'IF l_result = Y for quoting security');
260             END IF;
261           ELSE
262 
263             x_has_access := FND_API.G_FALSE;
264 
265             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
266               FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
267                 'IF l_result = N for quoting security');
268             END IF;
269           END IF;
270 
271         END IF;
272 
273       END IF; -- End of intent profile check
274 
275     END IF;  -- End of MO_GLOBAL check
276 
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,
279                      '110: Leaving OKC_REP_UTIL_PVT.check_contract_access');
280         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
281                 '111: x_has_access is: ' || x_has_access);
282         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
283                 '112: x_return_status is: ' || x_return_status);
284     END IF;
285 
286     EXCEPTION
287       WHEN FND_API.G_EXC_ERROR THEN
288         --close cursors
289         IF (intents_csr%ISOPEN) THEN
290           CLOSE intents_csr ;
291         END IF;
292         IF (po_contract_csr%ISOPEN) THEN
293           CLOSE po_contract_csr ;
294         END IF;
295         IF (neg_contract_csr%ISOPEN) THEN
296           CLOSE neg_contract_csr ;
297         END IF;
298         IF (bsa_contract_csr%ISOPEN) THEN
299           CLOSE bsa_contract_csr ;
300         END IF;
301         IF (so_contract_csr%ISOPEN) THEN
302           CLOSE so_contract_csr ;
303         END IF;
304         IF (quote_contract_csr%ISOPEN) THEN
305           CLOSE quote_contract_csr ;
306         END IF;
307         IF (quote_security_csr%ISOPEN) THEN
308           CLOSE quote_security_csr ;
309         END IF;
310         IF (mo_check_csr%ISOPEN) THEN
311           CLOSE mo_check_csr ;
312         END IF;
313 
314         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
315           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
316                  g_module || l_api_name || '.exception',
317                  '115: Leaving check_contract_access:FND_API.G_EXC_ERROR Exception');
318         END IF;
319         x_return_status := FND_API.G_RET_STS_ERROR;
320         FND_MSG_PUB.Count_And_Get(
321         p_count =>  x_msg_count,
322         p_data  =>  x_msg_data
323         );
324 
325       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
326         --close cursors
327         IF (intents_csr%ISOPEN) THEN
328           CLOSE intents_csr ;
329         END IF;
330         IF (po_contract_csr%ISOPEN) THEN
331           CLOSE po_contract_csr ;
332         END IF;
333         IF (neg_contract_csr%ISOPEN) THEN
334           CLOSE neg_contract_csr ;
335         END IF;
336         IF (bsa_contract_csr%ISOPEN) THEN
337           CLOSE bsa_contract_csr ;
338         END IF;
339         IF (so_contract_csr%ISOPEN) THEN
340           CLOSE so_contract_csr ;
341         END IF;
342         IF (quote_contract_csr%ISOPEN) THEN
343           CLOSE quote_contract_csr ;
344         END IF;
345         IF (quote_security_csr%ISOPEN) THEN
346           CLOSE quote_security_csr ;
347         END IF;
348         IF (mo_check_csr%ISOPEN) THEN
349           CLOSE mo_check_csr ;
350         END IF;
351 
352         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
353           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
354                  g_module || l_api_name || '.exception',
355                  '116:Leaving check_contract_access:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
356         END IF;
357         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
358         FND_MSG_PUB.Count_And_Get(
359         p_count =>  x_msg_count,
360         p_data  =>  x_msg_data
361         );
362 
363       WHEN OTHERS THEN
364         --close cursors
365         IF (intents_csr%ISOPEN) THEN
366           CLOSE intents_csr ;
367         END IF;
368         IF (po_contract_csr%ISOPEN) THEN
369           CLOSE po_contract_csr ;
370         END IF;
371         IF (neg_contract_csr%ISOPEN) THEN
372           CLOSE neg_contract_csr ;
373         END IF;
374         IF (bsa_contract_csr%ISOPEN) THEN
375           CLOSE bsa_contract_csr ;
376         END IF;
377         IF (so_contract_csr%ISOPEN) THEN
378           CLOSE so_contract_csr ;
379         END IF;
380         IF (quote_contract_csr%ISOPEN) THEN
381           CLOSE quote_contract_csr ;
382         END IF;
383         IF (quote_security_csr%ISOPEN) THEN
384           CLOSE quote_security_csr ;
385         END IF;
386         IF (mo_check_csr%ISOPEN) THEN
387           CLOSE mo_check_csr ;
388         END IF;
389 
390 
391         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
392           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
393                  g_module || l_api_name || '.exception',
394                  '117: Leaving check_contract_access because of EXCEPTION: ' || sqlerrm);
395         END IF;
396         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
397                             p_msg_name     => G_UNEXPECTED_ERROR,
398                             p_token1       => G_SQLCODE_TOKEN,
399                             p_token1_value => sqlcode,
400                             p_token2       => G_SQLERRM_TOKEN,
401                             p_token2_value => sqlerrm);
402         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
403         FND_MSG_PUB.Count_And_Get(
404         p_count =>  x_msg_count,
405         p_data  =>  x_msg_data
406         );
407   END check_contract_access_external;
408 
409   -- Start of comments
410   --API name      : check_contract_access
411   --Type          : Private.
412   --Function      : Checks access to a contract by the current user.
413   --Pre-reqs      : None.
414   --Parameters    :
415   --IN            : p_api_version         IN NUMBER       Required
416   --              : p_init_msg_list       IN VARCHAR2     Required
417   --              : p_contract_id         IN NUMBER       Required
418   --                   Id of the contract whose access to be checked
419   --              : p_function_name       IN VARCHAR2       Required
420   --                   Name of the function whose access to be checked. Possible values OKC_REP_SELECT, OKC_REP_UPDATE
421   --OUT           : x_has_access          OUT  VARCHAR2(1)
422   --              : x_return_status       OUT  VARCHAR2(1)
423   --              : x_msg_count           OUT  NUMBER
424   --              : x_msg_data            OUT  VARCHAR2(2000)
425   -- End of comments
426   PROCEDURE check_contract_access(
427     p_api_version     IN  NUMBER,
428     p_init_msg_list   IN VARCHAR2,
429     p_contract_id     IN  NUMBER,
430     p_function_name   IN  VARCHAR2,
431     x_has_access      OUT NOCOPY  VARCHAR2,
432     x_msg_data        OUT NOCOPY  VARCHAR2,
433     x_msg_count       OUT NOCOPY  NUMBER,
434     x_return_status   OUT NOCOPY  VARCHAR2)
435   IS
436 
437   l_api_name VARCHAR2(30);
438   l_org_id  OKC_REP_CONTRACTS_ALL.ORG_ID%type;
439   l_owner_id  OKC_REP_CONTRACTS_ALL.OWNER_ID%type;
440   l_contract_type  OKC_REP_CONTRACTS_ALL.CONTRACT_TYPE%type;
441   l_use_acl_flag OKC_REP_CONTRACTS_ALL.USE_ACL_FLAG%type;
442   l_result  VARCHAR2(1);
443   l_user_id FND_USER.USER_ID%type;
444   l_user_name FND_USER.USER_NAME%type;
445 
446   CURSOR intents_csr(p_contract_type IN VARCHAR2) IS
447     SELECT NULL
448     FROM okc_bus_doc_types_b
449     WHERE document_type = p_contract_type
450     AND   ((is_sales_workbench() = 'N'
451             AND (INSTR( FND_PROFILE.VALUE('OKC_REP_INTENTS'), intent) <> 0
452                  OR FND_PROFILE.VALUE('OKC_REP_INTENTS') IS NULL)
453            )
454         OR (is_sales_workbench() = 'Y'
455             AND intent IN ('S', 'O')
456            )
457           );
458 
459   CURSOR contract_csr(p_contract_id in number) IS
460      SELECT org_id,
461             owner_id,
462             use_acl_flag,
463             contract_type
464      FROM   okc_rep_contracts_all
465      WHERE  contract_id = p_contract_id;
466 
467   CURSOR grants_csr(p_contract_id1 in number, p_contract_id2 in number, p_grantee_key in FND_GRANTS.grantee_key%TYPE, p_grantee_orig_system in FND_GRANTS.grantee_orig_system%TYPE) IS
468     SELECT
469       NULL
470     FROM
471       jtf_rs_groups_denorm d
472       ,jtf_rs_group_members m
473       ,jtf_rs_resource_extns e
474       ,fnd_grants g
475       ,fnd_objects o
476     WHERE  d.parent_group_id = g.parameter2
477     AND TRUNC(SYSDATE)
478       BETWEEN d.start_date_active
479       AND NVL(d.end_date_active,TRUNC(SYSDATE))
480     and  d.group_id = m.group_id
481     and  m.delete_flag <> 'Y'
482     and  e.resource_id = m.resource_id
483     and  g.object_id = o.object_id
484     AND  o.obj_name = G_OBJECT_NAME
485     AND  g.grantee_type = G_FND_GRANTEE_TYPE_GROUP
486     AND  g.instance_pk1_value = p_contract_id1
487     AND  e.user_id = FND_GLOBAL.user_id()
488     AND  (
489          (g.parameter3 = G_FND_GRANTS_UPDATE_ACCESS AND p_function_name IN (G_SELECT_ACCESS_LEVEL, G_UPDATE_ACCESS_LEVEL))
490       OR (g.parameter3 = G_FND_GRANTS_VIEW_ACCESS   AND p_function_name  =  G_SELECT_ACCESS_LEVEL)
491     )
492      UNION ALL
493     SELECT
494           NULL
495     FROM
496        fnd_grants g
497       ,fnd_objects o
498     WHERE  g.object_id = o.object_id
499     AND  o.obj_name = G_OBJECT_NAME
500     AND  g.grantee_type = G_FND_GRANTEE_TYPE_USER
501     AND  g.instance_pk1_value = p_contract_id2
502     AND  (
503          (g.grantee_key = p_grantee_key AND (g.grantee_orig_system = p_grantee_orig_system OR g.grantee_orig_system = 'JRES_IND')) -- for R12 functionality
504       OR (g.grantee_key = FND_GLOBAL.user_name() AND g.grantee_orig_system = 'PER') -- for 11.5 backward compatibility
505          )
506     AND  (
507          (g.parameter3 = G_FND_GRANTS_UPDATE_ACCESS AND p_function_name IN (G_SELECT_ACCESS_LEVEL, G_UPDATE_ACCESS_LEVEL))
508       OR (g.parameter3 = G_FND_GRANTS_VIEW_ACCESS   AND p_function_name  =  G_SELECT_ACCESS_LEVEL)
509     );
510 
511   -- Cursor to get current user's JTF resource id
512   CURSOR cur_user_jtf_resource_csr IS
513     SELECT resource_id
514     FROM   jtf_rs_resource_extns
515     WHERE  user_id = FND_GLOBAL.user_id();
516 
517   l_resource_id JTF_RS_RESOURCE_EXTNS.resource_id%TYPE;
518   l_grantee_key FND_GRANTS.grantee_key%TYPE;
519   l_grantee_orig_system FND_GRANTS.grantee_orig_system%TYPE;
520   l_grantee_orig_system_id FND_GRANTS.grantee_orig_system_id%TYPE;
521 
522   BEGIN
523 
524     l_api_name  := 'check_contract_access';
525 
526     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
527       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
528                 '100: Entered OKC_REP_UTIL_PVT.check_contract_access');
529         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
530                 '101: Contract Id is: ' || to_char(p_contract_id));
531         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
532                 '102: Fucntion Name is: ' || p_function_name);
533     END IF;
534     -- Initialize message list if p_init_msg_list is set to TRUE.
535     IF FND_API.to_Boolean( p_init_msg_list ) THEN
536       FND_MSG_PUB.initialize;
537     END IF;
538 
539     OPEN  contract_csr(p_contract_id);
540     FETCH contract_csr  INTO  l_org_id, l_owner_id, l_use_acl_flag, l_contract_type;
541     CLOSE contract_csr;
542 
543     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
544       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
545         'Values from contract_csr: l_org_id = ' || l_org_id || ', l_owner_id = ' || l_owner_id || ',l_use_acl_flag = ' || l_use_acl_flag);
546       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
547         'Values : FND_GLOBAL.user_id() = ' || FND_GLOBAL.user_id() || ', FND_GLOBAL.user_name() = ' || FND_GLOBAL.user_name());
548     END IF;
549 
550     x_return_status := FND_API.G_RET_STS_SUCCESS;
551     x_has_access := FND_API.G_FALSE;
552 
553     IF ( p_function_name = G_UPDATE_ACCESS_LEVEL AND NOT( FND_FUNCTION.TEST(G_FUNC_OKC_REP_ADMINISTRATOR,'Y') OR FND_FUNCTION.TEST(G_FUNC_OKC_REP_USER_FUNC,'Y') ) ) THEN
554 
555       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
556         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
557           'returning FALSE, queried for UPDATE access, not an Admin, not a User, must be a Viewer');
558       END IF;
559 
560       x_return_status := FND_API.G_RET_STS_SUCCESS;
561       x_has_access := FND_API.G_FALSE;
562       RETURN;
563     END IF;
564 
565     -- Multi-Org Initialization
566     MO_GLOBAL.init(G_APP_NAME);
567 
568     --  Call multi-org API to check access to contract's organization by current user
569     l_result := MO_GLOBAL.check_access(p_org_id => l_org_id);
570 
571     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
572       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
573         'Values after calling MOAC API l_result = ' || l_result);
574     END IF;
575 
576     IF (l_result = 'Y') THEN
577 
578       --  Check for allowed intents
579       OPEN  intents_csr(l_contract_type);
580       FETCH intents_csr INTO l_result;
581 
582       IF (intents_csr%FOUND) THEN
583         l_result := 'Y';
584       ELSE
585         l_result := 'N';
586       END IF;
587 
588       CLOSE intents_csr;
589 
590       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
591         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
592           'Values after intents_csr fetch: l_result = ' || l_result);
593       END IF;
594 
595       IF (l_result = 'Y') THEN
596 
597         l_user_id := FND_GLOBAL.user_id();
598 
599         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
600           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
601             'Value from FND_GLOBAL.user_id() call: l_user_id = ' || l_user_id);
602         END IF;
603 
604         --   Check if the current user is owner of the contract
605         IF (l_user_id = l_owner_id) THEN
606           x_has_access := FND_API.G_TRUE;
607 
608           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
609             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
610               'IF (l_user_id = l_owner_id) THEN: TRUE: x_has_access = ' || x_has_access);
611           END IF;
612         ELSE
613 
614           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
615             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
616               'checking OKC_REP_ADMINISTRATOR function: ' || G_FUNC_OKC_REP_ADMINISTRATOR);
617           END IF;
618 
619           IF (FND_FUNCTION.TEST(G_FUNC_OKC_REP_ADMINISTRATOR,'Y')) THEN
620 
621             x_has_access := FND_API.G_TRUE;
622 
623             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
624               FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
625                 'IF (FND_FUNCTION.TEST(G_FUNC_OKC_REP_ADMINISTRATOR,''Y'')) THEN: TRUE: x_has_access = ' || x_has_access);
626             END IF;
627           ELSE
628 
629             -- Check if Use ACL flag is enabled for the current contract
630             IF (l_use_acl_flag = 'Y') THEN
631 
632               IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
633                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
634                   'IF (l_use_acl_flag = ''Y'') THEN: TRUE: x_has_access = ' || x_has_access);
635               END IF;
636 
637               -- Get current user's resource_id
638               OPEN cur_user_jtf_resource_csr;
639               FETCH cur_user_jtf_resource_csr INTO l_resource_id;
640               CLOSE cur_user_jtf_resource_csr;
641 
642               -- Get grantee key of the current resource
643               l_grantee_key := JTF_RS_WF_INTEGRATION_PUB.get_wf_role(l_resource_id);
644 
645               -- Get greantee orig system for the current grantee key
646               wf_directory.GetRoleOrigSysInfo(Role => l_grantee_key,
647                                               Orig_System => l_grantee_orig_system,
648                                               Orig_System_Id => l_grantee_orig_system_id);
649 
650               -- Check access of the current user in grants schema
651               OPEN  grants_csr(p_contract_id, p_contract_id, l_grantee_key, l_grantee_orig_system);
652               FETCH grants_csr INTO l_result;
653 
654               IF (grants_csr%FOUND) THEN
655                 x_has_access := FND_API.G_TRUE;
656 
657                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
658                   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
659                     'IF (grants_csr%FOUND) THEN: TRUE: x_has_access = ' || x_has_access);
660                 END IF;
661               ELSE
662                 x_has_access := FND_API.G_FALSE;
663 
664                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
665                   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
666                     'IF (grants_csr%FOUND) THEN: FALSE: x_has_access = ' || x_has_access);
667                 END IF;
668               END IF;
669 
670               CLOSE grants_csr;
671             ELSE
672               x_has_access := FND_API.G_TRUE;
673 
674               IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
675                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
676                   'IF (l_use_acl_flag = ''Y'') THEN: FALSE: x_has_access = ' || x_has_access);
677               END IF;
678             END IF; -- End of Use ACL flag check
679 
680           END IF; -- End of FND_FUNCTION.TEST() check
681 
682         END IF; -- End of owner id check
683 
684       END IF; -- End of intent profile check
685 
686     END IF;  -- End of MO_GLOBAL check
687 
688     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
689         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
690                      '110: Leaving OKC_REP_UTIL_PVT.check_contract_access');
691         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
692                 '111: x_has_access is: ' || x_has_access);
693         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
694                 '112: x_return_status is: ' || x_return_status);
695     END IF;
696 
697     EXCEPTION
698       WHEN FND_API.G_EXC_ERROR THEN
699         --close cursors
700         IF (intents_csr%ISOPEN) THEN
701           CLOSE intents_csr ;
702         END IF;
703         IF (contract_csr%ISOPEN) THEN
704           CLOSE contract_csr ;
705         END IF;
706         IF (grants_csr%ISOPEN) THEN
707           CLOSE grants_csr ;
708         END IF;
709 
710         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
711           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
712                  g_module || l_api_name || '.exception',
713                  '115: Leaving check_contract_access:FND_API.G_EXC_ERROR Exception');
714         END IF;
715         x_return_status := FND_API.G_RET_STS_ERROR;
716         FND_MSG_PUB.Count_And_Get(
717         p_count =>  x_msg_count,
718         p_data  =>  x_msg_data
719         );
720 
721       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
722         --close cursors
723         IF (intents_csr%ISOPEN) THEN
724           CLOSE intents_csr ;
725         END IF;
726         IF (contract_csr%ISOPEN) THEN
727           CLOSE contract_csr ;
728         END IF;
729         IF (grants_csr%ISOPEN) THEN
730           CLOSE grants_csr ;
731         END IF;
732 
733         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
734           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
735                  g_module || l_api_name || '.exception',
736                  '116:Leaving check_contract_access:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
737         END IF;
738         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
739         FND_MSG_PUB.Count_And_Get(
740         p_count =>  x_msg_count,
741         p_data  =>  x_msg_data
742         );
743 
744       WHEN OTHERS THEN
745         --close cursors
746         IF (intents_csr%ISOPEN) THEN
747           CLOSE intents_csr ;
748         END IF;
749         IF (contract_csr%ISOPEN) THEN
750           CLOSE contract_csr ;
751         END IF;
752         IF (grants_csr%ISOPEN) THEN
753           CLOSE grants_csr ;
754         END IF;
755 
756         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
757           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
758                  g_module || l_api_name || '.exception',
759                  '117: Leaving check_contract_access because of EXCEPTION: ' || sqlerrm);
760         END IF;
761         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
762                             p_msg_name     => G_UNEXPECTED_ERROR,
763                             p_token1       => G_SQLCODE_TOKEN,
764                             p_token1_value => sqlcode,
765                             p_token2       => G_SQLERRM_TOKEN,
766                             p_token2_value => sqlerrm);
767         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
768         FND_MSG_PUB.Count_And_Get(
769         p_count =>  x_msg_count,
770         p_data  =>  x_msg_data
771         );
772   END check_contract_access;
773 
774 
775 -- Start of comments
776   --API name      : Function has_contract_access_external
777   --Type          : Private.
778   --Function      : Checks access to a contract by the current user for external contracts.
779   --Pre-reqs      : None.
780   --Parameters    :
781   --IN            : p_contract_id         IN NUMBER       Required
782   --                   Id of the contract that is being checked
783   --              : p_contract_type       IN VARCHAR2       Required
784   --                   Contract type for contract being chacked
785   --OUT           : Return Y if the current user has access to the contracts, else returns N
786   -- End of comments
787   FUNCTION has_contract_access_external(
788       p_contract_id     IN  NUMBER,
789       p_contract_type   IN  VARCHAR2
790     ) RETURN VARCHAR2
791   IS
792     l_api_name                     VARCHAR2(30);
793     l_has_access                   VARCHAR2(1);
794     l_return_status                VARCHAR2(1);
795     l_msg_count                    NUMBER;
796     l_msg_data                     VARCHAR2(2000);
797 
798   BEGIN
799 
800     l_api_name                     := 'check_contract_access_external';
801     l_has_access                   := 'N';
802 
803     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
804         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
805                 'Entered Function OKC_REP_UTIL_PVT.check_contract_access');
806         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
807                 'Contract Id is: ' || p_contract_id);
808         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
809                 'Contract Type is: ' || p_contract_type);
810     END IF;
811     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
812         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
813                 'Calling OKC_REP_UTIL_PVT.has_contract_access');
814     END IF;
815     --- Call check_contract_access procedure.
816     check_contract_access_external(
817         p_api_version     => 1.0,
818         p_init_msg_list       => FND_API.G_FALSE,
819         p_contract_id         => p_contract_id,
820         p_contract_type       => p_contract_type,
821         x_has_access          => l_has_access,
822         x_msg_data            => l_msg_data,
823         x_msg_count           => l_msg_count,
824         x_return_status       => l_return_status
825     );
826     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
827         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
828                 'OKC_REP_UTIL_PVT.check_contract_access return status is: '
829           || l_return_status);
830         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
831                 'OKC_REP_UTIL_PVT.check_contract_access returns has_access as : '
832           || l_has_access);
833         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
834                 'Leaving Function has_contract_access');
835     END IF;
836     RETURN l_has_access ;
837 
838   EXCEPTION
839     WHEN OTHERS THEN
840       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
841         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
842                 'Leaving Function has_contract_access because of EXCEPTION: '||sqlerrm);
843       END IF;
844       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
845                         p_msg_name     => G_UNEXPECTED_ERROR,
846                         p_token1       => G_SQLCODE_TOKEN,
847                         p_token1_value => sqlcode,
848                         p_token2       => G_SQLERRM_TOKEN,
849                         p_token2_value => sqlerrm);
850       RETURN l_has_access ;
851   END has_contract_access_external;
852 
853 
854 
855 
856 -- Start of comments
857   --API name      : Function check_contract_access
858   --Type          : Private.
859   --Function      : Checks access to a contract by the current user.
860   --Pre-reqs      : None.
861   --Parameters    :
862   --IN            : p_api_version         IN NUMBER       Required
863   --              : p_init_msg_list       IN VARCHAR2     Optional
864   --                   Default = FND_API.G_FALSE
865   --              : p_contract_id         IN NUMBER       Required
866   --                   Id of the contract whose access to be checked
867   --              : p_function_name       IN VARCHAR2       Required
868   --                   Name of the function whose access to be checked. Possible values OKC_REP_SELECT, OKC_REP_UPDATE
869   --OUT           : Return Y if the current user has access to the contracts, else returns N
870   -- End of comments
871   FUNCTION has_contract_access(
872       p_contract_id     IN  NUMBER,
873       p_function_name   IN  VARCHAR2
874     ) RETURN VARCHAR2
875   IS
876     l_api_name                     VARCHAR2(30);
877     l_has_access                   VARCHAR2(1);
878     l_return_status                VARCHAR2(1);
879     l_msg_count                    NUMBER;
880     l_msg_data                     VARCHAR2(2000);
881 
882   BEGIN
883 
884     l_api_name                     := 'has_contract_access';
885     l_has_access                   := 'N';
886 
887     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
888         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
889                 'Entered Function OKC_REP_UTIL_PVT.check_contract_access');
890         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
891                 'Contract Id is: ' || p_contract_id);
892         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
893                 'Access Function Name is: ' || p_function_name);
894     END IF;
895     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
896         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
897                 'Calling OKC_REP_UTIL_PVT.has_contract_access');
898     END IF;
899     --- Call check_contract_access procedure.
900     check_contract_access(
901         p_api_version     => 1.0,
902         p_init_msg_list       => FND_API.G_FALSE,
903         p_contract_id         => p_contract_id,
904         p_function_name       => p_function_name,
905         x_has_access          => l_has_access,
906         x_msg_data            => l_msg_data,
907         x_msg_count           => l_msg_count,
908         x_return_status       => l_return_status
909     );
910     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
911         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
912                 'OKC_REP_UTIL_PVT.check_contract_access return status is: '
913           || l_return_status);
914         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
915                 'OKC_REP_UTIL_PVT.check_contract_access returns has_access as : '
916           || l_has_access);
917         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
918                 'Leaving Function has_contract_access');
919     END IF;
920     RETURN l_has_access ;
921 
922   EXCEPTION
923     WHEN OTHERS THEN
924       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
925         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
926                 'Leaving Function has_contract_access because of EXCEPTION: '||sqlerrm);
927       END IF;
928       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
929                         p_msg_name     => G_UNEXPECTED_ERROR,
930                         p_token1       => G_SQLCODE_TOKEN,
931                         p_token1_value => sqlcode,
932                         p_token2       => G_SQLERRM_TOKEN,
933                         p_token2_value => sqlerrm);
934       RETURN l_has_access ;
935   END has_contract_access;
936 
937 
938 
939   /**
940    * This procedure changes status of a contract and logs the user action that
941    * caused this into database tables OKC_REP_CON_STATUS_HIST.
942    * @param IN p_contract_id  Id of the contract whose status to be changed
943    * @param IN p_contract_version Version number of the contract whose status to be changed
944    * @param IN p_status_code New status code to be set on the contract
945    * @param IN p_user_id Id of the user who caused this change
946    * @param IN p_note User entered notes in the notification while approving or rejecting the contract
947    */
948   PROCEDURE change_contract_status(
949       p_api_version         IN  NUMBER,
950       p_init_msg_list   IN VARCHAR2,
951       p_contract_id         IN NUMBER,
952       p_contract_version    IN NUMBER,
953       p_status_code         IN VARCHAR2,
954       p_user_id             IN NUMBER:=NULL,
955       p_note                IN VARCHAR2:=NULL,
956     x_msg_data            OUT NOCOPY  VARCHAR2,
957       x_msg_count           OUT NOCOPY  NUMBER,
958       x_return_status       OUT NOCOPY  VARCHAR2)  IS
959 
960   l_api_name VARCHAR2(30);
961   l_user_id  FND_USER.USER_ID%type;
962 
963   BEGIN
964 
965     l_api_name := 'change_contract_status';
966 
967     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
968       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
969                 '200: Entered OKC_REP_UTIL_PVT.change_contract_status');
970         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
971                 '201: Contract Id is: ' || to_char(p_contract_id));
972         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
973                 '202: Contract version is: ' || p_contract_version);
974         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
975                 '203: Status code is: ' || p_status_code);
976         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
977                 '204: USer Id is: ' || to_char(p_user_id));
978         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
979                 '205: Note is: ' || p_note);
980     END IF;
981 
982     -- Initialize message list if p_init_msg_list is set to TRUE.
983     IF FND_API.to_Boolean( p_init_msg_list ) THEN
984       FND_MSG_PUB.initialize;
985     END IF;
986 
987     x_return_status := FND_API.G_RET_STS_SUCCESS;
988 
989 
990     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
991           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
992         g_module || l_api_name || '.begin',
993         'Before updating Contract Status');
994     END IF;
995 
996     -- Update the contract status
997     UPDATE  okc_rep_contracts_all
998     SET     contract_status_code = p_status_code,
999             contract_last_update_date = sysdate,
1000             contract_last_updated_by = FND_GLOBAL.user_id()
1001     WHERE   contract_id = p_contract_id
1002     AND     contract_version_num = p_contract_version;
1003 
1004     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1005           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1006         g_module || l_api_name,
1007         'After updating Contract Status');
1008     END IF;
1009 
1010     -- Log this status change into OKC_REP_CON_STATUS_HIST table
1011     IF (p_user_id IS NULL) THEN
1012       l_user_id := FND_GLOBAL.user_id();
1013 
1014       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1015           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1016         g_module || l_api_name || '.begin',
1017         'Current user id' || l_user_id);
1018       END IF;
1019 
1020     ELSE
1021       l_user_id := p_user_id;
1022     END IF;  -- End of p_user_id IS NULL
1023 
1024     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1025           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1026         g_module || l_api_name,
1027         'Before inserting a row into OKC_REP_CON_STATUS_HIST');
1028     END IF;
1029 
1030     -- Insert row into OKC_REP_CON_STATUS_HIST
1031     INSERT INTO OKC_REP_CON_STATUS_HIST(
1032         contract_id,
1033         contract_version_num,
1034         status_code,
1035         status_change_date,
1036         changed_by_user_id,
1037         object_version_number,
1038         created_by,
1039         creation_date,
1040         last_updated_by,
1041         last_update_date,
1042         last_update_login)
1043     VALUES(
1044         p_contract_id,
1045         p_contract_version,
1046         p_status_code,
1047         sysdate,
1048         l_user_id,
1049         1,
1050         l_user_id,
1051         sysdate,
1052         l_user_id,
1053         sysdate,
1054         l_user_id);
1055 
1056     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1057           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1058         g_module || l_api_name,
1059         'After inserting a row into OKC_REP_CON_STATUS_HIST');
1060     END IF;
1061     EXCEPTION
1062       WHEN FND_API.G_EXC_ERROR THEN
1063         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1064           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1065                  g_module || l_api_name || '.exception',
1066                  'Leaving change_contract_status:FND_API.G_EXC_ERROR Exception');
1067         END IF;
1068         x_return_status := FND_API.G_RET_STS_ERROR;
1069         FND_MSG_PUB.Count_And_Get(
1070         p_count =>  x_msg_count,
1071         p_data  =>  x_msg_data
1072         );
1073       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1074         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1075           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1076                  g_module || l_api_name || '.exception',
1077                  'Leaving change_contract_status: FND_API.G_EXC_UNEXPECTED_ERROR Exception');
1078         END IF;
1079         x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1080         FND_MSG_PUB.Count_And_Get(
1081         p_count =>  x_msg_count,
1082         p_data  =>  x_msg_data
1083         );
1084       WHEN OTHERS THEN
1085         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1086           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1087                  g_module || l_api_name || '.exception',
1088                  'Leaving change_contract_status because of EXCEPTION: ' || sqlerrm);
1089         END IF;
1090         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
1091                             p_msg_name     => G_UNEXPECTED_ERROR,
1092                             p_token1       => G_SQLCODE_TOKEN,
1093                             p_token1_value => sqlcode,
1094                             p_token2       => G_SQLERRM_TOKEN,
1095                             p_token2_value => sqlerrm);
1096         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1097         FND_MSG_PUB.Count_And_Get(
1098         p_count =>  x_msg_count,
1099         p_data  =>  x_msg_data
1100         );
1101   END change_contract_status;
1102 
1103 
1104 
1105   -- Start of comments
1106   --API name      : add_approval_hist_record
1107   --Type          : Private.
1108   --Function      : Inserts a record into table OKC_REP_CON_APPROVALS.
1109   --Pre-reqs      : None.
1110   --Parameters    :
1111   --IN            : p_api_version         IN NUMBER       Required
1112   --              : p_init_msg_list       IN VARCHAR2     Optional
1113   --                   Default = FND_API.G_FALSE
1114   --              : p_contract_id         IN NUMBER       Required
1115   --                   Contract ID of the approval history record
1116   --              : p_contract_version    IN VARCHAR2       Required
1117   --                   Contract version of the approval history record
1118   --              : p_action_code    IN OUT VARCHAR2       Optional
1119   --                   New action code to be set on the contract
1120   --              : p_user_id    IN VARCHAR2       Optional
1121   --                   Id of the user who caused this change
1122   --              : p_note    IN OUT VARCHAR2       Optional
1123   --                   User entered notes in the notification while approving or rejecting the contract
1124   --OUT           : x_return_status       OUT  VARCHAR2(1)
1125   --              : x_msg_count           OUT  NUMBER
1126   --              : x_msg_data            OUT  VARCHAR2(2000)
1127   -- End of comments
1128   PROCEDURE add_approval_hist_record(
1129       p_api_version         IN  NUMBER,
1130       p_init_msg_list   IN VARCHAR2,
1131       p_contract_id         IN NUMBER,
1132       p_contract_version    IN NUMBER,
1133       p_action_code         IN VARCHAR2,
1134       p_user_id             IN NUMBER:=NULL,
1135       p_note                IN VARCHAR2:=NULL,
1136     x_msg_data            OUT NOCOPY  VARCHAR2,
1137       x_msg_count           OUT NOCOPY  NUMBER,
1138       x_return_status       OUT NOCOPY  VARCHAR2)  IS
1139 
1140   l_api_name VARCHAR2(30);
1141   l_user_id  FND_USER.USER_ID%type;
1142 
1143   BEGIN
1144 
1145     l_api_name := 'add_approval_hist_record';
1146 
1147     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1148       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1149                 '300: Entered OKC_REP_UTIL_PVT.add_approval_hist_record');
1150         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1151                 '301: Contract Id is: ' || to_char(p_contract_id));
1152         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1153                 '302: Contract version is: ' || p_contract_version);
1154         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1155                 '303: Action code is: ' || p_action_code);
1156         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1157                 '304: USer Id is: ' || to_char(p_user_id));
1158         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1159                 '305: Note is: ' || p_note);
1160     END IF;
1161     -- Initialize message list if p_init_msg_list is set to TRUE.
1162     IF FND_API.to_Boolean( p_init_msg_list ) THEN
1163       FND_MSG_PUB.initialize;
1164     END IF;
1165 
1166     x_return_status := FND_API.G_RET_STS_SUCCESS;
1167 
1168     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1169           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1170         g_module || l_api_name,
1171         'Before inserting a row into OKC_REP_CON_APPROVALS');
1172     END IF;
1173 
1174      -- Insert a row into OKC_REP_CON_APPROVALS
1175       INSERT INTO OKC_REP_CON_APPROVALS(
1176           contract_id,
1177           contract_version_num,
1178           action_code,
1179           user_id,
1180           action_date,
1181           notes,
1182           object_version_number,
1183           created_by,
1184           creation_date,
1185           last_updated_by,
1186           last_update_date,
1187           last_update_login)
1188       VALUES(
1189           p_contract_id,
1190           p_contract_version,
1191           p_action_code,
1192           p_user_id,
1193           sysdate,
1194           p_note,
1195           1,
1196           p_user_id,
1197           sysdate,
1198           p_user_id,
1199           sysdate,
1200           p_user_id);
1201 
1202     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1203           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,
1204         g_module || l_api_name,
1205         'After inserting a row into OKC_REP_CON_APPROVALS');
1206     END IF;
1207     EXCEPTION
1208       WHEN FND_API.G_EXC_ERROR THEN
1209         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1210           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1211                  g_module || l_api_name || '.exception',
1212                  'Leaving add_approval_hist_record:FND_API.G_EXC_ERROR Exception');
1213         END IF;
1214         x_return_status := FND_API.G_RET_STS_ERROR;
1215         FND_MSG_PUB.Count_And_Get(
1216         p_count =>  x_msg_count,
1217         p_data  =>  x_msg_data
1218         );
1219       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1220         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1221           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1222                  g_module || l_api_name || '.exception',
1223                  'Leaving add_approval_hist_record: FND_API.G_EXC_UNEXPECTED_ERROR Exception');
1224         END IF;
1225         x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1226         FND_MSG_PUB.Count_And_Get(
1227         p_count =>  x_msg_count,
1228         p_data  =>  x_msg_data
1229         );
1230       WHEN OTHERS THEN
1231         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1232           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
1233                  g_module || l_api_name || '.exception',
1234                  'Leaving add_approval_hist_record because of EXCEPTION: ' || sqlerrm);
1235         END IF;
1236         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
1237                             p_msg_name     => G_UNEXPECTED_ERROR,
1238                             p_token1       => G_SQLCODE_TOKEN,
1239                             p_token1_value => sqlcode,
1240                             p_token2       => G_SQLERRM_TOKEN,
1241                             p_token2_value => sqlerrm);
1242         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1243         FND_MSG_PUB.Count_And_Get(
1244         p_count =>  x_msg_count,
1245         p_data  =>  x_msg_data
1246         );
1247   END add_approval_hist_record;
1248 
1249 
1250   -- Start of comments
1251   --API name      : validate_contract_party
1252   --Type          : Private.
1253   --Function      : Validates a contract party
1254   --Pre-reqs      : None.
1255   --Parameters    :
1256   --IN            : p_api_version         IN NUMBER       Required
1257   --              : p_init_msg_list       IN VARCHAR2     Optional
1258   --                   Default = FND_API.G_FALSE
1259   --              : p_contract_id         IN NUMBER       Required
1260   --                   Contract ID of the party to be validated
1261   --              : p_intent    IN VARCHAR2       Required
1262   --                   Intent of the contract
1263   --              : p_party_role_code    IN OUT VARCHAR2       Optional
1264   --                   Role code of the contract party to be validated
1265   --              : p_party_role_txt    IN VARCHAR2       Optional
1266   --                   Role name of the contract party to be validated
1267   --              : p_party_id    IN OUT NUMBER       Optional
1268   --                   Id of the contract party to be validated
1269   --              : p_party_name    IN VARCHAR2       Required
1270   --                   Name of the contract party to be validated
1271   --              : p_location_id    IN NUMBER       Optional
1272   --                   Id of the location of the contract party to be validated
1273   --              : p_mode    IN VARCHAR2       Required
1274   --                   Mode of the validation. Possible values 'IMPORT' or 'AUTHORING'
1275   --OUT           : x_valid_party_flag       OUT  VARCHAR2(1)
1276   --              : x_error_code          OUT  VARCHAR2(100)
1277   --                   Possible error codes are;
1278   --                     ROLE_NOT_EXIST - Party role doesn't exist (Import module)
1279   --                     INV_ROLE_INTENT - Party role and Contract intent combination is invalid (Import module)
1280   --                     PARTY_NOT_EXIST - Party doesn't exist (Import module)
1281   --                     INV_CUST_ACCT - Customer party doesn't have any customer accounts (Import module)
1282   --                     PARTY_NOT_UNIQUE - Party in not unique in the Contract (Import and Authoring modules)
1283   --                     INV_ROLE_PARTY - Role and Party combination is invalid (Authoring module)
1284   --                     INV_ROLE_LOCATION - Role and Party Location combination is invalid (Authoring module)
1285   --              : x_return_status       OUT  VARCHAR2(1)
1286   --              : x_msg_count           OUT  NUMBER
1287   --              : x_msg_data            OUT  VARCHAR2(2000)
1288   -- End of comments
1289 
1290   PROCEDURE validate_contract_party(
1291          p_api_version              IN NUMBER,
1292          p_init_msg_list            IN VARCHAR2,
1293          p_contract_id              IN NUMBER,
1294          p_intent                   IN VARCHAR2 DEFAULT NULL,
1295          p_party_role_code          IN OUT NOCOPY VARCHAR2,
1296          p_party_role_txt           IN VARCHAR2 DEFAULT NULL,
1297          p_party_id                 IN OUT NOCOPY NUMBER,
1298          p_party_name               IN VARCHAR2,
1299          p_location_id              IN NUMBER DEFAULT NULL,
1300          p_mode                     IN VARCHAR2,
1301          x_valid_party_flag         OUT NOCOPY VARCHAR2,
1302          x_error_code           OUT NOCOPY VARCHAR2,
1303          x_return_status            OUT NOCOPY VARCHAR2,
1304          x_msg_count                OUT NOCOPY NUMBER,
1305          x_msg_data                 OUT NOCOPY VARCHAR2)
1306   IS
1307   l_api_name VARCHAR2(30);
1308   l_api_version       CONSTANT NUMBER := 1.0;
1309   l_temp NUMBER;
1310   l_party_role_code2 VARCHAR2(30);
1311 
1312 
1313   CURSOR party_role_exist_csr IS
1314        SELECT  resp_party_code
1315        FROM    okc_resp_parties_tl
1316        WHERE   UPPER(name) = UPPER(p_party_role_txt)
1317        AND     language = USERENV('LANG')
1318        AND     document_type_class = 'REPOSITORY';
1319 
1320   CURSOR party_role_valid_csr IS
1321        SELECT  1
1322        FROM    okc_resp_parties_b
1323        WHERE   resp_party_code = p_party_role_code
1324        AND     intent = p_intent
1325        AND     document_type_class = 'REPOSITORY';
1326 
1327   CURSOR internal_party_exist_csr IS
1328        SELECT  organization_id
1329        FROM    hr_all_organization_units
1330        WHERE   UPPER(name) = UPPER(p_party_name);
1331 
1332   CURSOR tca_party_exist_csr IS
1333        SELECT  party_id
1334        FROM    hz_parties
1335        WHERE   UPPER(party_name) = UPPER(p_party_name)
1336        AND     party_type = 'ORGANIZATION';
1337 
1338   /*CURSOR vendor_exist_csr IS
1339        SELECT  vendor_id
1340        FROM    po_vendors
1341        WHERE   UPPER(vendor_name) = UPPER(p_party_name);*/
1342 
1343   CURSOR vendor_exist_csr IS
1344        SELECT  ap.vendor_id
1345        FROM    ap_suppliers ap,
1346             hz_parties hp
1347        WHERE ap.party_id = hp.party_id
1348     AND UPPER(hp.party_name) = UPPER(p_party_name);
1349 
1350   CURSOR rep_party_unique_csr(l_party_role_code2 varchar2) IS
1351        SELECT  1
1352        FROM    okc_rep_contract_parties
1353        WHERE   contract_id = p_contract_id
1354        AND     party_id = p_party_id
1355        AND     party_role_code IN (p_party_role_code, l_party_role_code2);
1356 
1357   CURSOR imp_party_unique_csr IS
1358        SELECT  1
1359        FROM    okc_rep_imp_parties_t
1360        WHERE   imp_contract_id = p_contract_id
1361        AND     party_id = p_party_id
1362        AND     party_role_code = p_party_role_code;
1363 
1364   CURSOR internal_party_and_role_csr IS
1365        SELECT  1
1366        FROM    hr_all_organization_units
1367        WHERE   UPPER(name) = UPPER(p_party_name)
1368        AND     organization_id = p_party_id;
1369 
1370   CURSOR tca_party_and_role_csr IS
1371        SELECT  1
1372        FROM    hz_parties
1373        WHERE   UPPER(party_name) = UPPER(p_party_name)
1374        AND     party_id = p_party_id;
1375 
1376   /*CURSOR vendor_and_role_csr IS
1377        SELECT  1
1378        FROM    po_vendors
1379        WHERE   UPPER(vendor_name) = UPPER(p_party_name)
1380        AND     vendor_id = p_party_id;  */
1381 
1382   CURSOR vendor_and_role_csr IS
1383        SELECT  1
1384        FROM    ap_suppliers ap,
1385                hz_parties hp
1386        WHERE   UPPER(hp.party_name) = UPPER(p_party_name)
1387        AND     hp.party_id = ap.party_id
1388        AND     ap.vendor_id = p_party_id;
1389 
1390   CURSOR tca_location_valid_csr IS
1391        SELECT  1
1392        FROM    hz_party_sites
1393        WHERE   party_id = p_party_id
1394        AND     party_site_id = p_location_id;
1395 
1396   CURSOR vendor_location_valid_csr IS
1397        SELECT  1
1398        FROM    po_vendor_sites_all
1399        WHERE   vendor_id = p_party_id
1400        AND     vendor_site_id = p_location_id;
1401 
1402   BEGIN
1403 
1404   l_api_name := 'validate_contract_party';
1405 
1406   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1407     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1408             'Entered OKC_REP_WF_PVT.validate_contract_party');
1409     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1410             'p_contract_id = ' || p_contract_id);
1411     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1412             'p_intent = ' || p_intent);
1413     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1414             'p_party_role_code = ' || p_party_role_code);
1415     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1416             'p_party_role_txt = ' || p_party_role_txt);
1417     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1418             'p_party_id = ' || p_party_id);
1419     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1420             'p_party_name = ' || p_party_name);
1421     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1422             'p_location_id = ' || p_location_id);
1423     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1424             'p_mode = ' || p_mode);
1425   END IF;
1426 
1427   -- Standard call to check for call compatibility.
1428   IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1429     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1430   END IF;
1431 
1432   -- Initialize message list if p_init_msg_list is set to TRUE.
1433   IF FND_API.to_Boolean( p_init_msg_list ) THEN
1434     FND_MSG_PUB.initialize;
1435   END IF;
1436 
1437   --  Initialize API return status to success
1438   x_return_status := FND_API.G_RET_STS_SUCCESS;
1439 
1440   x_valid_party_flag := 'Y';
1441 
1442   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1443     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1444             'Validating Contract Party for ' || p_mode || ' module');
1445   END IF;
1446 
1447   IF(p_mode = G_P_MODE_IMPORT) THEN
1448 
1449     -- Check existence of the party role
1450     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1451       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1452               'Checking existence of the party role');
1453     END IF;
1454 
1455     OPEN  party_role_exist_csr;
1456     FETCH party_role_exist_csr  INTO  p_party_role_code;
1457 
1458     IF party_role_exist_csr%NOTFOUND THEN
1459       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1460         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1461            'Party role not found');
1462       END IF;
1463 
1464       CLOSE party_role_exist_csr;
1465 
1466       x_valid_party_flag := 'N';
1467       x_error_code := 'ROLE_NOT_EXIST';
1468 
1469       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1470         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1471                 'x_valid_party_flag: ' || x_valid_party_flag);
1472         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1473                 'x_error_code: ' || x_error_code);
1474       END IF;
1475 
1476       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1477                                 p_data  =>  x_msg_data);
1478 
1479       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1480         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1481                 'Leaving OKC_REP_WF_PVT.validate_contract_party');
1482       END IF;
1483 
1484       return;
1485     END IF;
1486 
1487     CLOSE party_role_exist_csr;
1488 
1489     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1490       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1491          'Party Role found with code ' || p_party_role_code);
1492     END IF;
1493 
1494 
1495     -- Check validity of the party role and contract intent combination
1496     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1497       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1498          'Checking validity of the party role and contract intent combination');
1499     END IF;
1500 
1501     OPEN  party_role_valid_csr;
1502     FETCH party_role_valid_csr INTO l_temp;
1503 
1504     IF party_role_valid_csr%NOTFOUND THEN
1505       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1506         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1507            'Party role and contract intent combination is invalid');
1508       END IF;
1509 
1510       CLOSE party_role_valid_csr;
1511 
1512       x_valid_party_flag := 'N';
1513       x_error_code := 'INV_ROLE_INTENT';
1514 
1515       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1516         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1517                 'x_valid_party_flag: ' || x_valid_party_flag);
1518         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1519                 'x_error_code: ' || x_error_code);
1520       END IF;
1521 
1522       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1523                                 p_data  =>  x_msg_data);
1524 
1525       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1526         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1527                 'Leaving OKC_REP_WF_PVT.validate_contract_party');
1528       END IF;
1529 
1530       return;
1531     END IF;
1532 
1533     CLOSE party_role_valid_csr;
1534 
1535     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1536       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1537          'Party role and contract intent combination is valid');
1538     END IF;
1539 
1540     -- Check existence of the party
1541     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1542       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1543          'Checking existence of the party');
1544     END IF;
1545 
1546     IF (p_party_role_code = 'INTERNAL_ORG') THEN
1547 
1548       OPEN  internal_party_exist_csr;
1549       FETCH internal_party_exist_csr INTO p_party_id;
1550 
1551       IF internal_party_exist_csr%NOTFOUND THEN
1552         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1553           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1554              'Party not found');
1555         END IF;
1556 
1557         CLOSE internal_party_exist_csr;
1558 
1559         x_valid_party_flag := 'N';
1560         x_error_code := 'PARTY_NOT_EXIST';
1561 
1562         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1563           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1564                   'x_valid_party_flag: ' || x_valid_party_flag);
1565           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1566                   'x_error_code: ' || x_error_code);
1567         END IF;
1568 
1569         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1570                                   p_data  =>  x_msg_data);
1571 
1572         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1573           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1574                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1575         END IF;
1576 
1577         return;
1578       END IF;
1579 
1580       CLOSE internal_party_exist_csr;
1581 
1582     ELSIF (p_party_role_code = G_PARTY_ROLE_PARTNER OR
1583            p_party_role_code = G_PARTY_ROLE_CUSTOMER) THEN
1584 
1585       OPEN  tca_party_exist_csr;
1586       FETCH tca_party_exist_csr INTO p_party_id;
1587 
1588       IF tca_party_exist_csr%NOTFOUND THEN
1589         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1590           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1591              'Party not found');
1592         END IF;
1593 
1594         CLOSE tca_party_exist_csr;
1595 
1596         x_valid_party_flag := 'N';
1597         x_error_code := 'PARTY_NOT_EXIST';
1598 
1599         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1600           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1601                   'x_valid_party_flag: ' || x_valid_party_flag);
1602           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1603                   'x_error_code: ' || x_error_code);
1604         END IF;
1605 
1606         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1607                                   p_data  =>  x_msg_data);
1608 
1609         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1610           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1611                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1612         END IF;
1613 
1614         return;
1615       END IF;
1616 
1617       CLOSE tca_party_exist_csr;
1618 
1619     ELSIF (p_party_role_code = G_PARTY_ROLE_SUPPLIER) THEN
1620 
1621       OPEN  vendor_exist_csr;
1622       FETCH vendor_exist_csr INTO p_party_id;
1623 
1624       IF vendor_exist_csr%NOTFOUND THEN
1625         CLOSE vendor_exist_csr;
1626 
1627         x_valid_party_flag := 'N';
1628         x_error_code := 'PARTY_NOT_EXIST';
1629 
1630         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1631           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1632                   'x_valid_party_flag: ' || x_valid_party_flag);
1633           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1634                   'x_error_code: ' || x_error_code);
1635         END IF;
1636 
1637         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1638                                   p_data  =>  x_msg_data);
1639 
1640         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1641           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1642                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1643         END IF;
1644 
1645         return;
1646       END IF;
1647 
1648       CLOSE vendor_exist_csr;
1649 
1650     END IF;
1651 
1652     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1653       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1654          'Party found with id ' || p_party_id);
1655     END IF;
1656 
1657   END IF; -- End of p_mode = 'IMPORT'
1658 
1659 
1660   -- If p_mode = 'AUTHORING', then check uniqueness of the contract party in the repository table
1661   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1662     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1663             'Checking uniqueness of the party in contract');
1664   END IF;
1665 
1666   IF (p_mode = G_P_MODE_AUTHORING) THEN
1667 
1668     IF (p_party_role_code = G_PARTY_ROLE_PARTNER OR
1669         p_party_role_code = G_PARTY_ROLE_CUSTOMER) THEN
1670       l_party_role_code2 := G_PARTY_ROLE_CUSTOMER;
1671     END IF;
1672 
1673     OPEN  rep_party_unique_csr(l_party_role_code2);
1674     FETCH rep_party_unique_csr INTO l_temp;
1675 
1676     IF (rep_party_unique_csr%FOUND) THEN
1677 
1678       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1679         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1680                 'Party already exist in the contract');
1681       END IF;
1682 
1683       CLOSE rep_party_unique_csr;
1684 
1685       x_valid_party_flag := 'N';
1686       x_error_code := 'PARTY_NOT_UNIQUE';
1687 
1688       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1689         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1690                 'x_valid_party_flag: ' || x_valid_party_flag);
1691         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1692                 'x_error_code: ' || x_error_code);
1693       END IF;
1694 
1695       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1696                                 p_data  =>  x_msg_data);
1697 
1698       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1699         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1700                 'Leaving OKC_REP_WF_PVT.validate_contract_party');
1701       END IF;
1702 
1703       return;
1704     END IF;
1705 
1706     CLOSE rep_party_unique_csr;
1707 
1708   END IF;
1709 
1710   -- If p_mode = 'IMPORT', then check uniqueness of the contract party in the import table
1711   IF (p_mode = G_P_MODE_IMPORT) THEN
1712 
1713     OPEN  imp_party_unique_csr;
1714     FETCH imp_party_unique_csr INTO p_party_id;
1715 
1716     IF imp_party_unique_csr%FOUND THEN
1717 
1718       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1719         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1720                 'Party already exist in the contract');
1721       END IF;
1722 
1723       CLOSE imp_party_unique_csr;
1724 
1725       x_valid_party_flag := 'N';
1726       x_error_code := 'PARTY_NOT_UNIQUE';
1727 
1728       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1729         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1730                 'x_valid_party_flag: ' || x_valid_party_flag);
1731         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1732                 'x_error_code: ' || x_error_code);
1733       END IF;
1734 
1735       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1736                                 p_data  =>  x_msg_data);
1737 
1738       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1739         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1740                 'Leaving OKC_REP_WF_PVT.validate_contract_party');
1741       END IF;
1742 
1743       return;
1744     END IF;
1745 
1746     CLOSE imp_party_unique_csr;
1747 
1748   END IF;
1749 
1750   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1751     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1752             'Party is unique in the contract');
1753   END IF;
1754 
1755   IF (p_mode = G_P_MODE_AUTHORING) THEN
1756 
1757     -- Check validity of party role and party combination
1758     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1759       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1760               'Checking validity of party role and party combination');
1761     END IF;
1762 
1763     IF (p_party_role_code = G_PARTY_ROLE_INTERNAL) THEN
1764 
1765       OPEN  internal_party_and_role_csr;
1766       FETCH internal_party_and_role_csr INTO l_temp;
1767 
1768       IF internal_party_and_role_csr%NOTFOUND THEN
1769 
1770         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1771           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1772             'Party with id' || p_party_id || ' and name ' || p_party_name || 'not found in table HR_ALL_ORGANIZATION_UNITS');
1773         END IF;
1774 
1775         CLOSE internal_party_and_role_csr;
1776 
1777         x_valid_party_flag := 'N';
1778         x_error_code := 'INV_ROLE_PARTY';
1779 
1780         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1781           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1782                   'x_valid_party_flag: ' || x_valid_party_flag);
1783           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1784                   'x_error_code: ' || x_error_code);
1785         END IF;
1786 
1787         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1788                                   p_data  =>  x_msg_data);
1789 
1790         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1791           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1792                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1793         END IF;
1794 
1795         return;
1796       END IF;
1797 
1798       CLOSE internal_party_and_role_csr;
1799 
1800     ELSIF (p_party_role_code = G_PARTY_ROLE_PARTNER OR
1801            p_party_role_code = G_PARTY_ROLE_CUSTOMER) THEN
1802 
1803       OPEN  tca_party_and_role_csr;
1804       FETCH tca_party_and_role_csr INTO l_temp;
1805 
1806       IF tca_party_and_role_csr%NOTFOUND THEN
1807 
1808         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1809           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1810             'Party with id' || p_party_id || ' and name ' || p_party_name || 'not found in table HZ_PARTIES');
1811         END IF;
1812 
1813         CLOSE tca_party_and_role_csr;
1814 
1815         x_valid_party_flag := 'N';
1816         x_error_code := 'INV_ROLE_PARTY';
1817 
1818         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1819           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1820                   'x_valid_party_flag: ' || x_valid_party_flag);
1821           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1822                   'x_error_code: ' || x_error_code);
1823         END IF;
1824 
1825         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1826                                   p_data  =>  x_msg_data);
1827 
1828         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1829           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1830                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1831         END IF;
1832 
1833         return;
1834       END IF;
1835 
1836       CLOSE tca_party_and_role_csr;
1837 
1838     ELSIF (p_party_role_code = G_PARTY_ROLE_SUPPLIER) THEN
1839 
1840       OPEN  vendor_and_role_csr;
1841       FETCH vendor_and_role_csr INTO l_temp;
1842 
1843       IF vendor_and_role_csr%NOTFOUND THEN
1844 
1845         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1846           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1847             'Party with id' || p_party_id || ' and name ' || p_party_name || 'not found in table PO_VENDORS');
1848         END IF;
1849 
1850         CLOSE vendor_and_role_csr;
1851 
1852         x_valid_party_flag := 'N';
1853         x_error_code := 'INV_ROLE_PARTY';
1854 
1855         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1856           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1857                   'x_valid_party_flag: ' || x_valid_party_flag);
1858           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1859                   'x_error_code: ' || x_error_code);
1860         END IF;
1861 
1862         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1863                                   p_data  =>  x_msg_data);
1864 
1865         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1866           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1867                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1868         END IF;
1869 
1870         return;
1871       END IF;
1872 
1873       CLOSE vendor_and_role_csr;
1874 
1875     END IF;
1876 
1877     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1878       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1879               'Party role and party combination is valid');
1880     END IF;
1881 
1882     -- Check validity of party and location combination
1883     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1884           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1885              'Checking validity of party role and party address combination');
1886     END IF;
1887 
1888     -- Bug 4247146. Added null check for party location id as the Party
1889     -- Address/Site field in the Add party page became optional
1890     IF ((p_location_id IS NOT NULL) AND
1891         (p_party_role_code = G_PARTY_ROLE_PARTNER OR
1892          p_party_role_code = G_PARTY_ROLE_CUSTOMER)) THEN
1893 
1894       OPEN  tca_location_valid_csr;
1895       FETCH tca_location_valid_csr INTO l_temp;
1896 
1897       IF tca_location_valid_csr%NOTFOUND THEN
1898 
1899         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1900           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1901              'Party role and party address combination is invalid');
1902         END IF;
1903 
1904         CLOSE tca_location_valid_csr;
1905 
1906         x_valid_party_flag := 'N';
1907         x_error_code := 'INV_ROLE_LOCATION';
1908 
1909         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1910           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1911                   'x_valid_party_flag: ' || x_valid_party_flag);
1912           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1913                   'x_error_code: ' || x_error_code);
1914         END IF;
1915 
1916         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1917                                   p_data  =>  x_msg_data);
1918 
1919         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1920           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1921                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1922         END IF;
1923 
1924         return;
1925       END IF;
1926 
1927       CLOSE tca_location_valid_csr;
1928 
1929     ELSIF (p_location_id IS NOT NULL AND
1930            p_party_role_code = G_PARTY_ROLE_SUPPLIER) THEN
1931 
1932       OPEN  vendor_location_valid_csr;
1933       FETCH vendor_location_valid_csr INTO l_temp;
1934 
1935       IF vendor_location_valid_csr%NOTFOUND THEN
1936 
1937         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1938           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1939              'Party role and party address combination is invalid');
1940         END IF;
1941 
1942         CLOSE vendor_location_valid_csr;
1943 
1944         x_valid_party_flag := 'N';
1945         x_error_code := 'INV_ROLE_LOCATION';
1946 
1947         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1948           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1949                   'x_valid_party_flag: ' || x_valid_party_flag);
1950           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1951                   'x_error_code: ' || x_error_code);
1952         END IF;
1953 
1954         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
1955                                   p_data  =>  x_msg_data);
1956 
1957         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1958           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
1959                   'Leaving OKC_REP_WF_PVT.validate_contract_party');
1960         END IF;
1961 
1962         return;
1963       END IF;
1964 
1965       CLOSE vendor_location_valid_csr;
1966 
1967     END IF;
1968 
1969     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1970       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
1971          'Party role and party address combination is valid');
1972     END IF;
1973 
1974   END IF; -- End of p_mode = 'AUTHORING'
1975 
1976 
1977   EXCEPTION
1978 
1979     WHEN FND_API.G_EXC_ERROR THEN
1980 
1981       --close cursors
1982       IF (party_role_exist_csr%ISOPEN) THEN
1983         CLOSE party_role_exist_csr ;
1984       END IF;
1985       IF (party_role_valid_csr%ISOPEN) THEN
1986         CLOSE party_role_valid_csr ;
1987       END IF;
1988       IF (internal_party_exist_csr%ISOPEN) THEN
1989         CLOSE internal_party_exist_csr ;
1990       END IF;
1991       IF (tca_party_exist_csr%ISOPEN) THEN
1992         CLOSE tca_party_exist_csr ;
1993       END IF;
1994       IF (vendor_exist_csr%ISOPEN) THEN
1995         CLOSE vendor_exist_csr ;
1996       END IF;
1997       IF (rep_party_unique_csr%ISOPEN) THEN
1998         CLOSE rep_party_unique_csr ;
1999       END IF;
2000       IF (imp_party_unique_csr%ISOPEN) THEN
2001         CLOSE imp_party_unique_csr ;
2002       END IF;
2003       IF (internal_party_and_role_csr%ISOPEN) THEN
2004         CLOSE internal_party_and_role_csr ;
2005       END IF;
2006       IF (tca_party_and_role_csr%ISOPEN) THEN
2007         CLOSE tca_party_and_role_csr ;
2008       END IF;
2009       IF (vendor_and_role_csr%ISOPEN) THEN
2010         CLOSE vendor_and_role_csr ;
2011       END IF;
2012       IF (tca_location_valid_csr%ISOPEN) THEN
2013         CLOSE tca_location_valid_csr ;
2014       END IF;
2015       IF (vendor_location_valid_csr%ISOPEN) THEN
2016         CLOSE vendor_location_valid_csr ;
2017       END IF;
2018 
2019       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2020         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2021              'Leaving validate_contract_party:FND_API.G_EXC_ERROR Exception');
2022       END IF;
2023 
2024       x_return_status := FND_API.G_RET_STS_ERROR;
2025       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2026                                 p_data  =>  x_msg_data);
2027 
2028     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2029 
2030       --close cursors
2031       IF (party_role_exist_csr%ISOPEN) THEN
2032         CLOSE party_role_exist_csr ;
2033       END IF;
2034       IF (party_role_valid_csr%ISOPEN) THEN
2035         CLOSE party_role_valid_csr ;
2036       END IF;
2037       IF (internal_party_exist_csr%ISOPEN) THEN
2038         CLOSE internal_party_exist_csr ;
2039       END IF;
2040       IF (tca_party_exist_csr%ISOPEN) THEN
2041         CLOSE tca_party_exist_csr ;
2042       END IF;
2043       IF (vendor_exist_csr%ISOPEN) THEN
2044         CLOSE vendor_exist_csr ;
2045       END IF;
2046       IF (rep_party_unique_csr%ISOPEN) THEN
2047         CLOSE rep_party_unique_csr ;
2048       END IF;
2049       IF (imp_party_unique_csr%ISOPEN) THEN
2050         CLOSE imp_party_unique_csr ;
2051       END IF;
2052       IF (internal_party_and_role_csr%ISOPEN) THEN
2053         CLOSE internal_party_and_role_csr ;
2054       END IF;
2055       IF (tca_party_and_role_csr%ISOPEN) THEN
2056         CLOSE tca_party_and_role_csr ;
2057       END IF;
2058       IF (vendor_and_role_csr%ISOPEN) THEN
2059         CLOSE vendor_and_role_csr ;
2060       END IF;
2061       IF (tca_location_valid_csr%ISOPEN) THEN
2062         CLOSE tca_location_valid_csr ;
2063       END IF;
2064       IF (vendor_location_valid_csr%ISOPEN) THEN
2065         CLOSE vendor_location_valid_csr ;
2066       END IF;
2067 
2068       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2069         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2070              'Leaving validate_contract_party:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
2071       END IF;
2072 
2073       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
2074       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2075                                 p_data  =>  x_msg_data);
2076 
2077     WHEN OTHERS THEN
2078 
2079       --close cursors
2080       IF (party_role_exist_csr%ISOPEN) THEN
2081         CLOSE party_role_exist_csr ;
2082       END IF;
2083       IF (party_role_valid_csr%ISOPEN) THEN
2084         CLOSE party_role_valid_csr ;
2085       END IF;
2086       IF (internal_party_exist_csr%ISOPEN) THEN
2087         CLOSE internal_party_exist_csr ;
2088       END IF;
2089       IF (tca_party_exist_csr%ISOPEN) THEN
2090         CLOSE tca_party_exist_csr ;
2091       END IF;
2092       IF (vendor_exist_csr%ISOPEN) THEN
2093         CLOSE vendor_exist_csr ;
2094       END IF;
2095       IF (rep_party_unique_csr%ISOPEN) THEN
2096         CLOSE rep_party_unique_csr ;
2097       END IF;
2098       IF (imp_party_unique_csr%ISOPEN) THEN
2099         CLOSE imp_party_unique_csr ;
2100       END IF;
2101       IF (internal_party_and_role_csr%ISOPEN) THEN
2102         CLOSE internal_party_and_role_csr ;
2103       END IF;
2104       IF (tca_party_and_role_csr%ISOPEN) THEN
2105         CLOSE tca_party_and_role_csr ;
2106       END IF;
2107       IF (vendor_and_role_csr%ISOPEN) THEN
2108         CLOSE vendor_and_role_csr ;
2109       END IF;
2110       IF (tca_location_valid_csr%ISOPEN) THEN
2111         CLOSE tca_location_valid_csr ;
2112       END IF;
2113       IF (vendor_location_valid_csr%ISOPEN) THEN
2114         CLOSE vendor_location_valid_csr ;
2115       END IF;
2116 
2117       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2118         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2119              'Leaving validate_contract_party because of EXCEPTION: ' || sqlerrm);
2120       END IF;
2121 
2122       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
2123                          p_msg_name     => G_UNEXPECTED_ERROR,
2124                          p_token1       => G_SQLCODE_TOKEN,
2125                          p_token1_value => sqlcode,
2126                          p_token2       => G_SQLERRM_TOKEN,
2127                          p_token2_value => sqlerrm);
2128       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2129       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2130                                 p_data  =>  x_msg_data);
2131 
2132   END validate_contract_party;
2133 
2134 
2135   -- Start of comments
2136   --API name      : validate_party_contact
2137   --Type          : Private.
2138   --Function      : Validates a party contact
2139   --Pre-reqs      : None.
2140   --Parameters    :
2141   --IN            : p_api_version         IN NUMBER       Required
2142   --              : p_init_msg_list       IN VARCHAR2     Optional
2143   --                   Default = FND_API.G_FALSE
2144   --              : p_contract_id         IN NUMBER       Required
2145   --                   Contract ID of the party contact to be validated
2146   --              : p_party_role_code    IN VARCHAR2       Required
2147   --                   Role code of the party of the contact to be validated
2148   --              : p_party_id    IN    NUMBER       Required
2149   --                   Id of the contract party to be validated
2150   --              : p_contact_id    IN   NUMBER       Required
2151   --                   Id of the party contact to be validated
2152   --              : p_contact_name    IN   VARCHAR2       Required
2153   --                   Name of the party contact to be validated
2154   --              : p_contact_role_id    IN   NUMBER       Required
2155   --                   Id of the role of the party contact to be validated
2156   --OUT           : x_valid_contact_flag       OUT  VARCHAR2(1)
2157   --              : x_error_code          OUT  VARCHAR2(100)
2158   --                   Possible error codes are;
2159   --                     CONTACT_NOT_UNIQUE - Contact is not unique in the party
2160   --                     CONTACT_NOT_EXIST - Party and contact combination is invalid
2161   --              : x_return_status       OUT  VARCHAR2(1)
2162   --              : x_msg_count           OUT  NUMBER
2163   --              : x_msg_data            OUT  VARCHAR2(2000)
2164   -- End of comments
2165   PROCEDURE validate_party_contact(
2166        p_api_version              IN NUMBER,
2167        p_init_msg_list            IN VARCHAR2,
2168        p_contract_id              IN NUMBER,
2169        p_party_role_code          IN VARCHAR2,
2170        p_party_id                 IN NUMBER,
2171        p_contact_id               IN NUMBER,
2172        p_contact_name             IN VARCHAR2,
2173        p_contact_role_id          IN NUMBER,
2174        x_valid_contact_flag       OUT NOCOPY VARCHAR2,
2175        x_error_code               OUT NOCOPY VARCHAR2,
2176        x_return_status            OUT NOCOPY VARCHAR2,
2177        x_msg_count                OUT NOCOPY NUMBER,
2178        x_msg_data                 OUT NOCOPY VARCHAR2)
2179   IS
2180     l_api_name VARCHAR2(30);
2181     l_api_version       CONSTANT NUMBER := 1.0;
2182     l_temp NUMBER;
2183 
2184 
2185     CURSOR contact_unique_csr IS
2186           SELECT  1
2187           FROM    okc_rep_party_contacts
2188           WHERE   contract_id = p_contract_id
2189           AND     party_id = p_party_id
2190           AND     party_role_code = p_party_role_code
2191           AND     contact_id = p_contact_id
2192           AND     contact_role_id = p_contact_role_id;
2193 
2194 -- Bug 6598261.Changed per_all_workforce_v to per_workforce_v.
2195 
2196     CURSOR internal_party_contact_csr IS
2197           SELECT  1
2198           FROM    per_workforce_v
2199           WHERE   person_id = p_contact_id
2200           AND     full_name = p_contact_name;
2201 
2202     CURSOR tca_party_contact_csr IS
2203           SELECT  1
2204           FROM    hz_relationships  hr,
2205                   hz_parties  hz,
2206                   hz_parties  hz1
2207           WHERE   hr.party_id = p_contact_id
2208           AND     hr.subject_type = 'PERSON'
2209           AND     hr.object_type = 'ORGANIZATION'
2210           AND     hr.object_table_name = 'HZ_PARTIES'
2211           AND     hr.object_id = p_party_id
2212           AND     hr.relationship_code = 'CONTACT_OF'
2213           AND     hz.party_id = p_contact_id
2214           AND     hz1.party_id = hr.subject_id
2215           AND     hz1.party_name = p_contact_name;
2216 
2217     CURSOR vendor_party_contact_csr IS
2218           SELECT   1
2219           FROM     po_vendor_contacts   pvc,
2220                    Po_vendor_sites_all    pvs
2221           WHERE    pvs.vendor_id = p_party_id
2222           AND      pvc.vendor_site_id = pvs.vendor_site_id
2223           AND      pvc.vendor_contact_id = p_contact_id;
2224 
2225 
2226   BEGIN
2227 
2228     l_api_name := 'validate_party_contact';
2229 
2230     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2231       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2232               'Entered OKC_REP_WF_PVT.validate_party_contact');
2233       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2234               'p_contract_id = ' || p_contract_id);
2235       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2236               'p_party_role_code = ' || p_party_role_code);
2237       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2238               'p_party_id = ' || p_party_id);
2239       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2240               'p_contact_id = ' || p_contact_id);
2241       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2242               'p_contact_name = ' || p_contact_name);
2243       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2244               'p_contact_role_id = ' || p_contact_role_id);
2245     END IF;
2246 
2247     -- Standard call to check for call compatibility.
2248     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2249       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2250     END IF;
2251 
2252     -- Initialize message list if p_init_msg_list is set to TRUE.
2253     IF FND_API.to_Boolean( p_init_msg_list ) THEN
2254       FND_MSG_PUB.initialize;
2255     END IF;
2256 
2257     --  Initialize API return status to success
2258     x_return_status := FND_API.G_RET_STS_SUCCESS;
2259 
2260     x_valid_contact_flag := 'Y';
2261 
2262     -- Check uniqueness of the party contact
2263     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2264       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2265               'Checking uniqueness of the party contact');
2266     END IF;
2267 
2268     OPEN  contact_unique_csr;
2269     FETCH contact_unique_csr INTO l_temp;
2270 
2271     IF (contact_unique_csr%FOUND) THEN
2272 
2273       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2274         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2275                 'Contact already exist in the party');
2276       END IF;
2277 
2278       CLOSE contact_unique_csr;
2279 
2280       x_valid_contact_flag := 'N';
2281       x_error_code := 'CONTACT_NOT_UNIQUE';
2282 
2283       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2284         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2285                 'x_valid_contact_flag: ' || x_valid_contact_flag);
2286         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2287                 'x_error_code: ' || x_error_code);
2288       END IF;
2289 
2290       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2291                                 p_data  =>  x_msg_data);
2292 
2293       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2294         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2295                 'Leaving OKC_REP_WF_PVT.validate_party_contact');
2296       END IF;
2297 
2298       return;
2299 
2300     END IF;
2301 
2302     CLOSE contact_unique_csr;
2303 
2304 
2305 
2306     -- Check validity of party and contact combination
2307     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2308       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2309               'Checking validity of party and contact combination');
2310     END IF;
2311 
2312     IF (p_party_role_code = G_PARTY_ROLE_INTERNAL) THEN
2313 
2314       OPEN  internal_party_contact_csr;
2315       FETCH internal_party_contact_csr INTO l_temp;
2316 
2317       IF (internal_party_contact_csr%NOTFOUND) THEN
2318 
2319         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2320           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2321                   'Combination of party and contact is invalid');
2322         END IF;
2323 
2324         CLOSE internal_party_contact_csr;
2325 
2326         x_valid_contact_flag := 'N';
2327         x_error_code := 'CONTACT_NOT_EXIST';
2328 
2329         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2330           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2331                   'x_valid_contact_flag: ' || x_valid_contact_flag);
2332           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2333                   'x_error_code: ' || x_error_code);
2334         END IF;
2335 
2336         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2337                                   p_data  =>  x_msg_data);
2338 
2339         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2340           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2341                   'Leaving OKC_REP_WF_PVT.validate_party_contact');
2342         END IF;
2343 
2344         return;
2345 
2346       END IF;
2347 
2348       CLOSE internal_party_contact_csr;
2349 
2350     ELSIF (p_party_role_code = G_PARTY_ROLE_PARTNER OR
2351            p_party_role_code = G_PARTY_ROLE_CUSTOMER) THEN
2352 
2353       OPEN  tca_party_contact_csr;
2354       FETCH tca_party_contact_csr INTO l_temp;
2355 
2356       IF (tca_party_contact_csr%NOTFOUND) THEN
2357 
2358         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2359           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2360                   'Combination of party and contact is invalid');
2361         END IF;
2362 
2363         CLOSE tca_party_contact_csr;
2364 
2365         x_valid_contact_flag := 'N';
2366         x_error_code := 'CONTACT_NOT_EXIST';
2367 
2368         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2369           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2370                   'x_valid_contact_flag: ' || x_valid_contact_flag);
2371           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2372                   'x_error_code: ' || x_error_code);
2373         END IF;
2374 
2375         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2376                                   p_data  =>  x_msg_data);
2377 
2378         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2379           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2380                   'Leaving OKC_REP_WF_PVT.validate_party_contact');
2381         END IF;
2382 
2383         return;
2384 
2385       END IF;
2386 
2387       CLOSE tca_party_contact_csr;
2388 
2389     ELSIF (p_party_role_code = G_PARTY_ROLE_SUPPLIER) THEN
2390 
2391       OPEN  vendor_party_contact_csr;
2392       FETCH vendor_party_contact_csr INTO l_temp;
2393 
2394       IF (vendor_party_contact_csr%NOTFOUND) THEN
2395 
2396         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2397           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2398                   'Combination of party and contact is invalid');
2399         END IF;
2400 
2401         CLOSE vendor_party_contact_csr;
2402 
2403         x_valid_contact_flag := 'N';
2404         x_error_code := 'CONTACT_NOT_EXIST';
2405 
2406         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2407           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2408                   'x_valid_contact_flag: ' || x_valid_contact_flag);
2409           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2410                   'x_error_code: ' || x_error_code);
2411         END IF;
2412 
2413         FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2414                                   p_data  =>  x_msg_data);
2415 
2416         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2417           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2418                   'Leaving OKC_REP_WF_PVT.validate_party_contact');
2419         END IF;
2420 
2421         return;
2422 
2423       END IF;
2424 
2425       CLOSE vendor_party_contact_csr;
2426 
2427     END IF;
2428 
2429     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2430       FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2431               'Party and contact combination is valid');
2432     END IF;
2433 
2434 
2435   EXCEPTION
2436 
2437     WHEN FND_API.G_EXC_ERROR THEN
2438 
2439       --close cursors
2440       IF (contact_unique_csr%ISOPEN) THEN
2441         CLOSE contact_unique_csr ;
2442       END IF;
2443       IF (internal_party_contact_csr%ISOPEN) THEN
2444         CLOSE internal_party_contact_csr ;
2445       END IF;
2446       IF (tca_party_contact_csr%ISOPEN) THEN
2447         CLOSE tca_party_contact_csr ;
2448       END IF;
2449       IF (vendor_party_contact_csr%ISOPEN) THEN
2450         CLOSE vendor_party_contact_csr ;
2451       END IF;
2452 
2453       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2454         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2455              'Leaving validate_party_contact:FND_API.G_EXC_ERROR Exception');
2456       END IF;
2457 
2458       x_return_status := FND_API.G_RET_STS_ERROR;
2459       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2460                                 p_data  =>  x_msg_data);
2461 
2462     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2463 
2464       --close cursors
2465       IF (contact_unique_csr%ISOPEN) THEN
2466         CLOSE contact_unique_csr ;
2467       END IF;
2468       IF (internal_party_contact_csr%ISOPEN) THEN
2469         CLOSE internal_party_contact_csr ;
2470       END IF;
2471       IF (tca_party_contact_csr%ISOPEN) THEN
2472         CLOSE tca_party_contact_csr ;
2473       END IF;
2474       IF (vendor_party_contact_csr%ISOPEN) THEN
2475         CLOSE vendor_party_contact_csr ;
2476       END IF;
2477 
2478       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2479         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2480              'Leaving validate_party_contact:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
2481       END IF;
2482 
2483       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
2484       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2485                                 p_data  =>  x_msg_data);
2486 
2487     WHEN OTHERS THEN
2488 
2489       --close cursors
2490       IF (contact_unique_csr%ISOPEN) THEN
2491         CLOSE contact_unique_csr ;
2492       END IF;
2493       IF (internal_party_contact_csr%ISOPEN) THEN
2494         CLOSE internal_party_contact_csr ;
2495       END IF;
2496       IF (tca_party_contact_csr%ISOPEN) THEN
2497         CLOSE tca_party_contact_csr ;
2498       END IF;
2499       IF (vendor_party_contact_csr%ISOPEN) THEN
2500         CLOSE vendor_party_contact_csr ;
2501       END IF;
2502 
2503       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2504         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2505              'Leaving validate_party_contact because of EXCEPTION: ' || sqlerrm);
2506       END IF;
2507 
2508       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
2509                           p_msg_name     => G_UNEXPECTED_ERROR,
2510                           p_token1       => G_SQLCODE_TOKEN,
2511                           p_token1_value => sqlcode,
2512                           p_token2       => G_SQLERRM_TOKEN,
2513                           p_token2_value => sqlerrm);
2514       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2515       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2516                                 p_data  =>  x_msg_data);
2517 
2518   END validate_party_contact;
2519 
2520   -- Start of comments
2521   --API name      : populate_import_errors
2522   --Type          : Private.
2523   --Function      : Populate the okc_rep_imp_errors_t table with error messages
2524   --Pre-reqs      : None
2525   --Parameters    :
2526   --IN            : p_api_version         IN NUMBER       Required
2527   --              : p_init_msg_list       IN VARCHAR2     Optional
2528   --                   Default = FND_API.G_FALSE
2529   --              : p_contract_id         IN NUMBER       Required
2530   --                    Contract ID that the error is from
2531   --              : p_error_obj_type    IN    VARCHAR2       Required
2532   --                    Error Object Type: 'CONTRACT', 'PARTY', 'DOCUMENT'
2533   --              : p_error_obj_id     IN NUMBER       Required
2534   --                   Error Object's ID
2535   --              : p_error_msg_txt  IN VARCHAR2       Required
2536   --                   Translated error message text
2537   --              : p_program_id                IN  NUMBER Required
2538   --                    Concurrent program ID
2539   --              : p_program_login_id          IN  NUMBER Required
2540   --                    Concurrent program login ID
2541   --              : p_program_app_id            IN  NUMBER Required
2542   --                    Concurrent program application ID
2543   --              : p_request_id                IN  NUMBER Required
2544   --                    Concurrent program request ID
2545   --OUT           : x_return_status       OUT  VARCHAR2(1)
2546   --              : x_msg_count           OUT  NUMBER
2547   --              : x_msg_data            OUT  VARCHAR2(2000)
2548   -- End of comments
2549   PROCEDURE populate_import_errors(
2550        p_api_version              IN NUMBER,
2551        p_init_msg_list            IN VARCHAR2,
2552        p_contract_id              IN NUMBER,
2553        p_error_obj_type           IN VARCHAR2,
2554        p_error_obj_id             IN NUMBER,
2555        p_error_msg_txt            IN VARCHAR2,
2556        p_program_id               IN NUMBER,
2557        p_program_login_id         IN NUMBER,
2558        p_program_app_id           IN NUMBER,
2559        p_request_id               IN NUMBER,
2560        x_return_status            OUT NOCOPY VARCHAR2,
2561        x_msg_count                OUT NOCOPY NUMBER,
2562        x_msg_data                 OUT NOCOPY VARCHAR2)
2563   IS
2564     l_api_name VARCHAR2(30);
2565     l_api_version       CONSTANT NUMBER := 1.0;
2566 
2567     l_imp_error_id              NUMBER;
2568 
2569     CURSOR ERROR_ID_CSR IS
2570     SELECT OKC_REP_IMP_ERRORS_T_S.NEXTVAL
2571     FROM DUAL;
2572 
2573     BEGIN
2574 
2575     l_api_name := 'populate_import_errors';
2576 
2577     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2578       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2579               'Entered OKC_REP_UTIL_PVT.populate_import_errors');
2580       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2581               'p_contract_id = ' || p_contract_id);
2582       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2583               'p_error_obj_type = ' || p_error_obj_type);
2584       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2585               'p_error_obj_id = ' || p_error_obj_id);
2586       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2587               'p_error_msg_txt = ' || p_error_msg_txt);
2588       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2589               'p_program_id = ' || p_program_id);
2590       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2591               'p_program_login_id = ' || p_program_login_id);
2592       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2593               'p_program_app_id = ' || p_program_app_id);
2594       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2595               'p_request_id = ' || p_request_id);
2596 
2597 
2598     END IF;
2599 
2600     -- Standard call to check for call compatibility.
2601     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2602       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2603     END IF;
2604 
2605     -- Initialize message list if p_init_msg_list is set to TRUE.
2606     IF FND_API.to_Boolean( p_init_msg_list ) THEN
2607       FND_MSG_PUB.initialize;
2608     END IF;
2609 
2610     --  Initialize API return status to success
2611     x_return_status := FND_API.G_RET_STS_SUCCESS;
2612 
2613 
2614 
2615     OPEN ERROR_ID_CSR;
2616     FETCH ERROR_ID_CSR INTO l_imp_error_id;
2617     CLOSE ERROR_ID_CSR;
2618 
2619     IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2620         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2621              'l_imp_error_id: '||l_imp_error_id);
2622     END IF;
2623 
2624     INSERT INTO OKC_REP_IMP_ERRORS_T(
2625     IMP_ERROR_ID,
2626     IMP_CONTRACT_ID,
2627     ERROR_OBJECT_TYPE,
2628     ERROR_OBJECT_ID,
2629     ERROR_MESSAGE,
2630     CREATION_DATE,
2631     PROGRAM_ID,
2632     PROGRAM_LOGIN_ID,
2633     PROGRAM_APPLICATION_ID,
2634     REQUEST_ID)
2635     VALUES(
2636     l_imp_error_id,
2637     p_contract_id,
2638     p_error_obj_type,
2639     p_error_obj_id,
2640     p_error_msg_txt,
2641     sysdate,
2642     p_program_id,
2643     p_program_login_id,
2644     p_program_app_id,
2645     p_request_id
2646     );
2647 
2648     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2649         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2650                 'Leaving OKC_REP_UTIL_PVT.'||l_api_name);
2651     END IF;
2652 
2653   EXCEPTION
2654     WHEN FND_API.G_EXC_ERROR THEN
2655 
2656       --close cursors
2657       IF (ERROR_ID_CSR%ISOPEN) THEN
2658         CLOSE ERROR_ID_CSR ;
2659       END IF;
2660 
2661       IF ERROR_ID_CSR%ISOPEN THEN
2662         CLOSE ERROR_ID_CSR;
2663       END IF;
2664       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2665         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2666              'Leaving populate_import_errors:FND_API.G_EXC_ERROR Exception');
2667       END IF;
2668 
2669       x_return_status := FND_API.G_RET_STS_ERROR;
2670       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2671                                 p_data  =>  x_msg_data);
2672 
2673     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2674 
2675       --close cursors
2676       IF (ERROR_ID_CSR%ISOPEN) THEN
2677         CLOSE ERROR_ID_CSR ;
2678       END IF;
2679 
2680       IF ERROR_ID_CSR%ISOPEN THEN
2681         CLOSE ERROR_ID_CSR;
2682       END IF;
2683 
2684       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2685         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2686              'Leaving populate_import_errors:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
2687       END IF;
2688 
2689       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
2690       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2691                                 p_data  =>  x_msg_data);
2692 
2693     WHEN OTHERS THEN
2694 
2695       --close cursors
2696       IF (ERROR_ID_CSR%ISOPEN) THEN
2697         CLOSE ERROR_ID_CSR ;
2698       END IF;
2699 
2700       IF ERROR_ID_CSR%ISOPEN THEN
2701         CLOSE ERROR_ID_CSR;
2702       END IF;
2703 
2704       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2705         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
2706              'Leaving populate_import_errors because of EXCEPTION: ' || sqlerrm);
2707       END IF;
2708 
2709       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
2710                           p_msg_name     => G_UNEXPECTED_ERROR,
2711                           p_token1       => G_SQLCODE_TOKEN,
2712                           p_token1_value => sqlcode,
2713                           p_token2       => G_SQLERRM_TOKEN,
2714                           p_token2_value => sqlerrm);
2715       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2716       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
2717                                 p_data  =>  x_msg_data);
2718 
2719   END populate_import_errors;
2720 
2721 
2722   -- Start of comments
2723   --API name      : validate_import_documents
2724   --Type          : Private.
2725   --Function      : Validates the contract documents stored in the interface table
2726   --                in a concurrent program.
2727   --Pre-reqs      : Currently only called from repository import.
2728   --              : Contract documents should be saved to the OKC_REP_IMP_DOCUMENTS_T table
2729   --Parameters    :
2730   --IN            : p_api_version         IN NUMBER       Required
2731   --              : p_init_msg_list       IN VARCHAR2     Optional
2732   --                   Default = FND_API.G_FALSE
2733   --              : p_request_id         IN NUMBER       Required
2734   --                    Concurrent program request id
2735   --OUT           : x_return_status       OUT  VARCHAR2(1)
2736   --              : x_msg_count           OUT  NUMBER
2737   --              : x_msg_data            OUT  VARCHAR2(2000)
2738   -- End of comments
2739   PROCEDURE validate_import_documents(
2740        p_api_version              IN NUMBER,
2741        p_init_msg_list            IN VARCHAR2,
2742        p_request_id               IN NUMBER,
2743        x_return_status            OUT NOCOPY VARCHAR2,
2744        x_msg_count                OUT NOCOPY NUMBER,
2745        x_msg_data                 OUT NOCOPY VARCHAR2)
2746   IS
2747     l_api_name VARCHAR2(30);
2748     l_api_version       CONSTANT NUMBER := 1.0;
2749 
2750     l_category_code     VARCHAR2(30);
2751     l_valid_flag        VARCHAR2(1);
2752     l_error_msg         VARCHAR2(2000);
2753 
2754     l_file_name_length  CONSTANT NUMBER := 2048;
2755     l_file_desc_length  CONSTANT NUMBER := 255;
2756 
2757     CURSOR IMPORT_DOCUMENTS_CSR IS
2758     SELECT IMP_DOCUMENT_ID,
2759     IMP_CONTRACT_ID,
2760     DOCUMENT_INDEX,
2761     FILE_NAME,
2762     DOCUMENT_DESC,
2763     CATEGORY_NAME_TXT,
2764     PROGRAM_ID,
2765     PROGRAM_LOGIN_ID,
2766     PROGRAM_APPLICATION_ID,
2767     REQUEST_ID
2768     FROM OKC_REP_IMP_DOCUMENTS_T
2769     WHERE REQUEST_ID = p_request_id
2770     AND VALID_FLAG in ('Y', 'U');
2771 
2772     l_import_documents_rec IMPORT_DOCUMENTS_CSR%ROWTYPE;
2773 
2774     CURSOR document_category_csr (p_category_name VARCHAR2) IS
2775     select cat.name
2776     from fnd_document_categories cat,
2777     fnd_document_categories_tl cattl
2778     where UPPER(cattl.user_name) = UPPER(p_category_name)
2779     and cat.category_id = cattl.category_id
2780     and cat.name like 'OKC_REPO_%'
2781     and (cat.start_date_active is null OR trunc(cat.start_date_active) <= trunc(sysdate))
2782     and (cat.end_date_active is null OR trunc(cat.end_date_active) >= trunc(sysdate))
2783     and language = userenv('LANG');
2784 
2785 
2786     BEGIN
2787 
2788     l_api_name := 'validate_import_documents';
2789 
2790     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2791       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2792               'Entered OKC_REP_UTIL_PVT.'||l_api_name);
2793       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
2794               'p_request_id = ' || p_request_id);
2795 
2796     END IF;
2797 
2798     -- Standard call to check for call compatibility.
2799     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2800       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2801     END IF;
2802 
2803     -- Initialize message list if p_init_msg_list is set to TRUE.
2804     IF FND_API.to_Boolean( p_init_msg_list ) THEN
2805       FND_MSG_PUB.initialize;
2806     END IF;
2807 
2808     --  Initialize API return status to success
2809     x_return_status := FND_API.G_RET_STS_SUCCESS;
2810 
2811     OPEN IMPORT_DOCUMENTS_CSR;
2812     LOOP
2813         FETCH IMPORT_DOCUMENTS_CSR INTO l_import_documents_rec;
2814         EXIT WHEN IMPORT_DOCUMENTS_CSR%NOTFOUND;
2815 
2816         --Initialize l_valid_flag for every record
2817         l_valid_flag := 'Y';
2818         --Initialize l_error_msg to be NULL
2819         l_error_msg := NULL;
2820 
2821         --If l_valid_flag is already set to 'N', we do not perform any more checks
2822         --File Name should exist
2823         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2824                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2825                     'Checking if user enters file name');
2826         END IF;
2827         IF l_import_documents_rec.FILE_NAME IS NOT NULL THEN
2828             l_import_documents_rec.FILE_NAME := LTRIM(l_import_documents_rec.FILE_NAME);
2829             l_import_documents_rec.FILE_NAME := RTRIM(l_import_documents_rec.FILE_NAME);
2830         END IF;
2831         IF (l_valid_flag = 'Y' AND (l_import_documents_rec.FILE_NAME IS NULL OR LENGTH(l_import_documents_rec.FILE_NAME)=0)) THEN
2832             l_valid_flag := 'N';
2833 
2834             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_DOC_NAME');
2835             fnd_message.set_token(TOKEN => 'DOC_INDEX',
2836                                   VALUE => l_import_documents_rec.document_index);
2837             l_error_msg := fnd_message.get;
2838             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2839                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2840                 'Document Name is missing');
2841                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2842                 'Contract ID: '||l_import_documents_rec.imp_contract_id);
2843                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2844                 'Document ID: '||l_import_documents_rec.imp_document_id);
2845                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2846                 'l_error_msg: '||l_error_msg);
2847             END IF;
2848 
2849 
2850 
2851        END IF;
2852 
2853        --If l_valid_flag is already set to 'N', we do not perform any more checks
2854        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2855                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2856                     'Checking if file name is too long');
2857        END IF;
2858        --File Name should be <= 256
2859        IF (l_valid_flag = 'Y' AND LENGTH(l_import_documents_rec.file_name) > l_file_name_length) THEN
2860             l_valid_flag := 'N';
2861 
2862             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_LONG_DOC_NAME');
2863             fnd_message.set_token(TOKEN => 'DOC_INDEX',
2864                                   VALUE => l_import_documents_rec.document_index);
2865             l_error_msg := fnd_message.get;
2866             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2867                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2868                     'Document Name is too long');
2869                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2870                     'Contract ID: '||l_import_documents_rec.imp_contract_id);
2871                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2872                     'Document ID: '||l_import_documents_rec.imp_document_id);
2873                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2874                     'l_error_msg: '||l_error_msg);
2875             END IF;
2876        END IF;
2877 
2878        --If l_valid_flag is already set to 'N', we do not perform any more checks
2879        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2880                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2881                     'Checking if file description is too long');
2882        END IF;
2883        --File Name should be <= 256
2884        IF (l_valid_flag = 'Y' AND l_import_documents_rec.document_desc IS NOT NULL AND LENGTH(l_import_documents_rec.document_desc) > l_file_desc_length) THEN
2885             l_valid_flag := 'N';
2886 
2887             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_LONG_DOC_DESC');
2888             fnd_message.set_token(TOKEN => 'DOC_INDEX',
2889                                   VALUE => l_import_documents_rec.document_index);
2890             l_error_msg := fnd_message.get;
2891             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2892                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2893                     'Document Description is too long');
2894                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2895                     'Contract ID: '||l_import_documents_rec.imp_contract_id);
2896                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2897                     'Document ID: '||l_import_documents_rec.imp_document_id);
2898                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2899                     'l_error_msg: '||l_error_msg);
2900             END IF;
2901        END IF;
2902 
2903 
2904        --If l_valid_flag is already set to 'N', we do not perform any more checks
2905         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2906                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2907                     'Checking if user enters category name');
2908         END IF;
2909         --Category Name Text should exist
2910         IF l_import_documents_rec.category_name_txt IS NOT NULL THEN
2911             l_import_documents_rec.category_name_txt := LTRIM(l_import_documents_rec.category_name_txt);
2912             l_import_documents_rec.category_name_txt := RTRIM(l_import_documents_rec.category_name_txt);
2913         END IF;
2914         IF (l_valid_flag = 'Y' AND (l_import_documents_rec.category_name_txt IS NULL OR LENGTH(l_import_documents_rec.category_name_txt)=0)) THEN
2915                 l_valid_flag := 'N';
2916                 l_category_code := NULL;
2917 
2918                 fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_DOC_CATEGORY');
2919                 fnd_message.set_token(TOKEN => 'DOC_INDEX',
2920                                   VALUE => l_import_documents_rec.document_index);
2921                 l_error_msg := fnd_message.get;
2922                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2923                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2924                     'Document Category is missing');
2925                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2926                     'Contract ID: '||l_import_documents_rec.imp_contract_id);
2927                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2928                     'Document ID: '||l_import_documents_rec.imp_document_id);
2929                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2930                     'l_error_msg: '||l_error_msg);
2931                 END IF;
2932         END IF;
2933 
2934         --If l_valid_flag is already set to 'N', we do not perform any more checks
2935         IF l_valid_flag = 'Y' THEN
2936             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2937                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2938                     'Checking if category name is valid');
2939             END IF;
2940 
2941             OPEN  document_category_csr(l_import_documents_rec.category_name_txt);
2942             FETCH document_category_csr  INTO  l_category_code;
2943 
2944             IF document_category_csr%NOTFOUND THEN
2945                     l_valid_flag := 'N';
2946                     l_category_code := NULL;
2947 
2948                     fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_DOC_CATEGORY');
2949                     fnd_message.set_token(TOKEN => 'DOC_INDEX',
2950                                   VALUE => l_import_documents_rec.document_index);
2951                     l_error_msg := fnd_message.get;
2952                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2953                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2954                         'Category ID not found with given category name: '||l_import_documents_rec.category_name_txt);
2955                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2956                         'Contract ID: '||l_import_documents_rec.imp_contract_id);
2957                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2958                         'Document ID: '||l_import_documents_rec.imp_document_id);
2959                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2960                         'l_error_msg: '||l_error_msg);
2961                     END IF;
2962             END IF;
2963 
2964             CLOSE document_category_csr;
2965       END IF;
2966 
2967         --Populate the valid_flag and category_code columns in OKC_REP_IMP_DOCUMENTS_T
2968         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2969             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2970             'Updating OKC_REP_IMP_DOCUMENTS_T');
2971             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2972             'DOCUMENT ID: '||l_import_documents_rec.imp_document_id);
2973             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2974             'l_category_code: '||l_category_code);
2975             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
2976             'l_valid_flag: '||l_valid_flag);
2977         END IF;
2978 
2979         --Populate the error message table
2980         IF(l_valid_flag = 'N' AND l_error_msg IS NOT NULL) THEN
2981             populate_import_errors(p_init_msg_list => FND_API.G_FALSE,
2982                                    p_api_version => 1.0,
2983                                    p_contract_id => l_import_documents_rec.imp_contract_id,
2984                                 p_error_obj_type => G_IMP_DOCUMENT_ERROR,
2985                                 p_error_obj_id => l_import_documents_rec.imp_document_id,
2986                                 p_error_msg_txt => l_error_msg,
2987                                 p_program_id => l_import_documents_rec.program_id,
2988                                 p_program_login_id => l_import_documents_rec.program_login_id,
2989                                 p_program_app_id => l_import_documents_rec.program_application_id,
2990                                 p_request_id => l_import_documents_rec.request_id,
2991                                 x_return_status => x_return_status,
2992                                 x_msg_count => x_msg_count,
2993                                 x_msg_data => x_msg_data);
2994         END IF;
2995 
2996         IF(l_valid_flag = 'Y') THEN
2997         --Update the record in OKC_REP_IMP_DOCUMENTS_T
2998         UPDATE OKC_REP_IMP_DOCUMENTS_T
2999         SET CATEGORY_CODE = l_category_code,
3000         VALID_FLAG = l_valid_flag
3001         where imp_document_id = l_import_documents_rec.imp_document_id;
3002         END IF;
3003 
3004         IF(l_valid_flag = 'N') THEN
3005         UPDATE OKC_REP_IMP_DOCUMENTS_T
3006         SET VALID_FLAG = l_valid_flag
3007         where imp_document_id = l_import_documents_rec.imp_document_id;
3008         END IF;
3009 
3010     END LOOP;
3011     CLOSE IMPORT_DOCUMENTS_CSR;
3012 
3013     --bug fix for 4209521
3014     --need to commit or the Java layer will not pick up the changes
3015     COMMIT;
3016 
3017     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3018         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3019                 'Leaving OKC_REP_UTIL_PVT.'||l_api_name);
3020     END IF;
3021 
3022   EXCEPTION
3023     WHEN FND_API.G_EXC_ERROR THEN
3024       IF IMPORT_DOCUMENTS_CSR%ISOPEN THEN
3025         CLOSE IMPORT_DOCUMENTS_CSR;
3026       END IF;
3027 
3028       IF document_category_csr%ISOPEN THEN
3029         CLOSE document_category_csr;
3030       END IF;
3031       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3032         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3033              'Leaving '||l_api_name||':FND_API.G_EXC_ERROR Exception');
3034       END IF;
3035 
3036       x_return_status := FND_API.G_RET_STS_ERROR;
3037       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3038                                 p_data  =>  x_msg_data);
3039 
3040     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3041       IF IMPORT_DOCUMENTS_CSR%ISOPEN THEN
3042         CLOSE IMPORT_DOCUMENTS_CSR;
3043       END IF;
3044 
3045       IF document_category_csr%ISOPEN THEN
3046         CLOSE document_category_csr;
3047       END IF;
3048       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3049         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3050              'Leaving '||l_api_name||':FND_API.G_EXC_UNEXPECTED_ERROR Exception');
3051       END IF;
3052 
3053       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
3054       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3055                                 p_data  =>  x_msg_data);
3056 
3057     WHEN OTHERS THEN
3058       IF IMPORT_DOCUMENTS_CSR%ISOPEN THEN
3059         CLOSE IMPORT_DOCUMENTS_CSR;
3060       END IF;
3061 
3062       IF document_category_csr%ISOPEN THEN
3063         CLOSE document_category_csr;
3064       END IF;
3065       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3066         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3067              'Leaving '||l_api_name||' because of EXCEPTION: ' || sqlerrm);
3068       END IF;
3069 
3070       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
3071                           p_msg_name     => G_UNEXPECTED_ERROR,
3072                           p_token1       => G_SQLCODE_TOKEN,
3073                           p_token1_value => sqlcode,
3074                           p_token2       => G_SQLERRM_TOKEN,
3075                           p_token2_value => sqlerrm);
3076       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3077       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3078                                 p_data  =>  x_msg_data);
3079 
3080   END validate_import_documents;
3081 
3082   -- Start of comments
3083   --API name      : validate_import_parties
3084   --Type          : Private.
3085   --Function      : Validates contract parties during import
3086   --Pre-reqs      : Currently only called from repository import.
3087   --              : Contracts should be saved to the OKC_REP_IMP_PARTIES_T table
3088   --Parameters    :
3089   --IN            : p_api_version         IN NUMBER       Required
3090   --              : p_init_msg_list       IN VARCHAR2     Optional
3091   --                   Default = FND_API.G_FALSE
3092   --              : p_request_id         IN NUMBER       Required
3093   --                    Concurrent Program Request ID
3094   --OUT           : x_return_status       OUT  VARCHAR2(1)
3095   --              : x_msg_count           OUT  NUMBER
3096   --              : x_msg_data            OUT  VARCHAR2(2000)
3097   -- End of comments
3098   PROCEDURE validate_import_parties(
3099        p_api_version              IN NUMBER,
3100        p_init_msg_list            IN VARCHAR2,
3101        p_request_id               IN NUMBER,
3102        x_return_status            OUT NOCOPY VARCHAR2,
3103        x_msg_count                OUT NOCOPY NUMBER,
3104        x_msg_data                 OUT NOCOPY VARCHAR2)
3105   IS
3106     l_api_name VARCHAR2(30);
3107     l_api_version       CONSTANT NUMBER := 1.0;
3108 
3109     l_valid_flag        VARCHAR2(1);
3110     l_error_code        VARCHAR2(20);
3111     l_error_msg         VARCHAR2(2000);
3112 
3113 
3114     l_signed_by_length  CONSTANT NUMBER := 150;
3115 
3116     l_party_role_code   VARCHAR2(240);
3117     l_party_id          NUMBER;
3118     l_contract_intent   VARCHAR2(1);
3119     l_signed_date       DATE;
3120 
3121 
3122     CURSOR IMPORT_PARTIES_CSR IS
3123     SELECT IMP_PARTY_ID,
3124     IMP_CONTRACT_ID,
3125     PARTY_INDEX,
3126     SIGNED_BY_TXT,
3127     SIGNED_DATE,
3128     PARTY_NAME_TXT,
3129     PARTY_ROLE_TXT,
3130     VALID_FLAG,
3131     PROGRAM_ID,
3132     PROGRAM_LOGIN_ID,
3133     PROGRAM_APPLICATION_ID,
3134     REQUEST_ID
3135     FROM OKC_REP_IMP_PARTIES_T
3136     WHERE REQUEST_ID = p_request_id
3137     AND VALID_FLAG IN ('U', 'Y');
3138 
3139     l_import_parties_rec IMPORT_PARTIES_CSR%ROWTYPE;
3140 
3141     CURSOR CONTRACT_INTENT_CSR (p_imp_contract_id NUMBER) IS
3142     SELECT INTENT
3143     FROM OKC_BUS_DOC_TYPES_V bus_doc,
3144     OKC_REP_IMP_CONTRACTS_T temp
3145     WHERE bus_doc.name = temp.contract_type_txt
3146     AND temp.imp_contract_id = p_imp_contract_id
3147     AND bus_doc.document_type_class = 'REPOSITORY';
3148 
3149     BEGIN
3150 
3151     l_api_name := 'validate_import_parties';
3152 
3153     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3154       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3155               'Entered OKC_REP_UTIL_PVT.'||l_api_name);
3156       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3157               'p_request_id = ' || p_request_id);
3158 
3159     END IF;
3160 
3161     -- Standard call to check for call compatibility.
3162     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3163       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3164     END IF;
3165 
3166     -- Initialize message list if p_init_msg_list is set to TRUE.
3167     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3168       FND_MSG_PUB.initialize;
3169     END IF;
3170 
3171     --  Initialize API return status to success
3172     x_return_status := FND_API.G_RET_STS_SUCCESS;
3173 
3174     OPEN IMPORT_PARTIES_CSR;
3175     LOOP
3176         FETCH IMPORT_PARTIES_CSR INTO l_import_parties_rec;
3177         EXIT WHEN IMPORT_PARTIES_CSR%NOTFOUND;
3178 
3179         --Initialize l_valid_flag for every record
3180         l_valid_flag := 'Y';
3181         --Initialize l_error_msg for every record
3182         l_error_msg := NULL;
3183 
3184         --If l_valid_flag is already set to 'N', we do not perform any more checks
3185         --Party Name should exist
3186         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3187                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3188                     'Checking if user enters party name');
3189         END IF;
3190         IF l_import_parties_rec.party_name_txt IS NOT NULL THEN
3191             l_import_parties_rec.party_name_txt := LTRIM(l_import_parties_rec.party_name_txt);
3192             l_import_parties_rec.party_name_txt := RTRIM(l_import_parties_rec.party_name_txt);
3193         END IF;
3194         IF (l_valid_flag = 'Y' AND (l_import_parties_rec.party_name_txt IS NULL OR LENGTH(l_import_parties_rec.party_name_txt)=0)) THEN
3195             l_valid_flag := 'N';
3196 
3197             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_PARTY_NAME');
3198             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3199                                   VALUE => l_import_parties_rec.party_index);
3200             l_error_msg := fnd_message.get;
3201             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3202                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3203                 'Party Name is missing');
3204                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3205                 'Contract ID: '||l_import_parties_rec.imp_contract_id);
3206                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3207                 'Party ID: '||l_import_parties_rec.imp_party_id);
3208                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3209                 'l_error_msg: '||l_error_msg);
3210             END IF;
3211        END IF;
3212 
3213         --If l_valid_flag is already set to 'N', we do not perform any more checks
3214         --Party Role should exist
3215         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3216                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3217                     'Checking if user enters party role');
3218         END IF;
3219         IF l_import_parties_rec.party_role_txt IS NOT NULL THEN
3220             l_import_parties_rec.party_role_txt := LTRIM(l_import_parties_rec.party_role_txt);
3221             l_import_parties_rec.party_role_txt := RTRIM(l_import_parties_rec.party_role_txt);
3222         END IF;
3223         IF (l_valid_flag = 'Y' AND (l_import_parties_rec.party_role_txt IS NULL OR LENGTH(l_import_parties_rec.party_role_txt)=0)) THEN
3224             l_valid_flag := 'N';
3225 
3226             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_PARTY_ROLE');
3227             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3228                                   VALUE => l_import_parties_rec.party_index);
3229             l_error_msg := fnd_message.get;
3230             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3231                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3232                 'Party Role is missing');
3233                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3234                 'Contract ID: '||l_import_parties_rec.imp_contract_id);
3235                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3236                 'Party ID: '||l_import_parties_rec.imp_party_id);
3237                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3238                 'l_error_msg: '||l_error_msg);
3239             END IF;
3240 
3241        END IF;
3242 
3243         --If l_valid_flag is already set to 'N', we do not perform any more checks
3244         --Party Signed By should exist
3245         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3246                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3247                     'Checking if user enters party signed by');
3248         END IF;
3249         IF l_import_parties_rec.signed_by_txt IS NOT NULL THEN
3250             l_import_parties_rec.signed_by_txt := LTRIM(l_import_parties_rec.signed_by_txt);
3251             l_import_parties_rec.signed_by_txt := RTRIM(l_import_parties_rec.signed_by_txt);
3252         END IF;
3253         IF (l_valid_flag = 'Y' AND (l_import_parties_rec.signed_by_txt IS NULL OR LENGTH(l_import_parties_rec.signed_by_txt)=0)) THEN
3254             l_valid_flag := 'N';
3255 
3256             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_SIGNED_BY');
3257             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3258                                   VALUE => l_import_parties_rec.party_index);
3259             l_error_msg := fnd_message.get;
3260             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3261                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3262                 'Party Signed By is missing');
3263                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3264                 'Contract ID: '||l_import_parties_rec.imp_contract_id);
3265                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3266                 'Party ID: '||l_import_parties_rec.imp_party_id);
3267                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3268                 'l_error_msg: '||l_error_msg);
3269             END IF;
3270 
3271        END IF;
3272 
3273         --If l_valid_flag is already set to 'N', we do not perform any more checks
3274         --Party Signed By should be <150
3275         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3276                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3277                     'Checking if party signed by is too long');
3278         END IF;
3279         IF (l_valid_flag = 'Y' AND l_import_parties_rec.signed_by_txt IS NOT NULL
3280             AND LENGTH(l_import_parties_rec.signed_by_txt) > l_signed_by_length) THEN
3281             l_valid_flag := 'N';
3282 
3283             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_LONG_SIGNED_BY');
3284             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3285                                   VALUE => l_import_parties_rec.party_index);
3286             l_error_msg := fnd_message.get;
3287             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3288                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3289                 'Party Signed By is too long');
3290                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3291                 'Contract ID: '||l_import_parties_rec.imp_contract_id);
3292                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3293                 'Party ID: '||l_import_parties_rec.imp_party_id);
3294                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3295                 'l_error_msg: '||l_error_msg);
3296             END IF;
3297 
3298        END IF;
3299 
3300         --If l_valid_flag is already set to 'N', we do not perform any more checks
3301         --Party Signed Date should exist
3302         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3303                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3304                     'Checking if user enters party signed date');
3305         END IF;
3306         IF l_import_parties_rec.signed_date IS NOT NULL THEN
3307             l_import_parties_rec.signed_date := LTRIM(l_import_parties_rec.signed_date);
3308             l_import_parties_rec.signed_date := RTRIM(l_import_parties_rec.signed_date);
3309         END IF;
3310         IF (l_valid_flag = 'Y' AND (l_import_parties_rec.signed_date IS NULL OR LENGTH(l_import_parties_rec.signed_date)=0)) THEN
3311             l_valid_flag := 'N';
3312 
3313             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_MISS_SIGNED_DATE');
3314             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3315                                   VALUE => l_import_parties_rec.party_index);
3316             l_error_msg := fnd_message.get;
3317             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3318                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3319                 'Party Signed Date is missing');
3320                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3321                 'Contract ID: '||l_import_parties_rec.imp_contract_id);
3322                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3323                 'Party ID: '||l_import_parties_rec.imp_party_id);
3324                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3325                 'l_error_msg: '||l_error_msg);
3326             END IF;
3327 
3328        END IF;
3329 
3330         --If l_valid_flag is already set to 'N', we do not perform any more checks
3331         --Party Signed Date should be the right format
3332         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3333                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3334                     'Checking if party signed date is in the correct format');
3335         END IF;
3336         IF (l_valid_flag = 'Y' AND l_import_parties_rec.signed_date IS NOT NULL) THEN
3337         BEGIN
3338             l_signed_date := to_date(l_import_parties_rec.signed_date, G_IMP_DATE_FORMAT);
3339             EXCEPTION
3340                 WHEN OTHERS THEN
3341                 l_valid_flag := 'N';
3342                 fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_SIGNED_DATE');
3343                 fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3344                                   VALUE => l_import_parties_rec.party_index);
3345                 l_error_msg := fnd_message.get;
3346 
3347                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3348                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3349                     'Party Signed Date is not valid');
3350                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3351                     'Party ID: '||l_import_parties_rec.imp_contract_id);
3352                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3353                     'l_error_msg: '||l_error_msg);
3354                 END IF;
3355         END;
3356        END IF;
3357 
3358 
3359         --If l_valid_flag is already set to 'N', we do not perform any more checks
3360         --Now call validate_contract_party API
3361         IF (l_valid_flag = 'Y') THEN
3362             OPEN CONTRACT_INTENT_CSR (l_import_parties_rec.imp_contract_id);
3363                 FETCH CONTRACT_INTENT_CSR INTO l_contract_intent;
3364 
3365                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3366                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3367                     'l_contract_intent: '||l_contract_intent);
3368                 END IF;
3369 
3370                 IF (l_contract_intent IS NOT NULL ) THEN
3371 
3372                     validate_contract_party(p_api_version => 1.0,
3373                                     p_init_msg_list => FND_API.G_FALSE,
3374                                     p_contract_id => l_import_parties_rec.imp_contract_id,
3375                                     p_party_role_code => l_party_role_code,
3376                                     p_party_role_txt => l_import_parties_rec.party_role_txt,
3377                                     p_party_id => l_party_id,
3378                                     p_party_name => l_import_parties_rec.party_name_txt,
3379                                     p_mode => G_P_MODE_IMPORT,
3380                                     p_intent => l_contract_intent,
3381                                     x_valid_party_flag => l_valid_flag,
3382                                     x_error_code => l_error_code,
3383                                     x_return_status => x_return_status,
3384                                     x_msg_count => x_msg_count,
3385                                     x_msg_data => x_msg_data);
3386 
3387                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3388                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3389                     'After calling validate_contract_party, l_valid_flag: '||l_valid_flag);
3390                     END IF;
3391 
3392                     IF(l_valid_flag = 'N') THEN
3393 
3394                         --ROLE_NOT_EXIST - Party role doesn't exist
3395                         IF l_error_code = 'ROLE_NOT_EXIST' THEN
3396                             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_PARTY_ROLE');
3397                             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3398                                       VALUE => l_import_parties_rec.party_index);
3399                             l_error_msg := fnd_message.get;
3400                         END IF;
3401 
3402                         --INV_ROLE_INTENT - Party role and Contract intent combination is invalid
3403                         IF l_error_code = 'INV_ROLE_INTENT' THEN
3404                             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_ROLE_INTENT');
3405                             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3406                                     VALUE => l_import_parties_rec.party_index);
3407                             l_error_msg := fnd_message.get;
3408 
3409                         END IF;
3410 
3411                         --PARTY_NOT_EXIST - Party doesn't exist
3412                         IF l_error_code = 'PARTY_NOT_EXIST' THEN
3413                             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_PARTY_NAME');
3414                             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3415                                     VALUE => l_import_parties_rec.party_index);
3416                             l_error_msg := fnd_message.get;
3417                         END IF;
3418 
3419                         --INV_CUST_ACCT - Customer party doesn't have any customer accounts
3420                         IF l_error_code = 'INV_CUST_ACCT' THEN
3421                             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_INV_CUST_PARTY');
3422                             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3423                                   VALUE => l_import_parties_rec.party_index);
3424                             l_error_msg := fnd_message.get;
3425                         END IF;
3426 
3427                         --PARTY_NOT_UNIQUE - Party in not unique in the Contract
3428                         IF l_error_code = 'PARTY_NOT_UNIQUE' THEN
3429                             fnd_message.set_name(G_APP_NAME,'OKC_REP_IMP_NONUNIQUE_PARTY');
3430                             fnd_message.set_token(TOKEN => 'PARTY_INDEX',
3431                                     VALUE => l_import_parties_rec.party_index);
3432                             l_error_msg := fnd_message.get;
3433 
3434                         END IF;
3435 
3436                     END IF;
3437 /*                ELSE
3438                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3439                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3440                     'Contract type is invalid in csv file');
3441                     END IF;
3442                     --contract intent does not exist
3443                     --this means that contract_type_txt is invalid
3444                     --we need to flag the contract header as invalid
3445                     UPDATE OKC_REP_IMP_CONTRACTS_T
3446                     SET VALID_FLAG = 'N'
3447                     WHERE IMP_CONTRACT_ID = l_import_parties_rec.imp_contract_id;
3448 
3449                     --Also populate the error table
3450                     --Note that in this case we do not wait until the end to populate the error table
3451                     --because this time the error type is 'CONTRACT' and not 'PARTY'.
3452                     --The party may still be valid by itself.
3453                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_CON_TYPE');
3454                     populate_import_errors(p_init_msg_list => FND_API.G_FALSE,
3455                                    p_api_version => 1.0,
3456                                    p_contract_id => l_import_parties_rec.imp_contract_id,
3457                                    p_error_obj_type => G_IMP_CONTRACT_ERROR,
3458                                    p_error_obj_id => l_import_parties_rec.imp_contract_id,
3459                                    p_error_msg_txt => l_error_msg,
3460                                    p_program_id => l_import_parties_rec.program_id,
3461                                    p_program_login_id => l_import_parties_rec.program_login_id,
3462                                    p_program_app_id => l_import_parties_rec.program_application_id,
3463                                    p_request_id => l_import_parties_rec.request_id,
3464                                    x_return_status => x_return_status,
3465                                    x_msg_count => x_msg_count,
3466                                    x_msg_data => x_msg_data); */
3467                 END IF;
3468 
3469             CLOSE CONTRACT_INTENT_CSR;
3470 
3471         END IF;
3472 
3473 
3474         --Populate the error message table
3475         IF(l_valid_flag = 'N' AND l_error_msg IS NOT NULL) THEN
3476             populate_import_errors(p_init_msg_list => FND_API.G_FALSE,
3477                                    p_api_version => 1.0,
3478                                    p_contract_id => l_import_parties_rec.imp_contract_id,
3479                                    p_error_obj_type => G_IMP_PARTY_ERROR,
3480                                    p_error_obj_id => l_import_parties_rec.imp_party_id,
3481                                    p_error_msg_txt => l_error_msg,
3482                                    p_program_id => l_import_parties_rec.program_id,
3483                                    p_program_login_id => l_import_parties_rec.program_login_id,
3484                                    p_program_app_id => l_import_parties_rec.program_application_id,
3485                                    p_request_id => l_import_parties_rec.request_id,
3486                                    x_return_status => x_return_status,
3487                                    x_msg_count => x_msg_count,
3488                                    x_msg_data => x_msg_data);
3489         END IF;
3490 
3491 
3492         --Update the record
3493         IF (l_valid_flag = 'Y') THEN
3494         UPDATE OKC_REP_IMP_PARTIES_T
3495         SET
3496         PARTY_ID = l_party_id,
3497         PARTY_ROLE_CODE = l_party_role_code,
3498         --SIGNED_DATE = l_signed_date,
3499         VALID_FLAG = l_valid_flag
3500         WHERE IMP_PARTY_ID = l_import_parties_rec.imp_party_id;
3501         END IF;
3502 
3503         IF (l_valid_flag = 'N') THEN
3504         UPDATE OKC_REP_IMP_PARTIES_T
3505         SET
3506         VALID_FLAG = l_valid_flag
3507         WHERE IMP_PARTY_ID = l_import_parties_rec.imp_party_id;
3508         END IF;
3509 
3510     END LOOP;
3511     CLOSE IMPORT_PARTIES_CSR;
3512 
3513     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3514       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3515               'Leaving OKC_REP_UTIL_PVT.'||l_api_name);
3516    END IF;
3517 
3518   EXCEPTION
3519 
3520     WHEN FND_API.G_EXC_ERROR THEN
3521 
3522       IF CONTRACT_INTENT_CSR%ISOPEN THEN
3523         CLOSE CONTRACT_INTENT_CSR;
3524       END IF;
3525 
3526       IF IMPORT_PARTIES_CSR%ISOPEN THEN
3527         CLOSE IMPORT_PARTIES_CSR;
3528       END IF;
3529 
3530       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3531         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3532              'Leaving '||l_api_name||':FND_API.G_EXC_ERROR Exception');
3533       END IF;
3534 
3535       x_return_status := FND_API.G_RET_STS_ERROR;
3536       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3537                                 p_data  =>  x_msg_data);
3538 
3539     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3540 
3541       IF CONTRACT_INTENT_CSR%ISOPEN THEN
3542         CLOSE CONTRACT_INTENT_CSR;
3543       END IF;
3544 
3545       IF IMPORT_PARTIES_CSR%ISOPEN THEN
3546         CLOSE IMPORT_PARTIES_CSR;
3547       END IF;
3548 
3549       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3550         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3551              'Leaving '||l_api_name||':FND_API.G_EXC_UNEXPECTED_ERROR Exception');
3552       END IF;
3553 
3554       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
3555       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3556                                 p_data  =>  x_msg_data);
3557 
3558     WHEN OTHERS THEN
3559 
3560       IF CONTRACT_INTENT_CSR%ISOPEN THEN
3561         CLOSE CONTRACT_INTENT_CSR;
3562       END IF;
3563 
3564       IF IMPORT_PARTIES_CSR%ISOPEN THEN
3565         CLOSE IMPORT_PARTIES_CSR;
3566       END IF;
3567 
3568       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3569         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
3570              'Leaving '||l_api_name||' because of EXCEPTION: ' || sqlerrm);
3571       END IF;
3572 
3573       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
3574                           p_msg_name     => G_UNEXPECTED_ERROR,
3575                           p_token1       => G_SQLCODE_TOKEN,
3576                           p_token1_value => sqlcode,
3577                           p_token2       => G_SQLERRM_TOKEN,
3578                           p_token2_value => sqlerrm);
3579       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3580       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
3581                                 p_data  =>  x_msg_data);
3582 
3583   END validate_import_parties;
3584 
3585 
3586 
3587 
3588   -- Start of comments
3589   --API name      : validate_import_contracts
3590   --Type          : Private.
3591   --Function      : Validates contracts during import
3592   --Pre-reqs      : Currently only called from repository import.
3593   --              : Contracts should be saved to the OKC_REP_IMP_CONTRACTS_T table
3594   --Parameters    :
3595   --IN            : p_api_version         IN NUMBER       Required
3596   --              : p_init_msg_list       IN VARCHAR2     Optional
3597   --                   Default = FND_API.G_FALSE
3598   --              : p_request_id         IN NUMBER       Required
3599   --                    Concurrent Program Request ID
3600   --OUT           : x_return_status       OUT  VARCHAR2(1)
3601   --              : x_msg_count           OUT  NUMBER
3602   --              : x_msg_data            OUT  VARCHAR2(2000)
3603   -- End of comments
3604   PROCEDURE validate_import_contracts(
3605        p_api_version              IN NUMBER,
3606        p_init_msg_list            IN VARCHAR2,
3607        p_request_id               IN NUMBER,
3608        x_return_status            OUT NOCOPY VARCHAR2,
3609        x_msg_count                OUT NOCOPY NUMBER,
3610        x_msg_data                 OUT NOCOPY VARCHAR2)
3611   IS
3612     l_api_name VARCHAR2(30);
3613     l_api_version       CONSTANT NUMBER := 1.0;
3614 
3615     l_contract_number_length    CONSTANT NUMBER := 150;
3616     l_contract_name_length      CONSTANT NUMBER := 450;
3617     l_description_length        CONSTANT NUMBER := 2000;
3618     l_version_comments_length   CONSTANT NUMBER := 2000;
3619     l_keywords_length           CONSTANT NUMBER := 2000;
3620     l_location_length           CONSTANT NUMBER := 2000;
3621     l_orig_system_code_length   CONSTANT NUMBER := 30;
3622     l_orig_system_id1_length    CONSTANT NUMBER := 100;
3623     l_orig_system_id2_length    CONSTANT NUMBER := 100;
3624 
3625     --these are used to update the record
3626     l_valid_flag                VARCHAR2(1);
3627     l_status_code               VARCHAR2(30);
3628     l_contract_type             VARCHAR2(30);
3629     l_authoring_party_code      VARCHAR2(30);
3630     l_org_id                    NUMBER;
3631     l_owner_user_id             NUMBER;
3632     l_amount                    NUMBER;
3633     l_effective_date            DATE;
3634     l_expiration_date           DATE;
3635     l_currency_code             VARCHAR2(30);
3636     l_contract_id               NUMBER;
3637     l_contract_number           VARCHAR2(151);
3638     l_unique_contract_number    VARCHAR2(151); --used for checking contract number uniqueness
3639 
3640     l_error_msg                 VARCHAR2(2000);
3641 
3642     l_int_parties_count         NUMBER;
3643     l_ext_parties_count         NUMBER;
3644     -- l_intent                    VARCHAR2(30);
3645 
3646     --Used to check auto contract numbering profile option
3647     l_auto_number_yn            VARCHAR2(1);
3648     l_auto_number_option        CONSTANT VARCHAR2(30):= 'OKC_REP_AUTO_CON_NUMBER';
3649 
3650     -- Used for storing contract intent code
3651     l_contract_intent           VARCHAR2(30);
3652 
3653     CURSOR CONTRACT_ID_CSR IS
3654     SELECT OKC_REP_CONTRACTS_ALL_S1.NEXTVAL
3655     FROM DUAL;
3656 
3657     CURSOR CONTRACT_NUMBER_CSR IS
3658     SELECT OKC_REP_CONTRACTS_ALL_S2.NEXTVAL
3659     FROM DUAL;
3660 
3661     CURSOR CONTRACT_NUMBER_UNIQUE_CSR (p_contract_number VARCHAR2, p_imp_contract_id NUMBER) IS
3662     SELECT CONTRACT_NUMBER
3663     FROM OKC_REP_CONTRACTS_ALL
3664     WHERE UPPER(CONTRACT_NUMBER) = UPPER(p_contract_number)
3665     UNION
3666     SELECT CONTRACT_NUMBER
3667     FROM OKC_REP_IMP_CONTRACTS_T
3668     WHERE UPPER(CONTRACT_NUMBER) = UPPER(p_contract_number)
3669     AND IMP_CONTRACT_ID <> p_imp_contract_id
3670     --fix issue#7 in bug 4107212, add the following where clause
3671     AND VALID_FLAG <> 'N';
3672 
3673     CURSOR IMPORT_CONTRACTS_CSR IS
3674     SELECT IMP_CONTRACT_ID,
3675     CONTRACT_NUMBER,
3676     CONTRACT_NAME,
3677     DESCRIPTION,
3678     VERSION_COMMENTS,
3679     CONTRACT_EFFECTIVE_DATE,
3680     CONTRACT_EXPIRATION_DATE,
3681     CURRENCY_CODE,
3682     CONTRACT_AMOUNT,
3683     ORG_NAME,
3684     OWNER_USER_NAME,
3685     PHYSICAL_LOCATION,
3686     KEYWORDS,
3687     CONTRACT_TYPE_TXT,
3688     AUTHORING_PARTY_TXT,
3689     CONTRACT_STATUS_TXT,
3690     PROGRAM_ID,
3691     PROGRAM_LOGIN_ID,
3692     PROGRAM_APPLICATION_ID,
3693     REQUEST_ID,
3694     ORIG_SYSTEM_REFERENCE_CODE,
3695     ORIG_SYSTEM_REFERENCE_ID1,
3696     ORIG_SYSTEM_REFERENCE_ID2
3697     FROM
3698     OKC_REP_IMP_CONTRACTS_T
3699     WHERE
3700     REQUEST_ID = p_request_id
3701     AND VALID_FLAG IN ('U', 'Y');
3702 
3703     l_import_contracts_rec IMPORT_CONTRACTS_CSR%ROWTYPE;
3704 
3705     CURSOR CONTRACT_STATUS_CSR (p_status_txt VARCHAR2) IS
3706     SELECT LOOKUP_CODE FROM FND_LOOKUPS
3707     WHERE LOOKUP_TYPE = 'OKC_REP_CONTRACT_STATUSES'
3708     AND LOOKUP_CODE = 'SIGNED'
3709     AND UPPER(MEANING) = UPPER(p_status_txt);
3710 
3711     CURSOR CONTRACT_TYPE_CSR (p_type_txt VARCHAR2) IS
3712     SELECT DOCUMENT_TYPE
3713     FROM OKC_BUS_DOC_TYPES_V
3714     WHERE DOCUMENT_TYPE_CLASS = 'REPOSITORY'
3715     AND UPPER(NAME) = UPPER(p_type_txt);
3716 
3717     CURSOR CONTRACT_INTENT_CSR (p_imp_contract_id NUMBER) IS
3718     SELECT INTENT
3719     FROM OKC_BUS_DOC_TYPES_V bus_doc,
3720     OKC_REP_IMP_CONTRACTS_T temp
3721     WHERE bus_doc.name = temp.contract_type_txt
3722     AND temp.imp_contract_id = p_imp_contract_id
3723     AND bus_doc.document_type_class = 'REPOSITORY';
3724 
3725     CURSOR ORG_NAME_CSR (p_org_name VARCHAR2) IS
3726     SELECT ORGANIZATION_ID
3727     FROM HR_ALL_ORGANIZATION_UNITS
3728     WHERE UPPER(NAME) = UPPER(p_org_name)
3729     AND mo_global.check_access(ORGANIZATION_ID) = 'Y';
3730 
3731     CURSOR OWNER_NAME_CSR (p_owner_name VARCHAR2) IS
3732     SELECT FND_USER.USER_ID
3733     FROM FND_USER,
3734     PER_PEOPLE_F
3735     WHERE FND_USER.EMPLOYEE_ID = PER_PEOPLE_F.PERSON_ID
3736     AND UPPER(FND_USER.USER_NAME) = UPPER(p_owner_name);
3737 
3738     CURSOR CURRENCY_CSR (p_currency_code VARCHAR2) IS
3739     SELECT CURRENCY_CODE
3740     FROM FND_CURRENCIES
3741     WHERE UPPER(CURRENCY_CODE) = UPPER(p_currency_code)
3742     AND ENABLED_FLAG = 'Y';
3743 
3744     CURSOR AUTHORING_PARTY_CSR (p_authoring_party_txt VARCHAR2) IS
3745     SELECT LOOKUP_CODE
3746     FROM FND_LOOKUPS
3747     WHERE LOOKUP_TYPE = 'OKC_AUTHORING_PARTY'
3748     AND UPPER(MEANING) = UPPER(p_authoring_party_txt);
3749 
3750     CURSOR CONTRACT_PARTIES_CSR (p_contract_id VARCHAR2) IS
3751     SELECT PARTY_ROLE_CODE, PARTY_NAME_TXT
3752     FROM OKC_REP_IMP_PARTIES_T
3753     WHERE IMP_CONTRACT_ID = p_contract_id;
3754 
3755     l_contract_parties_rec CONTRACT_PARTIES_CSR%ROWTYPE;
3756     l_int_party_name OKC_REP_IMP_PARTIES_T.PARTY_NAME_TXT%TYPE;
3757 
3758     --CURSOR PARTY_INTENT_CSR (p_contract_type VARCHAR2, p_party_role_code VARCHAR2) IS
3759     --SELECT INTERNAL_EXTERNAL_FLAG
3760     --FROM OKC_RESP_PARTIES_B RESP_PARTIES,
3761     --OKC_BUS_DOC_TYPES_B DOC_TYPES
3762     --WHERE RESP_PARTIES.RESP_PARTY_CODE = p_party_role_code
3763     --AND RESP_PARTIES.DOCUMENT_TYPE_CLASS = 'REPOSITORY'
3764     --AND DOC_TYPES.INTENT = RESP_PARTIES.INTENT
3765     --AND DOC_TYPES.DOCUMENT_TYPE = p_contract_type;
3766 
3767     CURSOR VALID_PARTIES_CSR (p_contract_id VARCHAR2) IS
3768     SELECT VALID_FLAG, IMP_PARTY_ID
3769     FROM OKC_REP_IMP_PARTIES_T
3770     WHERE IMP_CONTRACT_ID = p_contract_id;
3771 
3772     l_valid_parties_rec VALID_PARTIES_CSR%ROWTYPE;
3773 
3774 
3775     CURSOR VALID_DOCUMENTS_CSR (p_contract_id VARCHAR2) IS
3776     SELECT VALID_FLAG, IMP_DOCUMENT_ID
3777     FROM OKC_REP_IMP_DOCUMENTS_T
3778     WHERE IMP_CONTRACT_ID = p_contract_id;
3779 
3780     l_valid_documents_rec VALID_DOCUMENTS_CSR%ROWTYPE;
3781 
3782 
3783     BEGIN
3784 
3785     l_api_name := 'validate_import_contracts';
3786 
3787     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3788       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3789               'Entered OKC_REP_UTIL_PVT.'||l_api_name);
3790       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3791               'p_request_id = ' || p_request_id);
3792 
3793     END IF;
3794 
3795     -- Standard call to check for call compatibility.
3796     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3797       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3798     END IF;
3799 
3800     -- Initialize message list if p_init_msg_list is set to TRUE.
3801     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3802       FND_MSG_PUB.initialize;
3803     END IF;
3804 
3805     --  Initialize API return status to success
3806     x_return_status := FND_API.G_RET_STS_SUCCESS;
3807 
3808     OPEN IMPORT_CONTRACTS_CSR;
3809     LOOP
3810         FETCH IMPORT_CONTRACTS_CSR INTO l_import_contracts_rec;
3811         EXIT WHEN IMPORT_CONTRACTS_CSR%NOTFOUND;
3812 
3813         --Initialize l_valid_flag for every record
3814         l_valid_flag := 'Y';
3815         --Initialize l_error_msg for every record
3816         l_error_msg := NULL;
3817         --Initialize l_int_parties_count and l_ext_parties_count
3818         l_int_parties_count := 0;
3819         l_ext_parties_count := 0;
3820         --Initialize l_intent
3821         -- l_intent := NULL;
3822         --Initialize l_contract_id
3823         l_contract_id := NULL;
3824  --Bug 6603192 Initialize l_amount
3825         l_amount := NULL;
3826 
3827 
3828         --If l_valid_flag is already set to 'N', we do not perform any more checks
3829         --Contract Number is required, if autonumbering is turned off
3830         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3831                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3832                     'Checking if user enters contract number');
3833         END IF;
3834         --Checking profile option value
3835         FND_PROFILE.GET(NAME => l_auto_number_option, VAL => l_auto_number_yn);
3836         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3837                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3838                     'Profile OKC_REP_AUTO_CON_NUMBER value is: '||l_auto_number_yn);
3839         END IF;
3840         IF l_auto_number_yn = 'Y' THEN
3841             --If auto number is on
3842             --contract_number has to be null
3843             --otherwise system should error out
3844             IF(l_import_contracts_rec.contract_number IS NOT NULL) THEN
3845                 l_valid_flag := 'N';
3846                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_NONNULL_NUMBER');
3847                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3848                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3849                     'Auto number is turned on, but contract number is not null');
3850                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3851                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3852                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3853                     'l_error_msg: '||l_error_msg);
3854                 END IF;
3855             END IF;
3856         ELSE
3857             --If auto number is off
3858             --contract_number is required
3859             --otherwise system should error out
3860             IF(l_import_contracts_rec.contract_number IS NULL) THEN
3861                 l_valid_flag := 'N';
3862                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_NUMBER');
3863                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3864                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3865                     'Auto number is turned off, but contract number is missing');
3866                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3867                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3868                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3869                     'l_error_msg: '||l_error_msg);
3870                 END IF;
3871             ELSE
3872                 --contract number is entered
3873                 --we need to check for length
3874                 IF(LENGTH(l_import_contracts_rec.contract_number) > l_contract_number_length) THEN
3875                     l_valid_flag := 'N';
3876                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_NUMBER');
3877                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3878                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3879                         'Conract number is too long');
3880                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3881                         'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3882                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3883                         'l_error_msg: '||l_error_msg);
3884                     END IF;
3885 
3886                 END IF;
3887             END IF;
3888         END IF;
3889 
3890         --If l_valid_flag is already set to 'N', we do not perform any more checks
3891         --Contract Number has to be unique
3892         IF l_valid_flag = 'Y' THEN
3893             OPEN CONTRACT_NUMBER_UNIQUE_CSR(l_import_contracts_rec.contract_number, l_import_contracts_rec.imp_contract_id);
3894                 FETCH CONTRACT_NUMBER_UNIQUE_CSR INTO l_unique_contract_number;
3895                 IF CONTRACT_NUMBER_UNIQUE_CSR%FOUND THEN
3896                     l_valid_flag := 'N';
3897                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_NONUNIQUE_NUMBER');
3898                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3899                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3900                         'Conract number is not unique');
3901                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3902                         'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3903                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3904                         'l_error_msg: '||l_error_msg);
3905                     END IF;
3906                 END IF;
3907             CLOSE CONTRACT_NUMBER_UNIQUE_CSR;
3908         END IF;
3909 
3910         --If l_valid_flag is already set to 'N', we do not perform any more checks
3911         --Contract Name is required
3912         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3913                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3914                     'Checking if user enters contract name');
3915         END IF;
3916         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_name IS NULL) THEN
3917             l_valid_flag := 'N';
3918             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_NAME');
3919             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3920                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3921                 'Contract Name is missing');
3922                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3923                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3924                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3925                 'l_error_msg: '||l_error_msg);
3926             END IF;
3927        END IF;
3928 
3929         --If l_valid_flag is already set to 'N', we do not perform any more checks
3930         --Contract Name should be <450
3931         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3932                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3933                     'Checking if contract name is too long');
3934         END IF;
3935         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.contract_name)>l_contract_name_length) THEN
3936             l_valid_flag := 'N';
3937             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_NAME');
3938             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3939                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3940                 'Contract Name is too long');
3941                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3942                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3943                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3944                 'l_error_msg: '||l_error_msg);
3945             END IF;
3946        END IF;
3947 
3948        -- If l_valid_flag is already set to 'N', we do not perform any more checks
3949        -- Validating to report error if a BUY contract is imported in Sales Workbench
3950        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3951                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3952                      'Checking if BUY intent contract is being imported in Sales Workbench');
3953        END IF;
3954        IF (l_valid_flag = 'Y') THEN
3955            OPEN CONTRACT_INTENT_CSR (l_import_contracts_rec.imp_contract_id);
3956            FETCH CONTRACT_INTENT_CSR INTO l_contract_intent;
3957            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3958                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3959               'l_contract_intent: '||l_contract_intent);
3960            END IF;
3961            IF ((is_sales_workbench() = 'Y') AND (l_contract_intent = G_INTENT_BUY)) THEN
3962                l_valid_flag := 'N';
3963                l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_SWB_INV_INTENT');
3964                IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3965                    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3966                    'Buy Intent Contract can not be imported in Sales Workbench ');
3967                    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3968                    'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3969                    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3970                    'l_error_msg: '||l_error_msg);
3971                END IF;
3972             END IF;
3973             CLOSE CONTRACT_INTENT_CSR;
3974        END IF;
3975         --If l_valid_flag is already set to 'N', we do not perform any more checks
3976         --Original System Reference Code should be <30
3977         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3978                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3979                     'Checking if Original System Reference Code is too long');
3980         END IF;
3981         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.orig_system_reference_code)>l_orig_system_code_length) THEN
3982             l_valid_flag := 'N';
3983             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_ORIG_CODE');
3984             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3985                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3986                 'Original System Reference Code is too long');
3987                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3988                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
3989                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3990                 'l_error_msg: '||l_error_msg);
3991             END IF;
3992        END IF;
3993 
3994         --If l_valid_flag is already set to 'N', we do not perform any more checks
3995         --Original System ID1 should be <100
3996         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3997                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3998                     'Checking if Original System ID1 is too long');
3999         END IF;
4000         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.orig_system_reference_id1)>l_orig_system_id1_length) THEN
4001             l_valid_flag := 'N';
4002             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_ORIG_ID1');
4003             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4004                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4005                 'Original System ID1 is too long');
4006                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4007                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4008                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4009                 'l_error_msg: '||l_error_msg);
4010             END IF;
4011        END IF;
4012 
4013         --If l_valid_flag is already set to 'N', we do not perform any more checks
4014         --Original System ID2 should be <100
4015         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4016                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4017                     'Checking if Original System ID2 is too long');
4018         END IF;
4019         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.orig_system_reference_id2)>l_orig_system_id2_length) THEN
4020             l_valid_flag := 'N';
4021             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_ORIG_ID2');
4022             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4023                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4024                 'Original System ID2 is too long');
4025                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4026                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4027                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4028                 'l_error_msg: '||l_error_msg);
4029             END IF;
4030        END IF;
4031 
4032         --If l_valid_flag is already set to 'N', we do not perform any more checks
4033         --Contract Status is required
4034         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4035                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4036                     'Checking if user enters contract status');
4037         END IF;
4038         IF l_import_contracts_rec.contract_status_txt IS NOT NULL THEN
4039             l_import_contracts_rec.contract_status_txt := LTRIM(l_import_contracts_rec.contract_status_txt);
4040             l_import_contracts_rec.contract_status_txt := RTRIM(l_import_contracts_rec.contract_status_txt);
4041         END IF;
4042 
4043         IF (l_valid_flag = 'Y' AND (l_import_contracts_rec.contract_status_txt IS NULL OR LENGTH(l_import_contracts_rec.contract_status_txt)=0)) THEN
4044             l_valid_flag := 'N';
4045             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_STATUS');
4046             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4047                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4048                 'Contract Status is missing');
4049                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4050                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4051                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4052                 'l_error_msg: '||l_error_msg);
4053             END IF;
4054        END IF;
4055 
4056         --If l_valid_flag is already set to 'N', we do not perform any more checks
4057         --Contract Status can only be 'SIGNED'
4058         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4059                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4060                     'Checking if status is valid');
4061         END IF;
4062         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_status_txt IS NOT NULL) THEN
4063             OPEN CONTRACT_STATUS_CSR(l_import_contracts_rec.contract_status_txt);
4064                 FETCH CONTRACT_STATUS_CSR INTO l_status_code;
4065                 IF CONTRACT_STATUS_CSR%NOTFOUND THEN
4066                     l_valid_flag := 'N';
4067                     l_status_code := NULL;
4068                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_STATUS');
4069                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4070                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4071                         'Contract Status is invalid');
4072                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4073                         'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4074                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4075                         'l_error_msg: '||l_error_msg);
4076                     END IF;
4077                 END IF;
4078             CLOSE CONTRACT_STATUS_CSR;
4079        END IF;
4080 
4081         --If l_valid_flag is already set to 'N', we do not perform any more checks
4082         --Contract Type is required
4083         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4084                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4085                     'Checking if user enters contract type');
4086         END IF;
4087         IF l_import_contracts_rec.contract_type_txt IS NOT NULL THEN
4088             l_import_contracts_rec.contract_type_txt := LTRIM(l_import_contracts_rec.contract_type_txt);
4089             l_import_contracts_rec.contract_type_txt := RTRIM(l_import_contracts_rec.contract_type_txt);
4090         END IF;
4091         IF (l_valid_flag = 'Y' AND (l_import_contracts_rec.contract_type_txt IS NULL OR LENGTH(l_import_contracts_rec.contract_type_txt)=0)) THEN
4092             l_valid_flag := 'N';
4093             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_CON_TYPE');
4094             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4095                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4096                 'Contract Type is missing');
4097                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4098                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4099                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4100                 'l_error_msg: '||l_error_msg);
4101             END IF;
4102        END IF;
4103 
4104         --If l_valid_flag is already set to 'N', we do not perform any more checks
4105         --Contract Type should resolve to valid contract type code
4106         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4107                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4108                     'Checking if contract type is valid');
4109         END IF;
4110         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_type_txt IS NOT NULL) THEN
4111             OPEN CONTRACT_TYPE_CSR(l_import_contracts_rec.contract_type_txt);
4112                 FETCH CONTRACT_TYPE_CSR INTO l_contract_type;
4113                 IF CONTRACT_TYPE_CSR%NOTFOUND THEN
4114                     l_valid_flag := 'N';
4115                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_CON_TYPE');
4116                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4117                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4118                         'Contract Type is invalid');
4119                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4120                         'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4121                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4122                         'l_error_msg: '||l_error_msg);
4123                     END IF;
4124                 END IF;
4125             CLOSE CONTRACT_TYPE_CSR;
4126        END IF;
4127 
4128         --If l_valid_flag is already set to 'N', we do not perform any more checks
4129         --Contract Effective Date is required
4130         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4131                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4132                     'Checking if user enters contract effective date');
4133         END IF;
4134         IF l_import_contracts_rec.contract_effective_date IS NOT NULL THEN
4135             l_import_contracts_rec.contract_effective_date := LTRIM(l_import_contracts_rec.contract_effective_date);
4136             l_import_contracts_rec.contract_effective_date := RTRIM(l_import_contracts_rec.contract_effective_date);
4137         END IF;
4138 
4139         IF (l_valid_flag = 'Y' AND (l_import_contracts_rec.contract_effective_date IS NULL OR LENGTH(l_import_contracts_rec.contract_effective_date)=0)) THEN
4140             l_valid_flag := 'N';
4141             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_EFF_DATE');
4142             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4143                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4144                 'Contract Effective Date is missing');
4145                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4146                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4147                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4148                 'l_error_msg: '||l_error_msg);
4149             END IF;
4150        END IF;
4151 
4152         --If l_valid_flag is already set to 'N', we do not perform any more checks
4153         --Contract Effective Date should be in the format specified by user language preference
4154         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4155                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4156                     'Checking if contract effective date is in the correct format');
4157         END IF;
4158         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_effective_date IS NOT NULL) THEN
4159         BEGIN
4160             l_effective_date := to_date(l_import_contracts_rec.contract_effective_date, G_IMP_DATE_FORMAT);
4161             EXCEPTION
4162                 WHEN OTHERS THEN
4163                 l_valid_flag := 'N';
4164                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_EFF_DATE');
4165                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4166                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4167                     'Contract Effective Date is not valid');
4168                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4169                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4170                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4171                     'l_error_msg: '||l_error_msg);
4172                 END IF;
4173         END;
4174        END IF;
4175 
4176         --If l_valid_flag is already set to 'N', we do not perform any more checks
4177         --Contract Expiration Date should be in the format specified by user language preference
4178         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4179                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4180                     'Checking if contract expriation date is in the correct format');
4181         END IF;
4182         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_expiration_date IS NOT NULL) THEN
4183         BEGIN
4184             l_expiration_date := to_date(l_import_contracts_rec.contract_expiration_date, G_IMP_DATE_FORMAT);
4185             EXCEPTION
4186                 WHEN OTHERS THEN
4187                 l_valid_flag := 'N';
4188                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_EXP_DATE');
4189                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4190                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4191                     'Contract Expiration Date is not valid');
4192                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4193                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4194                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4195                     'l_error_msg: '||l_error_msg);
4196                 END IF;
4197         END;
4198        END IF;
4199 
4200         --If l_valid_flag is already set to 'N', we do not perform any more checks
4201         --Contract Expiration Date should be after Contract Effective Date
4202         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4203                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4204                     'Checking if contract expriation date is in the correct format');
4205         END IF;
4206         IF (l_valid_flag = 'Y'
4207                 AND l_import_contracts_rec.contract_effective_date IS NOT NULL
4208                 AND l_import_contracts_rec.contract_expiration_date IS NOT NULL) THEN
4209             --at this point if there are any errors regarding the date format we should have caught it
4210             --so it is safe to convert the dates
4211             IF TRUNC(to_date(l_import_contracts_rec.contract_effective_date,G_IMP_DATE_FORMAT)) > TRUNC(to_date(l_import_contracts_rec.contract_expiration_date,G_IMP_DATE_FORMAT)) THEN
4212                 l_valid_flag := 'N';
4213                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_EXP_BEFORE_EFF');
4214                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4215                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4216                     'Contract Expiration Date is before Contract Effective Date');
4217                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4218                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4219                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4220                     'l_error_msg: '||l_error_msg);
4221                 END IF;
4222             END IF;
4223        END IF;
4224 
4225         --If l_valid_flag is already set to 'N', we do not perform any more checks
4226         --Organization Name is required
4227         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4228                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4229                     'Checking if user enters organization name');
4230         END IF;
4231         IF l_import_contracts_rec.org_name IS NOT NULL THEN
4232             l_import_contracts_rec.org_name := LTRIM(l_import_contracts_rec.org_name);
4233             l_import_contracts_rec.org_name := RTRIM(l_import_contracts_rec.org_name);
4234         END IF;
4235         IF (l_valid_flag = 'Y' AND (l_import_contracts_rec.org_name IS NULL OR LENGTH(l_import_contracts_rec.org_name)=0)) THEN
4236             l_valid_flag := 'N';
4237             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_ORG');
4238             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4239                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4240                 'Operating Unit is missing');
4241                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4242                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4243                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4244                 'l_error_msg: '||l_error_msg);
4245             END IF;
4246        END IF;
4247 
4248         --If l_valid_flag is already set to 'N', we do not perform any more checks
4249         --Organization Name should resolve to a valid Org ID
4250         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4251                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4252                     'Checking if organization name is valid');
4253         END IF;
4254         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.org_name IS NOT NULL) THEN
4255             OPEN ORG_NAME_CSR(l_import_contracts_rec.org_name);
4256             FETCH ORG_NAME_CSR INTO l_org_id;
4257             IF ORG_NAME_CSR%NOTFOUND THEN
4258                 l_valid_flag := 'N';
4259                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_ORG');
4260                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4261                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4262                     'Operating Unit is invalid');
4263                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4264                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4265                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4266                     'l_error_msg: '||l_error_msg);
4267                 END IF;
4268             END IF;
4269             CLOSE ORG_NAME_CSR;
4270        END IF;
4271 
4272         --If l_valid_flag is already set to 'N', we do not perform any more checks
4273         --Organization Name is required
4274         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4275                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4276                     'Checking if user enters owner user name');
4277         END IF;
4278         IF l_import_contracts_rec.owner_user_name IS NOT NULL THEN
4279             l_import_contracts_rec.owner_user_name := LTRIM(l_import_contracts_rec.owner_user_name);
4280             l_import_contracts_rec.owner_user_name := RTRIM(l_import_contracts_rec.owner_user_name);
4281         END IF;
4282         IF (l_valid_flag = 'Y' AND (l_import_contracts_rec.owner_user_name IS NULL OR LENGTH(l_import_contracts_rec.owner_user_name)=0)) THEN
4283             l_valid_flag := 'N';
4284             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_OWNER');
4285             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4286                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4287                 'Owner User Name is missing');
4288                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4289                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4290                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4291                 'l_error_msg: '||l_error_msg);
4292             END IF;
4293        END IF;
4294 
4295         --If l_valid_flag is already set to 'N', we do not perform any more checks
4296         --Owner User Name should resolve to a valid FND User ID
4297         --Also, the owner needs to be an employee
4298         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4299                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4300                     'Checking if owner user name is valid');
4301         END IF;
4302         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.owner_user_name IS NOT NULL) THEN
4303             OPEN OWNER_NAME_CSR(l_import_contracts_rec.owner_user_name);
4304             FETCH OWNER_NAME_CSR INTO l_owner_user_id;
4305             IF OWNER_NAME_CSR%NOTFOUND THEN
4306                 l_valid_flag := 'N';
4307                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_OWNER');
4308                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4309                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4310                     'Owner User Name is invalid');
4311                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4312                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4313                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4314                     'l_error_msg: '||l_error_msg);
4315                 END IF;
4316             END IF;
4317             CLOSE OWNER_NAME_CSR;
4318        END IF;
4319 
4320         --If l_valid_flag is already set to 'N', we do not perform any more checks
4321         --Currency Code is required if Amount is entered
4322         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4323                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4324                     'Checking if user enters currency when amount is entered');
4325         END IF;
4326         IF l_import_contracts_rec.currency_code IS NOT NULL THEN
4327             l_import_contracts_rec.currency_code := LTRIM(l_import_contracts_rec.currency_code);
4328             l_import_contracts_rec.currency_code := RTRIM(l_import_contracts_rec.currency_code);
4329         END IF;
4330         IF (l_valid_flag = 'Y'
4331                 AND l_import_contracts_rec.contract_amount IS NOT NULL
4332                 AND (l_import_contracts_rec.currency_code IS NULL OR LENGTH(l_import_contracts_rec.currency_code)=0)) THEN
4333             l_valid_flag := 'N';
4334             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_MISS_CURRENCY');
4335             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4336                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4337                 'Owner User Name is missing');
4338                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4339                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4340                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4341                 'l_error_msg: '||l_error_msg);
4342             END IF;
4343        END IF;
4344 
4345         --If l_valid_flag is already set to 'N', we do not perform any more checks
4346         --Currency should exist in FND_CURRENCIES table
4347         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4348                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4349                     'Checking if currency is valid');
4350         END IF;
4351         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.currency_code IS NOT NULL) THEN
4352             OPEN CURRENCY_CSR(l_import_contracts_rec.currency_code);
4353             FETCH CURRENCY_CSR INTO l_currency_code;
4354             IF CURRENCY_CSR%NOTFOUND THEN
4355                 l_valid_flag := 'N';
4356                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_CURRENCY');
4357                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4358                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4359                     'Currency is invalid');
4360                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4361                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4362                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4363                     'l_error_msg: '||l_error_msg);
4364                 END IF;
4365             END IF;
4366             CLOSE CURRENCY_CSR;
4367        END IF;
4368 
4369         --If l_valid_flag is already set to 'N', we do not perform any more checks
4370         --Amout should be in the format specified by user language preference
4371         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4372                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4373                     'Checking if amount is in the correct format');
4374         END IF;
4375         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.contract_amount IS NOT NULL) THEN
4376         BEGIN
4377             l_amount := to_number(l_import_contracts_rec.contract_amount, G_IMP_NUMBER_FORMAT);
4378             EXCEPTION
4379             WHEN OTHERS THEN
4380             l_valid_flag := 'N';
4381             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_AMOUNT');
4382             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4383                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4384                 'Amount is not valid');
4385                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4386                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4387                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4388                 'l_error_msg: '||l_error_msg);
4389             END IF;
4390         END;
4391 
4392 
4393        END IF;
4394 
4395         --If l_valid_flag is already set to 'N', we do not perform any more checks
4396         --Authoring Party should resolve to valid authoring_party_code
4397         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4398                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4399                     'Checking if authoring party is valid');
4400         END IF;
4401         IF (l_valid_flag = 'Y' AND l_import_contracts_rec.authoring_party_txt IS NOT NULL) THEN
4402             OPEN AUTHORING_PARTY_CSR(l_import_contracts_rec.authoring_party_txt);
4403             FETCH AUTHORING_PARTY_CSR INTO l_authoring_party_code;
4404             IF AUTHORING_PARTY_CSR%NOTFOUND THEN
4405                 l_valid_flag := 'N';
4406                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_AUTH_PARTY');
4407                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4408                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4409                     'Authoring Party is invalid');
4410                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4411                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4412                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4413                     'l_error_msg: '||l_error_msg);
4414                 END IF;
4415             END IF;
4416             CLOSE AUTHORING_PARTY_CSR;
4417        END IF;
4418 
4419         --If l_valid_flag is already set to 'N', we do not perform any more checks
4420         --Physical Location should be <2000
4421         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4422                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4423                     'Checking if Physical Location is too long');
4424         END IF;
4425         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.physical_location)>l_location_length) THEN
4426             l_valid_flag := 'N';
4427             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_LOCATION');
4428             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4429                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4430                 'Physical Location is too long');
4431                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4432                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4433                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4434                 'l_error_msg: '||l_error_msg);
4435             END IF;
4436        END IF;
4437 
4438         --If l_valid_flag is already set to 'N', we do not perform any more checks
4439         --Keywords should be <2000
4440         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4441                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4442                     'Checking if keywords is too long');
4443         END IF;
4444         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.keywords)>l_keywords_length) THEN
4445             l_valid_flag := 'N';
4446             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_KEYWORDS');
4447             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4448                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4449                 'Keywords is too long');
4450                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4451                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4452                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4453                 'l_error_msg: '||l_error_msg);
4454             END IF;
4455        END IF;
4456 
4457         --If l_valid_flag is already set to 'N', we do not perform any more checks
4458         --Description should be <2000
4459         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4460                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4461                     'Checking if description is too long');
4462         END IF;
4463         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.description)>l_description_length) THEN
4464             l_valid_flag := 'N';
4465             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_DESC');
4466             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4467                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4468                 'Description is too long');
4469                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4470                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4471                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4472                 'l_error_msg: '||l_error_msg);
4473             END IF;
4474        END IF;
4475 
4476         --If l_valid_flag is already set to 'N', we do not perform any more checks
4477         --Version Comments should be <2000
4478         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4479                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4480                     'Checking if version comments is too long');
4481         END IF;
4482         IF (l_valid_flag = 'Y' AND LENGTH(l_import_contracts_rec.version_comments)>l_version_comments_length) THEN
4483             l_valid_flag := 'N';
4484             l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_LONG_COMMENTS');
4485             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4486                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4487                 'Version Comments is too long');
4488                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4489                 'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4490                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4491                 'l_error_msg: '||l_error_msg);
4492             END IF;
4493        END IF;
4494 
4495         --If l_valid_flag is already set to 'N', we do not perform any more checks
4496         --Validate Contract Parties
4497         --1. There should exactly one internal party
4498         --2. There should be at least one external party
4499         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4500                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4501                     'Validating contract parties');
4502         END IF;
4503         IF (l_valid_flag = 'Y') THEN
4504             OPEN CONTRACT_PARTIES_CSR(l_import_contracts_rec.imp_contract_id);
4505             LOOP
4506                 FETCH CONTRACT_PARTIES_CSR INTO l_contract_parties_rec;
4507                 EXIT WHEN CONTRACT_PARTIES_CSR%NOTFOUND;
4508 
4509                 --At this point if the l_valid_flag is still 'Y', it means that l_contract_type is resolved
4510                 IF (l_contract_parties_rec.party_role_code = G_PARTY_ROLE_INTERNAL) THEN
4511                   l_int_parties_count := l_int_parties_count + 1;
4512       l_int_party_name := l_contract_parties_rec.party_name_txt;
4513                 ELSE
4514                   l_ext_parties_count := l_ext_parties_count + 1;
4515                 END IF;
4516             END LOOP;
4517             CLOSE CONTRACT_PARTIES_CSR;
4518 
4519             IF l_int_parties_count <> 1 THEN
4520                 l_valid_flag := 'N';
4521                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_INT_PARTIES');
4522                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4523                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4524                     'There are not exactly one internal party');
4525                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4526                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4527                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4528                     'l_error_msg: '||l_error_msg);
4529                 END IF;
4530           ELSE
4531                 --fix bug 4160416, need to validate internal party name with the org name in the header
4532                 IF l_import_contracts_rec.org_name <> l_int_party_name THEN
4533                     l_valid_flag := 'N';
4534                     l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_INT_PARTY_NAME');
4535                     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4536                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4537                         'Internal party name and org name are not matching');
4538                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4539                         'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4540                         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4541                         'l_error_msg: '||l_error_msg);
4542                     END IF;
4543                 END IF;
4544             END IF;
4545 
4546             IF l_ext_parties_count <1 THEN
4547                 l_valid_flag := 'N';
4548                 l_error_msg := fnd_message.get_string(G_APP_NAME,'OKC_REP_IMP_INV_EXT_PARTIES');
4549                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4550                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4551                     'There are less than one external party');
4552                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4553                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4554                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4555                     'l_error_msg: '||l_error_msg);
4556                 END IF;
4557             END IF;
4558        END IF;
4559 
4560 
4561         --If any of the parties and documents belonging to the contract is invalid,
4562         --We should flag the contract as invalid
4563 
4564         IF l_valid_flag = 'Y' THEN
4565             OPEN VALID_PARTIES_CSR(l_import_contracts_rec.imp_contract_id);
4566             LOOP
4567             FETCH VALID_PARTIES_CSR INTO l_valid_parties_rec;
4568             EXIT WHEN VALID_PARTIES_CSR%NOTFOUND;
4569 
4570             IF l_valid_parties_rec.valid_flag = 'N' THEN
4571                 l_valid_flag := 'N';
4572                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4573                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4574                     'One of the contract parties is invalid');
4575                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4576                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4577                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4578                     'Party ID: '||l_valid_parties_rec.imp_party_id);
4579                 END IF;
4580             END IF;
4581             END LOOP;
4582             CLOSE VALID_PARTIES_CSR;
4583         END IF;
4584 
4585         IF l_valid_flag = 'Y' THEN
4586 
4587             OPEN VALID_DOCUMENTS_CSR(l_import_contracts_rec.imp_contract_id);
4588             LOOP
4589             FETCH VALID_DOCUMENTS_CSR INTO l_valid_documents_rec;
4590             EXIT WHEN VALID_DOCUMENTS_CSR%NOTFOUND;
4591 
4592             IF l_valid_documents_rec.valid_flag = 'N' THEN
4593                 l_valid_flag := 'N';
4594                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4595                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4596                     'One of the contract documents is invalid');
4597                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4598                     'Contract ID: '||l_import_contracts_rec.imp_contract_id);
4599                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4600                     'Document ID: '||l_valid_documents_rec.imp_document_id);
4601                 END IF;
4602             END IF;
4603             END LOOP;
4604             CLOSE VALID_DOCUMENTS_CSR;
4605         END IF;
4606 
4607 
4608         --Populate the error message table
4609         IF(l_valid_flag = 'N' AND l_error_msg IS NOT NULL) THEN
4610             populate_import_errors(p_init_msg_list => FND_API.G_FALSE,
4611                                    p_api_version => 1.0,
4612                                    p_contract_id => l_import_contracts_rec.imp_contract_id,
4613                                    p_error_obj_type => G_IMP_CONTRACT_ERROR,
4614                                    p_error_obj_id => l_import_contracts_rec.imp_contract_id,
4615                                    p_error_msg_txt => l_error_msg,
4616                                    p_program_id => l_import_contracts_rec.program_id,
4617                                    p_program_login_id => l_import_contracts_rec.program_login_id,
4618                                    p_program_app_id => l_import_contracts_rec.program_application_id,
4619                                    p_request_id => l_import_contracts_rec.request_id,
4620                                    x_return_status => x_return_status,
4621                                    x_msg_count => x_msg_count,
4622                                    x_msg_data => x_msg_data);
4623         END IF;
4624 
4625         l_contract_number := l_import_contracts_rec.contract_number;
4626 
4627         --Get the contract_id from the sequence
4628         --We do not waste contract IDs on invalid contracts
4629         IF(l_valid_flag = 'Y') THEN
4630             OPEN CONTRACT_ID_CSR;
4631             FETCH CONTRACT_ID_CSR INTO l_contract_id;
4632             CLOSE CONTRACT_ID_CSR;
4633 
4634             --Also update okc_rep_imp_parties_t and okc_rep_imp_documents_t
4635             --with the new contract_id
4636             UPDATE OKC_REP_IMP_PARTIES_T
4637             SET CONTRACT_ID = l_contract_id
4638             WHERE IMP_CONTRACT_ID = l_import_contracts_rec.imp_contract_id;
4639 
4640             UPDATE OKC_REP_IMP_DOCUMENTS_T
4641             SET CONTRACT_ID = l_contract_id
4642             WHERE IMP_CONTRACT_ID = l_import_contracts_rec.imp_contract_id;
4643 
4644 
4645 
4646             IF (l_auto_number_yn = 'Y') THEN
4647                 --Get the contract_number from the sequence
4648                 --if auto number is on
4649                 OPEN CONTRACT_NUMBER_CSR;
4650                 FETCH CONTRACT_NUMBER_CSR INTO l_contract_number;
4651                 CLOSE CONTRACT_NUMBER_CSR;
4652             END IF;
4653         END IF;
4654 
4655         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4656             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4657               'l_contract_id: '||l_contract_id);
4658             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4659               'l_contract_number: '||l_contract_number);
4660         END IF;
4661 
4662         IF (l_valid_flag = 'Y') THEN
4663         --Update the record
4664         UPDATE OKC_REP_IMP_CONTRACTS_T
4665         SET
4666         CONTRACT_ID = l_contract_id,
4667         CONTRACT_NUMBER = l_contract_number,
4668         CONTRACT_STATUS_CODE = l_status_code,
4669         CONTRACT_TYPE = l_contract_type,
4670         AUTHORING_PARTY_CODE = l_authoring_party_code,
4671         ORG_ID = l_org_id,
4672         OWNER_USER_ID = l_owner_user_id,
4673         --CONTRACT_EFFECTIVE_DATE = l_effective_date,
4674         --CONTRACT_EXPIRATION_DATE = l_expiration_date,
4675         CONTRACT_AMOUNT = l_amount,
4676         VALID_FLAG = l_valid_flag
4677         WHERE IMP_CONTRACT_ID = l_import_contracts_rec.imp_contract_id;
4678 
4679         END IF;
4680 
4681 
4682         IF(l_valid_flag = 'N') THEN
4683         UPDATE OKC_REP_IMP_CONTRACTS_T
4684         SET
4685         VALID_FLAG = l_valid_flag
4686         WHERE IMP_CONTRACT_ID = l_import_contracts_rec.imp_contract_id;
4687         END IF;
4688     END LOOP;
4689     CLOSE IMPORT_CONTRACTS_CSR;
4690 
4691     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4692       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4693               'Leaving OKC_REP_UTIL_PVT.'||l_api_name);
4694    END IF;
4695 
4696 
4697   EXCEPTION
4698 
4699     WHEN FND_API.G_EXC_ERROR THEN
4700 
4701     IF CONTRACT_ID_CSR%ISOPEN THEN
4702         CLOSE CONTRACT_ID_CSR;
4703     END IF;
4704 
4705     IF CONTRACT_NUMBER_CSR%ISOPEN THEN
4706         CLOSE CONTRACT_NUMBER_CSR;
4707     END IF;
4708 
4709     IF CONTRACT_INTENT_CSR%ISOPEN THEN
4710         CLOSE CONTRACT_INTENT_CSR;
4711     END IF;
4712 
4713     IF IMPORT_CONTRACTS_CSR%ISOPEN THEN
4714         CLOSE IMPORT_CONTRACTS_CSR;
4715     END IF;
4716     IF CONTRACT_NUMBER_UNIQUE_CSR%ISOPEN THEN
4717         CLOSE CONTRACT_NUMBER_UNIQUE_CSR;
4718     END IF;
4719     IF CONTRACT_STATUS_CSR%ISOPEN THEN
4720         CLOSE CONTRACT_STATUS_CSR;
4721     END IF;
4722     IF CONTRACT_TYPE_CSR%ISOPEN THEN
4723         CLOSE CONTRACT_TYPE_CSR;
4724     END IF;
4725     IF ORG_NAME_CSR%ISOPEN THEN
4726         CLOSE ORG_NAME_CSR;
4727     END IF;
4728     IF OWNER_NAME_CSR%ISOPEN THEN
4729         CLOSE OWNER_NAME_CSR;
4730     END IF;
4731     IF CURRENCY_CSR%ISOPEN THEN
4732         CLOSE CURRENCY_CSR;
4733     END IF;
4734     IF AUTHORING_PARTY_CSR%ISOPEN THEN
4735         CLOSE AUTHORING_PARTY_CSR;
4736     END IF;
4737     IF CONTRACT_PARTIES_CSR%ISOPEN THEN
4738         CLOSE CONTRACT_PARTIES_CSR;
4739     END IF;
4740     --IF PARTY_INTENT_CSR%ISOPEN THEN
4741     --    CLOSE PARTY_INTENT_CSR;
4742     --END IF;
4743     IF VALID_PARTIES_CSR%ISOPEN THEN
4744         CLOSE VALID_PARTIES_CSR;
4745     END IF;
4746     IF VALID_DOCUMENTS_CSR%ISOPEN THEN
4747         CLOSE VALID_DOCUMENTS_CSR;
4748     END IF;
4749 
4750       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4751         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
4752              'Leaving '||l_api_name||':FND_API.G_EXC_ERROR Exception');
4753       END IF;
4754 
4755       x_return_status := FND_API.G_RET_STS_ERROR;
4756       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
4757                                 p_data  =>  x_msg_data);
4758 
4759     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4760     IF CONTRACT_ID_CSR%ISOPEN THEN
4761         CLOSE CONTRACT_ID_CSR;
4762     END IF;
4763 
4764     IF CONTRACT_NUMBER_CSR%ISOPEN THEN
4765         CLOSE CONTRACT_NUMBER_CSR;
4766     END IF;
4767     IF CONTRACT_NUMBER_UNIQUE_CSR%ISOPEN THEN
4768         CLOSE CONTRACT_NUMBER_UNIQUE_CSR;
4769     END IF;
4770 
4771     IF CONTRACT_INTENT_CSR%ISOPEN THEN
4772         CLOSE CONTRACT_INTENT_CSR;
4773     END IF;
4774 
4775     IF IMPORT_CONTRACTS_CSR%ISOPEN THEN
4776         CLOSE IMPORT_CONTRACTS_CSR;
4777     END IF;
4778     IF CONTRACT_STATUS_CSR%ISOPEN THEN
4779         CLOSE CONTRACT_STATUS_CSR;
4780     END IF;
4781     IF CONTRACT_TYPE_CSR%ISOPEN THEN
4782         CLOSE CONTRACT_TYPE_CSR;
4783     END IF;
4784     IF ORG_NAME_CSR%ISOPEN THEN
4785         CLOSE ORG_NAME_CSR;
4786     END IF;
4787     IF OWNER_NAME_CSR%ISOPEN THEN
4788         CLOSE OWNER_NAME_CSR;
4789     END IF;
4790     IF CURRENCY_CSR%ISOPEN THEN
4791         CLOSE CURRENCY_CSR;
4792     END IF;
4793     IF AUTHORING_PARTY_CSR%ISOPEN THEN
4794         CLOSE AUTHORING_PARTY_CSR;
4795     END IF;
4796     IF CONTRACT_PARTIES_CSR%ISOPEN THEN
4797         CLOSE CONTRACT_PARTIES_CSR;
4798     END IF;
4799     --IF PARTY_INTENT_CSR%ISOPEN THEN
4800     --    CLOSE PARTY_INTENT_CSR;
4801     --END IF;
4802     IF VALID_PARTIES_CSR%ISOPEN THEN
4803         CLOSE VALID_PARTIES_CSR;
4804     END IF;
4805     IF VALID_DOCUMENTS_CSR%ISOPEN THEN
4806         CLOSE VALID_DOCUMENTS_CSR;
4807     END IF;
4808 
4809       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4810         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
4811              'Leaving '||l_api_name||':FND_API.G_EXC_UNEXPECTED_ERROR Exception');
4812       END IF;
4813 
4814       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
4815       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
4816                                 p_data  =>  x_msg_data);
4817 
4818     WHEN OTHERS THEN
4819     IF CONTRACT_ID_CSR%ISOPEN THEN
4820         CLOSE CONTRACT_ID_CSR;
4821     END IF;
4822 
4823     IF CONTRACT_NUMBER_CSR%ISOPEN THEN
4824         CLOSE CONTRACT_NUMBER_CSR;
4825     END IF;
4826 
4827     IF CONTRACT_NUMBER_UNIQUE_CSR%ISOPEN THEN
4828         CLOSE CONTRACT_NUMBER_UNIQUE_CSR;
4829     END IF;
4830 
4831     IF CONTRACT_INTENT_CSR%ISOPEN THEN
4832         CLOSE CONTRACT_INTENT_CSR;
4833     END IF;
4834 
4835     IF IMPORT_CONTRACTS_CSR%ISOPEN THEN
4836         CLOSE IMPORT_CONTRACTS_CSR;
4837     END IF;
4838     IF CONTRACT_STATUS_CSR%ISOPEN THEN
4839         CLOSE CONTRACT_STATUS_CSR;
4840     END IF;
4841     IF CONTRACT_TYPE_CSR%ISOPEN THEN
4842         CLOSE CONTRACT_TYPE_CSR;
4843     END IF;
4844     IF ORG_NAME_CSR%ISOPEN THEN
4845         CLOSE ORG_NAME_CSR;
4846     END IF;
4847     IF OWNER_NAME_CSR%ISOPEN THEN
4848         CLOSE OWNER_NAME_CSR;
4849     END IF;
4850     IF CURRENCY_CSR%ISOPEN THEN
4851         CLOSE CURRENCY_CSR;
4852     END IF;
4853     IF AUTHORING_PARTY_CSR%ISOPEN THEN
4854         CLOSE AUTHORING_PARTY_CSR;
4855     END IF;
4856     IF CONTRACT_PARTIES_CSR%ISOPEN THEN
4857         CLOSE CONTRACT_PARTIES_CSR;
4858     END IF;
4859     --IF PARTY_INTENT_CSR%ISOPEN THEN
4860     --    CLOSE PARTY_INTENT_CSR;
4861     --END IF;
4862     IF VALID_PARTIES_CSR%ISOPEN THEN
4863         CLOSE VALID_PARTIES_CSR;
4864     END IF;
4865     IF VALID_DOCUMENTS_CSR%ISOPEN THEN
4866         CLOSE VALID_DOCUMENTS_CSR;
4867     END IF;
4868 
4869 
4870       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4871         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
4872              'Leaving '||l_api_name||' because of EXCEPTION: ' || sqlerrm);
4873       END IF;
4874 
4875       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
4876                           p_msg_name     => G_UNEXPECTED_ERROR,
4877                           p_token1       => G_SQLCODE_TOKEN,
4878                           p_token1_value => sqlcode,
4879                           p_token2       => G_SQLERRM_TOKEN,
4880                           p_token2_value => sqlerrm);
4881       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4882       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
4883                                 p_data  =>  x_msg_data);
4884 
4885   END validate_import_contracts;
4886 
4887 
4888 
4889   -- Start of comments
4890   --API name      : insert_prod_data
4891   --Type          : Private.
4892   --Function      : Insert validated contracts and parties into production tables
4893   --                i.e., move from OKC_REP_IMP_CONTRACTS_T and OKC_REP_IMP_PARTIES_T
4894   --                to OKC_REP_CONTRACTS_ALL AND OKC_REP_CONTRACT_PARTIES
4895   --                It also insert a record into OKC_REP_CON_STATUS_HIST for every record
4896   --                inserted into OKC_REP_CONTRACTS_ALL.
4897   --Pre-reqs      : Currently only called from repository import.
4898   --                Contracts should be saved to the OKC_REP_IMP_CONTRACTS_T table
4899   --                Date should all be validated in OKC_REP_IMP_CONTRACTS_T,
4900   --              : OKC_REP_IMP_PARTIES_T, and OKC_REP_IMP_DOCUMENTS_T
4901   --Parameters    :
4902   --IN            : p_api_version         IN NUMBER       Required
4903   --              : p_init_msg_list       IN VARCHAR2     Optional
4904   --                   Default = FND_API.G_FALSE
4905   --              : p_commit             IN VARCHAR2  Optional
4906   --                   Default = FND_API.G_FALSE
4907   --              : p_request_id         IN NUMBER       Required
4908   --                    Concurrent Program Request ID
4909   --OUT           : x_return_status       OUT  VARCHAR2(1)
4910   --              : x_msg_count           OUT  NUMBER
4911   --              : x_msg_data            OUT  VARCHAR2(2000)
4912   --              : x_number_inserted     OUT NUMBER
4913   -- End of comments
4914 
4915   PROCEDURE insert_prod_data (
4916     p_api_version       IN  NUMBER,
4917     p_init_msg_list     IN  VARCHAR2,
4918     p_commit            IN  VARCHAR2,
4919     p_request_id        IN  NUMBER,
4920     x_msg_data          OUT NOCOPY VARCHAR2,
4921     x_msg_count         OUT NOCOPY NUMBER,
4922     x_return_status     OUT NOCOPY VARCHAR2,
4923     x_number_inserted   OUT NOCOPY NUMBER)
4924   IS
4925 
4926     l_api_name            CONSTANT VARCHAR2(30):='insert_prod_data';
4927     l_api_version         CONSTANT NUMBER := 1.0;
4928 
4929     l_number_inserted   NUMBER;
4930     l_number_valid      NUMBER;
4931 
4932     l_min_contract_id     NUMBER;
4933     l_max_contract_id     NUMBER;
4934     l_start_contract_id   NUMBER;
4935     l_insert_batch_size   NUMBER;
4936 
4937     CURSOR number_inserted_csr IS
4938     SELECT COUNT(contract_id)
4939     FROM   okc_rep_contracts_all
4940     WHERE  request_id = p_request_id;
4941 
4942     CURSOR contract_id_cur IS
4943     SELECT
4944         MIN(contract_id) AS min_contract_id,
4945         MAX(contract_id) AS max_contract_id,
4946         COUNT(contract_id)
4947     FROM  okc_rep_imp_contracts_t
4948     WHERE request_id = p_request_id
4949     AND   valid_flag = 'Y';
4950 
4951   BEGIN
4952 
4953      FND_FILE.PUT_LINE(FND_FILE.LOG, '**********************************');
4954      FND_FILE.PUT_LINE(FND_FILE.LOG, '***** BEGIN insert_prod_data *****');
4955      FND_FILE.PUT_LINE(FND_FILE.LOG, '**********************************');
4956 
4957      FND_FILE.PUT_LINE(FND_FILE.LOG, 'p_api_version = ' || p_api_version);
4958      FND_FILE.PUT_LINE(FND_FILE.LOG, 'p_request_id = ' || p_request_id);
4959 
4960      l_insert_batch_size := 50;
4961      l_number_inserted := 0;
4962      l_number_valid  := -1;
4963 
4964      FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_insert_batch_size = ' || l_insert_batch_size);
4965 
4966     -- Standard call to check for call compatibility.
4967     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4968       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4969     END IF;
4970 
4971     -- Initialize message list if p_init_msg_list is set to TRUE.
4972     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4973       FND_MSG_PUB.initialize;
4974     END IF;
4975 
4976     --  Initialize API return status to success
4977     x_return_status := FND_API.G_RET_STS_SUCCESS;
4978 
4979     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4980       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4981               'Inserting contracts into production table...');
4982     END IF;
4983 
4984     l_min_contract_id := 0;
4985     l_max_contract_id := 0;
4986 
4987     OPEN  contract_id_cur;
4988     FETCH contract_id_cur INTO l_min_contract_id, l_max_contract_id, l_number_valid;
4989     CLOSE contract_id_cur;
4990 
4991     FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_number_valid = ' || l_number_valid);
4992 
4993     IF l_number_valid > 0 THEN
4994 
4995 
4996           FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_min_contract_id = ' || l_min_contract_id);
4997           FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_max_contract_id = ' || l_max_contract_id);
4998 
4999           l_start_contract_id := l_min_contract_id;
5000 
5001           FOR i IN 0..l_number_valid LOOP
5002 
5003             FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_start_contract_id = ' || l_start_contract_id);
5004 
5005             BEGIN
5006 
5007               SAVEPOINT before_insert_contracts;
5008 
5009               FND_FILE.PUT_LINE(FND_FILE.LOG, '***** SAVEPOINT before_insert_contracts *****');
5010 
5011               --Bulk insert contracts
5012               INSERT INTO okc_rep_contracts_all
5013                 (contract_id,
5014                 contract_version_num,
5015                 contract_name,
5016                 contract_number,
5017                 contract_desc,
5018                 contract_type,
5019                 contract_status_code,
5020                 version_comments,
5021                 org_id,
5022                 authoring_party_code,
5023                 owner_id,
5024                 contract_effective_date,
5025                 contract_expiration_date,
5026                 currency_code,
5027                 amount,
5028                 keywords,
5029                 physical_location,
5030                 source_language,
5031                 object_version_number,
5032                 created_by,
5033                 creation_date,
5034                 last_updated_by,
5035                 last_update_date,
5036                 last_update_login,
5037                 program_id,
5038                 program_login_id,
5039                 program_application_id,
5040                 request_id,
5041                 latest_signed_ver_number,
5042                 orig_system_reference_code,
5043                 orig_system_reference_id1,
5044                 orig_system_reference_id2
5045                 )
5046               SELECT
5047                 contract_id,
5048                 1, --contract_version_num,
5049                 contract_name,
5050                 contract_number,
5051                 description,
5052                 contract_type,
5053                 contract_status_code,
5054                 version_comments,
5055                 org_id,
5056                 authoring_party_code,
5057                 owner_user_id,
5058                 TO_DATE(contract_effective_date, G_IMP_DATE_FORMAT),
5059                 TO_DATE(contract_expiration_date, G_IMP_DATE_FORMAT),
5060                 currency_code,
5061                 contract_amount,
5062                 keywords,
5063                 physical_location,
5064                 USERENV('LANG'),--source_language,
5065                 1, --object_version_number,
5066                 FND_GLOBAL.USER_ID, --created_by,
5067                 SYSDATE, --creation_date,
5068                 FND_GLOBAL.USER_ID, --last_updated_by,
5069                 SYSDATE, --last_update_date,
5070                 FND_GLOBAL.USER_ID, --last_update_login,
5071                 program_id,
5072                 program_login_id,
5073                 program_application_id,
5074                 request_id,
5075                 1, --latest_signed_ver_number,
5076                 orig_system_reference_code,
5077                 orig_system_reference_id1,
5078                 orig_system_reference_id2
5079               FROM  okc_rep_imp_contracts_t
5080               WHERE request_id = p_request_id
5081               AND   valid_flag = 'Y'
5082               AND   contract_id >= l_start_contract_id
5083               AND   contract_id <  l_start_contract_id + l_insert_batch_size;
5084 
5085             FND_FILE.PUT_LINE(FND_FILE.LOG, '***** INSERT INTO okc_rep_contracts_all *****');
5086 
5087             --insert into contract parties
5088             INSERT INTO okc_rep_contract_parties
5089               (
5090               contract_id,
5091               party_role_code,
5092               party_id,
5093               --signed_by,
5094               --signed_date,
5095               object_version_number,
5096               created_by,
5097               creation_date,
5098               last_updated_by,
5099               last_update_date,
5100               last_update_login,
5101               program_id,
5102               program_login_id,
5103               program_application_id,
5104               request_id
5105               )
5106             SELECT
5107               contract_id,
5108               party_role_code,
5109               party_id,
5110               --signed_by_txt,
5111               --TO_DATE(signed_date, G_IMP_DATE_FORMAT),
5112               1, --object_version_number,
5113               FND_GLOBAL.USER_ID, --CREATED_BY,
5114               SYSDATE, --CREATION_DATE,
5115               FND_GLOBAL.USER_ID, --LAST_UPDATED_BY,
5116               SYSDATE, --LAST_UPDATE_DATE,
5117               FND_GLOBAL.USER_ID, --LAST_UPDATE_LOGIN,
5118               program_id,
5119               program_login_id,
5120               program_application_id,
5121               request_id
5122             FROM okc_rep_imp_parties_t
5123             WHERE valid_flag = 'Y'
5124             AND   request_id = p_request_id
5125             AND   contract_id IS NOT NULL
5126             AND   contract_id >= l_start_contract_id
5127             AND   contract_id <  l_start_contract_id + l_insert_batch_size;
5128 
5129             FND_FILE.PUT_LINE(FND_FILE.LOG, '***** INSERT INTO okc_rep_contract_parties *****');
5130 
5131             --insert into okc_rep_signature_details
5132             INSERT INTO OKC_REP_SIGNATURE_DETAILS
5133               (
5134               contract_id,
5135               contract_version_num,
5136               party_role_code,
5137               party_id,
5138               signed_by,
5139               signed_date,
5140               object_version_number,
5141               created_by,
5142               creation_date,
5143               last_updated_by,
5144               last_update_date,
5145               last_update_login,
5146               program_id,
5147               program_login_id,
5148               program_application_id,
5149               request_id
5150               )
5151             SELECT
5152               contract_id,
5153               1, -- ontract_version_num
5154               party_role_code,
5155               party_id,
5156               signed_by_txt,
5157               TO_DATE(signed_date, g_imp_date_format),
5158               1, --object_version_number,
5159               FND_GLOBAL.USER_ID, --created_by,
5160               SYSDATE, --creation_date,
5161               FND_GLOBAL.USER_ID, --last_updated_by,
5162               SYSDATE, --last_update_date,
5163               FND_GLOBAL.USER_ID, --last_update_login,
5164               program_id,
5165               program_login_id,
5166               program_application_id,
5167               request_id
5168             FROM  okc_rep_imp_parties_t
5169             WHERE valid_flag = 'Y'
5170             AND   request_id = p_request_id
5171             AND   contract_id IS NOT NULL
5172             AND   contract_id >= l_start_contract_id
5173             AND   contract_id <  l_start_contract_id + l_insert_batch_size;
5174 
5175             FND_FILE.PUT_LINE(FND_FILE.LOG, '***** INSERT INTO OKC_REP_SIGNATURE_DETAILS *****');
5176 
5177             --insert into status history
5178             INSERT INTO okc_rep_con_status_hist
5179               (
5180               contract_id,
5181               contract_version_num,
5182               status_code,
5183               status_change_date,
5184               changed_by_user_id,
5185               object_version_number,
5186               created_by,
5187               creation_date,
5188               last_updated_by,
5189               last_update_date,
5190               last_update_login
5191               )
5192             SELECT
5193               contract_id,
5194               contract_version_num,
5195               contract_status_code,
5196               SYSDATE,
5197               FND_GLOBAL.USER_ID,
5198               object_version_number,
5199               created_by,
5200               creation_date,
5201               last_updated_by,
5202               last_update_date,
5203               last_update_login
5204             FROM  okc_rep_contracts_all
5205             WHERE request_id = p_request_id
5206             AND   created_by = FND_GLOBAL.USER_ID
5207             AND   contract_id >= l_start_contract_id
5208             AND   contract_id <  l_start_contract_id + l_insert_batch_size;
5209 
5210             FND_FILE.PUT_LINE(FND_FILE.LOG, '***** INSERT INTO okc_rep_con_status_hist *****');
5211 
5212             COMMIT;
5213 
5214             FND_FILE.PUT_LINE(FND_FILE.LOG, '***** COMMIT *****');
5215 
5216             l_start_contract_id := l_start_contract_id + l_insert_batch_size;
5217 
5218             FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_start_contract_id = ' || l_start_contract_id);
5219 
5220             EXIT WHEN l_start_contract_id > l_max_contract_id;
5221 
5222           EXCEPTION
5223             WHEN OTHERS THEN
5224 
5225               FND_FILE.PUT_LINE(FND_FILE.LOG, '***** EXCEPTION WHEN OTHERS *****');
5226               FND_FILE.PUT_LINE(FND_FILE.LOG, SQLERRM);
5227 
5228               x_return_status := FND_API.G_RET_STS_ERROR;
5229               x_number_inserted := 0;
5230 
5231               FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5232                                       p_data  =>  x_msg_data);
5233 
5234               --rollback to the
5235               ROLLBACK TO before_insert_contracts;
5236 
5237               FND_FILE.PUT_LINE(FND_FILE.LOG, '***** ROLLBACK TO before_insert_contracts *****');
5238 
5239               --We also need to mark the documents as invalid
5240               --so that in the Java layer we won't add them as attachments
5241 
5242               --Here the assumption is made that exception has happened
5243               --in the INSERT SQL, so l_start_contract_id is from the
5244               --current iteration and we do not adjust it here
5245               UPDATE okc_rep_imp_documents_t
5246               SET    valid_flag = 'N'
5247               WHERE  request_id = p_request_id
5248               AND    contract_id >= l_start_contract_id
5249               AND    contract_id <  l_start_contract_id + l_insert_batch_size;
5250 
5251               FND_FILE.PUT_LINE(FND_FILE.LOG, '***** UPDATE okc_rep_imp_documents_t SET valid_flag = N *****');
5252 
5253               COMMIT;
5254 
5255               FND_FILE.PUT_LINE(FND_FILE.LOG, '***** COMMIT *****');
5256           END;
5257 
5258 
5259         END LOOP;
5260 
5261         FND_FILE.PUT_LINE(FND_FILE.LOG, '***** END LOOP *****');
5262 
5263     END IF;
5264 
5265 
5266     OPEN number_inserted_csr;
5267     FETCH number_inserted_csr INTO l_number_inserted;
5268 
5269     FND_FILE.PUT_LINE(FND_FILE.LOG, 'number_inserted_csr%ROWCOUNT = ' || number_inserted_csr%ROWCOUNT);
5270 
5271     CLOSE number_inserted_csr;
5272 
5273     FND_FILE.PUT_LINE(FND_FILE.LOG, '***** END LOOP *****');
5274 
5275     x_number_inserted := l_number_inserted;
5276 
5277     FND_FILE.PUT_LINE(FND_FILE.LOG, 'x_number_inserted = ' || x_number_inserted);
5278 
5279     FND_FILE.PUT_LINE(FND_FILE.LOG, '********************************');
5280     FND_FILE.PUT_LINE(FND_FILE.LOG, '***** END insert_prod_data *****');
5281     FND_FILE.PUT_LINE(FND_FILE.LOG, '********************************');
5282   EXCEPTION
5283 
5284     WHEN FND_API.G_EXC_ERROR THEN
5285 
5286       FND_FILE.PUT_LINE(FND_FILE.LOG, '***** EXCEPTION WHEN WHEN FND_API.G_EXC_ERROR *****');
5287       FND_FILE.PUT_LINE(FND_FILE.LOG, SQLERRM);
5288 
5289       --close cursors
5290       IF (number_inserted_csr%ISOPEN) THEN
5291         CLOSE number_inserted_csr ;
5292       END IF;
5293       IF (contract_id_cur%ISOPEN) THEN
5294         CLOSE contract_id_cur ;
5295       END IF;
5296 
5297 
5298       x_return_status := FND_API.G_RET_STS_ERROR;
5299       x_number_inserted := 0;
5300 
5301       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5302                                 p_data  =>  x_msg_data);
5303 
5304     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5305 
5306       FND_FILE.PUT_LINE(FND_FILE.LOG, '***** EXCEPTION WHEN FND_API.G_EXC_UNEXPECTED_ERROR *****');
5307       FND_FILE.PUT_LINE(FND_FILE.LOG, SQLERRM);
5308 
5309       --close cursors
5310       IF (number_inserted_csr%ISOPEN) THEN
5311         CLOSE number_inserted_csr ;
5312       END IF;
5313       IF (contract_id_cur%ISOPEN) THEN
5314         CLOSE contract_id_cur ;
5315       END IF;
5316 
5317 
5318       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
5319       x_number_inserted := 0;
5320 
5321       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5322                                 p_data  =>  x_msg_data);
5323 
5324     WHEN OTHERS THEN
5325 
5326       FND_FILE.PUT_LINE(FND_FILE.LOG, '***** EXCEPTION WHEN OTHERS *****');
5327       FND_FILE.PUT_LINE(FND_FILE.LOG, SQLERRM);
5328 
5329       --close cursors
5330       IF (number_inserted_csr%ISOPEN) THEN
5331         CLOSE number_inserted_csr ;
5332       END IF;
5333       IF (contract_id_cur%ISOPEN) THEN
5334         CLOSE contract_id_cur ;
5335       END IF;
5336 
5337 
5338       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
5339                           p_msg_name     => G_UNEXPECTED_ERROR,
5340                           p_token1       => G_SQLCODE_TOKEN,
5341                           p_token1_value => sqlcode,
5342                           p_token2       => G_SQLERRM_TOKEN,
5343                           p_token2_value => sqlerrm);
5344       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5345       x_number_inserted := 0;
5346 
5347       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5348                                 p_data  =>  x_msg_data);
5349 
5350   END insert_prod_data;
5351 
5352   -- Start of comments
5353   --API name      : validate_and_insert_contracts
5354   --Type          : Private.
5355   --Function      : Validates contracts in the interface tables, and then insert
5356   --                the valid ones into production tables:
5357   --                okc_rep_contracts_all and okc_rep_contract_parties
5358   --                Note that contract documents are inserted in the Java layer after this
5359   --Pre-reqs      : Currently only called from repository import.
5360   --              : Contracts should be saved to the OKC_REP_IMP_CONTRACTS_T table
5361   --Parameters    :
5362   --IN            : p_api_version         IN NUMBER       Required
5363   --              : p_init_msg_list       IN VARCHAR2     Optional
5364   --                   Default = FND_API.G_FALSE
5365   --              : p_request_id         IN NUMBER       Required
5366   --                    Concurrent Program Request ID
5367   --OUT           : x_return_status       OUT  VARCHAR2(1)
5368   --              : x_msg_count           OUT  NUMBER
5369   --              : x_msg_data            OUT  VARCHAR2(2000)
5370   --              : x_number_inserted     OUT NUMBER
5371   -- End of comments
5372   PROCEDURE validate_and_insert_contracts(
5373     p_api_version   IN  NUMBER,
5374     p_init_msg_list   IN  VARCHAR2,
5375     p_request_id    IN  NUMBER,
5376     x_msg_data      OUT NOCOPY VARCHAR2,
5377     x_msg_count   OUT NOCOPY NUMBER,
5378     x_return_status   OUT NOCOPY VARCHAR2,
5379     x_number_inserted   OUT NOCOPY NUMBER)
5380   IS
5381 
5382   l_api_name            CONSTANT VARCHAR2(30):='validate_contracts';
5383   l_api_version         CONSTANT NUMBER := 1.0;
5384 
5385   BEGIN
5386     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5387       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5388               'Entered OKC_REP_UTIL_PVT.'||l_api_name);
5389       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5390               'p_request_id = ' || p_request_id);
5391 
5392     END IF;
5393 
5394     -- Standard call to check for call compatibility.
5395     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5396       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5397     END IF;
5398 
5399     -- Initialize message list if p_init_msg_list is set to TRUE.
5400     IF FND_API.to_Boolean( p_init_msg_list ) THEN
5401       FND_MSG_PUB.initialize;
5402     END IF;
5403 
5404     --  Initialize API return status to success
5405     x_return_status := FND_API.G_RET_STS_SUCCESS;
5406 
5407     --We need to validate documents and parties before we validate contract headers
5408     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5409       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5410               'Validating Contract Documents...');
5411     END IF;
5412 
5413     validate_import_documents(p_api_version => 1.0,
5414                               p_init_msg_list => FND_API.G_FALSE,
5415                             p_request_id => p_request_id,
5416                             x_return_status => x_return_status,
5417                             x_msg_count => x_msg_count,
5418                             x_msg_data => x_msg_data);
5419 
5420     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5421       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5422               'Validating Contract Parties...');
5423     END IF;
5424 
5425     validate_import_parties(p_api_version => 1.0,
5426           p_init_msg_list => FND_API.G_FALSE,
5427                             p_request_id => p_request_id,
5428                             x_return_status => x_return_status,
5429                             x_msg_count => x_msg_count,
5430                             x_msg_data => x_msg_data);
5431 
5432     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5433       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5434               'Validating Contract Headers...');
5435     END IF;
5436 
5437     validate_import_contracts(p_api_version => 1.0,
5438                             p_init_msg_list => FND_API.G_FALSE,
5439                             p_request_id => p_request_id,
5440                             x_return_status => x_return_status,
5441                             x_msg_count => x_msg_count,
5442                             x_msg_data => x_msg_data);
5443 
5444     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5445       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5446               'Finished validating Contracts.  Now we will insert valid headers and parties into production tables.');
5447     END IF;
5448 
5449     insert_prod_data(p_api_version => 1.0,
5450                     p_init_msg_list => FND_API.G_FALSE,
5451                     p_commit => FND_API.G_TRUE,
5452                     p_request_id => p_request_id,
5453                     x_return_status => x_return_status,
5454                     x_msg_count => x_msg_count,
5455                     x_msg_data => x_msg_data,
5456                     x_number_inserted => x_number_inserted);
5457 
5458   EXCEPTION
5459     WHEN FND_API.G_EXC_ERROR THEN
5460       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5461         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5462              'Leaving '||l_api_name||':FND_API.G_EXC_ERROR Exception');
5463       END IF;
5464 
5465       x_return_status := FND_API.G_RET_STS_ERROR;
5466 
5467       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5468                                 p_data  =>  x_msg_data);
5469 
5470     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5471      IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5472         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5473              'Leaving '||l_api_name||':FND_API.G_EXC_UNEXPECTED_ERROR Exception');
5474       END IF;
5475 
5476       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
5477 
5478       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5479                                 p_data  =>  x_msg_data);
5480 
5481     WHEN OTHERS THEN
5482       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5483         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5484              'Leaving '||l_api_name||' because of EXCEPTION: ' || sqlerrm);
5485       END IF;
5486 
5487       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
5488                           p_msg_name     => G_UNEXPECTED_ERROR,
5489                           p_token1       => G_SQLCODE_TOKEN,
5490                           p_token1_value => sqlcode,
5491                           p_token2       => G_SQLERRM_TOKEN,
5492                           p_token2_value => sqlerrm);
5493       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5494 
5495       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5496                                 p_data  =>  x_msg_data);
5497 
5498 
5499   END validate_and_insert_contracts;
5500 
5501 
5502   -- Start of comments
5503   --API name      : delete_import_contract
5504   --Type          : Private.
5505   --Function      : (1) Delete the imported contract and its parties
5506   --                by calling okc_rep_contract_process_pvt.delete_contract
5507   --                (2) Set the contract's valid_flag to 'N' in okc_rep_imp_contracts_t
5508   --                (3) Insert an error message in okc_rep_imp_errors_t
5509   --                This procedure does the cleanup due to an error adding attachments
5510   --                in the Java layer during repository import
5511   --Pre-reqs      : None
5512   --Parameters    :
5513   --IN            : p_api_version         IN NUMBER       Required
5514   --              : p_init_msg_list       IN VARCHAR2     Optional
5515   --                   Default = FND_API.G_FALSE
5516   --              : p_commit               IN VARCHAR2    Optional
5517   --                   Default = FND_API.G_FALSE
5518   --              : p_contract_id         IN NUMBER       Required
5519   --                    Contract ID that the error is from
5520   --              : p_imp_document_id     IN NUMBER       Required
5521   --                   okc_rep_imp_documents_t.imp_document_id
5522   --              : p_error_msg_txt  IN VARCHAR2       Required
5523   --                   Translated error message text
5524   --              : p_program_id                IN  NUMBER Required
5525   --                    Concurrent program ID
5526   --              : p_program_login_id          IN  NUMBER Required
5527   --                    Concurrent program login ID
5528   --              : p_program_app_id            IN  NUMBER Required
5529   --                    Concurrent program application ID
5530   --              : p_request_id                IN  NUMBER Required
5531   --                    Concurrent program request ID
5532   --OUT           : x_return_status       OUT  VARCHAR2(1)
5533   --              : x_msg_count           OUT  NUMBER
5534   --              : x_msg_data            OUT  VARCHAR2(2000)
5535   -- End of comments
5536   PROCEDURE delete_import_contract(
5537        p_api_version              IN NUMBER,
5538        p_init_msg_list            IN VARCHAR2,
5539        p_commit                   IN VARCHAR2,
5540        p_contract_id              IN NUMBER,
5541        p_imp_document_id             IN NUMBER,
5542        p_error_msg_txt            IN VARCHAR2,
5543        p_program_id               IN NUMBER,
5544        p_program_login_id         IN NUMBER,
5545        p_program_app_id           IN NUMBER,
5546        p_request_id               IN NUMBER,
5547        x_return_status            OUT NOCOPY VARCHAR2,
5548        x_msg_count                OUT NOCOPY NUMBER,
5549        x_msg_data                 OUT NOCOPY VARCHAR2)
5550   IS
5551     l_api_name VARCHAR2(30);
5552     l_api_version       CONSTANT NUMBER := 1.0;
5553 
5554 
5555 
5556     BEGIN
5557 
5558     l_api_name := 'delete_import_contract';
5559 
5560     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5561       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5562               'Entered OKC_REP_UTIL_PVT.delete_import_contract');
5563       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5564               'p_contract_id = ' || p_contract_id);
5565       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5566               'p_imp_document_id = ' || p_imp_document_id);
5567       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5568               'p_error_msg_txt = ' || p_error_msg_txt);
5569       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5570               'p_program_id = ' || p_program_id);
5571       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5572               'p_program_login_id = ' || p_program_login_id);
5573       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5574               'p_program_app_id = ' || p_program_app_id);
5575       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5576               'p_request_id = ' || p_request_id);
5577 
5578 
5579     END IF;
5580 
5581     -- Standard call to check for call compatibility.
5582     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5583       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5584     END IF;
5585 
5586     -- Initialize message list if p_init_msg_list is set to TRUE.
5587     IF FND_API.to_Boolean( p_init_msg_list ) THEN
5588       FND_MSG_PUB.initialize;
5589     END IF;
5590 
5591     --  Initialize API return status to success
5592     x_return_status := FND_API.G_RET_STS_SUCCESS;
5593 
5594     -- Delete contract
5595     okc_rep_contract_process_pvt.delete_contract(
5596       p_api_version  => 1.0,
5597       p_init_msg_list => FND_API.G_FALSE,
5598       p_commit        => FND_API.G_FALSE,
5599       p_contract_id  => p_contract_id,
5600       x_msg_data   => x_msg_data,
5601       x_msg_count  => x_msg_count,
5602       x_return_status  => x_return_status);
5603 
5604 
5605      IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5606         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
5607                 'Called okc_rep_contract_process_pvt.delete_contract');
5608     END IF;
5609 
5610     -- Update valid_flag
5611     UPDATE OKC_REP_IMP_CONTRACTS_T
5612     SET valid_flag = 'N'
5613     WHERE CONTRACT_ID = p_contract_id;
5614 
5615     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5616         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
5617                 'Updated valid_flag to N');
5618     END IF;
5619 
5620     -- Insert error message
5621     populate_import_errors(p_init_msg_list => FND_API.G_FALSE,
5622                                    p_api_version => 1.0,
5623                                    p_contract_id => p_contract_id,
5624                                    p_error_obj_type => G_IMP_DOCUMENT_ERROR,
5625                                    p_error_obj_id => p_imp_document_id,
5626                                    p_error_msg_txt => p_error_msg_txt,
5627                                    p_program_id => p_program_id,
5628                                    p_program_login_id => p_program_login_id,
5629                                    p_program_app_id => p_program_app_id,
5630                                    p_request_id => p_request_id,
5631                                    x_return_status => x_return_status,
5632                                    x_msg_count => x_msg_count,
5633                                    x_msg_data => x_msg_data);
5634 
5635     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5636         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
5637                 'Inserted error into okc_rep_imp_errors_t');
5638     END IF;
5639 
5640 
5641     IF(p_commit = FND_API.G_TRUE) THEN
5642         COMMIT;
5643         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5644             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
5645                 'Committed transaction');
5646         END IF;
5647 
5648     END IF;
5649 
5650 
5651     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5652         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5653                 'Leaving OKC_REP_UTIL_PVT.delete_import_contract');
5654     END IF;
5655 
5656   EXCEPTION
5657 
5658     WHEN FND_API.G_EXC_ERROR THEN
5659       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5660         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5661              'Leaving delete_import_contract:FND_API.G_EXC_ERROR Exception');
5662       END IF;
5663 
5664       x_return_status := FND_API.G_RET_STS_ERROR;
5665       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5666                                 p_data  =>  x_msg_data);
5667 
5668     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5669 
5670       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5671         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5672              'Leaving delete_import_contract:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
5673       END IF;
5674 
5675       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
5676       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5677                                 p_data  =>  x_msg_data);
5678 
5679     WHEN OTHERS THEN
5680 
5681       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5682         fnd_log.string(FND_LOG.LEVEL_EXCEPTION, g_module || l_api_name,
5683              'Leaving delete_import_contract because of EXCEPTION: ' || sqlerrm);
5684       END IF;
5685 
5686       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
5687                           p_msg_name     => G_UNEXPECTED_ERROR,
5688                           p_token1       => G_SQLCODE_TOKEN,
5689                           p_token1_value => sqlcode,
5690                           p_token2       => G_SQLERRM_TOKEN,
5691                           p_token2_value => sqlerrm);
5692       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5693       FND_MSG_PUB.Count_And_Get(p_count =>  x_msg_count,
5694                                 p_data  =>  x_msg_data);
5695 
5696   END delete_import_contract;
5697 
5698   -- Start of comments
5699   --API name      : Function add_quotes
5700   --Type          : Private.
5701   --Function      : Add quotes around a string
5702   --                if it contains comma or quotes.
5703   --                This is used for generating error report
5704   --                during repository import
5705   --Pre-reqs      : None.
5706   --Parameters    :
5707   --IN            : p_api_version         IN NUMBER       Required
5708   --              : p_init_msg_list       IN VARCHAR2     Optional
5709   --                   Default = FND_API.G_FALSE
5710   --              : p_string         IN VARCHAR2       Required
5711   --OUT           : if p_string contains comma, return "p_string"
5712   --                otherwise return p_string
5713   -- End of comments
5714   FUNCTION add_quotes(
5715       p_string     IN  VARCHAR2
5716     ) RETURN VARCHAR2
5717   IS
5718     l_api_name          VARCHAR2(30);
5719     l_string            VARCHAR2(2050);
5720     l_unprocessed_string VARCHAR2(2050);
5721 
5722   BEGIN
5723 
5724     l_api_name          := 'add_quotes';
5725 
5726     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5727         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5728                 'Entered Function OKC_REP_UTIL_PVT.'||l_api_name);
5729         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5730                 'p_string is: ' || p_string);
5731     END IF;
5732 
5733     l_string := NULL;
5734     l_unprocessed_string := p_string;
5735 
5736     --if p_string starts and ends with quotes
5737     --we need to surround it with two double quotes
5738     --else if p_string contains comma
5739     --we need to surround it with one double quote
5740     IF (substr(l_unprocessed_string,1,1) = '"' AND substr(l_unprocessed_string, LENGTH(p_string), 1) = '"') THEN
5741         l_string := '""' || p_string || '""';
5742     ELSIF (instr(p_string, ',') > 0) THEN
5743         l_string := '"' || p_string || '"';
5744 
5745     ELSE
5746         l_string := p_string;
5747     END IF;
5748 
5749     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5750         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5751                 'Leaving Function OKC_REP_UTIL_PVT.'||l_api_name);
5752         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5753                 'l_string is: ' || l_string);
5754     END IF;
5755 
5756     return l_string;
5757 
5758   EXCEPTION
5759     WHEN OTHERS THEN
5760       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5761         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
5762                 'Leaving Function '||l_api_name||' because of EXCEPTION: '||sqlerrm);
5763       END IF;
5764       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
5765                         p_msg_name     => G_UNEXPECTED_ERROR,
5766                         p_token1       => G_SQLCODE_TOKEN,
5767                         p_token1_value => sqlcode,
5768                         p_token2       => G_SQLERRM_TOKEN,
5769                         p_token2_value => sqlerrm);
5770       RETURN l_string;
5771 
5772   END add_quotes;
5773 
5774   -- Start of comments
5775   --API name      : Function get_csv_error_string
5776   --Type          : Private.
5777   --Function      : Returns one line in the CSV Error Report
5778   --Pre-reqs      : None.
5779   --Parameters    :
5780   --IN            : p_api_version         IN NUMBER       Required
5781   --              : p_init_msg_list       IN VARCHAR2     Optional
5782   --                   Default = FND_API.G_FALSE
5783   --              : p_imp_contract_id         IN NUMBER       Required
5784   --                   okc_rep_imp_contracts_t.imp_contract_id
5785   -- End of comments
5786   FUNCTION get_csv_error_string(
5787       p_api_version              IN NUMBER,
5788        p_init_msg_list            IN VARCHAR2,
5789        p_imp_contract_id     IN  NUMBER
5790     ) RETURN VARCHAR2
5791   IS
5792     l_api_name                     VARCHAR2(30);
5793     l_num_parties                  CONSTANT NUMBER := 3;
5794     l_num_documents                CONSTANT NUMBER := 5;
5795     --there can be max of 9 error messages for each contract
5796     --one for header, three for parties, and five for documents
5797     --since each message has max length of 2000 in fnd_new_messages
5798     --l_csv_error_string should be at least 18000 + original data
5799     l_csv_error_string             VARCHAR2(20000);
5800     l_error_msg                    VARCHAR2(18000);
5801 
5802     l_empty_party_string           CONSTANT VARCHAR2(4) := ',,,,';
5803     l_empty_doc_string             CONSTANT VARCHAR2(3) := ',,,';
5804     l_party_index                  NUMBER;
5805     l_document_index               NUMBER;
5806 
5807 
5808     CURSOR IMP_CONTRACT_CSR IS
5809     SELECT CONTRACT_NUMBER,
5810     CONTRACT_NAME,
5811     CONTRACT_STATUS_TXT,
5812     CONTRACT_TYPE_TXT,
5813     CONTRACT_EFFECTIVE_DATE,
5814     CONTRACT_EXPIRATION_DATE,
5815     ORG_NAME,
5816     OWNER_USER_NAME,
5817     CURRENCY_CODE,
5818     CONTRACT_AMOUNT,
5819     AUTHORING_PARTY_TXT,
5820     PHYSICAL_LOCATION,
5821     KEYWORDS,
5822     DESCRIPTION,
5823     VERSION_COMMENTS,
5824     ORIG_SYSTEM_REFERENCE_CODE,
5825     ORIG_SYSTEM_REFERENCE_ID1,
5826     ORIG_SYSTEM_REFERENCE_ID2
5827     FROM OKC_REP_IMP_CONTRACTS_T
5828     WHERE IMP_CONTRACT_ID = p_imp_contract_id;
5829 
5830     l_imp_contract_rec IMP_CONTRACT_CSR%ROWTYPE;
5831 
5832 
5833     CURSOR IMP_PARTIES_CSR IS
5834     SELECT
5835     PARTY_INDEX,
5836     PARTY_NAME_TXT,
5837     PARTY_ROLE_TXT,
5838     SIGNED_BY_TXT,
5839     SIGNED_DATE
5840     FROM OKC_REP_IMP_PARTIES_T
5841     WHERE IMP_CONTRACT_ID = p_imp_contract_id
5842     ORDER BY PARTY_INDEX;
5843 
5844     l_imp_parties_rec IMP_PARTIES_CSR%ROWTYPE;
5845 
5846 
5847     CURSOR IMP_DOCUMENTS_CSR IS
5848     SELECT
5849     DOCUMENT_INDEX,
5850     FILE_NAME,
5851     CATEGORY_NAME_TXT,
5852     DOCUMENT_DESC
5853     FROM OKC_REP_IMP_DOCUMENTS_T
5854     WHERE IMP_CONTRACT_ID = p_imp_contract_id
5855     ORDER BY DOCUMENT_INDEX;
5856 
5857     l_imp_documents_rec IMP_DOCUMENTS_CSR%ROWTYPE;
5858 
5859 
5860     CURSOR IMP_ERRORS_CSR IS
5861     SELECT
5862     ERROR_MESSAGE
5863     FROM OKC_REP_IMP_ERRORS_T
5864     WHERE IMP_CONTRACT_ID = p_imp_contract_id;
5865 
5866     l_imp_errors_rec IMP_ERRORS_CSR%ROWTYPE;
5867 
5868 
5869   BEGIN
5870 
5871     l_api_name := 'get_csv_error_string';
5872 
5873     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5874         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5875                 'Entered Function OKC_REP_UTIL_PVT.'||l_api_name);
5876         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5877                 'p_imp_contract_id is: ' || p_imp_contract_id);
5878     END IF;
5879 
5880     --initialize l_csv_error_string
5881     l_csv_error_string := NULL;
5882 
5883     OPEN IMP_CONTRACT_CSR;
5884     FETCH IMP_CONTRACT_CSR INTO l_imp_contract_rec;
5885     IF IMP_CONTRACT_CSR%NOTFOUND THEN
5886         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5887             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5888                 'p_imp_contract_id does not exist in okc_rep_imp_contracts_t: '||p_imp_contract_id);
5889             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5890                 'returning null');
5891         END IF;
5892         RETURN l_csv_error_string;
5893     END IF;
5894 
5895     -------------------Important: The order of the following statements matter!----------
5896     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.contract_number) || ',';
5897     --l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.contract_name) || ',';
5898     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.contract_name);
5899 
5900     -- bug 4198537
5901     --the framework does not support opening the concurrent program output file in excel yet
5902     --so I am commenting the following part out
5903     /*
5904     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.contract_status_txt) || ',';
5905     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.contract_type_txt) || ',';
5906     l_csv_error_string := l_csv_error_string || l_imp_contract_rec.contract_effective_date || ',';
5907     l_csv_error_string := l_csv_error_string || l_imp_contract_rec.contract_expiration_date || ',';
5908     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.org_name) || ',';
5909     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.owner_user_name) || ',';
5910     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.currency_code) || ',';
5911     l_csv_error_string := l_csv_error_string || l_imp_contract_rec.contract_amount || ',';
5912     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.authoring_party_txt) || ',';
5913     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.physical_location) || ',';
5914     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.keywords) || ',';
5915     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.description) || ',';
5916     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.version_comments) || ',';
5917 
5918 
5919     l_party_index := 0;
5920     OPEN IMP_PARTIES_CSR;
5921     LOOP
5922         FETCH IMP_PARTIES_CSR INTO l_imp_parties_rec;
5923         EXIT WHEN IMP_PARTIES_CSR%NOTFOUND;
5924         -------------------Important: The order of the following statements matter!----------
5925         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_parties_rec.party_name_txt) || ',';
5926         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_parties_rec.party_role_txt) || ',';
5927         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_parties_rec.signed_by_txt) || ',';
5928         l_csv_error_string := l_csv_error_string || l_imp_parties_rec.signed_date || ',';
5929         l_party_index := l_party_index + 1;
5930     END LOOP;
5931     CLOSE IMP_PARTIES_CSR;
5932 
5933     IF l_party_index < l_num_parties THEN
5934         --we have less than 3 parties, need to fill in the commas
5935         FOR i IN (l_party_index+1)..l_num_parties
5936         LOOP
5937             l_csv_error_string := l_csv_error_string || l_empty_party_string;
5938         END LOOP;
5939     END IF;
5940 
5941     l_document_index := 0;
5942     OPEN IMP_DOCUMENTS_CSR;
5943     LOOP
5944         FETCH IMP_DOCUMENTS_CSR INTO l_imp_documents_rec;
5945         EXIT WHEN IMP_DOCUMENTS_CSR%NOTFOUND;
5946         -------------------Important: The order of the following statements matter!----------
5947         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_documents_rec.file_name) || ',';
5948         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_documents_rec.category_name_txt) || ',';
5949         l_csv_error_string := l_csv_error_string || add_quotes(l_imp_documents_rec.document_desc) || ',';
5950         l_document_index := l_document_index + 1;
5951 
5952     END LOOP;
5953     CLOSE IMP_DOCUMENTS_CSR;
5954 
5955     IF l_document_index < l_num_documents THEN
5956         --we have less than 5 documents, need to fill in the commas
5957         FOR i IN (l_document_index+1)..l_num_documents
5958         LOOP
5959             l_csv_error_string := l_csv_error_string || l_empty_doc_string;
5960         END LOOP;
5961     END IF;
5962 
5963 
5964     --we need to concatenate the last three orig_system* attributes
5965     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.orig_system_reference_code) || ',';
5966     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.orig_system_reference_id1) || ',';
5967     l_csv_error_string := l_csv_error_string || add_quotes(l_imp_contract_rec.orig_system_reference_id2);
5968     --Note that we don't close the IMP_CONTRACT_CSR until last
5969     --because of the orig_system* attributes
5970 */
5971     CLOSE IMP_CONTRACT_CSR;
5972 
5973 
5974     --Concatenate error messages
5975     l_error_msg := NULL;
5976     OPEN IMP_ERRORS_CSR;
5977     LOOP
5978         FETCH IMP_ERRORS_CSR INTO l_imp_errors_rec;
5979         EXIT WHEN IMP_ERRORS_CSR%NOTFOUND;
5980         l_error_msg :=  l_error_msg || FND_GLOBAL.Newline || l_imp_errors_rec.error_message || ' ';
5981     END LOOP;
5982     CLOSE IMP_ERRORS_CSR;
5983 
5984     IF(LENGTH(l_error_msg) > 0) THEN
5985         l_csv_error_string := l_csv_error_string || ',' || add_quotes(l_error_msg);
5986     END IF;
5987 
5988     l_csv_error_string := l_csv_error_string || FND_GLOBAL.Newline;
5989 
5990 
5991     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5992     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5993                 'Leaving Function '||l_api_name);
5994     END IF;
5995     RETURN l_csv_error_string;
5996 
5997   EXCEPTION
5998     WHEN OTHERS THEN
5999 
6000       --close cursors
6001       IF (IMP_CONTRACT_CSR%ISOPEN) THEN
6002         CLOSE IMP_CONTRACT_CSR ;
6003       END IF;
6004       IF (IMP_PARTIES_CSR%ISOPEN) THEN
6005         CLOSE IMP_PARTIES_CSR ;
6006       END IF;
6007       IF (IMP_DOCUMENTS_CSR%ISOPEN) THEN
6008         CLOSE IMP_DOCUMENTS_CSR ;
6009       END IF;
6010       IF (IMP_ERRORS_CSR%ISOPEN) THEN
6011         CLOSE IMP_ERRORS_CSR ;
6012       END IF;
6013 
6014       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6015         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
6016                 'Leaving Function '||l_api_name||' because of EXCEPTION: '||sqlerrm);
6017       END IF;
6018       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6019                         p_msg_name     => G_UNEXPECTED_ERROR,
6020                         p_token1       => G_SQLCODE_TOKEN,
6021                         p_token1_value => sqlcode,
6022                         p_token2       => G_SQLERRM_TOKEN,
6023                         p_token2_value => sqlerrm);
6024       RETURN l_csv_error_string ;
6025   END get_csv_error_string;
6026 
6027 
6028 
6029   -- Start of comments
6030   --API name      : Function get_csv_header_string
6031   --Type          : Private.
6032   --Function      : Returns the header in the csv file
6033   --Pre-reqs      : None.
6034   --Parameters    :
6035   --IN            : p_api_version         IN NUMBER       Required
6036   --              : p_init_msg_list       IN VARCHAR2     Optional
6037   --                   Default = FND_API.G_FALSE
6038   -- End of comments
6039   FUNCTION get_csv_header_string(
6040       p_api_version              IN NUMBER,
6041        p_init_msg_list            IN VARCHAR2
6042   ) RETURN VARCHAR2
6043   IS
6044     l_api_name                      VARCHAR2(30);
6045     l_csv_header_string             VARCHAR2(10000);
6046 
6047     CURSOR CSV_HEADER_CSR IS
6048     select meaning from fnd_lookup_values
6049     where lookup_type = 'OKC_REP_IMP_TEMPL_ATTRIBUTES'
6050     and LANGUAGE = userenv('LANG')
6051     and VIEW_APPLICATION_ID = 0
6052     and SECURITY_GROUP_ID = fnd_global.lookup_security_group('OKC_REP_IMP_TEMPL_ATTRIBUTES', VIEW_APPLICATION_ID)
6053     and enabled_flag = 'Y'
6054     order by to_number(tag);
6055 
6056     l_csv_header_rec CSV_HEADER_CSR%ROWTYPE;
6057 
6058     BEGIN
6059 
6060     l_api_name := 'get_csv_header_string';
6061 
6062     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6063         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6064                 'Entered Function OKC_REP_UTIL_PVT.'||l_api_name);
6065     END IF;
6066 
6067     l_csv_header_string := NULL;
6068     OPEN CSV_HEADER_CSR;
6069     LOOP
6070         FETCH CSV_HEADER_CSR INTO l_csv_header_rec;
6071         EXIT WHEN CSV_HEADER_CSR%NOTFOUND;
6072         l_csv_header_string := l_csv_header_string || l_csv_header_rec.meaning || ',';
6073     END LOOP;
6074     CLOSE CSV_HEADER_CSR;
6075 
6076     IF(instr(l_csv_header_string, ',') > 0) THEN
6077         --we need to remove the last ','
6078         l_csv_header_string := substr(l_csv_header_string,1, length(l_csv_header_string)-1);
6079     END IF;
6080 
6081     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6082         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6083                 'Entered Function OKC_REP_UTIL_PVT.'||l_api_name);
6084         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6085                 'l_csv_header_string is: ' || l_csv_header_string);
6086     END IF;
6087 
6088     RETURN l_csv_header_string;
6089 
6090     EXCEPTION
6091     WHEN OTHERS THEN
6092       --close cursors
6093       IF (CSV_HEADER_CSR%ISOPEN) THEN
6094         CLOSE CSV_HEADER_CSR ;
6095       END IF;
6096 
6097       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6098         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
6099                 'Leaving Function '||l_api_name||' because of EXCEPTION: '||sqlerrm);
6100       END IF;
6101       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6102                         p_msg_name     => G_UNEXPECTED_ERROR,
6103                         p_token1       => G_SQLCODE_TOKEN,
6104                         p_token1_value => sqlcode,
6105                         p_token2       => G_SQLERRM_TOKEN,
6106                         p_token2_value => sqlerrm);
6107       RETURN l_csv_header_string;
6108 
6109   END get_csv_header_string;
6110 
6111 
6112 
6113   -- Start of comments
6114   --API name      : get_vendor_userlist
6115   --Type          : Private.
6116   --Function      : Returns the external vendor user email addresses.
6117   --Pre-reqs      : None.
6118   --Parameters    :
6119   --IN            : p_api_version         IN NUMBER       Required
6120   --              : p_init_msg_list       IN VARCHAR2     Optional
6121   --                   Default = FND_API.G_FALSE
6122   --              : p_document_id         IN NUMBER       Required
6123   --                   Id of the contract
6124   --              : p_external_party_id   IN NUMBER       Required
6125   --                   External party ID
6126   --OUT           : x_external_userlist   OUT  VARCHAR2(1)
6127   --                      external contact email addresses
6128   --              : x_return_status       OUT  VARCHAR2(1)
6129   --              : x_msg_count           OUT  NUMBER
6130   --              : x_msg_data            OUT  VARCHAR2(2000)
6131   -- End of comments
6132   PROCEDURE get_vendor_userlist(
6133       p_api_version         IN  NUMBER,
6134       p_init_msg_list       IN VARCHAR2,
6135       p_document_id         IN  NUMBER,
6136       p_external_party_id   IN NUMBER,
6137       x_msg_data            OUT NOCOPY  VARCHAR2,
6138       x_msg_count           OUT NOCOPY  NUMBER,
6139       x_return_status       OUT NOCOPY  VARCHAR2,
6140     x_external_userlist   OUT NOCOPY VARCHAR2) IS
6141 
6142     l_api_name      VARCHAR2(30);
6143     l_api_version       CONSTANT NUMBER := 1.0;
6144     l_contact_email_address VARCHAR2(450);
6145     l_index             NUMBER;
6146 
6147     CURSOR vendor_contact_csr IS
6148       SELECT contact_id
6149       FROM OKC_REP_PARTY_CONTACTS
6150       WHERE contract_id = p_document_id
6151        AND  party_id = p_external_party_id
6152        AND  party_role_code = G_PARTY_ROLE_SUPPLIER;
6153 
6154     CURSOR vendor_email_csr(l_contact_id NUMBER) IS
6155         SELECT email_address
6156         FROM po_vendor_contacts pvc
6157         WHERE pvc.vendor_contact_id = l_contact_id;
6158 
6159   BEGIN
6160 
6161     l_api_name      := 'get_vendor_userlist';
6162 
6163     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6164         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6165                 'Entered OKC_REP_UTIL_PVT.get_external_userlist');
6166         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6167                 'p_document_id is: ' || to_char(p_document_id));
6168         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6169                 'p_external_party_id is: ' || to_char(p_external_party_id));
6170     END IF;
6171 
6172   -- Standard call to check for call compatibility.
6173     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6174       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6175     END IF;
6176     -- Initialize message list if p_init_msg_list is set to TRUE.
6177     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6178       FND_MSG_PUB.initialize;
6179     END IF;
6180 
6181     --  Initialize API return status to success
6182     x_return_status := FND_API.G_RET_STS_SUCCESS;
6183 
6184     -- Get email address of the vendor contacts.
6185     l_index := 1;
6186     FOR vendor_contact_rec IN vendor_contact_csr  LOOP
6187 
6188       -- Added for bug 5230060 fix
6189       l_contact_email_address := NULL;
6190 
6191         OPEN vendor_email_csr(vendor_contact_rec.contact_id);
6192         FETCH vendor_email_csr INTO l_contact_email_address;
6193         CLOSE vendor_email_csr;
6194         IF (l_contact_email_address IS NOT NULL) THEN
6195             IF (l_index = 1) THEN
6196                 x_external_userlist := l_contact_email_address;
6197             ELSE
6198                 x_external_userlist := x_external_userlist || ',' || l_contact_email_address;
6199             END IF;  -- (l_index = 1)
6200         l_index := l_index + 1;
6201         END IF; -- (l_contact_email_address <> NULL)
6202     END LOOP;
6203 
6204     -- Standard call to get message count and if count is 1, get message info.
6205     FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data );
6206 
6207   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6208         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6209                 'Leaving OKC_REP_UTIL_PVT.get_vendor_userlist');
6210     END IF;
6211 
6212 
6213     EXCEPTION
6214       WHEN FND_API.G_EXC_ERROR THEN
6215         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6216            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6217                  g_module || l_api_name,
6218                  'Leaving get_vendor_userlist:FND_API.G_EXC_ERROR Exception');
6219         END IF;
6220         --close cursor
6221         IF (vendor_contact_csr%ISOPEN) THEN
6222           CLOSE vendor_contact_csr ;
6223         END IF;
6224         IF (vendor_email_csr%ISOPEN) THEN
6225           CLOSE vendor_email_csr ;
6226         END IF;
6227         x_return_status := FND_API.G_RET_STS_ERROR;
6228         FND_MSG_PUB.Count_And_Get(
6229         p_count =>  x_msg_count,
6230         p_data  =>  x_msg_data
6231         );
6232 
6233       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6234         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6235            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6236                  g_module || l_api_name,
6237                  'Leaving get_vendor_userlist:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
6238         END IF;
6239         --close cursor
6240         IF (vendor_contact_csr%ISOPEN) THEN
6241           CLOSE vendor_contact_csr ;
6242         END IF;
6243         IF (vendor_email_csr%ISOPEN) THEN
6244           CLOSE vendor_email_csr ;
6245         END IF;
6246         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6247         FND_MSG_PUB.Count_And_Get(
6248         p_count =>  x_msg_count,
6249         p_data  =>  x_msg_data
6250         );
6251 
6252       WHEN OTHERS THEN
6253         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6254            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6255                  g_module || l_api_name,
6256                  'Leaving get_vendor_userlist because of EXCEPTION: ' || sqlerrm);
6257         END IF;
6258         --close cursor
6259         IF (vendor_contact_csr%ISOPEN) THEN
6260           CLOSE vendor_contact_csr ;
6261         END IF;
6262         IF (vendor_email_csr%ISOPEN) THEN
6263           CLOSE vendor_email_csr ;
6264         END IF;
6265         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6266                             p_msg_name     => G_UNEXPECTED_ERROR,
6267                             p_token1       => G_SQLCODE_TOKEN,
6268                             p_token1_value => sqlcode,
6269                             p_token2       => G_SQLERRM_TOKEN,
6270                             p_token2_value => sqlerrm);
6271         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6272         FND_MSG_PUB.Count_And_Get(
6273         p_count =>  x_msg_count,
6274         p_data  =>  x_msg_data
6275         );
6276   END get_vendor_userlist;
6277 
6278   -- Start of comments
6279   --API name      : get_customer_userlist
6280   --Type          : Private.
6281   --Function      : Returns the external customer user email addresses.
6282   --Pre-reqs      : None.
6283   --Parameters    :
6284   --IN            : p_api_version         IN NUMBER       Required
6285   --              : p_init_msg_list       IN VARCHAR2     Optional
6286   --                   Default = FND_API.G_FALSE
6287   --              : p_document_id         IN NUMBER       Required
6288   --                   Id of the contract
6289   --              : p_external_party_id   IN NUMBER       Required
6290   --                   External party ID
6291   --              : p_external_party_role IN VARCHAR2     Required
6292   --                   External party role.
6293   --OUT           : x_external_userlist   OUT  VARCHAR2(1)
6294   --                      external contact email addresses
6295   --              : x_return_status       OUT  VARCHAR2(1)
6296   --              : x_msg_count           OUT  NUMBER
6297   --              : x_msg_data            OUT  VARCHAR2(2000)
6298   -- End of comments
6299   PROCEDURE get_customer_userlist(
6300       p_api_version         IN  NUMBER,
6301       p_init_msg_list       IN VARCHAR2,
6302       p_document_id         IN  NUMBER,
6303       p_external_party_id   IN NUMBER,
6304       p_external_party_role IN VARCHAR2,
6305       x_msg_data            OUT NOCOPY  VARCHAR2,
6306       x_msg_count           OUT NOCOPY  NUMBER,
6307       x_return_status       OUT NOCOPY  VARCHAR2,
6308     x_external_userlist   OUT NOCOPY VARCHAR2) IS
6309 
6310     l_api_name      VARCHAR2(30);
6311     l_api_version       CONSTANT NUMBER := 1.0;
6312     l_contact_email_address     VARCHAR2(450);
6313     l_index             NUMBER;
6314 
6315     CURSOR tca_contact_csr IS
6316       SELECT contact_id
6317       FROM OKC_REP_PARTY_CONTACTS
6318       WHERE contract_id = p_document_id
6319        AND  party_id = p_external_party_id
6320        AND  party_role_code = p_external_party_role;
6321 
6322     CURSOR tca_email_csr(l_contact_id NUMBER) IS
6323         SELECT email_address
6324         FROM hz_contact_points cp
6325         WHERE cp.owner_table_id = l_contact_id
6326            AND   cp.owner_table_name='HZ_PARTIES'
6327            AND   cp.contact_point_type = 'EMAIL';
6328   BEGIN
6329     l_api_name := 'get_customer_userlist';
6330 
6331     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6332         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6333                 'Entered OKC_REP_UTIL_PVT.get_customer_userlist');
6334         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6335                 'p_document_id is: ' || to_char(p_document_id));
6336         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6337                 'p_external_party_id is: ' || to_char(p_external_party_id));
6338     END IF;
6339 
6340   -- Standard call to check for call compatibility.
6341     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6342       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6343     END IF;
6344     -- Initialize message list if p_init_msg_list is set to TRUE.
6345     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6346       FND_MSG_PUB.initialize;
6347     END IF;
6348 
6349     --  Initialize API return status to success
6350     x_return_status := FND_API.G_RET_STS_SUCCESS;
6351 
6352     l_index := 1;
6353     FOR tca_contact_rec IN tca_contact_csr LOOP
6354 
6355         -- Added for bug 5230060 fix
6356         l_contact_email_address := NULL;
6357 
6358         OPEN tca_email_csr(tca_contact_rec.contact_id);
6359         FETCH tca_email_csr INTO l_contact_email_address;
6360         CLOSE tca_email_csr;
6361         IF (l_contact_email_address IS NOT NULL) THEN
6362             IF (l_index = 1) THEN
6363                 x_external_userlist := l_contact_email_address;
6364             ELSE
6365                 x_external_userlist := x_external_userlist || ',' || l_contact_email_address;
6366             END IF;  -- (l_index = 1)
6367         l_index := l_index + 1;
6368         END IF; -- (l_contact_email_address <> NULL)
6369     END LOOP;
6370 
6371     -- Standard call to get message count and if count is 1, get message info.
6372     FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data );
6373 
6374   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6375         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6376                 'Leaving OKC_REP_UTIL_PVT.get_customer_userlist');
6377     END IF;
6378 
6379 
6380     EXCEPTION
6381       WHEN FND_API.G_EXC_ERROR THEN
6382         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6383            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6384                  g_module || l_api_name,
6385                  'Leaving get_customer_userlist:FND_API.G_EXC_ERROR Exception');
6386         END IF;
6387         IF (tca_contact_csr%ISOPEN) THEN
6388           CLOSE tca_contact_csr ;
6389         END IF;
6390         IF (tca_email_csr%ISOPEN) THEN
6391           CLOSE tca_email_csr ;
6392         END IF;
6393         x_return_status := FND_API.G_RET_STS_ERROR;
6394         FND_MSG_PUB.Count_And_Get(
6395         p_count =>  x_msg_count,
6396         p_data  =>  x_msg_data
6397         );
6398 
6399       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6400         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6401            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6402                  g_module || l_api_name,
6403                  'Leaving get_customer_userlist:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
6404         END IF;
6405         IF (tca_contact_csr%ISOPEN) THEN
6406           CLOSE tca_contact_csr ;
6407         END IF;
6408         IF (tca_email_csr%ISOPEN) THEN
6409           CLOSE tca_email_csr ;
6410         END IF;
6411         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6412         FND_MSG_PUB.Count_And_Get(
6413         p_count =>  x_msg_count,
6414         p_data  =>  x_msg_data
6415         );
6416 
6417       WHEN OTHERS THEN
6418         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6419            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6420                  g_module || l_api_name,
6421                  'Leaving get_customer_userlist because of EXCEPTION: ' || sqlerrm);
6422         END IF;
6423         IF (tca_contact_csr%ISOPEN) THEN
6424           CLOSE tca_contact_csr ;
6425         END IF;
6426         IF (tca_email_csr%ISOPEN) THEN
6427           CLOSE tca_email_csr ;
6428         END IF;
6429         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6430                             p_msg_name     => G_UNEXPECTED_ERROR,
6431                             p_token1       => G_SQLCODE_TOKEN,
6432                             p_token1_value => sqlcode,
6433                             p_token2       => G_SQLERRM_TOKEN,
6434                             p_token2_value => sqlerrm);
6435         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6436         FND_MSG_PUB.Count_And_Get(
6437         p_count =>  x_msg_count,
6438         p_data  =>  x_msg_data
6439         );
6440   END get_customer_userlist;
6441 
6442 
6443   -- Start of comments
6444   --API name      : get_external_userlist
6445   --Type          : Private.
6446   --Function      : Returns the external user email addresses.
6447   --Pre-reqs      : None.
6448   --Parameters    :
6449   --IN            : p_api_version         IN NUMBER       Required
6450   --              : p_init_msg_list       IN VARCHAR2     Optional
6451   --                   Default = FND_API.G_FALSE
6452   --              : p_document_id         IN NUMBER       Required
6453   --                   Id of the contract
6454   --             : p_document_type        IN VARCHAR2     Required
6455   --                   Contract type.
6456   --              : p_external_party_id   IN NUMBER       Required
6457   --                   External party ID
6458   --              : p_external_party_role IN VARCHAR2     Required
6459   --                   External party role.
6460   --OUT           : x_external_userlist   OUT  VARCHAR2(1)
6461   --                      external contact email addresses
6462   --              : x_return_status       OUT  VARCHAR2(1)
6463   --              : x_msg_count           OUT  NUMBER
6464   --              : x_msg_data            OUT  VARCHAR2(2000)
6465   -- End of comments
6466   PROCEDURE get_external_userlist(
6467       p_api_version         IN  NUMBER,
6468       p_init_msg_list       IN VARCHAR2,
6469       p_document_id         IN  NUMBER,
6470       p_document_type       IN VARCHAR2,
6471       p_external_party_id   IN NUMBER,
6472       p_external_party_role IN VARCHAR2,
6473       x_msg_data            OUT NOCOPY  VARCHAR2,
6474       x_msg_count           OUT NOCOPY  NUMBER,
6475       x_return_status       OUT NOCOPY  VARCHAR2,
6476     x_external_userlist   OUT NOCOPY VARCHAR2) IS
6477 
6478     l_api_name      VARCHAR2(30);
6479     l_api_version       CONSTANT NUMBER := 1.0;
6480 
6481   BEGIN
6482 
6483     l_api_name      := 'get_external_userlist';
6484 
6485     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6486         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6487                 'Entered OKC_REP_UTIL_PVT.get_external_userlist');
6488         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6489                 'p_document_id is: ' || to_char(p_document_id));
6490         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6491                 'p_document_type is: ' || to_char(p_document_type));
6492         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6493                 'p_external_party_id is: ' || to_char(p_external_party_id));
6494         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6495                 'p_external_party_role is: ' || to_char(p_external_party_role));
6496     END IF;
6497 
6498     -- Standard call to check for call compatibility.
6499     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6500       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6501     END IF;
6502     -- Initialize message list if p_init_msg_list is set to TRUE.
6503     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6504       FND_MSG_PUB.initialize;
6505     END IF;
6506 
6507     --  Initialize API return status to success
6508     x_return_status := FND_API.G_RET_STS_SUCCESS;
6509     if (p_external_party_role = G_PARTY_ROLE_SUPPLIER) THEN
6510         get_vendor_userlist(
6511           p_api_version         => p_api_version,
6512           p_init_msg_list       => p_init_msg_list,
6513           p_document_id         => p_document_id,
6514           p_external_party_id   => p_external_party_id,
6515           x_msg_data            => x_msg_data,
6516           x_msg_count           => x_msg_count,
6517           x_return_status       => x_return_status,
6518         x_external_userlist   => x_external_userlist);
6519   ELSE
6520       get_customer_userlist(
6521           p_api_version         => p_api_version,
6522           p_init_msg_list       => p_init_msg_list,
6523           p_document_id         => p_document_id,
6524           p_external_party_id   => p_external_party_id,
6525           p_external_party_role => p_external_party_role,
6526           x_msg_data            => x_msg_data,
6527           x_msg_count           => x_msg_count,
6528           x_return_status       => x_return_status,
6529         x_external_userlist   => x_external_userlist);
6530     END IF;
6531 
6532 
6533     -- Standard call to get message count and if count is 1, get message info.
6534     FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data );
6535 
6536   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6537         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6538                 'Leaving OKC_REP_UTIL_PVT.get_external_userlist');
6539     END IF;
6540 
6541 
6542     EXCEPTION
6543       WHEN FND_API.G_EXC_ERROR THEN
6544         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6545            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6546                  g_module || l_api_name,
6547                  'Leaving get_external_userlist:FND_API.G_EXC_ERROR Exception');
6548         END IF;
6549         x_return_status := FND_API.G_RET_STS_ERROR;
6550         FND_MSG_PUB.Count_And_Get(
6551         p_count =>  x_msg_count,
6552         p_data  =>  x_msg_data
6553         );
6554 
6555       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6556         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6557            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6558                  g_module || l_api_name,
6559                  'Leaving get_external_userlist:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
6560         END IF;
6561         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6562         FND_MSG_PUB.Count_And_Get(
6563         p_count =>  x_msg_count,
6564         p_data  =>  x_msg_data
6565         );
6566 
6567       WHEN OTHERS THEN
6568         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6569            fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
6570                  g_module || l_api_name,
6571                  'Leaving get_external_userlist because of EXCEPTION: ' || sqlerrm);
6572         END IF;
6573         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6574                             p_msg_name     => G_UNEXPECTED_ERROR,
6575                             p_token1       => G_SQLCODE_TOKEN,
6576                             p_token1_value => sqlcode,
6577                             p_token2       => G_SQLERRM_TOKEN,
6578                             p_token2_value => sqlerrm);
6579         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6580         FND_MSG_PUB.Count_And_Get(
6581         p_count =>  x_msg_count,
6582         p_data  =>  x_msg_data
6583         );
6584   END get_external_userlist;
6585 
6586 
6587   -- Start of comments
6588   --API name      : ok_to_commit
6589   --Type          : Private.
6590   --Function      : Returns the external user email addresses.
6591   --                Bug Fix 4232846 - If p_validation_string is not null (called from
6592   --                Contract Parties or Deliverables) we should check contract status
6593   --                as well.
6594   --Pre-reqs      : None.
6595   --Parameters    :
6596   --IN            : p_api_version         IN NUMBER       Required
6597   --              : p_init_msg_list       IN VARCHAR2     Optional
6598   --                   Default = FND_API.G_FALSE
6599   --              : p_doc_id              IN NUMBER       Required
6600   --                   Id of the contract
6601   --              : p_validation_string   IN VARCHAR2     Optional
6602   --                   Validation string
6603   --OUT           : x_return_status       OUT  VARCHAR2(1)
6604   --              : x_msg_count           OUT  NUMBER
6605   --              : x_msg_data            OUT  VARCHAR2(2000)
6606   -- End of comments
6607   FUNCTION ok_to_commit(
6608       p_api_version       IN  Number,
6609       p_init_msg_list     IN  Varchar2,
6610       p_doc_id            IN  Number,
6611       p_validation_string IN  Varchar2 default NULL,
6612       x_return_status     OUT NOCOPY Varchar2,
6613       x_msg_data          OUT NOCOPY Varchar2,
6614       x_msg_count         OUT NOCOPY Number)
6615   RETURN Varchar2 IS
6616 
6617     l_api_version      NUMBER;
6618     l_api_name         VARCHAR2(30);
6619     l_ok_to_commit     Varchar2(1);
6620     l_temp             NUMBER;
6621 
6622 
6623     CURSOR l_contract_exist_csr IS
6624       SELECT contract_id
6625       FROM okc_rep_contracts_all
6626       WHERE contract_id=p_doc_id;
6627 
6628     CURSOR l_contract_updatable_csr IS
6629       SELECT contract_id
6630       FROM okc_rep_contracts_all
6631       WHERE contract_id=p_doc_id
6632           AND contract_status_code in (G_STATUS_REJECTED, G_STATUS_DRAFT);
6633 
6634 
6635   BEGIN
6636 
6637     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6638       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6639               'Entered OKC_REP_WF_PVT.ok_to_commit');
6640       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6641               'p_doc_id = ' || p_doc_id);
6642       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6643               'p_validation_string = ' || p_validation_string);
6644     END IF;
6645 
6646     l_api_version := 1.0;
6647     l_api_name := 'ok_to_commit';
6648     l_ok_to_commit := FND_API.G_FALSE;
6649 
6650 
6651     -- Standard call to check for call compatibility.
6652     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6653       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6654     END IF;
6655 
6656     -- Initialize message list if p_init_msg_list is set to TRUE.
6657     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6658       FND_MSG_PUB.initialize;
6659     END IF;
6660 
6661     --  Initialize API return status to success
6662     x_return_status := FND_API.G_RET_STS_SUCCESS;
6663 
6664     -- If p_validation_string is NULL, check only the header record. Otherwise check contract
6665     -- status as well.
6666     IF (p_validation_string is NULL) THEN
6667         OPEN  l_contract_exist_csr;
6668         FETCH l_contract_exist_csr INTO l_temp;
6669         IF (l_contract_exist_csr%NOTFOUND) THEN
6670             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6671                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6672                 'Contract not found');
6673             END IF;
6674             l_ok_to_commit := FND_API.G_FALSE;
6675             CLOSE l_contract_exist_csr;
6676         ELSE
6677             -- Update the CONTRACT_LAST_UPDATE_DATE and CONTRACT_LAST_UPDATE_BY columns
6678             -- No need to updated these columns. These are updated upon View Contract.
6679             -- UPDATE  okc_rep_contracts_all
6680             -- SET     CONTRACT_LAST_UPDATE_DATE = sysdate,
6681             --      CONTRACT_LAST_UPDATED_BY = FND_GLOBAL.user_id()
6682             -- WHERE   contract_id = p_doc_id;
6683             l_ok_to_commit := FND_API.G_TRUE;
6684             CLOSE l_contract_exist_csr;
6685         END IF; -- (l_contract_exist_csr%NOTFOUND)
6686     ELSE
6687         OPEN  l_contract_updatable_csr;
6688         FETCH l_contract_updatable_csr INTO l_temp;
6689         IF (l_contract_updatable_csr%NOTFOUND) THEN
6690             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6691                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6692                 'Contract not found');
6693             END IF;
6694             l_ok_to_commit := FND_API.G_FALSE;
6695             CLOSE l_contract_updatable_csr;
6696         ELSE
6697             -- Update the CONTRACT_LAST_UPDATE_DATE and CONTRACT_LAST_UPDATE_BY columns
6698             -- No need to updated these columns. These are updated upon View Contract.
6699             -- UPDATE  okc_rep_contracts_all
6700             -- SET     CONTRACT_LAST_UPDATE_DATE = sysdate,
6701             --      CONTRACT_LAST_UPDATED_BY = FND_GLOBAL.user_id()
6702             -- WHERE   contract_id = p_doc_id;
6703             l_ok_to_commit := FND_API.G_TRUE;
6704             CLOSE l_contract_updatable_csr;
6705         END IF; -- (l_contract_updatable_csr%NOTFOUND)
6706     END IF;   -- (p_validation_string is NULL)
6707     -- Standard call to get message count and if count is 1, get message info.
6708     FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data );
6709     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6710       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6711                    '110: Leaving OKC_REP_UTIL_PVT.ok_to_commit');
6712       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6713               '111: Output is: ' || l_ok_to_commit);
6714       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6715               '112: x_return_status is: ' || x_return_status);
6716     END IF;
6717     return l_ok_to_commit;
6718   EXCEPTION
6719 
6720     WHEN OTHERS THEN
6721         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6722           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
6723                   'Leaving Function ok_to_commit because of EXCEPTION: '||sqlerrm);
6724         END IF;
6725 
6726         IF (l_contract_exist_csr%ISOPEN) THEN
6727           CLOSE l_contract_exist_csr ;
6728         END IF;
6729         IF (l_contract_updatable_csr%ISOPEN) THEN
6730           CLOSE l_contract_updatable_csr ;
6731         END IF;
6732         x_return_status := FND_API.G_RET_STS_ERROR;
6733         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6734                             p_msg_name     => G_UNEXPECTED_ERROR,
6735                             p_token1       => G_SQLCODE_TOKEN,
6736                             p_token1_value => sqlcode,
6737                             p_token2       => G_SQLERRM_TOKEN,
6738                             p_token2_value => sqlerrm);
6739     RETURN l_ok_to_commit ;
6740 
6741   END ok_to_commit;
6742 
6743 
6744 -- Start of comments
6745 --API name      : purge_recent_contracts
6746 --Type          : Private.
6747 --Function      : Called from OKC_PURGE_PVT package to purge
6748 --                contracts that are older than p_num_days days
6749 --Pre-reqs      : None.
6750 --Parameters    :
6751 --OUT           : errbuf  OUT NOCOPY VARCHAR2
6752 --              : retcode OUT NOCOPY VARCHAR2
6753 --IN            : p_num_days IN NUMBER
6754 --Note          :
6755 -- End of comments
6756 
6757   PROCEDURE purge_recent_contracts(
6758     errbuf  OUT NOCOPY VARCHAR2,
6759     retcode OUT NOCOPY VARCHAR2,
6760     p_num_days IN NUMBER)
6761 
6762   IS
6763     l_api_name      VARCHAR2(32);
6764   BEGIN
6765     l_api_name := 'purge_recent_contracts';
6766 
6767     retcode := G_RETURN_CODE_ERROR;
6768 
6769     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6770       FND_LOG.STRING(
6771         FND_LOG.LEVEL_PROCEDURE,
6772         G_MODULE||l_api_name,
6773         'Entering OKC_REP_UTIL_PVT.purge_recent_contracts');
6774     END IF;
6775 
6776     DELETE FROM okc_rep_recent_contracts c
6777     WHERE c.last_visited_date < SYSDATE - p_num_days;
6778 
6779     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6780     FND_LOG.STRING(
6781       FND_LOG.LEVEL_PROCEDURE,
6782       G_MODULE||l_api_name,
6783       'Leaving OKC_REP_UTIL_PVT.purge_recent_contracts');
6784     END IF;
6785 
6786     retcode := G_RETURN_CODE_SUCCESS;
6787 
6788     EXCEPTION
6789       WHEN OTHERS THEN
6790         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6791           fnd_log.string(
6792             FND_LOG.LEVEL_EXCEPTION,
6793             G_MODULE || l_api_name,
6794             'Leaving purge_recent_contracts because of EXCEPTION: ' || SQLERRM);
6795           errbuf := substr(SQLERRM, 1, 200);
6796         END IF;
6797 
6798 END purge_recent_contracts;
6799 
6800 -- Start of comments
6801 --API name      : can_update
6802 --Type          : Private.
6803 --Function      : Checks if user can update a contract
6804 --Pre-reqs      : None.
6805 --Parameters    :
6806 --OUT           : Return Y if user is allowed to update contracts, N if not allowed
6807 --Note          :
6808 -- End of comments
6809 
6810   FUNCTION can_update RETURN VARCHAR2
6811     IS
6812         l_api_name   VARCHAR2(10);
6813         l_can_update VARCHAR2(1);
6814   BEGIN
6815 
6816     l_api_name                     := 'can_update';
6817     l_can_update                   := 'N';
6818 
6819     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6820         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6821                 'Entered Function OKC_REP_UTIL_PVT.can_update');
6822     END IF;
6823 
6824     IF FND_FUNCTION.TEST(G_FUNC_OKC_REP_ADMINISTRATOR,'Y') OR FND_FUNCTION.TEST(G_FUNC_OKC_REP_USER_FUNC,'Y') THEN
6825       l_can_update := 'Y';
6826     END IF;
6827 
6828     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6829         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6830                 'OKC_REP_UTIL_PVT.check_contract_access returns l_can_update as : '
6831           || l_can_update);
6832         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6833                 'Leaving Function l_can_update');
6834     END IF;
6835     RETURN l_can_update;
6836 
6837   EXCEPTION
6838     WHEN OTHERS THEN
6839       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6840         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
6841                 'Leaving Function can_update because of EXCEPTION: '||sqlerrm);
6842       END IF;
6843       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6844                         p_msg_name     => G_UNEXPECTED_ERROR,
6845                         p_token1       => G_SQLCODE_TOKEN,
6846                         p_token1_value => sqlcode,
6847                         p_token2       => G_SQLERRM_TOKEN,
6848                         p_token2_value => sqlerrm);
6849       RETURN l_can_update ;
6850   END can_update;
6851 
6852 -- Start of comments
6853 --API name      : is_sales_workbench
6854 --Type          : Private.
6855 --Function      : Checks if the current application is Sales Contracts Workbench or Contract Repository
6856 --Pre-reqs      : None.
6857 --Parameters    :
6858 --OUT           : Return Y if it is Sales Contracts Workbench, otherwise returns N
6859 --Note          :
6860 -- End of comments
6861 
6862   FUNCTION is_sales_workbench RETURN VARCHAR2
6863     IS
6864 
6865       l_api_name   VARCHAR2(20);
6866       l_is_sales_workbench VARCHAR2(1);
6867 
6868     BEGIN
6869 
6870       l_api_name := 'is_sales_workbench';
6871       l_is_sales_workbench := 'N';
6872 
6873       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6874           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6875                   'Entered Function OKC_REP_UTIL_PVT.is_sales_workbench');
6876       END IF;
6877 
6878       IF FND_FUNCTION.TEST(G_FUNC_OKC_REP_SALES_WB_USER,'Y') THEN
6879         l_is_sales_workbench := 'Y';
6880       END IF;
6881 
6882       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6883           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6884                   'OKC_REP_UTIL_PVT.is_sales_workbench returns l_is_sales_workbench as : '
6885             || l_is_sales_workbench);
6886           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6887                   'Leaving Function is_sales_workbench');
6888       END IF;
6889 
6890       RETURN l_is_sales_workbench;
6891 
6892     EXCEPTION
6893       WHEN OTHERS THEN
6894         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6895           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
6896                   'Leaving Function is_sales_workbench because of EXCEPTION: '||sqlerrm);
6897         END IF;
6898         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
6899                             p_msg_name     => G_UNEXPECTED_ERROR,
6900                             p_token1       => G_SQLCODE_TOKEN,
6901                             p_token1_value => sqlcode,
6902                             p_token2       => G_SQLERRM_TOKEN,
6903                             p_token2_value => sqlerrm);
6904         RETURN l_is_sales_workbench ;
6905   END is_sales_workbench;
6906 
6907 
6908   -- Start of comments
6909   --API name      : insert_new_vendor_contact
6910   --Type          : Private.
6911   --Function      : Creates a new vendor contact and returns the newly created contact id.
6912   --Pre-reqs      : None.
6913   --Parameters    :
6914   --IN            : p_vendor_site_id         IN NUMBER       Required
6915   --                   Vendor site id of the contact
6916   --              : p_contract_id         IN NUMBER       Required
6917   --                   Id of the contract for which the new contact being created
6918   --              : p_first_name       IN VARCHAR2     Required
6919   --                   First name of the contact
6920   --              : p_last_name         IN NUMBER       Required
6921   --                   Last name of the contact
6922   --              : p_area_code        IN VARCHAR2     Optional
6923   --                   Area code of the contact phone number.
6924   --              : p_phone   IN NUMBER       Optional
6925   --                   Phone number of the contact
6926   --              : p_email_address IN VARCHAR2     Optional
6927   --                   Email address of the contact.
6928   --OUT           : x_vendor_contact_id   OUT  VARCHAR2(1)
6929   --                   Vendor contact id
6930   -- End of comments
6931   PROCEDURE insert_new_vendor_contact(
6932       p_vendor_site_id                IN NUMBER,
6933       p_contract_id                   IN NUMBER,
6934       p_first_name                    IN VARCHAR2,
6935       p_last_name                     IN VARCHAR2,
6936       p_area_code                     IN VARCHAR2,
6937       p_phone                         IN VARCHAR2,
6938       p_email_address                 IN VARCHAR2,
6939       x_vendor_contact_id             OUT NOCOPY NUMBER)
6940   IS
6941       l_api_name      VARCHAR2(32);
6942       l_vendor_contact_rec AP_VENDOR_PUB_PKG.r_vendor_contact_rec_type;
6943 
6944 
6945       l_return_status VARCHAR2(1);
6946       l_msg_count NUMBER;
6947       l_msg_data VARCHAR2(2000);
6948       l_per_party_id NUMBER;
6949       l_rel_party_id NUMBER;
6950       l_rel_id NUMBER;
6951       l_org_contact_id NUMBER;
6952       l_party_site_id NUMBER;
6953       l_org_id okc_rep_contracts_all.org_id%TYPE;
6954 
6955       CURSOR contract_org_csr IS
6956           SELECT org_id
6957           FROM okc_rep_contracts_all
6958           WHERE contract_id = p_contract_id;
6959 
6960     BEGIN
6961       l_api_name := 'insert_new_vendor_contact';
6962 
6963       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6964         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6965                         'Entering OKC_REP_UTIL_PVT.insert_new_vendor_contact');
6966         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6967                         'p_vendor_site_id: ' || p_vendor_site_id);
6968         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6969                         'p_contract_id: ' || p_contract_id);
6970         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6971                         'p_first_name: ' || p_first_name);
6972         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6973                         'p_last_name: ' || p_last_name);
6974         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6975                         'p_area_code: ' || p_area_code);
6976         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6977                         'p_phone: ' || p_phone);
6978         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6979                         'p_email_address: ' || p_email_address);
6980       END IF;
6981 
6982       -- Populate the record structure required by AP API
6983       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6984           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6985                   'Populate the record structure required by AP API');
6986       END IF;
6987 
6988       OPEN  contract_org_csr;
6989       FETCH contract_org_csr  INTO  l_org_id;
6990       CLOSE contract_org_csr;
6991 
6992       -- Set single-org policy context
6993       -- Even though in R12 vedor information is migrated to TCA still
6994       -- AP has some legacy code which requires org context
6995       IF (l_org_id IS NOT NULL) THEN
6996         MO_GLOBAL.set_policy_context(p_access_mode => 'S',
6997                                      p_org_id => l_org_id);
6998       END IF;
6999 
7000       l_vendor_contact_rec.VENDOR_SITE_ID := p_vendor_site_id;
7001       l_vendor_contact_rec.ORG_ID := l_org_id;
7002       l_vendor_contact_rec.PERSON_FIRST_NAME := p_first_name;
7003       l_vendor_contact_rec.PERSON_LAST_NAME := p_last_name;
7004       l_vendor_contact_rec.AREA_CODE := p_area_code;
7005       l_vendor_contact_rec.PHONE := p_phone;
7006       l_vendor_contact_rec.EMAIL_ADDRESS := p_email_address;
7007 
7008       -- Call the API to create a vendor contact
7009       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7010                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7011                         'Before calling AP_VENDOR_PUB_PKG.create_vendor_contact()');
7012       END IF;
7013 
7014       -- Call AP API to create a vendor contact as per user entered information
7015       AP_VENDOR_PUB_PKG.create_vendor_contact(
7016                             p_api_version => 1.0,
7017                             p_vendor_contact_rec => l_vendor_contact_rec,
7018                             p_commit => FND_API.G_FALSE,
7019                             x_vendor_contact_id => x_vendor_contact_id,
7020                             x_return_status => l_return_status,
7021                             x_msg_count => l_msg_count,
7022                             x_msg_data => l_msg_data,
7023                             x_per_party_id => l_per_party_id,
7024                             x_rel_party_id => l_rel_party_id,
7025                             x_rel_id => l_rel_id,
7026                             x_org_contact_id => l_org_contact_id,
7027                             x_party_site_id => l_party_site_id);
7028 
7029       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7030                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7031                         'After calling AP_VENDOR_PUB_PKG.create_vendor_contact()');
7032       END IF;
7033 
7034       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7035         FND_LOG.STRING(
7036             FND_LOG.LEVEL_PROCEDURE,
7037             G_MODULE||l_api_name,
7038             'Leaving OKC_REP_UTIL_PVT.insert_new_vendor_contact');
7039       END IF;
7040 
7041     EXCEPTION
7042       WHEN OTHERS THEN
7043         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7044           fnd_log.string(
7045             FND_LOG.LEVEL_EXCEPTION,
7046             G_MODULE || l_api_name,
7047             'Leaving insert_new_vendor_contact because of EXCEPTION: ' || SQLERRM);
7048         END IF;
7049 
7050 END insert_new_vendor_contact;
7051 
7052 
7053 
7054   -- Start of comments
7055   --API name      : sync_con_header_attributes
7056   --Type          : Public.
7057   --Function      : Updates the header level attributes of all archived versions when they're modified in the working version
7058   --Pre-reqs      : None.
7059   --Parameters    :
7060   --IN            : p_api_version         IN NUMBER       Required
7061   --              : p_init_msg_list       IN VARCHAR2     Optional
7062   --              : p_contract_id         IN NUMBER       Required
7063   --                   Id of the contact
7064   --OUT           : x_return_status       OUT  VARCHAR2(1)
7065   --              : x_msg_count           OUT  NUMBER
7066   --              : x_msg_data            OUT  VARCHAR2(2000)
7067   -- End of comments
7068   PROCEDURE sync_con_header_attributes(
7069       p_api_version         IN NUMBER,
7070       p_init_msg_list       IN VARCHAR2,
7071       p_contract_id                IN NUMBER,
7072       x_msg_data            OUT NOCOPY  VARCHAR2,
7073       x_msg_count           OUT NOCOPY  NUMBER,
7074       x_return_status       OUT NOCOPY  VARCHAR2)
7075   IS
7076       l_api_name      VARCHAR2(32);
7077       l_api_version       NUMBER;
7078 
7079       l_desc okc_rep_contracts_all.contract_desc%TYPE;
7080       l_use_acl_flag okc_rep_contracts_all.use_acl_flag%TYPE;
7081       l_expire_ntf_flag okc_rep_contracts_all.expire_ntf_flag%TYPE;
7082       l_expire_ntf_period okc_rep_contracts_all.expire_ntf_period%TYPE;
7083       l_ntf_contact_role_id okc_rep_contracts_all.notify_contact_role_id%TYPE;
7084 
7085       CURSOR contract_attribs_csr IS
7086         SELECT contract_desc,
7087                use_acl_flag,
7088                expire_ntf_flag,
7089                expire_ntf_period,
7090                notify_contact_role_id
7091         FROM okc_rep_contracts_all
7092         WHERE contract_id = p_contract_id;
7093 
7094     BEGIN
7095       l_api_name := 'sync_con_header_attributes';
7096       l_api_version := 1.0;
7097 
7098       -- Standard Start of API savepoint
7099       SAVEPOINT sync_con_header_attributes;
7100 
7101       -- Standard call to check for call compatibility.
7102       IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7103         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7104       END IF;
7105 
7106       -- Initialize message list if p_init_msg_list is set to TRUE.
7107       IF FND_API.to_Boolean( p_init_msg_list ) THEN
7108         FND_MSG_PUB.initialize;
7109       END IF;
7110 
7111       --  Initialize API return status to success
7112       x_return_status := FND_API.G_RET_STS_SUCCESS;
7113 
7114       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7115         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
7116                         'Entering OKC_REP_UTIL_PVT.sync_con_header_attributes');
7117         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7118                         'p_contract_id: ' || p_contract_id);
7119       END IF;
7120 
7121       OPEN  contract_attribs_csr;
7122       FETCH contract_attribs_csr  INTO  l_desc, l_use_acl_flag, l_expire_ntf_flag, l_expire_ntf_period, l_ntf_contact_role_id;
7123       CLOSE contract_attribs_csr;
7124 
7125       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7126           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7127                           'l_desc : ' || l_desc);
7128           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7129                           'l_use_acl_flag : ' || l_use_acl_flag);
7130           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7131                           'l_expire_ntf_flag : ' || l_expire_ntf_flag);
7132           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7133                           'l_expire_ntf_period : ' || l_expire_ntf_period);
7134           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7135                           'l_ntf_contact_role_id : ' || l_ntf_contact_role_id);
7136       END IF;
7137 
7138       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7139         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7140                         'Updating Archived versions of Contract with new Contract header attribute values');
7141       END IF;
7142 
7143       -- Update all the rows in archived contract versions table with new contract header details
7144       UPDATE okc_rep_contract_vers
7145       SET contract_desc = l_desc,
7146           use_acl_flag = l_use_acl_flag,
7147           expire_ntf_flag = l_expire_ntf_flag,
7148           expire_ntf_period = l_expire_ntf_period,
7149           notify_contact_role_id = l_ntf_contact_role_id
7150       WHERE contract_id = p_contract_id;
7151 
7152       COMMIT WORK;
7153 
7154       -- Standard call to get message count and if count is 1, get message info.
7155       FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data );
7156 
7157       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7158         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7159                 'Leaving OKC_REP_UTIL_PVT.sync_con_header_attributes');
7160       END IF;
7161 
7162     EXCEPTION
7163       WHEN OTHERS THEN
7164         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7165           fnd_log.string(
7166             FND_LOG.LEVEL_EXCEPTION,
7167             G_MODULE || l_api_name,
7168             'Leaving sync_con_header_attributes because of EXCEPTION: ' || SQLERRM);
7169         END IF;
7170 
7171         IF (contract_attribs_csr%ISOPEN) THEN
7172           CLOSE contract_attribs_csr ;
7173         END IF;
7174 
7175 END sync_con_header_attributes;
7176 
7177 
7178   -- Start of comments
7179   --API name      : check_contract_doc_access
7180   --Type          : Private.
7181   --Function      : Checks access to contract docs by the current user.
7182   --Pre-reqs      : None.
7183   --Parameters    :
7184   --IN            : p_api_version         IN NUMBER       Required
7185   --              : p_init_msg_list       IN VARCHAR2     Optional
7186   --              : p_contract_id         IN NUMBER       Required
7187   --                   Id of the contract whose access to be checked
7188   --              : p_function_name       IN VARCHAR2       Required
7189   --                   Name of the function whose access to be checked. Possible values OKC_REP_SELECT and OKC_REP_UPDATE
7190   --OUT           : x_has_access          OUT  VARCHAR2(1)
7191   --              : x_status_code         OUT  VARCHAR2(30)
7192   --              : x_return_status       OUT  VARCHAR2(1)
7193   --              : x_msg_count           OUT  NUMBER
7194   --              : x_msg_data            OUT  VARCHAR2(2000)
7195   -- End of comments
7196   PROCEDURE check_contract_doc_access(
7197       p_api_version     IN  NUMBER,
7198       p_init_msg_list   IN VARCHAR2,
7199       p_contract_id     IN  NUMBER,
7200       p_version_number  IN  NUMBER,
7201       p_function_name   IN  VARCHAR2,
7202       x_has_access      OUT NOCOPY  VARCHAR2,
7203       x_status_code     OUT NOCOPY  VARCHAR2,
7204       x_archived_yn     OUT NOCOPY  VARCHAR2,
7205       x_msg_data        OUT NOCOPY  VARCHAR2,
7206       x_msg_count       OUT NOCOPY  NUMBER,
7207       x_return_status   OUT NOCOPY  VARCHAR2)
7208   IS
7209 
7210      l_status_code OKC_REP_CONTRACTS_ALL.CONTRACT_STATUS_CODE%TYPE;
7211      l_archived_yn OKC_REP_DOC_VERSIONS_V.ARCHIVED_YN%TYPE;
7212 
7213   BEGIN
7214 
7215      check_contract_access(
7216       p_api_version     => p_api_version,
7217       p_init_msg_list   => p_init_msg_list,
7218       p_contract_id     => p_contract_id,
7219       p_function_name   => p_function_name,
7220       x_has_access      => x_has_access,
7221       x_msg_data        => x_msg_data,
7222       x_msg_count       => x_msg_count,
7223       x_return_status   => x_return_status) ;
7224 
7225       select status, archived_yn into l_status_code, l_archived_yn
7226         from OKC_REP_DOC_VERSIONS_V
7227         where document_id = p_contract_id
7228         and   document_version = p_version_number;
7229 
7230       x_status_code := l_status_code;
7231       x_archived_yn := l_archived_yn;
7232 
7233   EXCEPTION
7234   WHEN OTHERS THEN
7235 
7236         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7237           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,
7238                  g_module || 'check_contract_doc_access.exception',
7239                  '117: Leaving check_contract_access because of EXCEPTION: ' || sqlerrm);
7240         END IF;
7241         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
7242                             p_msg_name     => G_UNEXPECTED_ERROR,
7243                             p_token1       => G_SQLCODE_TOKEN,
7244                             p_token1_value => sqlcode,
7245                             p_token2       => G_SQLERRM_TOKEN,
7246                             p_token2_value => sqlerrm);
7247         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7248         FND_MSG_PUB.Count_And_Get(
7249         p_count =>  x_msg_count,
7250         p_data  =>  x_msg_data
7251         );
7252 
7253   END check_contract_doc_access;
7254 
7255   FUNCTION get_accessible_ous RETURN VARCHAR2
7256   IS
7257     l_api_name   VARCHAR2(20);
7258     l_ou_list VARCHAR2(4000);
7259     l_ou_tab MO_GLOBAL.OrgIdTab;
7260 
7261     BEGIN
7262 
7263       l_api_name := 'get_accessible_ous';
7264 
7265 
7266       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7267           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7268                   'Entered Function OKC_REP_UTIL_PVT.get_accessible_ous');
7269       END IF;
7270 
7271       l_ou_tab := MO_GLOBAL.get_ou_tab;
7272 
7273       IF (l_ou_tab.COUNT > 0) THEN
7274 
7275         FOR i IN l_ou_tab.FIRST .. l_ou_tab.LAST LOOP
7276 
7277           l_ou_list := l_ou_list || ' ' || l_ou_tab(i);
7278 
7279           IF (i <> l_ou_tab.LAST) THEN
7280 
7281             l_ou_list := l_ou_list || ', ';
7282 
7283           END IF;
7284 
7285         END LOOP;
7286 
7287       END IF;
7288 
7289       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7290           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7291                   'OKC_REP_UTIL_PVT.get_accessible_ous returns l_ou_list as : '
7292             || l_ou_list);
7293           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7294                   'Leaving Function get_accessible_ous');
7295       END IF;
7296       RETURN l_ou_list;
7297 
7298     EXCEPTION
7299       WHEN OTHERS THEN
7300         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7301           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
7302                   'Leaving Function get_accessible_ous because of EXCEPTION: '||sqlerrm);
7303         END IF;
7304         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
7305                           p_msg_name     => G_UNEXPECTED_ERROR,
7306                           p_token1       => G_SQLCODE_TOKEN,
7307                           p_token1_value => sqlcode,
7308                           p_token2       => G_SQLERRM_TOKEN,
7309                           p_token2_value => sqlerrm);
7310   END get_accessible_ous;
7311 
7312 
7313 -- Start of comments
7314   --API name      : has_contract_access
7315   --Type          : Private.
7316   --Function      : Checks access to a quote by the current user. It first checks the profile
7317   --              : "aso_enable_security_check". If this profile is set to 'No',
7318   --              : the API returns 'UPDATE'. else it calls ASO_SECURITY_INT.get_quote_access
7319   --              : to get the current user access.
7320   --              :
7321   --Pre-reqs      : None.
7322   --Parameters    :
7323   --IN            : p_resource_id         IN NUMBER       Required
7324   --              : p_quote_number        IN NUMBER       Required
7325   --OUT           : Return 'NONE' if the current user does not have access to the quote. Else it
7326   --              : returns 'READ' or 'UPDATE'.
7327   -- End of comments
7328   FUNCTION get_quote_access
7329   (
7330     p_resource_id                IN   NUMBER,
7331     p_quote_number               IN   NUMBER
7332   ) RETURN VARCHAR2
7333   IS
7334     l_api_name                     VARCHAR2(30);
7335     l_access                       VARCHAR2(30);
7336     l_check_security_access        VARCHAR2(15);
7337 
7338   BEGIN
7339 
7340     l_api_name                     := 'get_quote_access';
7341 
7342     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7343         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7344                 'Entered Function OKC_REP_UTIL_PVT.get_quote_access');
7345         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7346                 'Resource Id is: ' || p_resource_id);
7347         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7348                 'Quote Number is: ' || p_quote_number);
7349     END IF;
7350     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7351         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7352                 'checking security profile - ASO_ENABLE_SECURITY_CHECK');
7353     END IF;
7354 
7355     FND_PROFILE.GET(NAME => G_SALES_QUOTE_SEC_PROFILE, VAL => l_check_security_access);
7356     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7357         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7358             'Profile ASO_ENABLE_SECURITY_CHECK value is: '||l_check_security_access);
7359     END IF;
7360     IF (l_check_security_access = 'N') THEN
7361         l_access := G_SALES_QUOTE_UPDATE_ACCESS;
7362     ELSE
7363         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7364             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7365                 'Calling ASO_SECURITY_INT.get_quote_access to get the access');
7366         END IF;
7367         l_access := ASO_SECURITY_INT.get_quote_access(p_resource_id, p_quote_number);
7368     END IF;
7369     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7370         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7371                 'OKC_REP_UTIL_PVT.get_quote_access returns l_access as : '
7372           || l_access);
7373         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7374                 'Leaving Function get_quote_access');
7375     END IF;
7376     RETURN l_access ;
7377 
7378   EXCEPTION
7379     WHEN OTHERS THEN
7380       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7381         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
7382                 'Leaving Function get_quote_access because of EXCEPTION: '||sqlerrm);
7383       END IF;
7384       Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
7385                         p_msg_name     => G_UNEXPECTED_ERROR,
7386                         p_token1       => G_SQLCODE_TOKEN,
7387                         p_token1_value => sqlcode,
7388                         p_token2       => G_SQLERRM_TOKEN,
7389                         p_token2_value => sqlerrm);
7390       RETURN l_access ;
7391   END get_quote_access;
7392 
7393  --Start of comments
7394   --API name      : contract_terms_disabled_yn
7395   --Type          : Private.
7396   --Function      : Based on the type of the contract selected for update, this
7397   --              : will return 'Y' if there exist contracts with this contract type
7398   --              : which have structured terms authored.
7399   --              : Otherwise, it will return 'N'.The Enable_Contract_Terms chkbox
7400   --              : will be readonly if 'Y' is returned.It will be updateable otherwise.
7401   --              :
7402   --Pre-reqs      : None.
7403   --Parameters    :
7404   --IN            : p_contract_type               IN  VARCHAR2      Required
7405   --OUT           : x_disable_contract_terms_yn   OUT VARCHAR2
7406   -- End of comments
7407 
7408   PROCEDURE contract_terms_disabled_yn
7409   (p_contract_type              IN VARCHAR2 ,
7410   x_disable_contract_terms_yn   OUT NOCOPY  VARCHAR2
7411 
7412   )
7413   IS
7414   l_api_name                     VARCHAR2(30);
7415 
7416   BEGIN
7417 
7418   l_api_name := 'contract_terms_disabled_yn';
7419 
7420   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7421         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7422                 'Entered Procedure OKC_REP_UTIL_PVT.contract_terms_disabled_yn');
7423         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7424                 'Contract Type is: ' || p_contract_type);
7425 
7426   END IF;
7427 
7428 
7429   SELECT Nvl((SELECT 'Y' FROM okc_template_usages WHERE document_type = p_contract_type AND ROWNUM =1),'N') INTO x_disable_contract_terms_yn FROM dual;
7430 
7431 
7432 
7433   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7434         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7435                 'OKC_REP_UTIL_PVT.contract_terms_disabled_yn returns x_disable_contract_terms_yn as : '
7436           || x_disable_contract_terms_yn);
7437         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7438                 'Leaving Procedure contract_terms_disabled_yn');
7439   END IF;
7440 
7441   EXCEPTION
7442   WHEN OTHERS THEN
7443 
7444         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7445         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION ,G_MODULE||l_api_name,
7446                 'Leaving Function contract_terms_disabled_yn because of EXCEPTION: '||sqlerrm);
7447       END IF;
7448 
7449         Okc_Api.Set_Message(p_app_name     => G_APP_NAME,
7450                             p_msg_name     => G_UNEXPECTED_ERROR,
7451                             p_token1       => G_SQLCODE_TOKEN,
7452                             p_token1_value => sqlcode,
7453                             p_token2       => G_SQLERRM_TOKEN,
7454                             p_token2_value => sqlerrm);
7455 
7456 
7457 
7458   END contract_terms_disabled_yn;
7459 
7460 
7461 
7462 
7463 END OKC_REP_UTIL_PVT;