DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_REGISTRY_VALIDATE_BO_PVT

Source


1 PACKAGE BODY HZ_REGISTRY_VALIDATE_BO_PVT AS
2 /*$Header: ARHBRGVB.pls 120.26.12010000.3 2009/06/25 22:11:35 awu ship $ */
3 
4 -- PRIVATE PROCEDURE get_ps_from_rec
5 --
6 -- DESCRIPTION
7 --     Extract business object structure of party site.
8 --
9 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
10 --
11 -- ARGUMENTS
12 --   IN:
13 --     p_bus_object             Business object structure.
14 --   OUT:
15 --     x_bus_object             Business object structure of party site.
16 -- NOTES
17 --
18 -- MODIFICATION HISTORY
19 --
20 --   13-Jul-2005    Arnold Ng   o Created.
21 
22   PROCEDURE get_ps_from_rec(
23     p_bus_object              IN         COMPLETENESS_REC_TYPE,
24     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
25   );
26 
27 -- PRIVATE PROCEDURE get_cp_from_rec
28 --
29 -- DESCRIPTION
30 --     Extract business object structure of contact point.
31 --
32 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
33 --
34 -- ARGUMENTS
35 --   IN:
36 --     p_phone_code             'PHONE'.
37 --     p_email_code             'EMAIL'.
38 --     p_telex_code             'TLX'.
39 --     p_web_code               'WEB'.
40 --     p_edi_code               'EDI'.
41 --     p_eft_code               'EFT'.
42 --     p_sms_code               'SMS'.
43 --   OUT:
44 --     x_bus_object             Business object structure of contact point.
45 -- NOTES
46 --
47 -- MODIFICATION HISTORY
48 --
49 --   13-Jul-2005    Arnold Ng   o Created.
50 
51   PROCEDURE get_cp_from_rec(
52     p_phone_code              IN         VARCHAR2,
53     p_email_code              IN         VARCHAR2,
54     p_telex_code              IN         VARCHAR2,
55     p_web_code                IN         VARCHAR2,
56     p_edi_code                IN         VARCHAR2,
57     p_eft_code                IN         VARCHAR2,
58     p_sms_code                IN         VARCHAR2,
59     p_bus_object              IN         COMPLETENESS_REC_TYPE,
60     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
61   );
62 
63 -- PRIVATE FUNCTION is_ss_provided
64 --
65 -- DESCRIPTION
66 --     Return a flag to indicate that original system and original system reference
67 --     are provided.
68 --
69 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
70 --
71 -- ARGUMENTS
72 --   IN:
73 --     p_os                     Original system.
74 --     p_osr                    Original system reference.
75 -- NOTES
76 --
77 -- MODIFICATION HISTORY
78 --
79 --   13-Jul-2005    Arnold Ng   o Created.
80 
81   FUNCTION is_ss_provided(
82     p_os                      IN     VARCHAR2,
83     p_osr                     IN     VARCHAR2
84   ) RETURN VARCHAR2;
85 
86 -- PROCEDURE validate_parent_id
87 --
88 -- DESCRIPTION
89 --     Validates parent id of business object.
90 --
91 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
92 --
93 -- ARGUMENTS
94 --   IN:
95 --     px_parent_id             Parent Id.
96 --     px_parent_os             Parent original system.
97 --     px_parent_osr            Parent original system reference.
98 --     p_person_obj_type        Parent object type.
99 --   OUT:
100 --     x_return_status          Return status after the call. The status can
101 --                              be FND_API.G_RET_STS_SUCCESS (success),
102 --                              FND_API.G_RET_STS_ERROR (error),
103 --                              FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
104 --     x_msg_count              Return total number of message.
105 --     x_msg_data               Return message content.
106 -- NOTES
107 --
108 -- MODIFICATION HISTORY
109 --
110 --   13-Jul-2005    Arnold Ng   o Created.
111 
112   PROCEDURE validate_parent_id(
113     px_parent_id                 IN OUT NOCOPY NUMBER,
114     px_parent_os                 IN OUT NOCOPY VARCHAR2,
115     px_parent_osr                IN OUT NOCOPY VARCHAR2,
116     p_parent_obj_type            IN VARCHAR2,
117     x_return_status              OUT NOCOPY VARCHAR2,
118     x_msg_count                  OUT NOCOPY NUMBER,
119     x_msg_data                   OUT NOCOPY VARCHAR2
120   ) IS
121     CURSOR is_p_parent_valid(l_party_id NUMBER, l_party_type VARCHAR2) IS
122     select 'Y'
123     from HZ_PARTIES
124     where party_id = l_party_id
125     and party_type = l_party_type;
126 
127     CURSOR is_ps_parent_valid(l_party_site_id NUMBER) IS
128     select 'Y'
129     from HZ_PARTY_SITES
130     where party_site_id = l_party_site_id;
131 
132     CURSOR is_acct_parent_valid(l_acct_id NUMBER) IS
133     select 'Y'
134     from HZ_CUST_ACCOUNTS
135     where cust_account_id = l_acct_id;
136 
137     CURSOR is_acct_site_parent_valid(l_acct_site_id NUMBER) IS
138     select 'Y'
139     from HZ_CUST_ACCT_SITES_ALL
140     where cust_acct_site_id = l_acct_site_id;
141 
142     l_party_type                VARCHAR2(30);
143     l_valid_parent              VARCHAR2(1);
144     l_owner_table_id            NUMBER;
145     l_owner_table_name          VARCHAR2(30);
146     l_parent_ss_flag            VARCHAR2(1);
147     l_debug_prefix              VARCHAR2(30);
148     l_count                     NUMBER;
149   BEGIN
150 
151     -- Debug info.
152     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
153         hz_utility_v2pub.debug(p_message=>'validate_parent_id(+)',
154                                p_prefix=>l_debug_prefix,
155                                p_msg_level=>fnd_log.level_procedure);
156     END IF;
157 
158     x_return_status := FND_API.G_RET_STS_SUCCESS;
159 
160     l_parent_ss_flag := is_ss_provided(p_os  => px_parent_os,
161                                        p_osr => px_parent_osr);
162 
163     l_owner_table_name := get_owner_table_name(p_obj_type => p_parent_obj_type);
164 
165     -- if px_id pass in, check if px_id is valid or not
166     l_valid_parent := 'N';
167 
168     -- if px_parent_id is not null, check if px_parent_id is valid or not
169     IF(px_parent_id IS NOT NULL) THEN
170       IF(l_owner_table_name = 'HZ_PARTIES') THEN
171         IF(p_parent_obj_type = 'PERSON') THEN
172           l_party_type := 'PERSON';
173         ELSIF(p_parent_obj_type = 'ORG') THEN
174           l_party_type := 'ORGANIZATION';
175         ELSE
176           l_party_type := 'PARTY_RELATIONSHIP';
177         END IF;
178         OPEN is_p_parent_valid(px_parent_id, l_party_type);
179         FETCH is_p_parent_valid INTO l_valid_parent;
180         CLOSE is_p_parent_valid;
181       ELSIF(l_owner_table_name = 'HZ_PARTY_SITES') THEN
182         OPEN is_ps_parent_valid(px_parent_id);
183         FETCH is_ps_parent_valid INTO l_valid_parent;
184         CLOSE is_ps_parent_valid;
185       ELSIF(l_owner_table_name = 'HZ_CUST_ACCOUNTS') THEN
186         OPEN is_acct_parent_valid(px_parent_id);
187         FETCH is_acct_parent_valid INTO l_valid_parent;
188         CLOSE is_acct_parent_valid;
189       ELSIF(l_owner_table_name = 'HZ_CUST_ACCT_SITES_ALL') THEN
190         OPEN is_acct_site_parent_valid(px_parent_id);
191         FETCH is_acct_site_parent_valid INTO l_valid_parent;
192         CLOSE is_acct_site_parent_valid;
193       END IF;
194       -- if px_parent_id is invalid, raise error
195       IF(l_valid_parent = 'N') THEN
196         RAISE fnd_api.g_exc_error;
197       END IF;
198     END IF;
199 
200     -- if px_parent_os/px_parent_osr is not null, get owner_table_id and
201     -- set local parent_ss_flag to 'Y'
202     IF(l_parent_ss_flag = 'Y') THEN
203       -- Get how many rows return
204       l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
205                    p_orig_system           => px_parent_os,
206                    p_orig_system_reference => px_parent_osr,
207                    p_owner_table_name      => l_owner_table_name);
208 
209       IF(l_count > 0) THEN
210         -- Get owner_table_id
211         HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
212           p_orig_system           => px_parent_os,
213           p_orig_system_reference => px_parent_osr,
214           p_owner_table_name      => l_owner_table_name,
215           x_owner_table_id        => l_owner_table_id,
216           x_return_status         => x_return_status);
217       END IF;
218     END IF;
219 
220     -- if px_parent_id is passed in
221     IF(px_parent_id IS NOT NULL) THEN
222       -- check if px_parent_os/px_parent_osr is passed
223       IF(l_parent_ss_flag = 'Y') THEN
224         -- if px_parent_os/px_parent_osr is not valid, raise error
225         IF(l_count = 0) OR (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
226           RAISE fnd_api.g_exc_error;
227         END IF;
228         -- if px_parent_os/px_parent_osr is valid, but not same as px_parent_id
229         IF(l_owner_table_id <> px_parent_id) THEN
230           RAISE fnd_api.g_exc_error;
231         END IF;
232       END IF;
233     -- if px_parent_id is not passed in
234     ELSE
235       -- check if px_parent_os/px_parent_osr can find TCA identifier, owner_table_id
236       -- if not found, raise error
237       -- else, get owner_table_id and assign it to px_parent_id
238       IF(l_parent_ss_flag = 'Y') THEN
239         IF(l_count = 0) OR (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
240           RAISE fnd_api.g_exc_error;
241         ELSE
242           px_parent_id := l_owner_table_id;
243         END IF;
244       ELSE
245         RAISE fnd_api.g_exc_error;
246       END IF;
247     END IF;
248   EXCEPTION
249     WHEN fnd_api.g_exc_error THEN
250       x_return_status := fnd_api.g_ret_sts_error;
251 
252       -- put error message "Error: Invalid Identifier";
253       FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_PARENT_ID');
254       FND_MSG_PUB.ADD();
255 
256       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
257                                 p_count => x_msg_count,
258                                 p_data  => x_msg_data);
259 
260       -- Debug info.
261       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
262         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
263                                p_msg_data=>x_msg_data,
264                                p_msg_type=>'ERROR',
265                                p_msg_level=>fnd_log.level_error);
266       END IF;
267       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
268         hz_utility_v2pub.debug(p_message=>'validate_parent_id(-)',
269                                p_prefix=>l_debug_prefix,
270                                p_msg_level=>fnd_log.level_procedure);
271       END IF;
272     WHEN fnd_api.g_exc_unexpected_error THEN
273       x_return_status := fnd_api.g_ret_sts_unexp_error;
274 
275       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
276                                 p_count => x_msg_count,
277                                 p_data  => x_msg_data);
278 
279       -- Debug info.
280       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
281         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
282                                p_msg_data=>x_msg_data,
283                                p_msg_type=>'UNEXPECTED ERROR',
284                                p_msg_level=>fnd_log.level_error);
285       END IF;
286       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
287         hz_utility_v2pub.debug(p_message=>'validate_parent_id(-)',
288                                p_prefix=>l_debug_prefix,
289                                p_msg_level=>fnd_log.level_procedure);
290       END IF;
291 
292     WHEN OTHERS THEN
293       x_return_status := fnd_api.g_ret_sts_unexp_error;
294 
295       fnd_message.set_name('AR', 'HZ_API_OTHERS_EXCEP');
296       fnd_message.set_token('ERROR' ,SQLERRM);
297       fnd_msg_pub.add;
298 
299       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
300                                 p_count => x_msg_count,
301                                 p_data  => x_msg_data);
302 
303       -- Debug info.
304       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
305         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
306                                p_msg_data=>x_msg_data,
307                                p_msg_type=>'SQL ERROR',
308                                p_msg_level=>fnd_log.level_error);
309       END IF;
310       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
311         hz_utility_v2pub.debug(p_message=>'validate_parent_id(-)',
312                                p_prefix=>l_debug_prefix,
313                                p_msg_level=>fnd_log.level_procedure);
314       END IF;
315   END validate_parent_id;
316 
317 -- PROCEDURE validate_ssm_id
318 --
319 -- DESCRIPTION
320 --     Validates Id, original system and original system reference of business object.
321 --
322 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
323 --
324 -- ARGUMENTS
325 --   IN:
326 --     px_id                    Id.
327 --     px_os                    Original system.
328 --     px_osr                   Original system reference.
329 --     p_org_id                 Org_Id for customer account site, customer account
330 --                              site use and customer account relationship.
331 --     p_obj_type               Business object type.
332 --     p_create_or_update       Flag to indicate create or update.
333 --   OUT:
334 --     x_return_status          Return status after the call. The status can
335 --                              be FND_API.G_RET_STS_SUCCESS (success),
336 --                              FND_API.G_RET_STS_ERROR (error),
337 --                              FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
338 --     x_msg_count              Return total number of message.
339 --     x_msg_data               Return message content.
340 -- NOTES
341 --
342 -- MODIFICATION HISTORY
343 --
344 --   13-Jul-2005    Arnold Ng   o Created.
345 
346   PROCEDURE validate_ssm_id(
347     px_id                        IN OUT NOCOPY NUMBER,
348     px_os                        IN OUT NOCOPY VARCHAR2,
349     px_osr                       IN OUT NOCOPY VARCHAR2,
350     p_org_id                     IN            NUMBER := NULL,
351     p_obj_type                   IN            VARCHAR2,
352     p_create_or_update           IN            VARCHAR2,
353     x_return_status              OUT NOCOPY    VARCHAR2,
354     x_msg_count                  OUT NOCOPY    NUMBER,
355     x_msg_data                   OUT NOCOPY    VARCHAR2
356   ) IS
357     CURSOR is_cp_valid(l_cp_id NUMBER, l_cp_type VARCHAR2) IS
358     SELECT 'X'
359     FROM HZ_CONTACT_POINTS
360     WHERE contact_point_id = l_cp_id
361     AND contact_point_type = l_cp_type;
362 
363     CURSOR is_oc_valid(l_oc_id NUMBER) IS
364     SELECT 'X'
365     FROM HZ_ORG_CONTACTS
366     WHERE org_contact_id = l_oc_id;
367 
368     CURSOR is_pty_valid(l_pty_id NUMBER, l_pty_type VARCHAR2) IS
369     SELECT 'X'
370     FROM HZ_PARTIES
371     WHERE party_id = l_pty_id
372     AND party_type = l_pty_type
373     AND status in ('A', 'I');
374 
375     CURSOR is_ps_valid(l_ps_id NUMBER) IS
376     SELECT 'X'
377     FROM HZ_PARTY_SITES
378     WHERE party_site_id = l_ps_id;
379 
380     CURSOR is_loc_valid(l_loc_id NUMBER) IS
381     SELECT 'X'
382     FROM HZ_LOCATIONS
383     WHERE location_id = l_loc_id;
384 
385     CURSOR is_cr_valid(l_cr_id NUMBER) IS
386     SELECT 'X'
387     FROM HZ_CUST_ACCOUNT_ROLES
388     WHERE cust_account_role_id = l_cr_id;
389 
390     CURSOR is_ca_valid(l_ca_id NUMBER) IS
391     SELECT 'X'
392     FROM HZ_CUST_ACCOUNTS
393     WHERE cust_account_id = l_ca_id;
394 
395     CURSOR is_cas_valid(l_cas_id NUMBER, l_org_id NUMBER) IS
396     SELECT 'X'
397     FROM HZ_CUST_ACCT_SITES
398     WHERE cust_acct_site_id = l_cas_id
399     AND org_id = l_org_id;
400 
401     CURSOR is_casu_valid(l_casu_id NUMBER, l_org_id NUMBER) IS
402     SELECT 'X'
403     FROM HZ_CUST_SITE_USES
404     WHERE site_use_id = l_casu_id
405     AND org_id = l_org_id;
406 
407     l_owner_table_id            NUMBER;
408     l_ss_flag                   VARCHAR2(1);
409     l_debug_prefix              VARCHAR2(30);
410     l_valid_id                  VARCHAR2(1);
411     l_count                     NUMBER;
412     l_org_id                    NUMBER;
413     l_dummy                     VARCHAR2(1);
414     l_obj_type                  VARCHAR2(30);
415   BEGIN
416     -- Debug info.
417     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
418         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(+)',
419                                p_prefix=>l_debug_prefix,
420                                p_msg_level=>fnd_log.level_procedure);
421     END IF;
422 
423     x_return_status := FND_API.G_RET_STS_SUCCESS;
424 
425     -- check if os+osr are provided
426     l_ss_flag := is_ss_provided(p_os  => px_os,
427                                 p_osr => px_osr);
428 
429     -- if px_id pass in, check if px_id is valid or not
430     IF(px_id IS NOT NULL) THEN
431       -- user must not pass TCA id when create, if passed in create,
432       -- return error
433       IF(p_create_or_update = 'C') THEN
434         FND_MESSAGE.SET_NAME('AR','HZ_API_CANNOT_PASS_PK');
435         FND_MSG_PUB.ADD();
436         RAISE FND_API.G_EXC_ERROR;
437       END IF;
438       IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
439         OPEN is_cp_valid(px_id, p_obj_type);
440         FETCH is_cp_valid INTO l_valid_id;
441         CLOSE is_cp_valid;
442       ELSIF(p_obj_type = 'HZ_ORG_CONTACTS') THEN
443         OPEN is_oc_valid(px_id);
444         FETCH is_oc_valid INTO l_valid_id;
445         CLOSE is_oc_valid;
446       ELSIF(p_obj_type in ('PERSON','ORGANIZATION','PARTY_RELATIONSHIP')) THEN
447         OPEN is_pty_valid(px_id, p_obj_type);
448         FETCH is_pty_valid INTO l_valid_id;
449         CLOSE is_pty_valid;
450       ELSIF(p_obj_type = 'HZ_CUST_ACCOUNT_ROLES') THEN
451         OPEN is_cr_valid(px_id);
452         FETCH is_cr_valid INTO l_valid_id;
453         CLOSE is_cr_valid;
454       ELSIF(p_obj_type = 'HZ_LOCATIONS') THEN
455         OPEN is_loc_valid(px_id);
456         FETCH is_loc_valid INTO l_valid_id;
457         CLOSE is_loc_valid;
458       ELSIF(p_obj_type = 'HZ_PARTY_SITES') THEN
459         OPEN is_ps_valid(px_id);
460         FETCH is_ps_valid INTO l_valid_id;
461         CLOSE is_ps_valid;
462       ELSIF(p_obj_type = 'HZ_CUST_ACCOUNTS') THEN
463         OPEN is_ca_valid(px_id);
464         FETCH is_ca_valid INTO l_valid_id;
465         CLOSE is_ca_valid;
466       ELSIF(p_obj_type = 'HZ_CUST_ACCT_SITES_ALL') THEN
467         OPEN is_cas_valid(px_id, p_org_id);
468         FETCH is_cas_valid INTO l_valid_id;
469         CLOSE is_cas_valid;
470       ELSIF(p_obj_type = 'HZ_CUST_SITE_USES_ALL') THEN
471         OPEN is_casu_valid(px_id, p_org_id);
472         FETCH is_casu_valid INTO l_valid_id;
473         CLOSE is_casu_valid;
474       END IF;
475     END IF;
476 
477     -- if px_os/px_osr pass in, get owner_table_id and set l_ss_flag to 'Y'
478     IF(l_ss_flag = 'Y')THEN
479       IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
480         l_obj_type := 'HZ_CONTACT_POINTS';
481       ELSIF(p_obj_type in ('PERSON','ORGANIZATION','PARTY_RELATIONSHIP')) THEN
482         l_obj_type := 'HZ_PARTIES';
483       ELSE
484         l_obj_type := p_obj_type;
485       END IF;
486 
487       -- Get how many rows return
488       l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
489                    p_orig_system           => px_os,
490                    p_orig_system_reference => px_osr,
491                    p_owner_table_name      => l_obj_type);
492 
493       IF(l_count = 1) THEN
494         -- Get owner_table_id
495         HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
496           p_orig_system           => px_os,
497           p_orig_system_reference => px_osr,
498           p_owner_table_name      => l_obj_type,
499           x_owner_table_id        => l_owner_table_id,
500           x_return_status         => x_return_status);
501 
502         -- For contact point, check if the id and type is the same
503         IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
504           OPEN is_cp_valid(l_owner_table_id, p_obj_type);
505           FETCH is_cp_valid INTO l_dummy;
506           CLOSE is_cp_valid;
507           IF(l_dummy IS NULL) THEN
508             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
509             FND_MSG_PUB.ADD;
510             RAISE fnd_api.g_exc_error;
511           END IF;
512         END IF;
513       END IF;
514     END IF;
515 
516     -- for update
517     IF(p_create_or_update = 'U') THEN
518       -- if px_id pass in
519       IF(px_id IS NOT NULL) THEN
520         -- if px_id is invalid, raise error
521         IF(l_valid_id IS NULL) THEN
522           FND_MESSAGE.SET_NAME('AR','HZ_API_UPDATE_NOT_EXIST');
523           FND_MSG_PUB.ADD();
524           RAISE fnd_api.g_exc_error;
525         -- if px_id is valid
526         ELSE
527           -- check if px_os/px_osr is passed
528           IF(l_ss_flag = 'Y') THEN
529             -- if px_os/px_osr is not valid, means that this is new os+osr
530             -- we should not create ssm mapping, error out
531             IF(l_count = 0) THEN
532               FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_ID');
533               FND_MSG_PUB.ADD();
534               RAISE fnd_api.g_exc_error;
535             -- if px_os/px_osr is valid
536             ELSE
537               -- if px_os/px_osr is valid, but not same as px_id
538               IF(l_owner_table_id <> px_id) OR (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
539                 FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_ID');
540                 FND_MSG_PUB.ADD();
541                 RAISE fnd_api.g_exc_error;
542               END IF;
543             END IF;
544             -- if px_os/px_osr is valid and return value is same as px_id
545             -- do nothing
546           END IF;
547         END IF;
548       -- if px_id not pass in
549       ELSE
550         -- check if px_os/px_osr can find TCA identifier, owner_table_id
551         -- if not found, raise error
552         -- else, get owner_table_id and assign it to px_id
553         IF(l_ss_flag = 'Y') AND (l_count = 1) AND (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
554           px_id := l_owner_table_id;
555         ELSE
556           FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_ID');
557           FND_MSG_PUB.ADD();
558           RAISE fnd_api.g_exc_error;
559         END IF;
560       END IF;
561     -- for create
562     ELSIF(p_create_or_update = 'C') THEN
563       -- if os+osr is valid, raise error
564       IF(l_ss_flag = 'Y') AND (l_count > 0) AND (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
565         FND_MESSAGE.SET_NAME('AR','HZ_API_CREATE_ALREADY_EXISTS');
566         FND_MSG_PUB.ADD();
567         RAISE fnd_api.g_exc_error;
568       END IF;
569     END IF;  -- if p_create_or_update
570 
571   EXCEPTION
572     WHEN fnd_api.g_exc_error THEN
573       x_return_status := fnd_api.g_ret_sts_error;
574 
575       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
576                                 p_count => x_msg_count,
577                                 p_data  => x_msg_data);
578 
579       -- Debug info.
580       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
581         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
582                                p_msg_data=>x_msg_data,
583                                p_msg_type=>'ERROR',
584                                p_msg_level=>fnd_log.level_error);
585       END IF;
586       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
587         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
588                                p_prefix=>l_debug_prefix,
589                                p_msg_level=>fnd_log.level_procedure);
590       END IF;
591     WHEN fnd_api.g_exc_unexpected_error THEN
592       x_return_status := fnd_api.g_ret_sts_unexp_error;
593 
594       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
595                                 p_count => x_msg_count,
596                                 p_data  => x_msg_data);
597 
598       -- Debug info.
599       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
600         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
601                                p_msg_data=>x_msg_data,
602                                p_msg_type=>'UNEXPECTED ERROR',
603                                p_msg_level=>fnd_log.level_error);
604       END IF;
605       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
606         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
607                                p_prefix=>l_debug_prefix,
608                                p_msg_level=>fnd_log.level_procedure);
609       END IF;
610     WHEN OTHERS THEN
611       x_return_status := fnd_api.g_ret_sts_unexp_error;
612 
613       fnd_message.set_name('AR', 'HZ_API_OTHERS_EXCEP');
614       fnd_message.set_token('ERROR' ,SQLERRM);
615       fnd_msg_pub.add;
616 
617       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
618                                 p_count => x_msg_count,
619                                 p_data  => x_msg_data);
620 
621       -- Debug info.
622       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
623         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
624                                p_msg_data=>x_msg_data,
625                                p_msg_type=>'SQL ERROR',
626                                p_msg_level=>fnd_log.level_error);
627       END IF;
628       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
629         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
630                                p_prefix=>l_debug_prefix,
631                                p_msg_level=>fnd_log.level_procedure);
632       END IF;
633   END validate_ssm_id;
634 
635 -- PROCEDURE check_contact_pref_op
636 --
637 -- DESCRIPTION
638 --     Check the operation of contact preference based on pass in parameter.
639 --
640 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
641 --
642 -- ARGUMENTS
643 --   IN:
644 --     p_contact_level_table_id Contact level table Id.
645 --     p_contact_level_table    Contact level table.
646 --     p_contact_type           Contact preference type.
647 --     p_preference_code        Contact preference code.
648 --     p_preference_start_date  Contact preference start date.
649 --     p_preference_end_date    Contact preference end date.
650 --   IN/OUT:
651 --     px_contact_pref_id       Contact preference Id.
652 --   OUT:
653 --     x_object_version_number  Object version number of contact preference.
654 -- NOTES
655 --
656 -- MODIFICATION HISTORY
657 --
658 --   13-Jul-2005    Arnold Ng   o Created.
659 
660   PROCEDURE check_contact_pref_op(
661     p_contact_level_table_id     IN     NUMBER,
662     p_contact_level_table        IN     VARCHAR2,
663     px_contact_pref_id           IN OUT NOCOPY NUMBER,
664     p_contact_type               IN     VARCHAR2,
665     p_preference_code            IN     VARCHAR2,
666     p_preference_start_date      IN     DATE,
667     p_preference_end_date        IN     DATE,
668     x_object_version_number      OUT NOCOPY NUMBER
669   ) IS
670     CURSOR is_contact_pref_id_exist(l_contact_pref_id NUMBER)IS
671     SELECT nvl(object_version_number,1), contact_level_table_id, contact_level_table
672     FROM HZ_CONTACT_PREFERENCES
673     WHERE contact_preference_id = l_contact_pref_id
674     AND rownum = 1;
675 
676     CURSOR is_contact_pref_exist(l_contact_level_table_id NUMBER,
677                                  l_contact_level_table VARCHAR2,
678                                  l_contact_type VARCHAR2,
679                                  l_preference_code  VARCHAR2, l_preference_start_date DATE,
680                                  l_preference_end_date DATE)IS
681     SELECT nvl(object_version_number,1), contact_preference_id
682     FROM HZ_CONTACT_PREFERENCES
683     WHERE contact_level_table_id = l_contact_level_table_id
684     AND contact_level_table = l_contact_level_table
685     AND contact_type = l_contact_type
686   --  AND preference_code = l_preference_code
687     AND trunc(preference_start_date) = trunc(l_preference_start_date)
688     AND trunc(nvl(preference_end_date,sysdate)) = trunc(nvl(l_preference_end_date,sysdate))
689     AND status in ('A','I')
690     AND rownum = 1;
691 
692     l_clt_id     NUMBER;
693     l_clt        VARCHAR2(30);
694   BEGIN
695     IF(px_contact_pref_id IS NULL) THEN
696       OPEN is_contact_pref_exist(p_contact_level_table_id, p_contact_level_table,
697                                  p_contact_type, p_preference_code,
698                                  p_preference_start_date, p_preference_end_date);
699       FETCH is_contact_pref_exist INTO x_object_version_number, px_contact_pref_id;
700       CLOSE is_contact_pref_exist;
701     ELSE
702       OPEN is_contact_pref_id_exist(px_contact_pref_id);
703       FETCH is_contact_pref_id_exist INTO x_object_version_number, l_clt_id, l_clt;
704       CLOSE is_contact_pref_id_exist;
705       IF((l_clt_id <> p_contact_level_table_id) OR (l_clt <> p_contact_level_table)) OR
706          (l_clt_id IS NULL AND (p_contact_level_table_id IS NOT NULL OR p_contact_level_table IS NOT NULL)) THEN
707         -- return -1 to indicate that the combination of parent and object id do not match
708         x_object_version_number := -1;
709       END IF;
710     END IF;
711   END check_contact_pref_op;
712 
713 -- PROCEDURE check_language_op
714 --
715 -- DESCRIPTION
716 --     Check the operation of person language based on pass in parameter.
717 --
718 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
719 --
720 -- ARGUMENTS
721 --   IN:
722 --     p_party_id               Party Id.
723 --     p_language_name          Language name.
724 --   IN/OUT:
725 --     px_language_use_ref_id   Language use reference Id.
726 --   OUT:
727 --     x_object_version_number  Object version number of person language.
728 -- NOTES
729 --
730 -- MODIFICATION HISTORY
731 --
732 --   13-Jul-2005    Arnold Ng   o Created.
733 
734   PROCEDURE check_language_op(
735     p_party_id                   IN     NUMBER,
736     px_language_use_ref_id       IN OUT NOCOPY NUMBER,
737     p_language_name              IN     VARCHAR2,
738     x_object_version_number      OUT NOCOPY NUMBER
739   ) IS
740     CURSOR is_lang_id_exist(l_lang_id NUMBER)IS
741     SELECT nvl(object_version_number,1), party_id
742     FROM HZ_PERSON_LANGUAGE
743     WHERE language_use_reference_id = l_lang_id
744     AND rownum = 1;
745 
746     CURSOR is_language_exist(l_party_id NUMBER, l_language_name VARCHAR2)IS
747     SELECT nvl(object_version_number,1), language_use_reference_id
748     FROM HZ_PERSON_LANGUAGE
749     WHERE party_id = l_party_id
750     AND language_name = l_language_name
751     AND status in ('A','I')
752     AND rownum = 1;
753 
754     l_party_id     NUMBER;
755   BEGIN
756     IF(px_language_use_ref_id IS NULL) THEN
757       OPEN is_language_exist(p_party_id, p_language_name);
758       FETCH is_language_exist INTO x_object_version_number, px_language_use_ref_id;
759       CLOSE is_language_exist;
760     ELSE
761       OPEN is_lang_id_exist(px_language_use_ref_id);
762       FETCH is_lang_id_exist INTO x_object_version_number, l_party_id;
763       CLOSE is_lang_id_exist;
764       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
765         -- return -1 to indicate that the combination of parent and object id do not match
766         x_object_version_number := -1;
767       END IF;
768     END IF;
769   END check_language_op;
770 
771 -- PROCEDURE check_education_op
772 --
773 -- DESCRIPTION
774 --     Check the operation of education based on pass in parameter.
775 --
776 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
777 --
778 -- ARGUMENTS
779 --   IN:
780 --     p_party_id               Party Id.
781 --     p_course_major           Course major.
782 --     p_school_attended_name   Name of attended school.
783 --     p_degree_received        Received degree.
784 --   IN/OUT:
785 --     px_education_id          Education Id.
786 --   OUT:
787 --     x_object_version_number  Object version number of education.
788 -- NOTES
789 --
790 -- MODIFICATION HISTORY
791 --
792 --   13-Jul-2005    Arnold Ng   o Created.
793 
794   PROCEDURE check_education_op(
795     p_party_id                   IN     NUMBER,
796     px_education_id              IN OUT NOCOPY NUMBER,
797     p_course_major               IN     VARCHAR2,
798     p_school_attended_name       IN     VARCHAR2,
799     p_degree_received            IN     VARCHAR2,
800     x_object_version_number      OUT NOCOPY NUMBER
801   ) IS
802     CURSOR is_edu_id_exist(l_edu_id NUMBER) IS
803     SELECT nvl(object_version_number,1), party_id
804     FROM HZ_EDUCATION
805     WHERE education_id = l_edu_id
806     AND rownum = 1;
807 
808     CURSOR is_education_exist(l_party_id NUMBER, l_course_major VARCHAR2,
809                               l_school_attended_name VARCHAR2,
810                               l_degree_received VARCHAR2)IS
811     SELECT nvl(object_version_number,1), education_id
812     FROM HZ_EDUCATION
813     WHERE party_id = l_party_id
814     AND UPPER(ltrim(rtrim(course_major))) = UPPER(ltrim(rtrim(l_course_major)))
815     AND UPPER(ltrim(rtrim(degree_received))) = UPPER(ltrim(rtrim(l_degree_received)))
816     AND UPPER(ltrim(rtrim(school_attended_name))) = UPPER(ltrim(rtrim(l_school_attended_name)))
817     AND status in ('A','I')
818     AND rownum = 1;
819 
820     l_party_id     NUMBER;
821   BEGIN
822     IF(px_education_id IS NULL) THEN
823       OPEN is_education_exist(p_party_id, p_course_major, p_school_attended_name, p_degree_received);
824       FETCH is_education_exist INTO x_object_version_number, px_education_id;
825       CLOSE is_education_exist;
826     ELSE
827       OPEN is_edu_id_exist(px_education_id);
828       FETCH is_edu_id_exist INTO x_object_version_number, l_party_id;
829       CLOSE is_edu_id_exist;
830       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
831         -- return -1 to indicate that the combination of parent and object id do not match
832         x_object_version_number := -1;
833       END IF;
834     END IF;
835   END check_education_op;
836 
837 -- PROCEDURE check_citizenship_op
838 --
839 -- DESCRIPTION
840 --     Check the operation of citizenship based on pass in parameter.
841 --
842 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
843 --
844 -- ARGUMENTS
845 --   IN:
846 --     p_party_id               Party Id.
847 --     p_country_code           Country code.
848 --   IN/OUT:
849 --     px_citizenship_id        Citizenship Id.
850 --   OUT:
851 --     x_object_version_number  Object version number of citizenship.
852 -- NOTES
853 --
854 -- MODIFICATION HISTORY
855 --
856 --   13-Jul-2005    Arnold Ng   o Created.
857 
858   PROCEDURE check_citizenship_op(
859     p_party_id                   IN     NUMBER,
860     px_citizenship_id            IN OUT NOCOPY NUMBER,
861     p_country_code               IN     VARCHAR2,
862     x_object_version_number      OUT NOCOPY NUMBER
863   ) IS
864     CURSOR is_citizen_id_exist(l_citizen_id NUMBER)IS
865     SELECT nvl(object_version_number,1), party_id
866     FROM HZ_CITIZENSHIP
867     WHERE citizenship_id = l_citizen_id
868     AND rownum = 1;
869 
870     CURSOR is_citizenship_exist(l_party_id NUMBER, l_country_code VARCHAR2)IS
871     SELECT nvl(object_version_number,1), citizenship_id
872     FROM HZ_CITIZENSHIP
873     WHERE party_id = l_party_id
874     AND country_code = l_country_code
875     AND status in ('A','I')
876     AND rownum = 1;
877 
878     l_party_id        NUMBER;
879   BEGIN
880     IF(px_citizenship_id IS NULL) THEN
881       OPEN is_citizenship_exist(p_party_id, p_country_code);
882       FETCH is_citizenship_exist INTO x_object_version_number, px_citizenship_id;
883       CLOSE is_citizenship_exist;
884     ELSE
885       OPEN is_citizen_id_exist(px_citizenship_id);
886       FETCH is_citizen_id_exist INTO x_object_version_number, l_party_id;
887       CLOSE is_citizen_id_exist;
888       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
889         -- return -1 to indicate that the combination of parent and object id do not match
890         x_object_version_number := -1;
891       END IF;
892     END IF;
893   END check_citizenship_op;
894 
895 -- PROCEDURE check_employ_hist_op
896 --
897 -- DESCRIPTION
898 --     Check the operation of employment history based on pass in parameter.
899 --
900 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
901 --
902 -- ARGUMENTS
903 --   IN:
904 --     p_party_id               Party Id.
905 --     p_employed_by_name_company   Name of company.
906 --     p_employed_as_title      Job title.
907 --     p_begin_date             Begin date.
908 --   IN/OUT:
909 --     px_emp_hist_id           Employment history Id.
910 --   OUT:
911 --     x_object_version_number  Object version number of employment history.
912 -- NOTES
913 --
914 -- MODIFICATION HISTORY
915 --
916 --   13-Jul-2005    Arnold Ng   o Created.
917 
918   PROCEDURE check_employ_hist_op(
919     p_party_id                   IN     NUMBER,
920     px_emp_hist_id               IN OUT NOCOPY NUMBER,
921     p_employed_by_name_company   IN     VARCHAR2,
922     p_employed_as_title          IN     VARCHAR2,
923     p_begin_date                 IN     DATE,
924     x_object_version_number      OUT NOCOPY NUMBER
925   ) IS
926     CURSOR is_employ_hist_id_exist(l_emp_hist_id NUMBER)IS
927     SELECT nvl(object_version_number,1), party_id
928     FROM HZ_EMPLOYMENT_HISTORY
929     WHERE employment_history_id = l_emp_hist_id
930     AND rownum = 1;
931 
932     CURSOR is_employ_hist_exist(l_party_id NUMBER, l_company VARCHAR2,
933                                 l_title VARCHAR2, l_begin_date  DATE)IS
934     SELECT nvl(object_version_number,1), employment_history_id
935     FROM HZ_EMPLOYMENT_HISTORY
936     WHERE party_id = l_party_id
937     AND nvl(UPPER(ltrim(rtrim(employed_by_name_company))),-99) = nvl(UPPER(ltrim(rtrim(l_company))),-99)
938     AND nvl(UPPER(ltrim(rtrim(employed_as_title))),-99) = nvl(UPPER(ltrim(rtrim(l_title))), -99)
939     AND nvl(trunc(begin_date),sysdate) = nvl(trunc(l_begin_date),sysdate)
940     AND status in ('A','I')
941     AND rownum = 1;
942 
943     l_party_id        NUMBER;
944   BEGIN
945     IF(px_emp_hist_id IS NULL) THEN
946       OPEN is_employ_hist_exist(p_party_id, p_employed_by_name_company, p_employed_as_title, p_begin_date);
947       FETCH is_employ_hist_exist INTO x_object_version_number, px_emp_hist_id;
948       CLOSE is_employ_hist_exist;
949     ELSE
950       OPEN is_employ_hist_id_exist(px_emp_hist_id);
951       FETCH is_employ_hist_id_exist INTO x_object_version_number, l_party_id;
952       CLOSE is_employ_hist_id_exist;
953       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
954         -- return -1 to indicate that the combination of parent and object id do not match
955         x_object_version_number := -1;
956       END IF;
957     END IF;
958   END check_employ_hist_op;
959 
960 -- PROCEDURE check_work_class_op
961 --
962 -- DESCRIPTION
963 --     Check the operation of work class based on pass in parameter.
964 --
965 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
966 --
967 -- ARGUMENTS
968 --   IN:
969 --     p_party_id               Party Id.
970 --     p_work_class_name        Name of work class.
971 --   IN/OUT:
972 --     px_work_class_id         Work class Id.
973 --   OUT:
974 --     x_object_version_number  Object version number of work class.
975 -- NOTES
976 --
977 -- MODIFICATION HISTORY
978 --
979 --   13-Jul-2005    Arnold Ng   o Created.
980 
981   PROCEDURE check_work_class_op(
982     p_employ_hist_id             IN     NUMBER,
983     px_work_class_id             IN OUT NOCOPY NUMBER,
984     p_work_class_name            IN     VARCHAR2,
985     x_object_version_number      OUT NOCOPY NUMBER
986   ) IS
987     CURSOR is_work_class_id_exist(l_work_class_id NUMBER)IS
988     SELECT nvl(object_version_number,1), employment_history_id
989     FROM HZ_WORK_CLASS
990     WHERE work_class_id = l_work_class_id
991     AND rownum = 1;
992 
993     CURSOR is_work_class_exist(l_employ_hist_id NUMBER, l_work_class_name VARCHAR2)IS
994     SELECT nvl(object_version_number,1), work_class_id
995     FROM HZ_WORK_CLASS
996     WHERE employment_history_id = l_employ_hist_id
997     AND UPPER(ltrim(rtrim(WORK_CLASS_NAME))) = UPPER(ltrim(rtrim(l_work_class_name)))
998     AND status in ('A','I')
999     AND rownum = 1;
1000 
1001     l_eh_id       NUMBER;
1002   BEGIN
1003     IF(px_work_class_id IS NULL) THEN
1004       OPEN is_work_class_exist(p_employ_hist_id, p_work_class_name);
1005       FETCH is_work_class_exist INTO x_object_version_number, px_work_class_id;
1006       CLOSE is_work_class_exist;
1007     ELSE
1008       OPEN is_work_class_id_exist(px_work_class_id);
1009       FETCH is_work_class_id_exist INTO x_object_version_number, l_eh_id;
1010       CLOSE is_work_class_id_exist;
1011       IF(l_eh_id <> p_employ_hist_id) OR (l_eh_id IS NULL AND p_employ_hist_id IS NOT NULL) THEN
1012         -- return -1 to indicate that the combination of parent and object id do not match
1013         x_object_version_number := -1;
1014       END IF;
1015     END IF;
1016   END check_work_class_op;
1017 
1018 -- PROCEDURE check_interest_op
1019 --
1020 -- DESCRIPTION
1021 --     Check the operation of person interest based on pass in parameter.
1022 --
1023 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1024 --
1025 -- ARGUMENTS
1026 --   IN:
1027 --     p_party_id               Party Id.
1028 --     p_interest_type_code     Interest type code.
1029 --     p_sub_interest_type_code Sub-interest type code.
1030 --     p_interest_name          Name of interest.
1031 --   IN/OUT:
1032 --     px_interest_id           Person interest Id.
1033 --   OUT:
1034 --     x_object_version_number  Object version number of person interest.
1035 -- NOTES
1036 --
1037 -- MODIFICATION HISTORY
1038 --
1039 --   13-Jul-2005    Arnold Ng   o Created.
1040 
1041   PROCEDURE check_interest_op(
1042     p_party_id                   IN     NUMBER,
1043     px_interest_id               IN OUT NOCOPY NUMBER,
1044     p_interest_type_code         IN     VARCHAR2,
1045     p_sub_interest_type_code     IN     VARCHAR2,
1046     p_interest_name              IN     VARCHAR2,
1047     x_object_version_number      OUT NOCOPY NUMBER
1048   ) IS
1049     CURSOR is_interest_id_exist(l_interest_id NUMBER)IS
1050     SELECT nvl(object_version_number,1), party_id
1051     FROM HZ_PERSON_INTEREST
1052     WHERE person_interest_id = l_interest_id
1053     AND rownum = 1;
1054 
1055     CURSOR is_interest_exist(l_party_id NUMBER, l_interest_type_code VARCHAR2,
1056                              l_sub_interest_type_code VARCHAR2,
1057                              l_interest_name VARCHAR2)IS
1058     SELECT nvl(object_version_number,1), person_interest_id
1059     FROM HZ_PERSON_INTEREST
1060     WHERE party_id = l_party_id
1061     AND (
1062          (nvl(INTEREST_TYPE_CODE,'X') = nvl(l_interest_type_code,'X') AND
1063           nvl(SUB_INTEREST_TYPE_CODE,'X') = nvl(l_sub_interest_type_code,'X'))
1064          OR
1065          UPPER(ltrim(rtrim(INTEREST_NAME))) = UPPER(ltrim(rtrim(l_interest_name)))
1066         )
1067     AND status in ('A','I')
1068     AND rownum = 1;
1069 
1070     l_party_id        NUMBER;
1071   BEGIN
1072     IF(px_interest_id IS NULL) THEN
1073       OPEN is_interest_exist(p_party_id, p_interest_type_code, p_sub_interest_type_code, p_interest_name);
1074       FETCH is_interest_exist INTO x_object_version_number, px_interest_id;
1075       CLOSE is_interest_exist;
1076     ELSE
1077       OPEN is_interest_id_exist(px_interest_id);
1078       FETCH is_interest_id_exist INTO x_object_version_number, l_party_id;
1079       CLOSE is_interest_id_exist;
1080       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1081         -- return -1 to indicate that the combination of parent and object id do not match
1082         x_object_version_number := -1;
1083       END IF;
1084     END IF;
1085   END check_interest_op;
1086 
1087 -- PROCEDURE check_party_site_use_op
1088 --
1089 -- DESCRIPTION
1090 --     Check the operation of party site use based on pass in parameter.
1091 --
1092 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1093 --
1094 -- ARGUMENTS
1095 --   IN:
1096 --     p_party_site_id          Party site Id.
1097 --     p_site_use_type          Site use type.
1098 --   IN/OUT:
1099 --     px_party_site_use_id     Party site use Id.
1100 --   OUT:
1101 --     x_object_version_number  Object version number of party site use.
1102 -- NOTES
1103 --
1104 -- MODIFICATION HISTORY
1105 --
1106 --   13-Jul-2005    Arnold Ng   o Created.
1107 
1108   PROCEDURE check_party_site_use_op(
1109     p_party_site_id              IN     NUMBER,
1110     px_party_site_use_id         IN OUT NOCOPY NUMBER,
1111     p_site_use_type              IN     VARCHAR2,
1112     x_object_version_number      OUT NOCOPY NUMBER
1113   ) IS
1114     CURSOR is_party_site_use_id_exist(l_site_use_id NUMBER)IS
1115     SELECT nvl(object_version_number,1), party_site_id
1116     FROM HZ_PARTY_SITE_USES
1117     WHERE party_site_use_id = l_site_use_id
1118     AND rownum = 1;
1119 
1120     CURSOR is_party_site_use_exist(l_party_site_id NUMBER, l_site_use_type VARCHAR2)IS
1121 	SELECT nvl(object_version_number,1), party_site_use_id
1122    	FROM (SELECT object_version_number, party_site_use_id,
1123     		RANK() OVER (ORDER BY status asc ) rank
1124     	  	FROM HZ_PARTY_SITE_USES
1125           	WHERE party_site_id = l_party_site_id
1126           	AND site_use_type = l_site_use_type )
1127     	where rank = 1
1128     	AND ROWNUM = 1;
1129 
1130 
1131     l_ps_id       NUMBER;
1132   BEGIN
1133     IF(px_party_site_use_id IS NULL) THEN
1134       OPEN is_party_site_use_exist(p_party_site_id, p_site_use_type);
1135       FETCH is_party_site_use_exist INTO x_object_version_number, px_party_site_use_id;
1136       CLOSE is_party_site_use_exist;
1137     ELSE
1138       OPEN is_party_site_use_id_exist(px_party_site_use_id);
1139       FETCH is_party_site_use_id_exist INTO x_object_version_number, l_ps_id;
1140       CLOSE is_party_site_use_id_exist;
1141       IF(l_ps_id <> p_party_site_id) OR (l_ps_id IS NULL AND p_party_site_id IS NOT NULL) THEN
1142         -- return -1 to indicate that the combination of parent and object id do not match
1143         x_object_version_number := -1;
1144       END IF;
1145     END IF;
1146   END check_party_site_use_op;
1147 
1148 -- PROCEDURE check_relationship_op
1149 --
1150 -- DESCRIPTION
1151 --     Check the operation of relationship based on pass in parameter.
1152 --
1153 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1154 --
1155 -- ARGUMENTS
1156 --   IN:
1157 --     p_subject_id             Subject Id.
1158 --     p_object_id              Object Id.
1159 --     p_relationship_type      Relationship type.
1160 --     p_relationship_code      Relationship code.
1161 --   IN/OUT:
1162 --     px_relationship_id       Relationship Id.
1163 --   OUT:
1164 --     x_object_version_number  Object version number of relationship.
1165 --     x_party_object_version_number  Object version number of relationship party.
1166 -- NOTES
1167 --
1168 -- MODIFICATION HISTORY
1169 --
1170 --   13-Jul-2005    Arnold Ng   o Created.
1171 
1172   PROCEDURE check_relationship_op(
1173     p_subject_id                 IN     NUMBER,
1174     p_object_id                  IN     NUMBER,
1175     px_relationship_id           IN OUT NOCOPY NUMBER,
1176     p_relationship_type          IN     VARCHAR2,
1177     p_relationship_code          IN     VARCHAR2,
1178     x_object_version_number      OUT NOCOPY NUMBER,
1179     x_party_obj_version_number   OUT NOCOPY NUMBER
1180   ) IS
1181     CURSOR is_relationship_id_exist(l_subject_id NUMBER, l_object_id NUMBER, l_rel_id NUMBER) IS
1182     SELECT rel.object_version_number, p.object_version_number
1183     FROM HZ_RELATIONSHIPS rel, HZ_PARTIES p
1184     WHERE rel.subject_id = l_subject_id
1185     AND rel.object_id = l_object_id
1186     AND rel.relationship_id = l_rel_id
1187     AND rel.party_id = p.party_id
1188     AND rel.status in ('A','I')
1189     AND rownum = 1;
1190 
1191     CURSOR is_relationship_exist(l_subject_id NUMBER, l_object_id NUMBER,
1192                                  l_relationship_type VARCHAR2, l_relationship_code VARCHAR2)IS
1193     SELECT rel.object_version_number, p.object_version_number, rel.relationship_id
1194     FROM HZ_RELATIONSHIPS rel, HZ_PARTIES p
1195     WHERE rel.subject_id = l_subject_id
1196     AND rel.object_id = l_object_id
1197     AND rel.relationship_type = l_relationship_type
1198     AND rel.relationship_code = l_relationship_code
1199     AND sysdate between rel.start_date and nvl(rel.end_date, sysdate)
1200     AND rel.party_id = p.party_id
1201     AND rel.status in ('A','I')
1202     AND rownum = 1;
1203   BEGIN
1204     IF(px_relationship_id IS NULL) THEN
1205       OPEN is_relationship_exist(p_subject_id, p_object_id, p_relationship_type, p_relationship_code);
1206       FETCH is_relationship_exist INTO x_object_version_number, x_party_obj_version_number, px_relationship_id;
1207       CLOSE is_relationship_exist;
1208     ELSE
1209       OPEN is_relationship_id_exist(p_subject_id, p_object_id, px_relationship_id);
1210       FETCH is_relationship_id_exist INTO x_object_version_number, x_party_obj_version_number;
1211       CLOSE is_relationship_id_exist;
1212     END IF;
1213   END check_relationship_op;
1214 
1215 -- PROCEDURE check_org_contact_role_op
1216 --
1217 -- DESCRIPTION
1218 --     Check the operation of org contact role based on pass in parameter.
1219 --
1220 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1221 --
1222 -- ARGUMENTS
1223 --   IN:
1224 --     p_org_contact_id         Org contact Id.
1225 --     p_role_type              Role type.
1226 --   IN/OUT:
1227 --     px_org_contact_role_id   Org contact role Id.
1228 --   OUT:
1229 --     x_object_version_number  Object version number of org contact role.
1230 -- NOTES
1231 --
1232 -- MODIFICATION HISTORY
1233 --
1234 --   13-Jul-2005    Arnold Ng   o Created.
1235 
1236   PROCEDURE check_org_contact_role_op(
1237     p_org_contact_id             IN     NUMBER,
1238     px_org_contact_role_id       IN OUT NOCOPY NUMBER,
1239     p_role_type                  IN     VARCHAR2,
1240     x_object_version_number      OUT NOCOPY NUMBER
1241   ) IS
1242     CURSOR is_org_contact_role_id_exist(l_role_id NUMBER)IS
1243     SELECT nvl(object_version_number,1), org_contact_id
1244     FROM HZ_ORG_CONTACT_ROLES
1245     WHERE org_contact_role_id = l_role_id
1246     AND rownum = 1;
1247 
1248     CURSOR is_org_contact_role_exist(l_org_contact_id NUMBER, l_role_type VARCHAR2)IS
1249     SELECT nvl(object_version_number,1), org_contact_role_id
1250     FROM HZ_ORG_CONTACT_ROLES
1251     WHERE org_contact_id = l_org_contact_id
1252     AND role_type = l_role_type
1253     AND status in ('A','I')
1254     AND rownum = 1;
1255 
1256     l_oc_id       NUMBER;
1257   BEGIN
1258     IF(px_org_contact_role_id IS NULL) THEN
1259       OPEN is_org_contact_role_exist(p_org_contact_id, p_role_type);
1260       FETCH is_org_contact_role_exist INTO x_object_version_number, px_org_contact_role_id;
1261       CLOSE is_org_contact_role_exist;
1262     ELSE
1263       OPEN is_org_contact_role_id_exist(px_org_contact_role_id);
1264       FETCH is_org_contact_role_id_exist INTO x_object_version_number, l_oc_id;
1265       CLOSE is_org_contact_role_id_exist;
1266       IF(l_oc_id <> p_org_contact_id) OR (l_oc_id IS NULL AND p_org_contact_id IS NOT NULL) THEN
1267         -- return -1 to indicate that the combination of parent and object id do not match
1268         x_object_version_number := -1;
1269       END IF;
1270     END IF;
1271   END check_org_contact_role_op;
1272 
1273 -- PROCEDURE check_certification_op
1274 --
1275 -- DESCRIPTION
1276 --     Check the operation of certification based on pass in parameter.
1277 --
1278 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1279 --
1280 -- ARGUMENTS
1281 --   IN:
1282 --     p_party_id               Party Id.
1283 --     p_certification_name     Name of certification.
1284 --   IN/OUT:
1285 --     px_certification_id      Certification Id.
1286 --   OUT:
1287 --     x_last_update_date       Last update date of certification.
1288 -- NOTES
1289 --
1290 -- MODIFICATION HISTORY
1291 --
1292 --   13-Jul-2005    Arnold Ng   o Created.
1293 
1294   PROCEDURE check_certification_op(
1295     p_party_id                   IN     NUMBER,
1296     px_certification_id          IN OUT NOCOPY NUMBER,
1297     p_certification_name         IN     VARCHAR2,
1298     x_last_update_date           OUT NOCOPY DATE,
1299     x_return_status              OUT NOCOPY VARCHAR2
1300   ) IS
1301     CURSOR is_cert_id_exist(l_cert_id NUMBER) IS
1302     SELECT last_update_date, party_id
1303     FROM HZ_CERTIFICATIONS
1304     WHERE certification_id = l_cert_id
1305     AND rownum = 1;
1306 
1307     CURSOR is_cert_exist(l_party_id NUMBER, l_cert_name VARCHAR2) IS
1308     SELECT last_update_date, certification_id
1309     FROM HZ_CERTIFICATIONS
1310     WHERE party_id = l_party_id
1311     AND certification_name = l_cert_name
1312     AND status in ('A','I')
1313     AND rownum = 1;
1314 
1315     l_party_id    NUMBER;
1316   BEGIN
1317     x_return_status := FND_API.G_RET_STS_SUCCESS;
1318     IF(px_certification_id IS NULL) THEN
1319       OPEN is_cert_exist(p_party_id, p_certification_name);
1320       FETCH is_cert_exist INTO x_last_update_date, px_certification_id;
1321       CLOSE is_cert_exist;
1322     ELSE
1323       OPEN is_cert_id_exist(px_certification_id);
1324       FETCH is_cert_id_exist INTO x_last_update_date, l_party_id;
1325       CLOSE is_cert_id_exist;
1326       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1327         -- return -1 to indicate that the combination of parent and object id do not match
1328         x_return_status := FND_API.G_RET_STS_ERROR;
1329       END IF;
1330     END IF;
1331   END check_certification_op;
1332 
1333 -- PROCEDURE check_financial_prof_op
1334 --
1335 -- DESCRIPTION
1336 --     Check the operation of financial profile based on pass in parameter.
1337 --
1338 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1339 --
1340 -- ARGUMENTS
1341 --   IN:
1342 --     p_party_id               Party Id.
1343 --     p_financial_profile_id   Financial profile Id.
1344 --   OUT:
1345 --     x_last_update_date       Last update date of financial profile.
1346 -- NOTES
1347 --
1348 -- MODIFICATION HISTORY
1349 --
1350 --   13-Jul-2005    Arnold Ng   o Created.
1351 
1352   PROCEDURE check_financial_prof_op(
1353     p_party_id                   IN     NUMBER,
1354     p_financial_profile_id       IN     NUMBER,
1355     x_last_update_date           OUT NOCOPY DATE,
1356     x_return_status              OUT NOCOPY VARCHAR2
1357   ) IS
1358     CURSOR is_fin_exist(l_fin_prof_id NUMBER) IS
1359     SELECT last_update_date, party_id
1360     FROM HZ_FINANCIAL_PROFILE
1361     WHERE financial_profile_id = l_fin_prof_id
1362     AND rownum = 1;
1363 
1364     l_party_id    NUMBER;
1365   BEGIN
1366     x_return_status := FND_API.G_RET_STS_SUCCESS;
1367     IF(p_financial_profile_id IS NULL) THEN
1368       x_last_update_date := NULL;
1369     ELSE
1370       OPEN is_fin_exist(p_financial_profile_id);
1371       FETCH is_fin_exist INTO x_last_update_date, l_party_id;
1372       CLOSE is_fin_exist;
1373       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1374          x_return_status := FND_API.G_RET_STS_ERROR;
1375       END IF;
1376     END IF;
1377   END check_financial_prof_op;
1378 
1379 -- PROCEDURE check_code_assign_op
1380 --
1381 -- DESCRIPTION
1382 --     Check the operation of classification based on pass in parameter.
1383 --
1384 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1385 --
1386 -- ARGUMENTS
1387 --   IN:
1388 --     p_owner_table_name       Owner table name.
1389 --     p_owner_table_id         Owner table Id.
1390 --     p_class_category         Class category.
1391 --     p_class_code             Class code.
1392 --   IN/OUT:
1393 --     px_code_assignment_id    Code assignment Id.
1394 --   OUT:
1395 --     x_object_version_number  Object version number of classification.
1396 -- NOTES
1397 --
1398 -- MODIFICATION HISTORY
1399 --
1400 --   13-Jul-2005    Arnold Ng   o Created.
1401 
1402   PROCEDURE check_code_assign_op(
1403     p_owner_table_name           IN     VARCHAR2,
1404     p_owner_table_id             IN     NUMBER,
1405     px_code_assignment_id        IN OUT NOCOPY NUMBER,
1406     p_class_category             IN     VARCHAR2,
1407     p_class_code                 IN     VARCHAR2,
1408     x_object_version_number      OUT NOCOPY NUMBER
1409   ) IS
1410     CURSOR is_code_assign_id_exist(l_code_assignment_id NUMBER)IS
1411     SELECT nvl(object_version_number,1), owner_table_name, owner_table_id
1412     FROM HZ_CODE_ASSIGNMENTS
1413     WHERE code_assignment_id = l_code_assignment_id
1414     AND rownum = 1;
1415 
1416     CURSOR is_code_assign_exist(l_owner_table_name VARCHAR2, l_owner_table_id   NUMBER,
1417                                 l_class_category   VARCHAR2, l_class_code       VARCHAR2)IS
1418     SELECT nvl(object_version_number,1), code_assignment_id
1419     FROM HZ_CODE_ASSIGNMENTS
1420     WHERE owner_table_name = l_owner_table_name
1421     AND owner_table_id = l_owner_table_id
1422     AND class_category = l_class_category
1423     AND class_code = l_class_code
1424     AND sysdate between start_date_active and nvl(end_date_active, sysdate)
1425     AND status in ('A','I')
1426     AND rownum = 1;
1427 
1428     l_ot_name     VARCHAR2(30);
1429     l_ot_id       NUMBER;
1430   BEGIN
1431     IF(px_code_assignment_id IS NULL) THEN
1432       OPEN is_code_assign_exist(p_owner_table_name, p_owner_table_id, p_class_category, p_class_code);
1433       FETCH is_code_assign_exist INTO x_object_version_number, px_code_assignment_id;
1434       CLOSE is_code_assign_exist;
1435     ELSE
1436       OPEN is_code_assign_id_exist(px_code_assignment_id);
1437       FETCH is_code_assign_id_exist INTO x_object_version_number, l_ot_name, l_ot_id;
1438       CLOSE is_code_assign_id_exist;
1439       IF(l_ot_name <> p_owner_table_name OR l_ot_id <> p_owner_table_id) OR
1440         (l_ot_id IS NULL OR (p_owner_table_name IS NOT NULL OR p_owner_table_id IS NOT NULL)) THEN
1441         -- return -1 to indicate that the combination of parent and object id do not match
1442         x_object_version_number := -1;
1443       END IF;
1444     END IF;
1445   END check_code_assign_op;
1446 
1447 -- PROCEDURE check_party_pref_op
1448 --
1449 -- DESCRIPTION
1450 --     Check the operation of party preference based on pass in parameter.
1451 --
1452 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1453 --
1454 -- ARGUMENTS
1455 --   IN:
1456 --     p_party_id               Party Id.
1457 --     p_module                 Module.
1458 --     p_category               Category.
1459 --     p_preference_code        Preference code.
1460 --   OUT:
1461 --     x_object_version_number  Object version number of party preference.
1462 -- NOTES
1463 --
1464 -- MODIFICATION HISTORY
1465 --
1466 --   13-Jul-2005    Arnold Ng   o Created.
1467 
1468   PROCEDURE check_party_pref_op(
1469     p_party_id                   IN     NUMBER,
1470     p_module                     IN     VARCHAR2,
1471     p_category                   IN     VARCHAR2,
1472     p_preference_code            IN     VARCHAR2,
1473     x_object_version_number      OUT NOCOPY NUMBER
1474   ) IS
1475     CURSOR is_party_pref_exist(l_party_id NUMBER, l_module VARCHAR2,
1476                                l_category VARCHAR2, l_preference_code VARCHAR2) IS
1477     SELECT nvl(object_version_number,1)
1478     FROM HZ_PARTY_PREFERENCES
1479     WHERE party_id = l_party_id
1480     AND module = l_module
1481     AND category = l_category
1482     AND preference_code = l_preference_code
1483     AND rownum = 1;
1484   BEGIN
1485     OPEN is_party_pref_exist(p_party_id, p_module, p_category, p_preference_code);
1486     FETCH is_party_pref_exist INTO x_object_version_number;
1487     CLOSE is_party_pref_exist;
1488   END check_party_pref_op;
1489 
1490 -- PROCEDURE check_credit_rating_op
1491 --
1492 -- DESCRIPTION
1493 --     Check the operation of credit rating based on pass in parameter.
1494 --
1495 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1496 --
1497 -- ARGUMENTS
1498 --   IN:
1499 --     p_party_id               Party Id.
1500 --     p_rating_organization    Rating organization.
1501 --     p_rated_as_of_date       Rated date.
1502 --   IN/OUT:
1503 --     px_credit_rating_id      Credit rating Id.
1504 --   OUT:
1505 --     x_object_version_number  Object version number of credit rating.
1506 -- NOTES
1507 --
1508 -- MODIFICATION HISTORY
1509 --
1510 --   13-Jul-2005    Arnold Ng   o Created.
1511 
1512   PROCEDURE check_credit_rating_op(
1513     p_party_id                   IN     NUMBER,
1514     px_credit_rating_id          IN OUT NOCOPY NUMBER,
1515     p_rating_organization        IN     VARCHAR2,
1516     p_rated_as_of_date           IN     DATE,
1517     x_object_version_number      OUT NOCOPY NUMBER
1518   ) IS
1519     CURSOR is_credit_rating_id_exist(l_credit_rating_id NUMBER)IS
1520     SELECT nvl(object_version_number,1), party_id
1521     FROM HZ_CREDIT_RATINGS
1522     WHERE credit_rating_id = l_credit_rating_id
1523     AND rownum = 1;
1524 
1525     CURSOR is_credit_rating_exist(l_party_id NUMBER, l_rating_organization VARCHAR2,
1526                      l_rated_as_of_date DATE)IS
1527     SELECT nvl(object_version_number,1), credit_rating_id
1528     FROM HZ_CREDIT_RATINGS
1529     WHERE party_id = l_party_id
1530     AND nvl(rating_organization,'A') = nvl(l_rating_organization,'A')
1531     AND trunc(nvl(rated_as_of_date,sysdate)) = trunc(nvl(l_rated_as_of_date,sysdate))
1532     AND status in ('A','I')
1533     AND rownum = 1;
1534 
1535     l_party_id    NUMBER;
1536   BEGIN
1537     IF(px_credit_rating_id IS NULL) THEN
1538       OPEN is_credit_rating_exist(p_party_id, p_rating_organization, p_rated_as_of_date);
1539       FETCH is_credit_rating_exist INTO x_object_version_number, px_credit_rating_id;
1540       CLOSE is_credit_rating_exist;
1541     ELSE
1542       OPEN is_credit_rating_id_exist(px_credit_rating_id);
1543       FETCH is_credit_rating_id_exist INTO x_object_version_number, l_party_id;
1544       CLOSE is_credit_rating_id_exist;
1545       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1546         -- return -1 to indicate that the combination of parent and object id do not match
1547         x_object_version_number := -1;
1548       END IF;
1549     END IF;
1550   END check_credit_rating_op;
1551 
1552 -- PROCEDURE check_fin_report_op
1553 --
1554 -- DESCRIPTION
1555 --     Check the operation of financial report based on pass in parameter.
1556 --
1557 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1558 --
1559 -- ARGUMENTS
1560 --   IN:
1561 --     p_party_id               Party Id.
1562 --     p_type_of_financial_report  Type of financial report.
1563 --     p_document_reference     Document reference.
1564 --     p_date_report_issued     Report issued date.
1565 --     p_issued_period          Issued period.
1566 --   IN/OUT:
1567 --     px_fin_report_id         Financial report Id.
1568 --   OUT:
1569 --     x_object_version_number  Object version number of financial report.
1570 -- NOTES
1571 --
1572 -- MODIFICATION HISTORY
1573 --
1574 --   13-Jul-2005    Arnold Ng   o Created.
1575 
1576   PROCEDURE check_fin_report_op(
1577     p_party_id                   IN     NUMBER,
1578     px_fin_report_id             IN OUT NOCOPY NUMBER,
1579     p_type_of_financial_report   IN     VARCHAR2,
1580     p_document_reference         IN     VARCHAR2,
1581     p_date_report_issued         IN     DATE,
1582     p_issued_period              IN     VARCHAR2,
1583     x_object_version_number      OUT NOCOPY NUMBER
1584   ) IS
1585     CURSOR is_fin_report_id_exist(l_fin_report_id NUMBER)IS
1586     SELECT nvl(object_version_number,1), party_id
1587     FROM HZ_FINANCIAL_REPORTS
1588     WHERE financial_report_id = l_fin_report_id
1589     AND rownum = 1;
1590 
1591     CURSOR is_fin_report_exist(l_party_id NUMBER, l_type_of_fin_report VARCHAR2,
1592                                l_doc_reference VARCHAR2, l_date_report_issued DATE,
1593                                l_issued_period VARCHAR2 )IS
1594     SELECT nvl(object_version_number,1), financial_report_id
1595     FROM HZ_FINANCIAL_REPORTS
1596     WHERE party_id = l_party_id
1597     AND type_of_financial_report = l_type_of_fin_report
1598     AND document_reference = l_doc_reference
1599     AND (trunc(date_report_issued) = trunc(l_date_report_issued) OR
1600          issued_period = l_issued_period OR
1601          sysdate between nvl(report_start_date,sysdate) and nvl(report_end_date, sysdate))
1602     AND status in ('A','I')
1603     AND rownum = 1;
1604 
1605     l_party_id    NUMBER;
1606   BEGIN
1607     IF(px_fin_report_id IS NULL) THEN
1608       OPEN is_fin_report_exist(p_party_id, p_type_of_financial_report, p_document_reference,
1609                                p_date_report_issued, p_issued_period);
1610       FETCH is_fin_report_exist INTO x_object_version_number, px_fin_report_id;
1611       CLOSE is_fin_report_exist;
1612     ELSE
1613       OPEN is_fin_report_id_exist(px_fin_report_id);
1614       FETCH is_fin_report_id_exist INTO x_object_version_number, l_party_id;
1615       CLOSE is_fin_report_id_exist;
1616       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1617         -- return -1 to indicate that the combination of parent and object id do not match
1618         x_object_version_number := -1;
1619       END IF;
1620     END IF;
1621   END check_fin_report_op;
1622 
1623 -- PROCEDURE check_fin_number_op
1624 --
1625 -- DESCRIPTION
1626 --     Check the operation of financial number based on pass in parameter.
1627 --
1628 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1629 --
1630 -- ARGUMENTS
1631 --   IN:
1632 --     p_fin_report_id          Financial report Id.
1633 --     p_financial_number_name  Name of financial number.
1634 --   IN/OUT:
1635 --     px_fin_number_id         Financial number Id.
1636 --   OUT:
1637 --     x_object_version_number  Object version number of financial number.
1638 -- NOTES
1639 --
1640 -- MODIFICATION HISTORY
1641 --
1642 --   13-Jul-2005    Arnold Ng   o Created.
1643 
1644   PROCEDURE check_fin_number_op(
1645     p_fin_report_id              IN     NUMBER,
1646     px_fin_number_id             IN OUT NOCOPY NUMBER,
1647     p_financial_number_name      IN     VARCHAR2,
1648     x_object_version_number      OUT NOCOPY NUMBER
1649   ) IS
1650     CURSOR is_fin_number_id_exist(l_fin_number_id NUMBER) IS
1651     SELECT nvl(object_version_number,1), financial_report_id
1652     FROM HZ_FINANCIAL_NUMBERS
1653     WHERE financial_number_id = l_fin_number_id
1654     AND rownum = 1;
1655 
1656     CURSOR is_fin_number_exist(l_fin_report_id NUMBER, l_fin_number_name VARCHAR2) IS
1657     SELECT nvl(object_version_number,1), financial_number_id
1658     FROM HZ_FINANCIAL_NUMBERS
1659     WHERE financial_report_id = l_fin_report_id
1660     AND financial_number_name = l_fin_number_name
1661     AND status in ('A','I')
1662     AND rownum = 1;
1663 
1664     l_fr_id       NUMBER;
1665   BEGIN
1666     IF(px_fin_number_id IS NULL) THEN
1667       OPEN is_fin_number_exist(p_fin_report_id, p_financial_number_name);
1668       FETCH is_fin_number_exist INTO x_object_version_number, px_fin_number_id;
1669       CLOSE is_fin_number_exist;
1670     ELSE
1671       OPEN is_fin_number_id_exist(px_fin_number_id);
1672       FETCH is_fin_number_id_exist INTO x_object_version_number, l_fr_id;
1673       CLOSE is_fin_number_id_exist;
1674       IF(l_fr_id <> p_fin_report_id) OR (l_fr_id IS NULL AND p_fin_report_id IS NOT NULL) THEN
1675         -- return -1 to indicate that the combination of parent and object id do not match
1676         x_object_version_number := -1;
1677       END IF;
1678     END IF;
1679   END check_fin_number_op;
1680 
1681 -- PROCEDURE check_role_resp_op
1682 --
1683 -- DESCRIPTION
1684 --     Check the operation of role responsibility based on pass in parameter.
1685 --
1686 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1687 --
1688 -- ARGUMENTS
1689 --   IN:
1690 --     p_cust_acct_contact_id   Customer account contact Id.
1691 --     p_responsibility_type    Role responsibility type.
1692 --   IN/OUT:
1693 --     px_responsibility_id     Role responsibility Id.
1694 --   OUT:
1695 --     x_object_version_number  Object version number of role responsibility.
1696 -- NOTES
1697 --
1698 -- MODIFICATION HISTORY
1699 --
1700 --   13-Jul-2005    Arnold Ng   o Created.
1701 
1702   PROCEDURE check_role_resp_op(
1703     p_cust_acct_contact_id       IN     NUMBER,
1704     px_responsibility_id         IN OUT NOCOPY NUMBER,
1705     p_responsibility_type        IN     VARCHAR2,
1706     x_object_version_number      OUT NOCOPY NUMBER
1707   ) IS
1708     CURSOR is_role_resp_id_exist(l_resp_id NUMBER) IS
1709     SELECT nvl(object_version_number,1), cust_account_role_id
1710     FROM HZ_ROLE_RESPONSIBILITY
1711     WHERE responsibility_id = l_resp_id
1712     AND rownum = 1;
1713 
1714     CURSOR is_role_resp_exist(l_cac_id NUMBER, l_resp_type VARCHAR2) IS
1715     SELECT nvl(object_version_number,1), responsibility_id
1716     FROM HZ_ROLE_RESPONSIBILITY
1717     WHERE cust_account_role_id = l_cac_id
1718     AND responsibility_type = l_resp_type
1719     AND rownum = 1;
1720 
1721     l_cac_id      NUMBER;
1722   BEGIN
1723     IF(px_responsibility_id IS NULL) THEN
1724       OPEN is_role_resp_exist(p_cust_acct_contact_id, p_responsibility_type);
1725       FETCH is_role_resp_exist INTO x_object_version_number, px_responsibility_id;
1726       CLOSE is_role_resp_exist;
1727     ELSE
1728       OPEN is_role_resp_id_exist(px_responsibility_id);
1729       FETCH is_role_resp_id_exist INTO x_object_version_number, l_cac_id;
1730       CLOSE is_role_resp_id_exist;
1731       IF(l_cac_id <> p_cust_acct_contact_id) OR (l_cac_id IS NULL AND p_cust_acct_contact_id IS NOT NULL) THEN
1732         -- return -1 to indicate that the combination of parent and object id do not match
1733         x_object_version_number := -1;
1734       END IF;
1735     END IF;
1736   END check_role_resp_op;
1737 
1738 -- PROCEDURE check_cust_profile_op
1739 --
1740 -- DESCRIPTION
1741 --     Check the operation of customer profile based on pass in parameter.
1742 --
1743 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1744 --
1745 -- ARGUMENTS
1746 --   IN:
1747 --     p_cust_acct_id           Customer account Id.
1748 --     p_site_use_id            Customer site use Id.
1749 --     p_profile_class_id       Profile class Id.
1750 --   IN/OUT:
1751 --     px_cust_acct_profile_id  Customer profile Id.
1752 --   OUT:
1753 --     x_object_version_number  Object version number of customer profile.
1754 -- NOTES
1755 --
1756 -- MODIFICATION HISTORY
1757 --
1758 --   13-Jul-2005    Arnold Ng   o Created.
1759 
1760   PROCEDURE check_cust_profile_op(
1761     p_cust_acct_id               IN     NUMBER,
1762     px_cust_acct_profile_id      IN OUT NOCOPY NUMBER,
1763     p_site_use_id                IN     NUMBER,
1764     p_profile_class_id           IN     NUMBER,
1765     x_object_version_number      OUT NOCOPY NUMBER
1766   ) IS
1767     CURSOR is_cust_profile_id_exist(l_cust_acct_prof_id NUMBER) IS
1768     SELECT nvl(object_version_number,1), cust_account_id, site_use_id
1769     FROM HZ_CUSTOMER_PROFILES
1770     WHERE cust_account_profile_id = l_cust_acct_prof_id
1771     AND rownum = 1;
1772 
1773     CURSOR is_cust_profile_exist(l_ca_id NUMBER, l_site_use_id NUMBER, l_profile_class_id NUMBER) IS
1774     SELECT nvl(object_version_number,1), cust_account_profile_id
1775     FROM HZ_CUSTOMER_PROFILES
1776     WHERE cust_account_id = l_ca_id
1777     AND nvl(site_use_id, -99) = nvl(l_site_use_id, -99)
1778     AND profile_class_id = l_profile_class_id
1779     AND status in ('A','I')
1780     AND rownum = 1;
1781 
1782     l_ca_id       NUMBER;
1783     l_casu_id     NUMBER;
1784   BEGIN
1785     IF(px_cust_acct_profile_id IS NULL) THEN
1786       OPEN is_cust_profile_exist(p_cust_acct_id, p_site_use_id, p_profile_class_id);
1787       FETCH is_cust_profile_exist INTO x_object_version_number, px_cust_acct_profile_id;
1788       CLOSE is_cust_profile_exist;
1789     ELSE
1790       OPEN is_cust_profile_id_exist(px_cust_acct_profile_id);
1791       FETCH is_cust_profile_id_exist INTO x_object_version_number, l_ca_id, l_casu_id;
1792       CLOSE is_cust_profile_id_exist;
1793       IF((l_ca_id <> p_cust_acct_id) OR (nvl(l_casu_id,-99) <> nvl(p_site_use_id,-99))) OR
1794         ((l_ca_id IS NULL AND p_cust_acct_id IS NOT NULL) OR (l_casu_id IS NULL AND p_site_use_id IS NOT NULL)) THEN
1795         -- return -1 to indicate that the combination of parent and object id do not match
1796         x_object_version_number := -1;
1797       END IF;
1798     END IF;
1799   END check_cust_profile_op;
1800 
1801 -- PROCEDURE check_cust_profile_amt_op
1802 --
1803 -- DESCRIPTION
1804 --     Check the operation of customer profile amount based on pass in parameter.
1805 --
1806 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1807 --
1808 -- ARGUMENTS
1809 --   IN:
1810 --     p_cust_profile_id        Customer profile Id.
1811 --     p_currency_code          Currency code.
1812 --   IN/OUT:
1813 --     px_cust_acct_prof_amt_id Customer profile amount Id.
1814 --   OUT:
1815 --     x_object_version_number  Object version number of customer profile amount.
1816 -- NOTES
1817 --
1818 -- MODIFICATION HISTORY
1819 --
1820 --   13-Jul-2005    Arnold Ng   o Created.
1821 
1822   PROCEDURE check_cust_profile_amt_op(
1823     p_cust_profile_id            IN     NUMBER,
1824     px_cust_acct_prof_amt_id     IN OUT NOCOPY NUMBER,
1825     p_currency_code              IN     VARCHAR2,
1826     x_object_version_number      OUT NOCOPY NUMBER
1827   ) IS
1828     CURSOR is_cust_profile_amt_id_exist(l_cust_prof_amt_id NUMBER) IS
1829     SELECT nvl(object_version_number,1), cust_account_profile_id
1830     FROM HZ_CUST_PROFILE_AMTS
1831     WHERE cust_acct_profile_amt_id = l_cust_prof_amt_id
1832     AND rownum = 1;
1833 
1834     CURSOR is_cust_profile_amt_exist(l_cap_id NUMBER, l_currency_code VARCHAR2) IS
1835     SELECT nvl(object_version_number,1), cust_acct_profile_amt_id
1836     FROM HZ_CUST_PROFILE_AMTS
1837     WHERE cust_account_profile_id = l_cap_id
1838     AND currency_code = l_currency_code
1839     AND rownum = 1;
1840 
1841     l_cap_id      NUMBER;
1842   BEGIN
1843     IF(px_cust_acct_prof_amt_id IS NULL) THEN
1844       OPEN is_cust_profile_amt_exist(p_cust_profile_id, p_currency_code);
1845       FETCH is_cust_profile_amt_exist INTO x_object_version_number, px_cust_acct_prof_amt_id;
1846       CLOSE is_cust_profile_amt_exist;
1847     ELSE
1848       OPEN is_cust_profile_amt_id_exist(px_cust_acct_prof_amt_id);
1849       FETCH is_cust_profile_amt_id_exist INTO x_object_version_number, l_cap_id;
1850       CLOSE is_cust_profile_amt_id_exist;
1851       IF(l_cap_id <> p_cust_profile_id) OR (l_cap_id IS NULL AND p_cust_profile_id IS NOT NULL) THEN
1852         -- return -1 to indicate that the combination of parent and object id do not match
1853         x_object_version_number := -1;
1854       END IF;
1855     END IF;
1856   END check_cust_profile_amt_op;
1857 
1858 -- PROCEDURE check_cust_acct_relate_op
1859 --
1860 -- DESCRIPTION
1861 --     Check the operation of customer account relationship based on pass in parameter.
1862 --
1863 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1864 --
1865 -- ARGUMENTS
1866 --   IN:
1867 --     p_cust_acct_id           Customer account Id.
1868 --     p_related_cust_acct_id   Related customer account Id.
1869 --   OUT:
1870 --     x_object_version_number  Object version number of customer account relationship.
1871 -- NOTES
1872 --
1873 -- MODIFICATION HISTORY
1874 --
1875 --   13-Jul-2005    Arnold Ng   o Created.
1876 
1877   PROCEDURE check_cust_acct_relate_op(
1878     p_cust_acct_id               IN     NUMBER,
1879     p_related_cust_acct_id       IN     NUMBER,
1880     p_org_id                     IN     NUMBER,
1881     x_object_version_number      OUT NOCOPY NUMBER
1882   ) IS
1883     CURSOR is_cust_acct_relate_exist(l_ca_id NUMBER, l_rca_id NUMBER) IS
1884     SELECT nvl(object_version_number,1)
1885     FROM HZ_CUST_ACCT_RELATE
1886     WHERE cust_account_id = l_ca_id
1887     AND related_cust_account_id = l_rca_id
1888     AND status in ('A','I')
1889     AND ORG_ID = NVL(p_org_id, ORG_ID) -- bug 8549266
1890     AND rownum = 1;
1891   BEGIN
1892     OPEN is_cust_acct_relate_exist(p_cust_acct_id, p_related_cust_acct_id);
1893     FETCH is_cust_acct_relate_exist INTO x_object_version_number;
1894     CLOSE is_cust_acct_relate_exist;
1895   END check_cust_acct_relate_op;
1896 
1897 -- PROCEDURE check_payment_method_op
1898 --
1899 -- DESCRIPTION
1900 --     Check the operation of payment method based on pass in parameter.
1901 --
1902 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1903 --
1904 -- ARGUMENTS
1905 --   IN:
1906 --     p_cust_receipt_method_id Payment method Id.
1907 --   OUT:
1908 --     x_last_update_date       Last update date of payment method.
1909 -- NOTES
1910 --
1911 -- MODIFICATION HISTORY
1912 --
1913 --   13-Jul-2005    Arnold Ng   o Created.
1914 
1915   PROCEDURE check_payment_method_op(
1916     p_cust_receipt_method_id     IN     NUMBER,
1917     x_last_update_date           OUT NOCOPY DATE
1918   ) IS
1919     CURSOR is_payment_method_exist(l_pm_id NUMBER) IS
1920     SELECT last_update_date
1921     FROM RA_CUST_RECEIPT_METHODS
1922     WHERE cust_receipt_method_id = l_pm_id
1923     AND rownum = 1;
1924   BEGIN
1925     OPEN is_payment_method_exist(p_cust_receipt_method_id);
1926     FETCH is_payment_method_exist INTO x_last_update_date;
1927     CLOSE is_payment_method_exist;
1928   END check_payment_method_op;
1929 
1930 -- FUNCTION check_bo_op
1931 --
1932 -- DESCRIPTION
1933 --     Return the operation of business object based on pass in parameter.
1934 --     Return value can be 'C' (create) or 'U' (update)
1935 --
1936 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1937 --
1938 -- ARGUMENTS
1939 --   IN:
1940 --     p_entity_id              Business object Id.
1941 --     p_entity_os              Business object original system.
1942 --     p_entity_osr             Business object original system reference.
1943 --     p_entity_type            Business object type.
1944 --     p_cp_type                Contact point type.
1945 --     p_parent_id              Parent Id,
1946 --     p_parent_table           Parent table
1947 -- NOTES
1948 --
1949 -- MODIFICATION HISTORY
1950 --
1951 --   13-Jul-2005    Arnold Ng   o Created.
1952 
1953   FUNCTION check_bo_op(
1954     p_entity_id                  IN     NUMBER,
1955     p_entity_os                  IN     VARCHAR2,
1956     p_entity_osr                 IN     VARCHAR2,
1957     p_entity_type                IN     VARCHAR2,
1958     p_cp_type                    IN     VARCHAR2 := NULL,
1959     p_parent_id                  IN     NUMBER,
1960     p_parent_obj_type            IN     VARCHAR2
1961   ) RETURN VARCHAR2 IS
1962     CURSOR is_contact_point_exist(l_contact_point_id NUMBER, l_contact_point_type VARCHAR2) IS
1963     SELECT owner_table_id, owner_table_name
1964     FROM HZ_CONTACT_POINTS
1965     WHERE contact_point_id = l_contact_point_id
1966     AND contact_point_type = l_contact_point_type;
1967 
1968     CURSOR is_party_site_exist(l_ps_id NUMBER) IS
1969     SELECT party_id
1970     FROM HZ_PARTY_SITES
1971     WHERE party_site_id = l_ps_id;
1972 
1973     CURSOR is_location_exist(l_loc_id NUMBER) IS
1974     SELECT 'X'
1975     FROM HZ_LOCATIONS
1976     WHERE location_id = l_loc_id;
1977 
1978     CURSOR is_party_exist(l_party_id NUMBER) IS
1979     SELECT 'X'
1980     FROM HZ_PARTIES
1981     WHERE party_id = l_party_id;
1982 
1983     CURSOR is_org_contact_exist(l_org_contact_id NUMBER) IS
1984     SELECT r.object_id
1985     FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
1986     WHERE oc.org_contact_id = l_org_contact_id
1987     AND oc.party_relationship_id = r.relationship_id
1988     AND r.object_type = 'ORGANIZATION'
1989     AND r.subject_type = 'PERSON'
1990     AND rownum = 1;
1991 
1992     CURSOR is_cust_account_exist(l_cust_acct_id NUMBER) IS
1993     SELECT party_id
1994     FROM HZ_CUST_ACCOUNTS
1995     WHERE cust_account_id = l_cust_acct_id;
1996 
1997     CURSOR is_cust_acct_site_exist(l_cust_acct_site_id NUMBER) IS
1998     SELECT cust_account_id
1999     FROM HZ_CUST_ACCT_SITES_ALL
2000     WHERE cust_acct_site_id = l_cust_acct_site_id;
2001 
2002     CURSOR is_cust_site_use_exist(l_site_use_id NUMBER) IS
2003     SELECT cust_acct_site_id
2004     FROM HZ_CUST_SITE_USES
2005     WHERE site_use_id = l_site_use_id;
2006 
2007     CURSOR is_cust_acct_role_exist(l_cust_acct_role_id NUMBER) IS
2008     SELECT cust_account_id, nvl(cust_acct_site_id, -99)
2009     FROM HZ_CUST_ACCOUNT_ROLES
2010     WHERE cust_account_role_id = l_cust_acct_role_id;
2011 
2012     l_create_update_flag       VARCHAR2(1);
2013     l_dummy                    VARCHAR2(1);
2014     l_ss_flag                  VARCHAR2(1);
2015     l_owner_table_id           NUMBER;
2016     l_debug_prefix             VARCHAR2(30);
2017     l_return_status            VARCHAR2(30);
2018     l_count                    NUMBER;
2019     l_parent_id                NUMBER;
2020     l_acct_site_id             NUMBER;
2021     l_input_parent_table       VARCHAR2(30);
2022     l_parent_table             VARCHAR2(30);
2023   BEGIN
2024     l_dummy := NULL;
2025 
2026     l_ss_flag := is_ss_provided(p_os  => p_entity_os,
2027                                 p_osr => p_entity_osr);
2028 
2029     -- Return as 'Create' if no TCA id and no os+osr pass in
2030     -- Fix bug 4748851
2031     IF(p_entity_id IS NULL) AND (l_ss_flag = 'N') THEN
2032       RETURN 'C';
2033     END IF;
2034 
2035     -- if TCA id pass in, check if it is valid or not
2036     IF(p_entity_id IS NOT NULL) THEN
2037       l_input_parent_table := get_owner_table_name(p_parent_obj_type);
2038 
2039       IF(p_entity_type = 'HZ_CONTACT_POINTS') THEN
2040         OPEN is_contact_point_exist(p_entity_id, p_cp_type);
2041         FETCH is_contact_point_exist INTO l_parent_id, l_parent_table;
2042         CLOSE is_contact_point_exist;
2043         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id OR l_parent_table <> l_input_parent_table) THEN
2044           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2045           FND_MSG_PUB.ADD;
2046           RETURN 'E';
2047         END IF;
2048         l_dummy := 'X';
2049       ELSIF(p_entity_type = 'HZ_PARTY_SITES') THEN
2050         OPEN is_party_site_exist(p_entity_id);
2051         FETCH is_party_site_exist INTO l_parent_id;
2052         CLOSE is_party_site_exist;
2053         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2054           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2055           FND_MSG_PUB.ADD;
2056           RETURN 'E';
2057         END IF;
2058         l_dummy := 'X';
2059       ELSIF(p_entity_type = 'HZ_LOCATIONS') THEN
2060         OPEN is_location_exist(p_entity_id);
2061         FETCH is_location_exist INTO l_dummy;
2062         CLOSE is_location_exist;
2063       ELSIF(p_entity_type = 'HZ_PARTIES') THEN
2064         OPEN is_party_exist(p_entity_id);
2065         FETCH is_party_exist INTO l_dummy;
2066         CLOSE is_party_exist;
2067       ELSIF(p_entity_type = 'HZ_ORG_CONTACTS') THEN
2068         OPEN is_org_contact_exist(p_entity_id);
2069         FETCH is_org_contact_exist INTO l_parent_id;
2070         CLOSE is_org_contact_exist;
2071         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2072           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2073           FND_MSG_PUB.ADD;
2074           RETURN 'E';
2075         END IF;
2076         l_dummy := 'X';
2077       ELSIF(p_entity_type = 'HZ_CUST_ACCOUNTS') THEN
2078         OPEN is_cust_account_exist(p_entity_id);
2079         FETCH is_cust_account_exist INTO l_parent_id;
2080         CLOSE is_cust_account_exist;
2081         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2082           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2083           FND_MSG_PUB.ADD;
2084           RETURN 'E';
2085         END IF;
2086         l_dummy := 'X';
2087       ELSIF(p_entity_type = 'HZ_CUST_ACCT_SITES_ALL') THEN
2088         OPEN is_cust_acct_site_exist(p_entity_id);
2089         FETCH is_cust_acct_site_exist INTO l_parent_id;
2090         CLOSE is_cust_acct_site_exist;
2091         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2092           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2093           FND_MSG_PUB.ADD;
2094           RETURN 'E';
2095         END IF;
2096         l_dummy := 'X';
2097       ELSIF(p_entity_type = 'HZ_CUST_SITE_USES_ALL') THEN
2098         OPEN is_cust_site_use_exist(p_entity_id);
2099         FETCH is_cust_site_use_exist INTO l_parent_id;
2100         CLOSE is_cust_site_use_exist;
2101         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2102           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2103           FND_MSG_PUB.ADD;
2104           RETURN 'E';
2105         END IF;
2106         l_dummy := 'X';
2107       ELSIF(p_entity_type = 'HZ_CUST_ACCOUNT_ROLES') THEN
2108         OPEN is_cust_acct_role_exist(p_entity_id);
2109         FETCH is_cust_acct_role_exist INTO l_parent_id, l_acct_site_id;
2110         CLOSE is_cust_acct_role_exist;
2111         IF(p_parent_obj_type = 'CUST_ACCT_SITE') THEN
2112           IF(l_parent_id IS NULL OR l_acct_site_id <> p_parent_id) THEN
2113             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2114             FND_MSG_PUB.ADD;
2115             RETURN 'E';
2116           END IF;
2117         ELSIF(p_parent_obj_type = 'CUST_ACCT') THEN
2118           IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2119             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2120             FND_MSG_PUB.ADD;
2121             RETURN 'E';
2122           END IF;
2123         END IF;
2124         l_dummy := 'X';
2125       END IF;
2126     END IF;
2127 
2128     IF(l_ss_flag = 'Y') THEN
2129       -- Get how many rows return
2130       l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
2131                    p_orig_system           => p_entity_os,
2132                    p_orig_system_reference => p_entity_osr,
2133                    p_owner_table_name      => p_entity_type);
2134 
2135       IF(l_count > 0) THEN
2136         HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
2137           p_orig_system           => p_entity_os,
2138           p_orig_system_reference => p_entity_osr,
2139           p_owner_table_name      => p_entity_type,
2140           x_owner_table_id        => l_owner_table_id,
2141           x_return_status         => l_return_status);
2142 
2143         -- For contact point, check if the id and type is the same
2144         IF(p_entity_type = 'HZ_CONTACT_POINTS') THEN
2145           OPEN is_contact_point_exist(l_owner_table_id, p_cp_type);
2146           FETCH is_contact_point_exist INTO l_parent_id, l_parent_table;
2147           CLOSE is_contact_point_exist;
2148           IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id OR l_parent_table <> l_input_parent_table) THEN
2149             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2150             FND_MSG_PUB.ADD;
2151             RETURN 'E';
2152           END IF;
2153         END IF;
2154       END IF;
2155     END IF;
2156 
2157     -- no TCA id
2158     IF(p_entity_id IS NULL) THEN
2159       -- ssm is invalid
2160       IF(l_ss_flag = 'Y') AND (l_count = 0) THEN
2161         RETURN 'C';
2162       END IF;
2163       -- ssm is valid
2164       IF(l_ss_flag = 'Y') AND (l_count > 0) AND (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2165         RETURN 'U';
2166       ELSE
2167         RETURN 'E';
2168       END IF;
2169     ELSE
2170       -- invalid TCA id
2171       IF(l_dummy IS NULL) THEN
2172         -- ssm is valid
2173         IF(l_ss_flag = 'Y') AND (l_count > 0) AND (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2174           RETURN 'E';
2175         END IF;
2176         RETURN 'C';
2177       -- valid TCA id
2178       ELSE
2179         RETURN 'U';
2180       END IF;
2181     END IF;
2182   END check_bo_op;
2183 
2184 -- PROCEDURE check_party_usage_op
2185 --
2186 -- DESCRIPTION
2187 --     Checks if a row exists in  party_usg_assigments table for agiven
2188 --      party_id and party_usages_code.
2189 --     If exists Return last_update_date value. otherwise null.
2190 --
2191 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2192 --
2193 -- ARGUMENTS
2194 --   IN:
2195 --    p_party_id              id of a party for whicch party_usage was created.
2196 --    p_party_usage_code         seeded usage code.
2197 
2198 --   OUT:
2199 --    x_last_update_date       last_update_date column,
2200 --    x_return_status              status of the call
2201 -- NOTES
2202 --
2203 -- MODIFICATION HISTORY
2204 --
2205 --   01-Mar-2006    Hadi Alatasi   o Created.
2206 
2207   PROCEDURE check_party_usage_op(
2208     p_party_id                   IN     NUMBER,
2209     p_party_usage_code          IN     VARCHAR2,
2210     x_last_update_date          OUT NOCOPY DATE,
2211     x_return_status              OUT NOCOPY VARCHAR2
2212   ) IS
2213     CURSOR is_usg_exist(l_party_id NUMBER, l_party_usage_code VARCHAR2 ) IS
2214     SELECT last_update_date
2215     FROM HZ_PARTY_USG_ASSIGNMENTS
2216     WHERE PARTY_USAGE_CODE = l_party_usage_code
2217 	AND PARTY_ID= l_party_id
2218     AND rownum = 1;
2219 
2220     l_party_id    NUMBER;
2221   BEGIN
2222     x_return_status := FND_API.G_RET_STS_SUCCESS;
2223     IF(p_party_usage_code IS NULL OR p_party_id IS NULL) THEN
2224       x_last_update_date := NULL;
2225     ELSE
2226       OPEN is_usg_exist(p_party_id,p_party_usage_code);
2227       FETCH is_usg_exist INTO x_last_update_date;
2228       CLOSE is_usg_exist;
2229     END IF;
2230   EXCEPTION
2231    when NO_DATA_FOUND then
2232      x_last_update_date := NULL;
2233    when OTHERS then
2234      x_return_status := FND_API.G_RET_STS_ERROR;
2235 
2236   END check_party_usage_op;
2237 
2238 
2239 -- PRIVATE FUNCTION is_ss_provided
2240 --
2241 -- DESCRIPTION
2242 --     Return a flag to indicate that original system and original system reference
2243 --     are provided.
2244 --
2245 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2246 --
2247 -- ARGUMENTS
2248 --   IN:
2249 --     p_os                     Original system.
2250 --     p_osr                    Original system reference.
2251 -- NOTES
2252 --
2253 -- MODIFICATION HISTORY
2254 --
2255 --   13-Jul-2005    Arnold Ng   o Created.
2256 
2257   FUNCTION is_ss_provided(
2258     p_os                  IN     VARCHAR2,
2259     p_osr                 IN     VARCHAR2
2260   ) RETURN VARCHAR2 IS
2261   BEGIN
2262     IF((p_os is null or p_os = fnd_api.g_miss_char)
2263       and (p_osr is null or p_osr = fnd_api.g_miss_char))THEN
2264       RETURN 'N';
2265     ELSE
2266       RETURN 'Y';
2267     END IF;
2268   END is_ss_provided;
2269 
2270 -- FUNCTION get_owner_table_name
2271 --
2272 -- DESCRIPTION
2273 --     Return the owner table name based on object type.
2274 --
2275 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2276 --
2277 -- ARGUMENTS
2278 --   IN:
2279 --     p_obj_type               Object type.
2280 -- NOTES
2281 --
2282 -- MODIFICATION HISTORY
2283 --
2284 --   13-Jul-2005    Arnold Ng   o Created.
2285 
2286   FUNCTION get_owner_table_name(
2287     p_obj_type            IN     VARCHAR2
2288   ) RETURN VARCHAR2 IS
2289   BEGIN
2290     -- Base on HZ_BUSINESS_OBJECTS lookup code
2291     IF(p_obj_type = 'PARTY_SITE') THEN
2292       RETURN 'HZ_PARTY_SITES';
2293     ELSIF((p_obj_type = 'ORG') OR (p_obj_type = 'PERSON') OR (p_obj_type = 'ORG_CONTACT')) THEN
2294       RETURN 'HZ_PARTIES';
2295     ELSIF((p_obj_type = 'ORG_CUST') OR (p_obj_type = 'PERSON_CUST') OR (p_obj_type = 'CUST_ACCT')) THEN
2296       RETURN 'HZ_CUST_ACCOUNTS';
2297     ELSIF(p_obj_type = 'CUST_ACCT_CONTACT') THEN
2298       RETURN 'HZ_CUST_ACCOUNT_ROLES';
2299     ELSIF(p_obj_type = 'CUST_ACCT_SITE') THEN
2300       RETURN 'HZ_CUST_ACCT_SITES_ALL';
2301     ELSIF(p_obj_type in ('PHONE', 'EMAIL', 'TLX', 'WEB', 'EDI', 'EFT', 'SMS')) THEN
2302       RETURN 'HZ_CONTACT_POINTS';
2303     ELSIF(p_obj_type = 'LOCATION') THEN
2304       RETURN 'HZ_LOCATIONS';
2305     ELSIF(p_obj_type = 'CUST_ACCT_SITE_USE') THEN
2306       RETURN 'HZ_CUST_SITE_USES_ALL';
2307     END IF;
2308     RETURN NULL;
2309   END get_owner_table_name;
2310 
2311 -- FUNCTION get_parent_object_type
2312 --
2313 -- DESCRIPTION
2314 --     Return the object type based on parent table and Id.
2315 --
2316 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2317 --
2318 -- ARGUMENTS
2319 --   IN:
2320 --     p_parent_table_name      Parent table name.
2321 --     p_parent_id              Parent Id.
2322 -- NOTES
2323 --
2324 -- MODIFICATION HISTORY
2325 --
2326 --   13-Jul-2005    Arnold Ng   o Created.
2327 
2328   FUNCTION get_parent_object_type(
2329     p_parent_table_name         IN     VARCHAR2,
2330     p_parent_id                 IN     NUMBER
2331   ) RETURN VARCHAR2 IS
2332 
2333     l_party_type VARCHAR2(30) := null;
2334 
2335     CURSOR c1 IS
2336       SELECT party_type FROM hz_parties
2337       WHERE party_id = p_parent_id;
2338 
2339     CURSOR c2 IS
2340       SELECT party_type
2341       FROM hz_parties p, hz_cust_accounts ca
2342       WHERE p.party_id = ca.party_id
2343       AND ca.cust_account_id = p_parent_id;
2344 
2345   BEGIN
2346     -- Base on owner_table_name to return HZ_BUSINESS_OBJECTS lookup code
2347     IF p_parent_table_name = 'HZ_PARTIES' THEN
2348       OPEN c1;
2349       FETCH c1 INTO l_party_type;
2350       CLOSE c1;
2351     ELSIF p_parent_table_name = 'HZ_CUST_ACCOUNTS' THEN
2352       OPEN c2;
2353       FETCH c2 INTO l_party_type;
2354       CLOSE c2;
2355     END IF;
2356 
2357     IF(p_parent_table_name = 'HZ_PARTY_SITES') THEN
2358       RETURN 'PARTY_SITE';
2359     ELSIF(p_parent_table_name = 'HZ_PARTIES') THEN
2360       IF(l_party_type = 'ORGANIZATION') THEN
2361         RETURN 'ORG';
2362       ELSIF(l_party_type = 'PERSON') THEN
2363         RETURN 'PERSON';
2364       ELSIF(l_party_type = 'PARTY_RELATIONSHIP') THEN
2365         RETURN 'ORG_CONTACT';
2366       END IF;
2367     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNTS') THEN
2368       IF(l_party_type = 'ORGANIZATION') THEN
2369         RETURN 'ORG_CUST';
2370       ELSIF(l_party_type = 'PERSON') THEN
2371         RETURN 'PERSON_CUST';
2372       ELSIF(l_party_type IS NULL) THEN
2373         RETURN 'CUST_ACCT';
2374       END IF;
2375     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNT_ROLES') THEN
2376       RETURN 'CUST_ACCT_CONTACT';
2377     ELSIF(p_parent_table_name = 'HZ_CUST_ACCT_SITES_ALL') THEN
2378       RETURN 'CUST_ACCT_SITE';
2379     END IF;
2380     RETURN NULL;
2381   END get_parent_object_type;
2382 
2383 -- FUNCTION is_cp_bo_comp
2384 --
2385 -- DESCRIPTION
2386 --     Return true if contact point object is complete.  Otherwise, return false.
2387 --
2388 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2389 --
2390 -- ARGUMENTS
2391 --   IN:
2392 --     p_phone_objs             List of phone business objects.
2393 --     p_email_objs             List of email business objects.
2394 --     p_telex_objs             List of telex business objects.
2395 --     p_web_objs               List of web business objects.
2396 --     p_edi_objs               List of edi business objects.
2397 --     p_eft_objs               List of eft business objects.
2398 --     p_sms_objs               List of sms business objects.
2399 --     p_bus_object             Business object structure for contact point.
2400 -- NOTES
2401 --
2402 -- MODIFICATION HISTORY
2403 --
2404 --   13-Jul-2005    Arnold Ng   o Created.
2405 
2406   FUNCTION is_cp_bo_comp(
2407     p_phone_objs              IN     HZ_PHONE_CP_BO_TBL,
2408     p_email_objs              IN     HZ_EMAIL_CP_BO_TBL,
2409     p_telex_objs              IN     HZ_TELEX_CP_BO_TBL,
2410     p_web_objs                IN     HZ_WEB_CP_BO_TBL,
2411     p_edi_objs                IN     HZ_EDI_CP_BO_TBL,
2412     p_eft_objs                IN     HZ_EFT_CP_BO_TBL,
2413     p_sms_objs                IN     HZ_SMS_CP_BO_TBL,
2414     p_bus_object              IN     COMPLETENESS_REC_TYPE
2415   ) RETURN BOOLEAN IS
2416 
2417     l_phone_cpref             BOOLEAN;
2418     l_email_cpref             BOOLEAN;
2419     l_telex_cpref             BOOLEAN;
2420     l_web_cpref               BOOLEAN;
2421     l_edi_cpref               BOOLEAN;
2422     l_eft_cpref               BOOLEAN;
2423     l_sms_cpref               BOOLEAN;
2424     l_bus_object              COMPLETENESS_REC_TYPE;
2425     l_bo_num                  NUMBER;
2426   BEGIN
2427     -- Contact point only has contact preference entity, use boolean to
2428     -- indicate whether it must be present or not
2429     l_bo_num       := 0;
2430     l_phone_cpref  := FALSE;
2431     l_email_cpref  := FALSE;
2432     l_telex_cpref  := FALSE;
2433     l_web_cpref    := FALSE;
2434     l_edi_cpref    := FALSE;
2435     l_eft_cpref    := FALSE;
2436     l_sms_cpref    := FALSE;
2437     l_bus_object.business_object_code := boc_tbl();
2438     l_bus_object.child_bo_code := cbc_tbl();
2439     l_bus_object.tca_mandated_flag := tmf_tbl();
2440     l_bus_object.user_mandated_flag := umf_tbl();
2441     l_bus_object.root_node_flag := rnf_tbl();
2442     l_bus_object.entity_name := ent_tbl();
2443 
2444     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2445       -- get all entity of contact point, for contact point, the only possible
2446       -- entity is HZ_CONTACT_PREFERENCES
2447       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2448          p_bus_object.user_mandated_flag(i) = 'Y' AND
2449          p_bus_object.root_node_flag(i) = 'N') THEN
2450         CASE
2451           WHEN p_bus_object.business_object_code(i) = 'PHONE' THEN
2452             l_phone_cpref := TRUE;
2453           WHEN p_bus_object.business_object_code(i) = 'EMAIL' THEN
2454             l_email_cpref := TRUE;
2455           WHEN p_bus_object.business_object_code(i) = 'TELEX' THEN
2456             l_telex_cpref := TRUE;
2457           WHEN p_bus_object.business_object_code(i) = 'WEB' THEN
2458             l_web_cpref := TRUE;
2459           WHEN p_bus_object.business_object_code(i) = 'EDI' THEN
2460             l_edi_cpref := TRUE;
2461           WHEN p_bus_object.business_object_code(i) = 'EFT' THEN
2462             l_eft_cpref := TRUE;
2463           WHEN p_bus_object.business_object_code(i) = 'SMS' THEN
2464             l_sms_cpref := TRUE;
2465           ELSE
2466             null;
2467         END CASE;
2468       ELSIF(p_bus_object.tca_mandated_flag(i) = 'Y' AND
2469             p_bus_object.user_mandated_flag(i) = 'Y' AND
2470             p_bus_object.root_node_flag(i) = 'Y') THEN
2471         l_bo_num := l_bo_num + 1;
2472         l_bus_object.business_object_code.EXTEND;
2473         l_bus_object.child_bo_code.EXTEND;
2474         l_bus_object.tca_mandated_flag.EXTEND;
2475         l_bus_object.user_mandated_flag.EXTEND;
2476         l_bus_object.root_node_flag.EXTEND;
2477         l_bus_object.entity_name.EXTEND;
2478         l_bus_object.business_object_code(l_bo_num) := p_bus_object.business_object_code(i);
2479         l_bus_object.child_bo_code(l_bo_num) := p_bus_object.child_bo_code(i);
2480         l_bus_object.tca_mandated_flag(l_bo_num) := p_bus_object.tca_mandated_flag(i);
2481         l_bus_object.user_mandated_flag(l_bo_num) := p_bus_object.user_mandated_flag(i);
2482         l_bus_object.root_node_flag(l_bo_num) := p_bus_object.root_node_flag(i);
2483         l_bus_object.entity_name(l_bo_num) := p_bus_object.entity_name(i);
2484       END IF;
2485     END LOOP;
2486 
2487     -- loop through l_bus_object to find out which contact point must be present
2488     FOR i IN 1..l_bo_num LOOP
2489       CASE
2490         WHEN l_bus_object.business_object_code(i) = 'PHONE' THEN
2491           IF(p_phone_objs IS NULL OR p_phone_objs.COUNT < 1) THEN
2492             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2493             fnd_message.set_token('OBJECT' ,'PHONE');
2494             fnd_msg_pub.add;
2495             RETURN FALSE;
2496           ELSE
2497             FOR j IN 1..p_phone_objs.COUNT LOOP
2498               IF(l_phone_cpref AND
2499                  (p_phone_objs(j).contact_pref_objs IS NULL OR
2500                   p_phone_objs(j).contact_pref_objs.COUNT < 1)) THEN
2501                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2502                 fnd_message.set_token('ENTITY' ,'PHONE-CONTACT_PREFERENCE');
2503                 fnd_msg_pub.add;
2504                 RETURN FALSE;
2505               END IF;
2506             END LOOP;
2507           END IF;
2508         WHEN l_bus_object.business_object_code(i) = 'EMAIL' THEN
2509           IF(p_email_objs IS NULL OR p_email_objs.COUNT < 1) THEN
2510             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2511             fnd_message.set_token('OBJECT' ,'EMAIL');
2512             fnd_msg_pub.add;
2513             RETURN FALSE;
2514           ELSE
2515             FOR j IN 1..p_email_objs.COUNT LOOP
2516               IF(l_email_cpref AND
2517                  (p_email_objs(j).contact_pref_objs IS NULL OR
2518                   p_email_objs(j).contact_pref_objs.COUNT < 1)) THEN
2519                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2520                 fnd_message.set_token('ENTITY' ,'EMAIL-CONTACT_PREFERENCE');
2521                 fnd_msg_pub.add;
2522                 RETURN FALSE;
2523               END IF;
2524             END LOOP;
2525           END IF;
2526         WHEN l_bus_object.business_object_code(i) = 'TLX' THEN
2527           IF(p_telex_objs IS NULL OR p_telex_objs.COUNT < 1) THEN
2528             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2529             fnd_message.set_token('OBJECT' ,'TELEX');
2530             fnd_msg_pub.add;
2531             RETURN FALSE;
2532           ELSE
2533             FOR j IN 1..p_telex_objs.COUNT LOOP
2534               IF(l_telex_cpref AND
2535                  (p_telex_objs(j).contact_pref_objs IS NULL OR
2536                   p_telex_objs(j).contact_pref_objs.COUNT < 1)) THEN
2537                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2538                 fnd_message.set_token('ENTITY' ,'TLX-CONTACT_PREFERENCE');
2539                 fnd_msg_pub.add;
2540                 RETURN FALSE;
2541               END IF;
2542             END LOOP;
2543           END IF;
2544         WHEN l_bus_object.business_object_code(i) = 'WEB' THEN
2545           IF(p_web_objs IS NULL OR p_web_objs.COUNT < 1) THEN
2546             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2547             fnd_message.set_token('OBJECT' ,'WEB');
2548             fnd_msg_pub.add;
2549             RETURN FALSE;
2550           ELSE
2551             FOR j IN 1..p_web_objs.COUNT LOOP
2552               IF(l_web_cpref AND
2553                  (p_web_objs(j).contact_pref_objs IS NULL OR
2554                   p_web_objs(j).contact_pref_objs.COUNT < 1)) THEN
2555                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2556                 fnd_message.set_token('ENTITY' ,'WEB-CONTACT_PREFERENCE');
2557                 fnd_msg_pub.add;
2558                 RETURN FALSE;
2559               END IF;
2560             END LOOP;
2561           END IF;
2562         WHEN l_bus_object.business_object_code(i) = 'EDI' THEN
2563           IF(p_edi_objs IS NULL OR p_edi_objs.COUNT < 1) THEN
2564             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2565             fnd_message.set_token('OBJECT' ,'EDI');
2566             fnd_msg_pub.add;
2567             RETURN FALSE;
2568           ELSE
2569             FOR j IN 1..p_edi_objs.COUNT LOOP
2570               IF(l_edi_cpref AND
2571                  (p_edi_objs(j).contact_pref_objs IS NULL OR
2572                   p_edi_objs(j).contact_pref_objs.COUNT < 1)) THEN
2573                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2574                 fnd_message.set_token('ENTITY' ,'EDI-CONTACT_PREFERENCE');
2575                 fnd_msg_pub.add;
2576                 RETURN FALSE;
2577               END IF;
2578             END LOOP;
2579           END IF;
2580         WHEN l_bus_object.business_object_code(i) = 'EFT' THEN
2581           IF(p_eft_objs IS NULL OR p_eft_objs.COUNT < 1) THEN
2582             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2583             fnd_message.set_token('OBJECT' ,'EFT');
2584             fnd_msg_pub.add;
2585             RETURN FALSE;
2586           ELSE
2587             FOR j IN 1..p_eft_objs.COUNT LOOP
2588               IF(l_eft_cpref AND
2589                  (p_eft_objs(j).contact_pref_objs IS NULL OR
2590                   p_eft_objs(j).contact_pref_objs.COUNT < 1)) THEN
2591                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2592                 fnd_message.set_token('ENTITY' ,'EFT-CONTACT_PREFERENCE');
2593                 fnd_msg_pub.add;
2594                 RETURN FALSE;
2595               END IF;
2596             END LOOP;
2597           END IF;
2598         WHEN l_bus_object.business_object_code(i) = 'SMS' THEN
2599           IF(p_sms_objs IS NULL OR p_sms_objs.COUNT < 1) THEN
2600             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2601             fnd_message.set_token('OBJECT' ,'SMS');
2602             fnd_msg_pub.add;
2603             RETURN FALSE;
2604           ELSE
2605             FOR j IN 1..p_sms_objs.COUNT LOOP
2606               IF(l_sms_cpref AND
2607                  (p_sms_objs(j).contact_pref_objs IS NULL OR
2608                   p_sms_objs(j).contact_pref_objs.COUNT < 1)) THEN
2609                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2610                 fnd_message.set_token('ENTITY' ,'SMS-CONTACT_PREFERENCE');
2611                 fnd_msg_pub.add;
2612                 RETURN FALSE;
2613               END IF;
2614             END LOOP;
2615           END IF;
2616         ELSE
2617           null;
2618         END CASE;
2619     END LOOP;
2620 
2621     RETURN TRUE;
2622   END is_cp_bo_comp;
2623 
2624 -- FUNCTION is_ps_bo_comp
2625 --
2626 -- DESCRIPTION
2627 --     Return true if party site object is complete.  Otherwise, return false.
2628 --
2629 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2630 --
2631 -- ARGUMENTS
2632 --   IN:
2633 --     p_ps_objs                List of party site business objects.
2634 --     p_bus_object             Business object structure for party site.
2635 -- NOTES
2636 --
2637 -- MODIFICATION HISTORY
2638 --
2639 --   13-Jul-2005    Arnold Ng   o Created.
2640 
2641   FUNCTION is_ps_bo_comp(
2642     p_ps_objs                 IN     HZ_PARTY_SITE_BO_TBL,
2643     p_bus_object              IN     COMPLETENESS_REC_TYPE
2644   ) RETURN BOOLEAN IS
2645 
2646     l_bus_object              COMPLETENESS_REC_TYPE;
2647     l_cp_bus_object           COMPLETENESS_REC_TYPE;
2648     l_valid_obj               BOOLEAN;
2649     l_psu                     BOOLEAN;
2650     l_cpref                   BOOLEAN;
2651     l_ps_ext                  BOOLEAN;
2652     l_loc_ext                 BOOLEAN;
2653     l_phone_code              VARCHAR2(30);
2654     l_telex_code              VARCHAR2(30);
2655     l_email_code              VARCHAR2(30);
2656     l_web_code                VARCHAR2(30);
2657   BEGIN
2658     l_psu          := FALSE;
2659     l_cpref        := FALSE;
2660     l_ps_ext       := FALSE;
2661     l_loc_ext      := FALSE;
2662     l_phone_code   := NULL;
2663     l_telex_code   := NULL;
2664     l_email_code   := NULL;
2665     l_web_code     := NULL;
2666 
2667     IF(p_ps_objs IS NULL OR p_ps_objs.COUNT < 1) THEN
2668       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2669       fnd_message.set_token('OBJECT' ,'PARTY_SITE');
2670       fnd_msg_pub.add;
2671       RETURN FALSE;
2672     END IF;
2673 
2674     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2675       -- get all entities of party site, for party site, the only possible
2676       -- entites are HZ_PARTY_SITE_USES, HZ_CONTACT_PREFERENCES
2677       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2678          p_bus_object.user_mandated_flag(i) = 'Y' AND
2679          p_bus_object.business_object_code(i) = 'PARTY_SITE' AND
2680          p_bus_object.child_bo_code(i) IS NULL) THEN
2681         CASE
2682           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_SITE_USES' THEN
2683             l_psu := TRUE;
2684           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
2685             l_cpref := TRUE;
2686           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_SITES_EXT_VL' THEN
2687             l_ps_ext := TRUE;
2688         END CASE;
2689       -- Get contact point business object
2690       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
2691             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2692         CASE
2693           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
2694             l_phone_code := 'PHONE';
2695           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
2696             l_telex_code := 'TLX';
2697           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
2698             l_email_code := 'EMAIL';
2699           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
2700             l_web_code := 'WEB';
2701           ELSE
2702             null;
2703         END CASE;
2704       -- Get location object
2705       ELSIF(p_bus_object.business_object_code(i) = 'LOCATION' AND
2706             p_bus_object.user_mandated_flag(i) = 'Y' AND
2707             p_bus_object.tca_mandated_flag(i) = 'N' AND
2708             p_bus_object.child_bo_code(i) IS NULL) THEN
2709         IF p_bus_object.entity_name(i) = 'HZ_LOCATIONS_EXT_VL' THEN
2710           l_loc_ext := TRUE;
2711         END IF;
2712       END IF;
2713     END LOOP;
2714 
2715     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
2716        l_email_code IS NOT NULL OR l_web_code IS NOT NULL) THEN
2717       get_cp_from_rec(
2718         p_phone_code         => l_phone_code,
2719         p_email_code         => l_email_code,
2720         p_telex_code         => l_telex_code,
2721         p_web_code           => l_web_code,
2722         p_edi_code           => NULL,
2723         p_eft_code           => NULL,
2724         p_sms_code           => NULL,
2725         p_bus_object         => p_bus_object,
2726         x_bus_object         => l_cp_bus_object
2727       );
2728     END IF;
2729 
2730     FOR i IN 1..p_ps_objs.COUNT LOOP
2731       IF(p_ps_objs(i).location_obj IS NULL) THEN
2732         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2733         fnd_message.set_token('OBJECT' ,'LOCATION');
2734         fnd_msg_pub.add;
2735         RETURN FALSE;
2736       END IF;
2737       IF(l_psu AND
2738         (p_ps_objs(i).party_site_use_objs IS NULL OR
2739          p_ps_objs(i).party_site_use_objs.COUNT < 1)) THEN
2740         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2741         fnd_message.set_token('OBJECT' ,'PARTY_SITE_USE');
2742         fnd_msg_pub.add;
2743         RETURN FALSE;
2744       END IF;
2745       IF(l_cpref AND
2746          (p_ps_objs(i).contact_pref_objs IS NULL OR
2747           p_ps_objs(i).contact_pref_objs.COUNT < 1)) THEN
2748         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2749         fnd_message.set_token('OBJECT' ,'PARTY_SITE: CONTACT_PREFERENCE');
2750         fnd_msg_pub.add;
2751         RETURN FALSE;
2752       END IF;
2753       IF(l_ps_ext AND
2754          (p_ps_objs(i).ext_attributes_objs IS NULL OR
2755           p_ps_objs(i).ext_attributes_objs.COUNT < 1)) THEN
2756         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2757         fnd_message.set_token('OBJECT' ,'PARTY_SITE: EXTENSIBILITY');
2758         fnd_msg_pub.add;
2759         RETURN FALSE;
2760       END IF;
2761       IF(l_loc_ext AND
2762          (p_ps_objs(i).location_obj.ext_attributes_objs IS NULL OR
2763           p_ps_objs(i).location_obj.ext_attributes_objs.COUNT < 1)) THEN
2764         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2765         fnd_message.set_token('OBJECT' ,'LOCATION: EXTENSIBILITY');
2766         fnd_msg_pub.add;
2767         RETURN FALSE;
2768       END IF;
2769       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
2770          l_email_code IS NOT NULL OR l_web_code IS NOT NULL) THEN
2771         -- check contact point business object for party site
2772         l_valid_obj := is_cp_bo_comp(
2773                          p_phone_objs             => p_ps_objs(i).phone_objs,
2774                          p_email_objs             => p_ps_objs(i).email_objs,
2775                          p_telex_objs             => p_ps_objs(i).telex_objs,
2776                          p_web_objs               => p_ps_objs(i).web_objs,
2777                          p_edi_objs               => NULL,
2778                          p_eft_objs               => NULL,
2779                          p_sms_objs               => NULL,
2780                          p_bus_object             => l_cp_bus_object
2781                        );
2782         IF NOT(l_valid_obj) THEN
2783           RETURN FALSE;
2784         END IF;
2785       END IF;
2786     END LOOP;
2787 
2788     RETURN TRUE;
2789   END is_ps_bo_comp;
2790 
2791 -- FUNCTION is_person_bo_comp
2792 --
2793 -- DESCRIPTION
2794 --     Return true if person object is complete.  Otherwise, return false.
2795 --
2796 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2797 --
2798 -- ARGUMENTS
2799 --   IN:
2800 --     p_person_obj             Person business objects.
2801 --     p_bus_object             Business object structure for person.
2802 -- NOTES
2803 --
2804 -- MODIFICATION HISTORY
2805 --
2806 --   13-Jul-2005    Arnold Ng   o Created.
2807 
2808   FUNCTION is_person_bo_comp(
2809     p_person_obj              IN     HZ_PERSON_BO,
2810     p_bus_object              IN     COMPLETENESS_REC_TYPE
2811   ) RETURN BOOLEAN IS
2812     l_bus_object              COMPLETENESS_REC_TYPE;
2813     l_cp_bus_object           COMPLETENESS_REC_TYPE;
2814     l_ps_bus_object           COMPLETENESS_REC_TYPE;
2815     l_valid_obj               BOOLEAN;
2816 
2817     l_pref                    BOOLEAN;
2818     l_rel                     BOOLEAN;
2819     l_class                   BOOLEAN;
2820     l_lang                    BOOLEAN;
2821     l_edu                     BOOLEAN;
2822     l_citiz                   BOOLEAN;
2823     l_emp_hist                BOOLEAN;
2824     l_work_class              BOOLEAN;
2825     l_int                     BOOLEAN;
2826     l_cert                    BOOLEAN;
2827     l_fin_prof                BOOLEAN;
2828     l_cpref                   BOOLEAN;
2829     l_ps                      BOOLEAN;
2830     l_ext                     BOOLEAN;
2831 
2832     l_phone_code              VARCHAR2(30);
2833     l_email_code              VARCHAR2(30);
2834     l_web_code                VARCHAR2(30);
2835     l_sms_code                VARCHAR2(30);
2836   BEGIN
2837     l_pref         := FALSE;
2838     l_rel          := FALSE;
2839     l_class        := FALSE;
2840     l_lang         := FALSE;
2841     l_edu          := FALSE;
2842     l_citiz        := FALSE;
2843     l_emp_hist     := FALSE;
2844     l_work_class   := FALSE;
2845     l_int          := FALSE;
2846     l_cert         := FALSE;
2847     l_fin_prof     := FALSE;
2848     l_cpref        := FALSE;
2849     l_ps           := FALSE;
2850     l_ext          := FALSE;
2851 
2852     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2853       -- get all entities of person, for person, the possible entites are
2854       -- HZ_PARTY_PREFERENCES, HZ_RELATIONSHIPS, HZ_CODE_ASSIGNMENTS,
2855       -- HZ_PERSON_LANGUAGE, HZ_EDUCATION, HZ_CITIZENSHIP, HZ_EMPLOYMENT_HISTORY
2856       -- HZ_PERSON_INTEREST, HZ_CERTIFICATIONS, HZ_FINANCIAL_PROFILE,
2857       -- HZ_CONTACT_PREFERENCES
2858       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2859          p_bus_object.user_mandated_flag(i) = 'Y' AND
2860          p_bus_object.business_object_code(i) = 'PERSON' AND
2861          p_bus_object.child_bo_code(i) IS NULL) THEN
2862         CASE
2863           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_PREFERENCES' THEN
2864             l_pref := TRUE;
2865           WHEN p_bus_object.entity_name(i) = 'HZ_RELATIONSHIPS' THEN
2866             l_rel := TRUE;
2867           WHEN p_bus_object.entity_name(i) = 'HZ_CODE_ASSIGNMENTS' THEN
2868             l_class := TRUE;
2869           WHEN p_bus_object.entity_name(i) = 'HZ_PERSON_LANGUAGE' THEN
2870             l_lang := TRUE;
2871           WHEN p_bus_object.entity_name(i) = 'HZ_EDUCATION' THEN
2872             l_edu := TRUE;
2873           WHEN p_bus_object.entity_name(i) = 'HZ_CITIZENSHIP' THEN
2874             l_citiz := TRUE;
2875           WHEN p_bus_object.entity_name(i) = 'HZ_PERSON_INTEREST' THEN
2876             l_int := TRUE;
2877           WHEN p_bus_object.entity_name(i) = 'HZ_CERTIFICATIONS' THEN
2878             l_cert := TRUE;
2879           WHEN p_bus_object.entity_name(i) = 'HZ_FINANCIAL_PROFILE' THEN
2880             l_fin_prof := TRUE;
2881           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
2882             l_cpref := TRUE;
2883           WHEN p_bus_object.entity_name(i) = 'HZ_PER_PROFILES_EXT_VL' THEN
2884             l_ext := TRUE;
2885         END CASE;
2886       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
2887             p_bus_object.business_object_code(i) = 'PERSON' AND
2888             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2889         CASE
2890           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
2891             l_phone_code := 'PHONE';
2892           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
2893             l_email_code := 'EMAIL';
2894           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
2895             l_web_code := 'WEB';
2896           WHEN p_bus_object.child_bo_code(i) = 'SMS' THEN
2897             l_sms_code := 'SMS';
2898           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
2899             l_ps := TRUE;
2900           WHEN p_bus_object.child_bo_code(i) = 'EMP_HIST' THEN
2901             l_emp_hist := TRUE;
2902         END CASE;
2903       ELSIF(p_bus_object.business_object_code(i) = 'EMP_HIST' AND
2904             p_bus_object.entity_name(i) = 'HZ_WORK_CLASS' AND
2905             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2906         l_work_class := TRUE;
2907       END IF;
2908     END LOOP;
2909 
2910     IF(l_phone_code IS NOT NULL OR l_email_code IS NOT NULL OR
2911        l_web_code IS NOT NULL OR l_sms_code IS NOT NULL) THEN
2912       get_cp_from_rec(
2913         p_phone_code         => l_phone_code,
2914         p_email_code         => l_email_code,
2915         p_telex_code         => NULL,
2916         p_web_code           => l_web_code,
2917         p_edi_code           => NULL,
2918         p_eft_code           => NULL,
2919         p_sms_code           => l_sms_code,
2920         p_bus_object         => p_bus_object,
2921         x_bus_object         => l_cp_bus_object
2922       );
2923     END IF;
2924 
2925     IF(l_ps) THEN
2926       get_ps_from_rec(
2927         p_bus_object         => p_bus_object,
2928         x_bus_object         => l_ps_bus_object
2929       );
2930     END IF;
2931 
2932       IF(l_pref AND
2933         (p_person_obj.preference_objs IS NULL OR
2934          p_person_obj.preference_objs.COUNT < 1)) THEN
2935         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2936         fnd_message.set_token('OBJECT' ,'PARTY_PREFERENCE');
2937         fnd_msg_pub.add;
2938         RETURN FALSE;
2939       END IF;
2940       IF(l_class AND
2941         (p_person_obj.class_objs IS NULL OR
2942          p_person_obj.class_objs.COUNT < 1)) THEN
2943         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2944         fnd_message.set_token('OBJECT' ,'CLASSIFICATION');
2945         fnd_msg_pub.add;
2946         RETURN FALSE;
2947       END IF;
2948       IF(l_lang AND
2949         (p_person_obj.language_objs IS NULL OR
2950          p_person_obj.language_objs.COUNT < 1)) THEN
2951         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2952         fnd_message.set_token('OBJECT' ,'LANGUAGE');
2953         fnd_msg_pub.add;
2954         RETURN FALSE;
2955       END IF;
2956       IF(l_edu AND
2957         (p_person_obj.education_objs IS NULL OR
2958          p_person_obj.education_objs.COUNT < 1)) THEN
2959         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2960         fnd_message.set_token('OBJECT' ,'EDUCATION');
2961         fnd_msg_pub.add;
2962         RETURN FALSE;
2963       END IF;
2964       IF(l_citiz AND
2965         (p_person_obj.citizenship_objs IS NULL OR
2966          p_person_obj.citizenship_objs.COUNT < 1)) THEN
2967         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2968         fnd_message.set_token('OBJECT' ,'CITIZENSHIP');
2969         fnd_msg_pub.add;
2970         RETURN FALSE;
2971       END IF;
2972       IF(l_emp_hist AND
2973         (p_person_obj.employ_hist_objs IS NULL OR
2974          p_person_obj.employ_hist_objs.COUNT < 1)) THEN
2975         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2976         fnd_message.set_token('OBJECT' ,'EMPLOYMENT_HISTORY');
2977         fnd_msg_pub.add;
2978         RETURN FALSE;
2979         FOR j IN 1..p_person_obj.employ_hist_objs.COUNT LOOP
2980           IF(l_work_class AND
2981             (p_person_obj.employ_hist_objs(j).work_class_objs IS NULL OR
2982              p_person_obj.employ_hist_objs(j).work_class_objs.COUNT < 1)) THEN
2983             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2984             fnd_message.set_token('OBJECT' ,'WORK_CLASS');
2985             fnd_msg_pub.add;
2986             RETURN FALSE;
2987           END IF;
2988         END LOOP;
2989       END IF;
2990       IF(l_int AND
2991         (p_person_obj.interest_objs IS NULL OR
2992          p_person_obj.interest_objs.COUNT < 1)) THEN
2993         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2994         fnd_message.set_token('OBJECT' ,'PERSON_INTEREST');
2995         fnd_msg_pub.add;
2996         RETURN FALSE;
2997       END IF;
2998       IF(l_cert AND
2999         (p_person_obj.certification_objs IS NULL OR
3000          p_person_obj.certification_objs.COUNT < 1)) THEN
3001         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3002         fnd_message.set_token('OBJECT' ,'CERTIFICATION');
3003         fnd_msg_pub.add;
3004         RETURN FALSE;
3005       END IF;
3006       IF(l_fin_prof AND
3007         (p_person_obj.financial_prof_objs IS NULL OR
3008          p_person_obj.financial_prof_objs.COUNT < 1)) THEN
3009         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3010         fnd_message.set_token('OBJECT' ,'FINANCIAL_PROFILE');
3011         fnd_msg_pub.add;
3012         RETURN FALSE;
3013       END IF;
3014       IF(l_rel AND
3015         (p_person_obj.relationship_objs IS NULL OR
3016          p_person_obj.relationship_objs.COUNT < 1)) THEN
3017         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3018         fnd_message.set_token('OBJECT' ,'RELATIONSHIP');
3019         fnd_msg_pub.add;
3020         RETURN FALSE;
3021       END IF;
3022       IF(l_cpref AND
3023         (p_person_obj.contact_pref_objs IS NULL OR
3024          p_person_obj.contact_pref_objs.COUNT < 1)) THEN
3025         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3026         fnd_message.set_token('OBJECT' ,'PERSON: CONTACT_PREFERENCE');
3027         fnd_msg_pub.add;
3028         RETURN FALSE;
3029       END IF;
3030       IF(l_ext AND
3031         (p_person_obj.ext_attributes_objs IS NULL OR
3032          p_person_obj.ext_attributes_objs.COUNT < 1)) THEN
3033         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3034         fnd_message.set_token('OBJECT' ,'PERSON: EXTENSIBILITY');
3035         fnd_msg_pub.add;
3036         RETURN FALSE;
3037       END IF;
3038       IF(l_phone_code IS NOT NULL OR l_email_code IS NOT NULL OR
3039          l_web_code IS NOT NULL OR l_sms_code IS NOT NULL) THEN
3040         -- check contact point business object for person
3041         l_valid_obj := is_cp_bo_comp(
3042                          p_phone_objs             => p_person_obj.phone_objs,
3043                          p_email_objs             => p_person_obj.email_objs,
3044                          p_telex_objs             => NULL,
3045                          p_web_objs               => p_person_obj.web_objs,
3046                          p_edi_objs               => NULL,
3047                          p_eft_objs               => NULL,
3048                          p_sms_objs               => p_person_obj.sms_objs,
3049                          p_bus_object             => l_cp_bus_object
3050                        );
3051         IF NOT(l_valid_obj) THEN
3052           RETURN FALSE;
3053         END IF;
3054       END IF;
3055       IF(l_ps) THEN
3056         -- check contact point business object for person
3057         l_valid_obj := is_ps_bo_comp(
3058                          p_ps_objs                => p_person_obj.party_site_objs,
3059                          p_bus_object             => l_ps_bus_object
3060                        );
3061         IF NOT(l_valid_obj) THEN
3062           RETURN FALSE;
3063         END IF;
3064       END IF;
3065 
3066     RETURN TRUE;
3067   END is_person_bo_comp;
3068 
3069 -- FUNCTION is_oc_bo_comp
3070 --
3071 -- DESCRIPTION
3072 --     Return true if org contact object is complete.  Otherwise, return false.
3073 --
3074 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3075 --
3076 -- ARGUMENTS
3077 --   IN:
3078 --     p_oc_objs                List of organization contact business objects.
3079 --     p_bus_object             Business object structure for organization contact.
3080 -- NOTES
3081 --
3082 -- MODIFICATION HISTORY
3083 --
3084 --   13-Jul-2005    Arnold Ng   o Created.
3085 
3086   FUNCTION is_oc_bo_comp(
3087     p_oc_objs                 IN     HZ_ORG_CONTACT_BO_TBL,
3088     p_bus_object              IN     COMPLETENESS_REC_TYPE
3089   ) RETURN BOOLEAN IS
3090     l_bus_object              COMPLETENESS_REC_TYPE;
3091     l_cp_bus_object           COMPLETENESS_REC_TYPE;
3092     l_ps_bus_object           COMPLETENESS_REC_TYPE;
3093     l_per_bus_object          COMPLETENESS_REC_TYPE;
3094     l_valid_obj               BOOLEAN;
3095 
3096     l_ocr                     BOOLEAN;
3097     l_cpref                   BOOLEAN;
3098     l_ps                      BOOLEAN;
3099 
3100     l_phone_code              VARCHAR2(30);
3101     l_telex_code              VARCHAR2(30);
3102     l_email_code              VARCHAR2(30);
3103     l_web_code                VARCHAR2(30);
3104     l_sms_code                VARCHAR2(30);
3105   BEGIN
3106     -- For org contact, person bo is a must and person only has one
3107     -- object, not a list of object
3108     l_ocr    := FALSE;
3109     l_cpref  := FALSE;
3110     l_ps     := FALSE;
3111 
3112     IF(p_oc_objs IS NULL OR p_oc_objs.COUNT < 1) THEN
3113       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3114       fnd_message.set_token('OBJECT' ,'ORG_CONTACT');
3115       fnd_msg_pub.add;
3116       RETURN FALSE;
3117     END IF;
3118 
3119     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3120       -- get all entities of org contact, for org contact, the possible entites are
3121       -- HZ_ORG_CONTACT_ROLES
3122       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3123          p_bus_object.user_mandated_flag(i) = 'Y' AND
3124          p_bus_object.business_object_code(i) = 'ORG_CONTACT' AND
3125          p_bus_object.child_bo_code(i) IS NULL) THEN
3126         IF(p_bus_object.entity_name(i) = 'HZ_ORG_CONTACT_ROLES') THEN
3127           l_ocr := TRUE;
3128         ELSIF(p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES') THEN
3129           l_cpref := TRUE;
3130         END IF;
3131       -- Get contact point business object
3132       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3133             p_bus_object.business_object_code(i) = 'ORG_CONTACT' AND
3134             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3135         CASE
3136           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
3137             l_phone_code := 'PHONE';
3138           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
3139             l_telex_code := 'TLX';
3140           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
3141             l_email_code := 'EMAIL';
3142           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
3143             l_web_code := 'WEB';
3144           WHEN p_bus_object.child_bo_code(i) = 'SMS' THEN
3145             l_sms_code := 'SMS';
3146           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
3147             l_ps := TRUE;
3148           ELSE
3149             null;
3150         END CASE;
3151       END IF;
3152     END LOOP;
3153 
3154     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3155        l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3156        l_sms_code IS NOT NULL) THEN
3157       get_cp_from_rec(
3158         p_phone_code         => l_phone_code,
3159         p_email_code         => l_email_code,
3160         p_telex_code         => l_telex_code,
3161         p_web_code           => l_web_code,
3162         p_edi_code           => NULL,
3163         p_eft_code           => NULL,
3164         p_sms_code           => l_sms_code,
3165         p_bus_object         => p_bus_object,
3166         x_bus_object         => l_cp_bus_object
3167       );
3168     END IF;
3169 
3170     IF(l_ps) THEN
3171       get_ps_from_rec(
3172         p_bus_object         => p_bus_object,
3173         x_bus_object         => l_ps_bus_object
3174       );
3175     END IF;
3176 
3177     FOR i IN 1..p_oc_objs.COUNT LOOP
3178       IF(p_oc_objs(i).person_profile_obj IS NULL) THEN
3179         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3180         fnd_message.set_token('OBJECT' ,'PERSON_CONTACT');
3181         fnd_msg_pub.add;
3182         RETURN FALSE;
3183       END IF;
3184 
3185       IF(l_ocr AND
3186         (p_oc_objs(i).org_contact_role_objs IS NULL OR
3187          p_oc_objs(i).org_contact_role_objs.COUNT < 1)) THEN
3188         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3189         fnd_message.set_token('OBJECT' ,'ORG_CONTACT_ROLE');
3190         fnd_msg_pub.add;
3191         RETURN FALSE;
3192       END IF;
3193       IF(l_cpref AND
3194          (p_oc_objs(i).contact_pref_objs IS NULL OR
3195           p_oc_objs(i).contact_pref_objs.COUNT < 1)) THEN
3196         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3197         fnd_message.set_token('OBJECT' ,'ORG_CONTACT: CONTACT_PREFERENCE');
3198         fnd_msg_pub.add;
3199         RETURN FALSE;
3200       END IF;
3201 
3202       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3203          l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3204          l_sms_code IS NOT NULL) THEN
3205         -- check contact point business object for org contact
3206         l_valid_obj := is_cp_bo_comp(
3207                          p_phone_objs             => p_oc_objs(i).phone_objs,
3208                          p_email_objs             => p_oc_objs(i).email_objs,
3209                          p_telex_objs             => p_oc_objs(i).telex_objs,
3210                          p_web_objs               => p_oc_objs(i).web_objs,
3211                          p_edi_objs               => NULL,
3212                          p_eft_objs               => NULL,
3213                          p_sms_objs               => p_oc_objs(i).sms_objs,
3214                          p_bus_object             => l_cp_bus_object
3215                        );
3216         IF NOT(l_valid_obj) THEN
3217           RETURN FALSE;
3218         END IF;
3219       END IF;
3220       IF(l_ps) THEN
3221         -- check contact point business object for org contact
3222         l_valid_obj := is_ps_bo_comp(
3223                          p_ps_objs                => p_oc_objs(i).party_site_objs,
3224                          p_bus_object             => l_ps_bus_object
3225                        );
3226         IF NOT(l_valid_obj) THEN
3227           RETURN FALSE;
3228         END IF;
3229       END IF;
3230     END LOOP;
3231 
3232     RETURN TRUE;
3233   END is_oc_bo_comp;
3234 
3235 -- FUNCTION is_org_bo_comp
3236 --
3237 -- DESCRIPTION
3238 --     Return true if organization object is complete.  Otherwise, return false.
3239 --
3240 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3241 --
3242 -- ARGUMENTS
3243 --   IN:
3244 --     p_organization_obj       Organization business objects.
3245 --     p_bus_object             Business object structure for organization.
3246 -- NOTES
3247 --
3248 -- MODIFICATION HISTORY
3249 --
3250 --   13-Jul-2005    Arnold Ng   o Created.
3251 
3252   FUNCTION is_org_bo_comp(
3253     p_organization_obj        IN     HZ_ORGANIZATION_BO,
3254     p_bus_object              IN     COMPLETENESS_REC_TYPE
3255   ) RETURN BOOLEAN IS
3256     l_bus_object              COMPLETENESS_REC_TYPE;
3257     l_cp_bus_object           COMPLETENESS_REC_TYPE;
3258     l_ps_bus_object           COMPLETENESS_REC_TYPE;
3259     l_oc_bus_object           COMPLETENESS_REC_TYPE;
3260     l_valid_obj               BOOLEAN;
3261 
3262     l_pref                    BOOLEAN;
3263     l_credit                  BOOLEAN;
3264     l_rel                     BOOLEAN;
3265     l_class                   BOOLEAN;
3266     l_fin_report              BOOLEAN;
3267     l_cpref                   BOOLEAN;
3268     l_cert                    BOOLEAN;
3269     l_fin_prof                BOOLEAN;
3270     l_ps                      BOOLEAN;
3271     l_oc                      BOOLEAN;
3272     l_ext                     BOOLEAN;
3273 
3274     l_phone_code              VARCHAR2(30);
3275     l_telex_code              VARCHAR2(30);
3276     l_email_code              VARCHAR2(30);
3277     l_web_code                VARCHAR2(30);
3278     l_edi_code                VARCHAR2(30);
3279     l_eft_code                VARCHAR2(30);
3280   BEGIN
3281     l_pref       := FALSE;
3282     l_credit     := FALSE;
3283     l_rel        := FALSE;
3284     l_class      := FALSE;
3285     l_fin_report := FALSE;
3286     l_cpref      := FALSE;
3287     l_cert       := FALSE;
3288     l_fin_prof   := FALSE;
3289     l_ps         := FALSE;
3290     l_oc         := FALSE;
3291     l_ext        := FALSE;
3292 
3293     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3294       -- get all entities of org, for org, the possible entites are
3295       -- HZ_PARTY_PREFERENCES, HZ_CREDIT_RATINGS, HZ_RELATIONSHIPS,
3296       -- HZ_CODE_ASSIGNMENTS, HZ_FINANCIAL_REPORTS, HZ_FINANCIAL_NUMBERS,
3297       -- HZ_CERTIFICATIONS, HZ_FINANCIAL_PROFILE, HZ_CONTACT_PREFERENCES
3298       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3299          p_bus_object.user_mandated_flag(i) = 'Y' AND
3300          p_bus_object.business_object_code(i) = 'ORG' AND
3301          p_bus_object.child_bo_code(i) IS NULL) THEN
3302         CASE
3303           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_PREFERENCES' THEN
3304             l_pref := TRUE;
3305           WHEN p_bus_object.entity_name(i) = 'HZ_CREDIT_RATINGS' THEN
3306             l_credit := TRUE;
3307           WHEN p_bus_object.entity_name(i) = 'HZ_RELATIONSHIPS' THEN
3308             l_rel := TRUE;
3309           WHEN p_bus_object.entity_name(i) = 'HZ_CODE_ASSIGNMENTS' THEN
3310             l_class := TRUE;
3311           WHEN p_bus_object.entity_name(i) = 'HZ_CERTIFICATIONS' THEN
3312             l_cert := TRUE;
3313           WHEN p_bus_object.entity_name(i) = 'HZ_FINANCIAL_PROFILE' THEN
3314             l_fin_prof := TRUE;
3315           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
3316             l_cpref := TRUE;
3317           WHEN p_bus_object.entity_name(i) = 'HZ_ORG_PROFILES_EXT_VL' THEN
3318             l_ext := TRUE;
3319         END CASE;
3320       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3321             p_bus_object.business_object_code(i) = 'ORG' AND
3322             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3323         CASE
3324           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
3325             l_phone_code := 'PHONE';
3326           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
3327             l_telex_code := 'TLX';
3328           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
3329             l_email_code := 'EMAIL';
3330           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
3331             l_web_code := 'WEB';
3332           WHEN p_bus_object.child_bo_code(i) = 'EDI' THEN
3333             l_edi_code := 'EDI';
3334           WHEN p_bus_object.child_bo_code(i) = 'EFT' THEN
3335             l_eft_code := 'EFT';
3336           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
3337             l_ps := TRUE;
3338           WHEN p_bus_object.child_bo_code(i) = 'ORG_CONTACT' THEN
3339             l_oc := TRUE;
3340           WHEN p_bus_object.child_bo_code(i) = 'FIN_REPORT' THEN
3341             l_fin_report := TRUE;
3342         END CASE;
3343       END IF;
3344     END LOOP;
3345 
3346     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3347        l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3348        l_edi_code IS NOT NULL OR l_eft_code IS NOT NULL) THEN
3349       get_cp_from_rec(
3350         p_phone_code         => l_phone_code,
3351         p_email_code         => l_email_code,
3352         p_telex_code         => l_telex_code,
3353         p_web_code           => l_web_code,
3354         p_edi_code           => l_edi_code,
3355         p_eft_code           => l_eft_code,
3356         p_sms_code           => NULL,
3357         p_bus_object         => p_bus_object,
3358         x_bus_object         => l_cp_bus_object
3359       );
3360     END IF;
3361 
3362     IF(l_ps) THEN
3363       get_ps_from_rec(
3364         p_bus_object         => p_bus_object,
3365         x_bus_object         => l_ps_bus_object
3366       );
3367     END IF;
3368 
3369     IF(l_oc) THEN
3370       get_bus_obj_struct(
3371         p_bus_object_code    => 'ORG_CONTACT',
3372         x_bus_object         => l_oc_bus_object
3373       );
3374     END IF;
3375 
3376       IF(l_pref AND
3377         (p_organization_obj.preference_objs IS NULL OR
3378          p_organization_obj.preference_objs.COUNT < 1)) THEN
3379         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3380         fnd_message.set_token('OBJECT' ,'PARTY_PREFERENCE');
3381         fnd_msg_pub.add;
3382         RETURN FALSE;
3383       END IF;
3384       IF(l_credit AND
3385         (p_organization_obj.credit_rating_objs IS NULL OR
3386          p_organization_obj.credit_rating_objs.COUNT < 1)) THEN
3387         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3388         fnd_message.set_token('OBJECT' ,'CREDIT_RATING');
3389         fnd_msg_pub.add;
3390         RETURN FALSE;
3391       END IF;
3392       IF(l_rel AND
3393         (p_organization_obj.relationship_objs IS NULL OR
3394          p_organization_obj.relationship_objs.COUNT < 1)) THEN
3395         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3396         fnd_message.set_token('OBJECT' ,'RELATIONSHIP');
3397         fnd_msg_pub.add;
3398         RETURN FALSE;
3399       END IF;
3400       IF(l_class AND
3401         (p_organization_obj.class_objs IS NULL OR
3402          p_organization_obj.class_objs.COUNT < 1)) THEN
3403         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3404         fnd_message.set_token('OBJECT' ,'CLASSIFICATION');
3405         fnd_msg_pub.add;
3406         RETURN FALSE;
3407       END IF;
3408       IF(l_fin_report AND
3409         (p_organization_obj.financial_report_objs IS NULL OR
3410          p_organization_obj.financial_report_objs.COUNT < 1)) THEN
3411         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3412         fnd_message.set_token('OBJECT' ,'FINANCIAL_REPORT');
3413         fnd_msg_pub.add;
3414         RETURN FALSE;
3415 
3416         -- financial report always require financial number
3417         FOR j IN 1..p_organization_obj.financial_report_objs.COUNT LOOP
3418           IF(p_organization_obj.financial_report_objs(j).financial_number_objs IS NULL OR
3419              p_organization_obj.financial_report_objs(j).financial_number_objs.COUNT < 1) THEN
3420             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3421             fnd_message.set_token('OBJECT' ,'FINANCIAL_NUMBER');
3422             fnd_msg_pub.add;
3423             RETURN FALSE;
3424           END IF;
3425         END LOOP;
3426       END IF;
3427       IF(l_cert AND
3428         (p_organization_obj.certification_objs IS NULL OR
3429          p_organization_obj.certification_objs.COUNT < 1)) THEN
3430         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3431         fnd_message.set_token('OBJECT' ,'CERTIFICATION');
3432         fnd_msg_pub.add;
3433         RETURN FALSE;
3434       END IF;
3435       IF(l_fin_prof AND
3436         (p_organization_obj.financial_prof_objs IS NULL OR
3437          p_organization_obj.financial_prof_objs.COUNT < 1)) THEN
3438         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3439         fnd_message.set_token('OBJECT' ,'FINANCIAL_PROFILE');
3440         fnd_msg_pub.add;
3441         RETURN FALSE;
3442       END IF;
3443       IF(l_cpref AND
3444         (p_organization_obj.contact_pref_objs IS NULL OR
3445          p_organization_obj.contact_pref_objs.COUNT < 1)) THEN
3446         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3447         fnd_message.set_token('OBJECT' ,'ORG: CONTACT_PREFERENCE');
3448         fnd_msg_pub.add;
3449         RETURN FALSE;
3450       END IF;
3451       IF(l_ext AND
3452         (p_organization_obj.ext_attributes_objs IS NULL OR
3453          p_organization_obj.ext_attributes_objs.COUNT < 1)) THEN
3454         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3455         fnd_message.set_token('OBJECT' ,'ORG: EXTENSIBILITY');
3456         fnd_msg_pub.add;
3457         RETURN FALSE;
3458       END IF;
3459 
3460       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3461          l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3462          l_edi_code IS NOT NULL OR l_eft_code IS NOT NULL) THEN
3463         -- check contact point business object for org
3464         l_valid_obj := is_cp_bo_comp(
3465                          p_phone_objs  => p_organization_obj.phone_objs,
3466                          p_email_objs  => p_organization_obj.email_objs,
3467                          p_telex_objs  => p_organization_obj.telex_objs,
3468                          p_web_objs    => p_organization_obj.web_objs,
3469                          p_edi_objs    => p_organization_obj.edi_objs,
3470                          p_eft_objs    => p_organization_obj.eft_objs,
3471                          p_sms_objs    => NULL,
3472                          p_bus_object  => l_cp_bus_object
3473                        );
3474         IF NOT(l_valid_obj) THEN
3475           RETURN FALSE;
3476         END IF;
3477       END IF;
3478 
3479       IF(l_ps) THEN
3480         -- check party site business object for org
3481         l_valid_obj := is_ps_bo_comp(
3482                          p_ps_objs     => p_organization_obj.party_site_objs,
3483                          p_bus_object  => l_ps_bus_object
3484                        );
3485         IF NOT(l_valid_obj) THEN
3486           RETURN FALSE;
3487         END IF;
3488       END IF;
3489 
3490       IF(l_oc) THEN
3491         -- check org contact business object for org
3492         l_valid_obj := is_oc_bo_comp(
3493                          p_oc_objs     => p_organization_obj.contact_objs,
3494                          p_bus_object  => l_oc_bus_object
3495                        );
3496         IF NOT(l_valid_obj) THEN
3497           RETURN FALSE;
3498         END IF;
3499       END IF;
3500 
3501     RETURN TRUE;
3502   END is_org_bo_comp;
3503 
3504 -- FUNCTION is_cac_bo_comp
3505 --
3506 -- DESCRIPTION
3507 --     Return true if customer account contact object is complete.
3508 --     Otherwise, return false.
3509 --
3510 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3511 --
3512 -- ARGUMENTS
3513 --   IN:
3514 --     p_cac_objs               List of customer account contact business objects.
3515 --     p_bus_object             Business object structure for customer account contact.
3516 -- NOTES
3517 --
3518 -- MODIFICATION HISTORY
3519 --
3520 --   13-Jul-2005    Arnold Ng   o Created.
3521 
3522   FUNCTION is_cac_bo_comp(
3523     p_cac_objs                IN     HZ_CUST_ACCT_CONTACT_BO_TBL,
3524     p_bus_object              IN     COMPLETENESS_REC_TYPE
3525   ) RETURN BOOLEAN IS
3526     l_valid_obj               BOOLEAN;
3527     l_rr                      BOOLEAN;
3528   BEGIN
3529     l_rr := FALSE;
3530 
3531     IF(p_cac_objs IS NULL OR p_cac_objs.COUNT < 1) THEN
3532       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3533       fnd_message.set_token('OBJECT' ,'CUST_ACCT_CONTACT');
3534       fnd_msg_pub.add;
3535       RETURN FALSE;
3536     END IF;
3537 
3538     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3539       -- get all entities of cust acct contact, for cust acct contact, the possible entites are
3540       -- HZ_ROLE_RESPONSIBILITY
3541       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3542          p_bus_object.user_mandated_flag(i) = 'Y' AND
3543          p_bus_object.business_object_code(i) = 'CUST_ACCT_CONTACT' AND
3544          p_bus_object.child_bo_code(i) IS NULL) THEN
3545         IF(p_bus_object.entity_name(i) = 'HZ_ROLE_RESPONSIBILITY') THEN
3546             l_rr := TRUE;
3547         END IF;
3548       END IF;
3549     END LOOP;
3550 
3551     FOR i IN 1..p_cac_objs.COUNT LOOP
3552       -- Check role responsibility objects
3553       IF(l_rr AND
3554         (p_cac_objs(i).contact_role_objs IS NULL OR
3555          p_cac_objs(i).contact_role_objs.COUNT < 1)) THEN
3556         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3557         fnd_message.set_token('OBJECT' ,'ROLE_RESPONSIBILITY');
3558         fnd_msg_pub.add;
3559         RETURN FALSE;
3560       END IF;
3561     END LOOP;
3562 
3563     RETURN TRUE;
3564   END is_cac_bo_comp;
3565 
3566 -- FUNCTION is_cas_bo_comp
3567 --
3568 -- DESCRIPTION
3569 --     Return true if customer account site object is complete.
3570 --     Otherwise, return false.
3571 --
3572 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3573 --
3574 -- ARGUMENTS
3575 --   IN:
3576 --     p_cas_objs               List of customer account site business objects.
3577 --     p_bus_object             Business object structure for customer account site.
3578 -- NOTES
3579 --
3580 -- MODIFICATION HISTORY
3581 --
3582 --   13-Jul-2005    Arnold Ng   o Created.
3583 
3584   FUNCTION is_cas_bo_comp(
3585     p_cas_objs                IN     HZ_CUST_ACCT_SITE_BO_TBL,
3586     p_bus_object              IN     COMPLETENESS_REC_TYPE
3587   ) RETURN BOOLEAN IS
3588     l_valid_obj               BOOLEAN;
3589     l_casu                    BOOLEAN;
3590     l_cp                      BOOLEAN;
3591     l_cac                     BOOLEAN;
3592     l_cpa                     BOOLEAN;
3593     l_bau                     BOOLEAN;
3594     l_pm                      BOOLEAN;
3595     l_cac_bus_object          COMPLETENESS_REC_TYPE;
3596   BEGIN
3597     l_casu := FALSE;
3598     l_cp   := FALSE;
3599     l_cpa  := FALSE;
3600     l_cac  := FALSE;
3601     l_bau  := FALSE;
3602     l_pm   := FALSE;
3603 
3604     IF(p_cas_objs IS NULL OR p_cas_objs.COUNT < 1) THEN
3605       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3606       fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE');
3607       fnd_msg_pub.add;
3608       RETURN FALSE;
3609     END IF;
3610 
3611     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3612       -- no entities of cust acct site
3613       IF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3614          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE' AND
3615          p_bus_object.user_mandated_flag(i) = 'Y') THEN
3616         CASE
3617           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE_USE' AND
3618                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
3619             l_casu := TRUE;
3620           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT' AND
3621                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
3622             l_cac := TRUE;
3623         END CASE;
3624       ELSIF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3625          p_bus_object.user_mandated_flag(i) = 'Y' AND
3626          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
3627          p_bus_object.child_bo_code(i) IS NULL) THEN
3628         CASE
3629           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
3630             l_pm := TRUE;
3631           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
3632             l_bau := TRUE;
3633         END CASE;
3634       ELSIF(p_bus_object.child_bo_code(i) = 'CUST_PROFILE' AND
3635             p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
3636             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3637         l_cp := TRUE;
3638       ELSIF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS' AND
3639             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
3640             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3641         l_cpa := TRUE;
3642       END IF;
3643     END LOOP;
3644 
3645     IF(l_cac) THEN
3646       get_bus_obj_struct(
3647         p_bus_object_code    => 'CUST_ACCT_CONTACT',
3648         x_bus_object         => l_cac_bus_object
3649       );
3650     END IF;
3651 
3652     FOR i IN 1..p_cas_objs.COUNT LOOP
3653       IF(l_cac) THEN
3654         l_valid_obj := is_cac_bo_comp(
3655                          p_cac_objs    => p_cas_objs(i).cust_acct_contact_objs,
3656                          p_bus_object  => l_cac_bus_object
3657                        );
3658         IF NOT(l_valid_obj) THEN
3659           RETURN FALSE;
3660         END IF;
3661       END IF;
3662 
3663       IF(l_casu AND
3664         (p_cas_objs(i).cust_acct_site_use_objs IS NULL OR
3665          p_cas_objs(i).cust_acct_site_use_objs.COUNT < 1)) THEN
3666         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3667         fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE_USE');
3668         fnd_msg_pub.add;
3669         RETURN FALSE;
3670 
3671         FOR j IN 1..p_cas_objs(i).cust_acct_site_use_objs.COUNT LOOP
3672           IF(l_cp AND p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj IS NULL) THEN
3673             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3674             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE');
3675             fnd_msg_pub.add;
3676             RETURN FALSE;
3677           END IF;
3678           IF(l_cpa AND
3679             (p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs IS NULL OR
3680              p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
3681             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3682             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE_AMOUNT');
3683             fnd_msg_pub.add;
3684             RETURN FALSE;
3685           END IF;
3686           -- for bank account use and payment method
3687           IF(l_bau AND
3688             (p_cas_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs IS NULL OR
3689              p_cas_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs.COUNT < 1)) THEN
3690             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3691             fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
3692             fnd_msg_pub.add;
3693             RETURN FALSE;
3694           END IF;
3695           IF(l_pm AND
3696             (p_cas_objs(i).cust_acct_site_use_objs(j).payment_method_obj IS NULL)) THEN
3697             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3698             fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
3699             fnd_msg_pub.add;
3700             RETURN FALSE;
3701           END IF;
3702         END LOOP;
3703       END IF;
3704     END LOOP;
3705 
3706     RETURN TRUE;
3707   END is_cas_bo_comp;
3708 
3709 -- FUNCTION is_ca_bo_comp
3710 --
3711 -- DESCRIPTION
3712 --     Return true if customer account object is complete.  Otherwise, return false.
3713 --
3714 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3715 --
3716 -- ARGUMENTS
3717 --   IN:
3718 --     p_ca_objs                List of customer account business objects.
3719 --     p_bus_object             Business object structure for customer account.
3720 -- NOTES
3721 --
3722 -- MODIFICATION HISTORY
3723 --
3724 --   13-Jul-2005    Arnold Ng   o Created.
3725 
3726   FUNCTION is_ca_bo_comp(
3727     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL,
3728     p_bus_object              IN     COMPLETENESS_REC_TYPE
3729   ) RETURN BOOLEAN IS
3730     l_valid_obj               BOOLEAN;
3731     l_carel                   BOOLEAN;
3732     l_cas                     BOOLEAN;
3733     l_cac                     BOOLEAN;
3734     l_cp                      BOOLEAN;
3735     l_cpa                     BOOLEAN;
3736     l_bau                     BOOLEAN;
3737     l_pm                      BOOLEAN;
3738     l_cas_bus_object          COMPLETENESS_REC_TYPE;
3739     l_cac_bus_object          COMPLETENESS_REC_TYPE;
3740   BEGIN
3741     l_carel := FALSE;
3742     l_cas   := FALSE;
3743     l_cac   := FALSE;
3744     l_cp    := FALSE;
3745     l_cpa   := FALSE;
3746     l_bau   := FALSE;
3747     l_pm    := FALSE;
3748 
3749     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3750       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3751       fnd_message.set_token('OBJECT' ,'CUST_ACCT');
3752       fnd_msg_pub.add;
3753       RETURN FALSE;
3754     END IF;
3755 
3756     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3757       -- get all entities of cust acct, for cust acct, the possible entites are
3758       -- HZ_BANK_ACCOUNT_USE, HZ_PAYMENT_METHOD, HZ_CUST_ACCT_RELATE
3759       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3760          p_bus_object.user_mandated_flag(i) = 'Y' AND
3761          p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
3762          p_bus_object.child_bo_code(i) IS NULL) THEN
3763         CASE
3764           WHEN(p_bus_object.entity_name(i) = 'HZ_CUST_ACCT_RELATE_ALL') THEN
3765             l_carel := TRUE;
3766           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
3767             l_pm := TRUE;
3768           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
3769             l_bau := TRUE;
3770         END CASE;
3771       -- Get other business object
3772       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3773             p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
3774             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3775         CASE
3776           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE') THEN
3777             l_cas := TRUE;
3778           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT') THEN
3779             l_cac := TRUE;
3780           ELSE
3781             null;
3782         END CASE;
3783       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3784             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
3785             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3786         IF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS') THEN
3787           l_cpa := TRUE;
3788         END IF;
3789       END IF;
3790     END LOOP;
3791 
3792     -- customer profile is mandatory for customer account
3793     l_cp := TRUE;
3794 
3795     IF(l_cas) THEN
3796       get_bus_obj_struct(
3797         p_bus_object_code    => 'CUST_ACCT_SITE',
3798         x_bus_object         => l_cas_bus_object
3799       );
3800     END IF;
3801 
3802     IF(l_cac) THEN
3803       get_bus_obj_struct(
3804         p_bus_object_code    => 'CUST_ACCT_CONTACT',
3805         x_bus_object         => l_cac_bus_object
3806       );
3807     END IF;
3808 
3809     FOR i IN 1..p_ca_objs.COUNT LOOP
3810       IF(l_cas) THEN
3811         l_valid_obj := is_cas_bo_comp(
3812                          p_cas_objs    => p_ca_objs(i).cust_acct_site_objs,
3813                          p_bus_object  => l_cas_bus_object
3814                        );
3815         IF NOT(l_valid_obj) THEN
3816           RETURN FALSE;
3817         END IF;
3818       END IF;
3819 
3820       IF(l_cac) THEN
3821         l_valid_obj := is_cac_bo_comp(
3822                          p_cac_objs    => p_ca_objs(i).cust_acct_contact_objs,
3823                          p_bus_object  => l_cac_bus_object
3824                        );
3825         IF NOT(l_valid_obj) THEN
3826           RETURN FALSE;
3827         END IF;
3828       END IF;
3829 
3830       IF(l_carel AND
3831         (p_ca_objs(i).acct_relate_objs IS NULL OR
3832          p_ca_objs(i).acct_relate_objs.COUNT < 1)) THEN
3833         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3834         fnd_message.set_token('OBJECT' ,'CUSTOMER_ACCOUNT_RELATE');
3835         fnd_msg_pub.add;
3836         RETURN FALSE;
3837       END IF;
3838 
3839 -- for bank account use and payment method
3840       IF(l_bau AND
3841         (p_ca_objs(i).bank_acct_use_objs IS NULL OR
3842          p_ca_objs(i).bank_acct_use_objs.COUNT < 1)) THEN
3843         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3844         fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
3845         fnd_msg_pub.add;
3846         RETURN FALSE;
3847       END IF;
3848       IF(l_pm AND
3849         (p_ca_objs(i).payment_method_obj IS NULL)) THEN
3850         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3851         fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
3852         fnd_msg_pub.add;
3853         RETURN FALSE;
3854       END IF;
3855 
3856       IF(l_cp AND p_ca_objs(i).cust_profile_obj IS NULL) THEN
3857         RETURN FALSE;
3858       ELSE
3859         IF(l_cpa AND
3860           (p_ca_objs(i).cust_profile_obj.cust_profile_amt_objs IS NULL OR
3861            p_ca_objs(i).cust_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
3862           fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3863           fnd_message.set_token('OBJECT' ,'CUSTOMER_PROFILE_AMOUNT');
3864           fnd_msg_pub.add;
3865           RETURN FALSE;
3866         END IF;
3867       END IF;
3868     END LOOP;
3869 
3870     RETURN TRUE;
3871   END is_ca_bo_comp;
3872 
3873 -- FUNCTION is_pca_bo_comp
3874 --
3875 -- DESCRIPTION
3876 --     Return true if person customer object is complete.  Otherwise, return false.
3877 --
3878 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3879 --
3880 -- ARGUMENTS
3881 --   IN:
3882 --     p_person_obj             Person business object.
3883 --     p_ca_objs                List of customer account objects.
3884 -- NOTES
3885 --
3886 -- MODIFICATION HISTORY
3887 --
3888 --   13-Jul-2005    Arnold Ng   o Created.
3889 
3890   FUNCTION is_pca_bo_comp(
3891     p_person_obj              IN     HZ_PERSON_BO,
3892     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL
3893   ) RETURN BOOLEAN IS
3894     l_per_bus_object          COMPLETENESS_REC_TYPE;
3895     l_ca_bus_object           COMPLETENESS_REC_TYPE;
3896     l_valid_obj               BOOLEAN;
3897   BEGIN
3898     IF(p_person_obj IS NULL) THEN
3899       RETURN FALSE;
3900     END IF;
3901     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3902       RETURN FALSE;
3903     END IF;
3904 
3905     -- check person object for person cust acct
3906     get_bus_obj_struct(
3907       p_bus_object_code         => 'PERSON',
3908       x_bus_object              => l_per_bus_object
3909     );
3910     l_valid_obj := is_person_bo_comp(
3911                      p_person_obj  => p_person_obj,
3912                      p_bus_object  => l_per_bus_object
3913                    );
3914     IF NOT(l_valid_obj) THEN
3915       RETURN FALSE;
3916     END IF;
3917 
3918     -- check cust account for person cust acct
3919     get_bus_obj_struct(
3920       p_bus_object_code         => 'CUST_ACCT',
3921       x_bus_object              => l_ca_bus_object
3922     );
3923     l_valid_obj := is_ca_bo_comp(
3924                      p_ca_objs    => p_ca_objs,
3925                      p_bus_object => l_ca_bus_object
3926                    );
3927     IF NOT(l_valid_obj) THEN
3928       RETURN FALSE;
3929     END IF;
3930 
3931     RETURN TRUE;
3932   END is_pca_bo_comp;
3933 
3934 -- FUNCTION is_oca_bo_comp
3935 --
3936 -- DESCRIPTION
3937 --     Return true if organization customer object is complete.
3938 --     Otherwise, return false.
3939 --
3940 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3941 --
3942 -- ARGUMENTS
3943 --   IN:
3944 --     p_org_obj                Organization business object.
3945 --     p_ca_objs                List of customer account objects.
3946 -- NOTES
3947 --
3948 -- MODIFICATION HISTORY
3949 --
3950 --   13-Jul-2005    Arnold Ng   o Created.
3951 
3952   FUNCTION is_oca_bo_comp(
3953     p_org_obj                 IN     HZ_ORGANIZATION_BO,
3954     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL
3955   ) RETURN BOOLEAN IS
3956     l_org_bus_object          COMPLETENESS_REC_TYPE;
3957     l_ca_bus_object           COMPLETENESS_REC_TYPE;
3958     l_valid_obj               BOOLEAN;
3959   BEGIN
3960     IF(p_org_obj IS NULL) THEN
3961       RETURN FALSE;
3962     END IF;
3963     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3964       RETURN FALSE;
3965     END IF;
3966 
3967     -- check organization object for org cust acct
3968     get_bus_obj_struct(
3969       p_bus_object_code         => 'ORG',
3970       x_bus_object              => l_org_bus_object
3971     );
3972     l_valid_obj := is_org_bo_comp(
3973                      p_organization_obj => p_org_obj,
3974                      p_bus_object       => l_org_bus_object
3975                    );
3976     IF NOT(l_valid_obj) THEN
3977       RETURN FALSE;
3978     END IF;
3979 
3980     -- check cust account for org cust acct
3981     get_bus_obj_struct(
3982       p_bus_object_code         => 'CUST_ACCT',
3983       x_bus_object              => l_ca_bus_object
3984     );
3985     l_valid_obj := is_ca_bo_comp(
3986                      p_ca_objs          => p_ca_objs,
3987                      p_bus_object       => l_ca_bus_object
3988                    );
3989     IF NOT(l_valid_obj) THEN
3990       RETURN FALSE;
3991     END IF;
3992 
3993     RETURN TRUE;
3994   END is_oca_bo_comp;
3995 
3996 -- FUNCTION get_bus_object_struct
3997 --
3998 -- DESCRIPTION
3999 --     Get contact point business object structure.
4000 --
4001 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4002 --
4003 -- ARGUMENTS
4004 --   IN:
4005 --     p_bus_object_code        Business object code, such as 'PARTY_SITE',
4006 --                              'ORG_CONTACT'
4007 --   OUT:
4008 --     x_bus_object             Business object structure.
4009 -- NOTES
4010 --
4011 -- MODIFICATION HISTORY
4012 --
4013 --   13-Jul-2005    Arnold Ng   o Created.
4014 
4015   PROCEDURE get_bus_obj_struct(
4016     p_bus_object_code         IN         VARCHAR2,
4017     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4018   ) IS
4019     CURSOR get_bus_obj(l_bus_obj VARCHAR2) IS
4020     SELECT d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4021            d.user_mandated_flag, d.root_node_flag, d.entity_name
4022     FROM hz_bus_obj_definitions d
4023     start with d.business_object_code = l_bus_obj and d.user_mandated_flag = 'Y'
4024     connect by prior d.child_bo_code = d.business_object_code and d.user_mandated_flag = 'Y'
4025     group by d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4026              d.user_mandated_flag, d.root_node_flag, d.entity_name;
4027   BEGIN
4028     OPEN get_bus_obj(p_bus_object_code);
4029     FETCH get_bus_obj BULK COLLECT
4030       INTO x_bus_object.business_object_code,
4031            x_bus_object.child_bo_code,
4032            x_bus_object.tca_mandated_flag,
4033            x_bus_object.user_mandated_flag,
4034            x_bus_object.root_node_flag,
4035            x_bus_object.entity_name;
4036     CLOSE get_bus_obj;
4037   END get_bus_obj_struct;
4038 
4039 -- FUNCTION get_cp_bus_obj_struct
4040 --
4041 -- DESCRIPTION
4042 --     Get contact point business object structure.
4043 --
4044 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4045 --
4046 -- ARGUMENTS
4047 --   IN:
4048 --     p_phone_code             'PHONE'.
4049 --     p_email_code             'EMAIL'.
4050 --     p_telex_code             'TLX'.
4051 --     p_web_code               'WEB'.
4052 --     p_edi_code               'EDI'.
4053 --     p_eft_code               'EFT'.
4054 --     p_sms_code               'SMS'.
4055 --   OUT:
4056 --     x_bus_object             Contact point business object structure.
4057 -- NOTES
4058 --
4059 -- MODIFICATION HISTORY
4060 --
4061 --   13-Jul-2005    Arnold Ng   o Created.
4062 
4063   PROCEDURE get_cp_bus_obj_struct(
4064     p_phone_code              IN         VARCHAR2,
4065     p_email_code              IN         VARCHAR2,
4066     p_telex_code              IN         VARCHAR2,
4067     p_web_code                IN         VARCHAR2,
4068     p_edi_code                IN         VARCHAR2,
4069     p_eft_code                IN         VARCHAR2,
4070     p_sms_code                IN         VARCHAR2,
4071     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4072   ) IS
4073     CURSOR get_cp_bus_obj(l_phone VARCHAR2, l_email VARCHAR2,
4074                           l_telex VARCHAR2, l_web VARCHAR2, l_edi VARCHAR2,
4075                           l_eft VARCHAR2, l_sms VARCHAR2) IS
4076     SELECT d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4077            d.user_mandated_flag, d.root_node_flag, d.entity_name
4078     FROM hz_bus_obj_definitions d
4079     start with d.business_object_code in (l_phone, l_email, l_telex, l_web, l_edi, l_eft, l_sms) and d.user_mandated_flag = 'Y'
4080     connect by prior d.child_bo_code = d.business_object_code
4081                 and d.user_mandated_flag = 'Y'
4082     group by d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4083              d.user_mandated_flag, d.root_node_flag, d.entity_name;
4084   BEGIN
4085     OPEN get_cp_bus_obj(p_phone_code, p_email_code, p_telex_code,
4086                         p_web_code, p_edi_code, p_eft_code, p_sms_code);
4087     FETCH get_cp_bus_obj BULK COLLECT
4088       INTO x_bus_object.business_object_code,
4089            x_bus_object.child_bo_code,
4090            x_bus_object.tca_mandated_flag,
4091            x_bus_object.user_mandated_flag,
4092            x_bus_object.root_node_flag,
4093            x_bus_object.entity_name;
4094     CLOSE get_cp_bus_obj;
4095   END get_cp_bus_obj_struct;
4096 
4097 -- PRIVATE PROCEDURE get_cp_from_rec
4098 --
4099 -- DESCRIPTION
4100 --     Extract business object structure of contact point.
4101 --
4102 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4103 --
4104 -- ARGUMENTS
4105 --   IN:
4106 --     p_phone_code             'PHONE'.
4107 --     p_email_code             'EMAIL'.
4108 --     p_telex_code             'TLX'.
4109 --     p_web_code               'WEB'.
4110 --     p_edi_code               'EDI'.
4111 --     p_eft_code               'EFT'.
4112 --     p_sms_code               'SMS'.
4113 --   OUT:
4114 --     x_bus_object             Business object structure of contact point.
4115 -- NOTES
4116 --
4117 -- MODIFICATION HISTORY
4118 --
4119 --   13-Jul-2005    Arnold Ng   o Created.
4120 
4121   PROCEDURE get_cp_from_rec(
4122     p_phone_code              IN         VARCHAR2,
4123     p_email_code              IN         VARCHAR2,
4124     p_telex_code              IN         VARCHAR2,
4125     p_web_code                IN         VARCHAR2,
4126     p_edi_code                IN         VARCHAR2,
4127     p_eft_code                IN         VARCHAR2,
4128     p_sms_code                IN         VARCHAR2,
4129     p_bus_object              IN         COMPLETENESS_REC_TYPE,
4130     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4131   ) IS
4132     l_count                   NUMBER;
4133   BEGIN
4134     l_count := 0;
4135     x_bus_object.business_object_code := boc_tbl();
4136     x_bus_object.child_bo_code := cbc_tbl();
4137     x_bus_object.tca_mandated_flag := tmf_tbl();
4138     x_bus_object.user_mandated_flag := umf_tbl();
4139     x_bus_object.root_node_flag := rnf_tbl();
4140     x_bus_object.entity_name := ent_tbl();
4141     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4142       IF(p_bus_object.business_object_code(i) = p_phone_code OR
4143          p_bus_object.business_object_code(i) = p_email_code OR
4144          p_bus_object.business_object_code(i) = p_telex_code OR
4145          p_bus_object.business_object_code(i) = p_web_code OR
4146          p_bus_object.business_object_code(i) = p_edi_code OR
4147          p_bus_object.business_object_code(i) = p_eft_code OR
4148          p_bus_object.business_object_code(i) = p_sms_code) THEN
4149           l_count := l_count + 1;
4150           x_bus_object.business_object_code.EXTEND;
4151           x_bus_object.child_bo_code.EXTEND;
4152           x_bus_object.tca_mandated_flag.EXTEND;
4153           x_bus_object.user_mandated_flag.EXTEND;
4154           x_bus_object.root_node_flag.EXTEND;
4155           x_bus_object.entity_name.EXTEND;
4156           x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4157           x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4158           x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4159           x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4160           x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4161           x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4162       END IF;
4163     END LOOP;
4164   END get_cp_from_rec;
4165 
4166 -- PRIVATE PROCEDURE get_ps_from_rec
4167 --
4168 -- DESCRIPTION
4169 --     Extract business object structure of party site.
4170 --
4171 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4172 --
4173 -- ARGUMENTS
4174 --   IN:
4175 --     p_bus_object             Business object structure.
4176 --   OUT:
4177 --     x_bus_object             Business object structure of party site.
4178 -- NOTES
4179 --
4180 -- MODIFICATION HISTORY
4181 --
4182 --   13-Jul-2005    Arnold Ng   o Created.
4183 
4184   PROCEDURE get_ps_from_rec(
4185     p_bus_object              IN         COMPLETENESS_REC_TYPE,
4186     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4187   ) IS
4188     l_count                   NUMBER;
4189     l_phone                   VARCHAR2(30);
4190     l_telex                   VARCHAR2(30);
4191     l_email                   VARCHAR2(30);
4192     l_web                     VARCHAR2(30);
4193     l_edi                     VARCHAR2(30);
4194     l_eft                     VARCHAR2(30);
4195     l_sms                     VARCHAR2(30);
4196   BEGIN
4197     l_count := 0;
4198     x_bus_object.business_object_code := boc_tbl();
4199     x_bus_object.child_bo_code := cbc_tbl();
4200     x_bus_object.tca_mandated_flag := tmf_tbl();
4201     x_bus_object.user_mandated_flag := umf_tbl();
4202     x_bus_object.root_node_flag := rnf_tbl();
4203     x_bus_object.entity_name := ent_tbl();
4204     -- find all rows related to PARTY_SITE
4205     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4206       IF(p_bus_object.business_object_code(i) = 'PARTY_SITE') THEN
4207         l_count := l_count + 1;
4208         x_bus_object.business_object_code.EXTEND;
4209         x_bus_object.child_bo_code.EXTEND;
4210         x_bus_object.tca_mandated_flag.EXTEND;
4211         x_bus_object.user_mandated_flag.EXTEND;
4212         x_bus_object.root_node_flag.EXTEND;
4213         x_bus_object.entity_name.EXTEND;
4214         x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4215         x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4216         x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4217         x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4218         x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4219         x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4220       END IF;
4221     END LOOP;
4222 
4223     -- find all PARTY_SITE rows with child_bo_code, all rows must be CONTACT POINT
4224     FOR i IN 1..x_bus_object.business_object_code.COUNT LOOP
4225       IF(x_bus_object.child_bo_code(i) IS NOT NULL) THEN
4226         CASE
4227           WHEN x_bus_object.child_bo_code(i) = 'PHONE' THEN
4228             l_phone := x_bus_object.child_bo_code(i);
4229           WHEN x_bus_object.child_bo_code(i) = 'TLX' THEN
4230             l_telex := x_bus_object.child_bo_code(i);
4231           WHEN x_bus_object.child_bo_code(i) = 'EMAIL' THEN
4232             l_email := x_bus_object.child_bo_code(i);
4233           WHEN x_bus_object.child_bo_code(i) = 'WEB' THEN
4234             l_web := x_bus_object.child_bo_code(i);
4235           WHEN x_bus_object.child_bo_code(i) = 'EDI' THEN
4236             l_edi := x_bus_object.child_bo_code(i);
4237           WHEN x_bus_object.child_bo_code(i) = 'EFT' THEN
4238             l_eft := x_bus_object.child_bo_code(i);
4239           WHEN x_bus_object.child_bo_code(i) = 'SMS' THEN
4240             l_sms := x_bus_object.child_bo_code(i);
4241           ELSE -- for 'LOCATION'
4242             NULL;
4243         END CASE;
4244       END IF;
4245     END LOOP;
4246 
4247     -- find all contact point rows for PARTY_SITE
4248     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4249       IF(p_bus_object.business_object_code(i) = l_phone OR
4250          p_bus_object.business_object_code(i) = l_telex OR
4251          p_bus_object.business_object_code(i) = l_email OR
4252          p_bus_object.business_object_code(i) = l_web OR
4253          p_bus_object.business_object_code(i) = l_edi OR
4254          p_bus_object.business_object_code(i) = l_eft OR
4255          p_bus_object.business_object_code(i) = l_sms) THEN
4256         l_count := l_count + 1;
4257         x_bus_object.business_object_code.EXTEND;
4258         x_bus_object.child_bo_code.EXTEND;
4259         x_bus_object.tca_mandated_flag.EXTEND;
4260         x_bus_object.user_mandated_flag.EXTEND;
4261         x_bus_object.root_node_flag.EXTEND;
4262         x_bus_object.entity_name.EXTEND;
4263         x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4264         x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4265         x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4266         x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4267         x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4268         x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4269       END IF;
4270     END LOOP;
4271   END get_ps_from_rec;
4272 
4273 -- FUNCTION get_id_from_ososr
4274 --
4275 -- DESCRIPTION
4276 --     Get TCA Id based on original system and original system reference.
4277 --
4278 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4279 --
4280 -- ARGUMENTS
4281 --   IN:
4282 --     p_os                     Original system
4283 --     p_osr                    Original system reference
4284 --     p_owner_table_name       Owner table name
4285 -- NOTES
4286 --
4287 -- MODIFICATION HISTORY
4288 --
4289 --   13-Jul-2005    Arnold Ng   o Created.
4290 
4291   FUNCTION get_id_from_ososr(
4292     p_os                 IN VARCHAR2,
4293     p_osr                IN VARCHAR2,
4294     p_owner_table_name   IN VARCHAR2
4295   ) RETURN NUMBER IS
4296     l_count              NUMBER;
4297     l_owner_table_id     NUMBER;
4298     l_return_status      VARCHAR2(30);
4299   BEGIN
4300     l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
4301                  p_orig_system           => p_os,
4302                  p_orig_system_reference => p_osr,
4303                  p_owner_table_name      => p_owner_table_name);
4304 
4305     IF(l_count = 1) THEN
4306       -- Get owner_table_id
4307       HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
4308         p_orig_system           => p_os,
4309         p_orig_system_reference => p_osr,
4310         p_owner_table_name      => p_owner_table_name,
4311         x_owner_table_id        => l_owner_table_id,
4312         x_return_status         => l_return_status);
4313     END IF;
4314 
4315     RETURN l_owner_table_id;
4316   END get_id_from_ososr;
4317 
4318 -- FUNCTION is_cas_v2_bo_comp
4319 --
4320 -- DESCRIPTION
4321 --     Return true if customer account site object is complete.
4322 --     Otherwise, return false.
4323 --
4324 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4325 --
4326 -- ARGUMENTS
4327 --   IN:
4328 --     p_cas_v2_objs               List of customer account site business objects.
4329 --     p_bus_object             Business object structure for customer account site.
4330 -- NOTES
4331 --
4332 -- MODIFICATION HISTORY
4333 --
4334 --   1-FEB-2008    vsegu   o Created.
4335 
4336   FUNCTION is_cas_v2_bo_comp(
4337     p_cas_v2_objs                IN     HZ_CUST_ACCT_SITE_V2_BO_TBL,
4338     p_bus_object              IN     COMPLETENESS_REC_TYPE
4339   ) RETURN BOOLEAN IS
4340     l_valid_obj               BOOLEAN;
4341     l_casu                    BOOLEAN;
4342     l_cp                      BOOLEAN;
4343     l_cac                     BOOLEAN;
4344     l_cpa                     BOOLEAN;
4345     l_bau                     BOOLEAN;
4346     l_pm                      BOOLEAN;
4347     l_cac_bus_object          COMPLETENESS_REC_TYPE;
4348   BEGIN
4349     l_casu := FALSE;
4350     l_cp   := FALSE;
4351     l_cpa  := FALSE;
4352     l_cac  := FALSE;
4353     l_bau  := FALSE;
4354     l_pm   := FALSE;
4355 
4356     IF(p_cas_v2_objs IS NULL OR p_cas_v2_objs.COUNT < 1) THEN
4357       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
4358       fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE');
4359       fnd_msg_pub.add;
4360       RETURN FALSE;
4361     END IF;
4362 
4363     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4364       -- no entities of cust acct site
4365       IF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4366          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE' AND
4367          p_bus_object.user_mandated_flag(i) = 'Y') THEN
4368         CASE
4369           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE_USE' AND
4370                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
4371             l_casu := TRUE;
4372           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT' AND
4373                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
4374             l_cac := TRUE;
4375         END CASE;
4376       ELSIF(p_bus_object.tca_mandated_flag(i) = 'N' AND
4377          p_bus_object.user_mandated_flag(i) = 'Y' AND
4378          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
4379          p_bus_object.child_bo_code(i) IS NULL) THEN
4380         CASE
4381           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
4382             l_pm := TRUE;
4383           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
4384             l_bau := TRUE;
4385         END CASE;
4386       ELSIF(p_bus_object.child_bo_code(i) = 'CUST_PROFILE' AND
4387             p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
4388             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4389         l_cp := TRUE;
4390       ELSIF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS' AND
4391             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
4392             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4393         l_cpa := TRUE;
4394       END IF;
4395     END LOOP;
4396 
4397     IF(l_cac) THEN
4398       get_bus_obj_struct(
4399         p_bus_object_code    => 'CUST_ACCT_CONTACT',
4400         x_bus_object         => l_cac_bus_object
4401       );
4402     END IF;
4403 
4404     FOR i IN 1..p_cas_v2_objs.COUNT LOOP
4405       IF(l_cac) THEN
4406         l_valid_obj := is_cac_bo_comp(
4407                          p_cac_objs    => p_cas_v2_objs(i).cust_acct_contact_objs,
4408                          p_bus_object  => l_cac_bus_object
4409                        );
4410         IF NOT(l_valid_obj) THEN
4411           RETURN FALSE;
4412         END IF;
4413       END IF;
4414 
4415       IF(l_casu AND
4416         (p_cas_v2_objs(i).cust_acct_site_use_objs IS NULL OR
4417          p_cas_v2_objs(i).cust_acct_site_use_objs.COUNT < 1)) THEN
4418         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4419         fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE_USE');
4420         fnd_msg_pub.add;
4421         RETURN FALSE;
4422 
4423         FOR j IN 1..p_cas_v2_objs(i).cust_acct_site_use_objs.COUNT LOOP
4424           IF(l_cp AND p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj IS NULL) THEN
4425             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4426             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE');
4427             fnd_msg_pub.add;
4428             RETURN FALSE;
4429           END IF;
4430           IF(l_cpa AND
4431             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs IS NULL OR
4432              p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
4433             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4434             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE_AMOUNT');
4435             fnd_msg_pub.add;
4436             RETURN FALSE;
4437           END IF;
4438           -- for bank account use and payment method
4439           IF(l_bau AND
4440             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs IS NULL OR
4441              p_cas_v2_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs.COUNT < 1)) THEN
4442             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4443             fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
4444             fnd_msg_pub.add;
4445             RETURN FALSE;
4446           END IF;
4447           IF(l_pm AND
4448             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).payment_method_objs IS NULL OR
4449              p_cas_v2_objs(i).cust_acct_site_use_objs(j).payment_method_objs.COUNT < 1)) THEN
4450             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4451             fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
4452             fnd_msg_pub.add;
4453             RETURN FALSE;
4454           END IF;
4455         END LOOP;
4456       END IF;
4457     END LOOP;
4458 
4459     RETURN TRUE;
4460   END is_cas_v2_bo_comp;
4461 
4462 -- FUNCTION is_ca_v2_bo_comp
4463 --
4464 -- DESCRIPTION
4465 --     Return true if customer account object is complete.  Otherwise, return false.
4466 --
4467 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4468 --
4469 -- ARGUMENTS
4470 --   IN:
4471 --     p_ca_v2_objs                List of customer account business objects.
4472 --     p_bus_object             Business object structure for customer account.
4473 -- NOTES
4474 --
4475 -- MODIFICATION HISTORY
4476 --
4477 --   1-FEB-2008    vsegu   o Created.
4478 
4479   FUNCTION is_ca_v2_bo_comp(
4480     p_ca_v2_objs                 IN     HZ_CUST_ACCT_V2_BO_TBL,
4481     p_bus_object              IN     COMPLETENESS_REC_TYPE
4482   ) RETURN BOOLEAN IS
4483     l_valid_obj               BOOLEAN;
4484     l_carel                   BOOLEAN;
4485     l_cas                     BOOLEAN;
4486     l_cac                     BOOLEAN;
4487     l_cp                      BOOLEAN;
4488     l_cpa                     BOOLEAN;
4489     l_bau                     BOOLEAN;
4490     l_pm                      BOOLEAN;
4491     l_cas_bus_object          COMPLETENESS_REC_TYPE;
4492     l_cac_bus_object          COMPLETENESS_REC_TYPE;
4493   BEGIN
4494     l_carel := FALSE;
4495     l_cas   := FALSE;
4496     l_cac   := FALSE;
4497     l_cp    := FALSE;
4498     l_cpa   := FALSE;
4499     l_bau   := FALSE;
4500     l_pm    := FALSE;
4501 
4502     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4503       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
4504       fnd_message.set_token('OBJECT' ,'CUST_ACCT');
4505       fnd_msg_pub.add;
4506       RETURN FALSE;
4507     END IF;
4508 
4509     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4510       -- get all entities of cust acct, for cust acct, the possible entites are
4511       -- HZ_BANK_ACCOUNT_USE, HZ_PAYMENT_METHOD, HZ_CUST_ACCT_RELATE
4512       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
4513          p_bus_object.user_mandated_flag(i) = 'Y' AND
4514          p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
4515          p_bus_object.child_bo_code(i) IS NULL) THEN
4516         CASE
4517           WHEN(p_bus_object.entity_name(i) = 'HZ_CUST_ACCT_RELATE_ALL') THEN
4518             l_carel := TRUE;
4519           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
4520             l_pm := TRUE;
4521           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
4522             l_bau := TRUE;
4523         END CASE;
4524       -- Get other business object
4525       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4526             p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
4527             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4528         CASE
4529           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE') THEN
4530             l_cas := TRUE;
4531           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT') THEN
4532             l_cac := TRUE;
4533           ELSE
4534             null;
4535         END CASE;
4536       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4537             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
4538             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4539         IF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS') THEN
4540           l_cpa := TRUE;
4541         END IF;
4542       END IF;
4543     END LOOP;
4544 
4545     -- customer profile is mandatory for customer account
4546     l_cp := TRUE;
4547 
4548     IF(l_cas) THEN
4549       get_bus_obj_struct(
4550         p_bus_object_code    => 'CUST_ACCT_SITE',
4551         x_bus_object         => l_cas_bus_object
4552       );
4553     END IF;
4554 
4555     IF(l_cac) THEN
4556       get_bus_obj_struct(
4557         p_bus_object_code    => 'CUST_ACCT_CONTACT',
4558         x_bus_object         => l_cac_bus_object
4559       );
4560     END IF;
4561 
4562     FOR i IN 1..p_ca_v2_objs.COUNT LOOP
4563       IF(l_cas) THEN
4564         l_valid_obj := is_cas_v2_bo_comp(
4565                          p_cas_v2_objs    => p_ca_v2_objs(i).cust_acct_site_objs,
4566                          p_bus_object  => l_cas_bus_object
4567                        );
4568         IF NOT(l_valid_obj) THEN
4569           RETURN FALSE;
4570         END IF;
4571       END IF;
4572 
4573       IF(l_cac) THEN
4574         l_valid_obj := is_cac_bo_comp(
4575                          p_cac_objs    => p_ca_v2_objs(i).cust_acct_contact_objs,
4576                          p_bus_object  => l_cac_bus_object
4577                        );
4578         IF NOT(l_valid_obj) THEN
4579           RETURN FALSE;
4580         END IF;
4581       END IF;
4582 
4583       IF(l_carel AND
4584         (p_ca_v2_objs(i).acct_relate_objs IS NULL OR
4585          p_ca_v2_objs(i).acct_relate_objs.COUNT < 1)) THEN
4586         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4587         fnd_message.set_token('OBJECT' ,'CUSTOMER_ACCOUNT_RELATE');
4588         fnd_msg_pub.add;
4589         RETURN FALSE;
4590       END IF;
4591 
4592 -- for bank account use and payment method
4593       IF(l_bau AND
4594         (p_ca_v2_objs(i).bank_acct_use_objs IS NULL OR
4595          p_ca_v2_objs(i).bank_acct_use_objs.COUNT < 1)) THEN
4596         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4597         fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
4598         fnd_msg_pub.add;
4599         RETURN FALSE;
4600       END IF;
4601       IF(l_pm AND
4602         (p_ca_v2_objs(i).payment_method_objs IS NULL OR
4603          p_ca_v2_objs(i).payment_method_objs.COUNT < 1)) THEN
4604         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4605         fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
4606         fnd_msg_pub.add;
4607         RETURN FALSE;
4608       END IF;
4609 
4610       IF(l_cp AND p_ca_v2_objs(i).cust_profile_obj IS NULL) THEN
4611         RETURN FALSE;
4612       ELSE
4613         IF(l_cpa AND
4614           (p_ca_v2_objs(i).cust_profile_obj.cust_profile_amt_objs IS NULL OR
4615            p_ca_v2_objs(i).cust_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
4616           fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4617           fnd_message.set_token('OBJECT' ,'CUSTOMER_PROFILE_AMOUNT');
4618           fnd_msg_pub.add;
4619           RETURN FALSE;
4620         END IF;
4621       END IF;
4622     END LOOP;
4623 
4624     RETURN TRUE;
4625   END is_ca_v2_bo_comp;
4626 
4627 -- FUNCTION is_pca_v2_bo_comp
4628 --
4629 -- DESCRIPTION
4630 --     Return true if person customer object is complete.  Otherwise, return false.
4631 --
4632 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4633 --
4634 -- ARGUMENTS
4635 --   IN:
4636 --     p_person_obj             Person business object.
4637 --     p_ca_v2_objs             List of customer account objects.
4638 -- NOTES
4639 --
4640 -- MODIFICATION HISTORY
4641 --
4642 --   1-FEB-2008    vsegu   o Created.
4643 
4644   FUNCTION is_pca_v2_bo_comp(
4645     p_person_obj              IN     HZ_PERSON_BO,
4646     p_ca_v2_objs              IN     HZ_CUST_ACCT_V2_BO_TBL
4647   ) RETURN BOOLEAN IS
4648     l_per_bus_object          COMPLETENESS_REC_TYPE;
4649     l_ca_bus_object           COMPLETENESS_REC_TYPE;
4650     l_valid_obj               BOOLEAN;
4651   BEGIN
4652     IF(p_person_obj IS NULL) THEN
4653       RETURN FALSE;
4654     END IF;
4655     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4656       RETURN FALSE;
4657     END IF;
4658 
4659     -- check person object for person cust acct
4660     get_bus_obj_struct(
4661       p_bus_object_code         => 'PERSON',
4662       x_bus_object              => l_per_bus_object
4663     );
4664     l_valid_obj := is_person_bo_comp(
4665                      p_person_obj  => p_person_obj,
4666                      p_bus_object  => l_per_bus_object
4667                    );
4668     IF NOT(l_valid_obj) THEN
4669       RETURN FALSE;
4670     END IF;
4671 
4672     -- check cust account for person cust acct
4673     get_bus_obj_struct(
4674       p_bus_object_code         => 'CUST_ACCT',
4675       x_bus_object              => l_ca_bus_object
4676     );
4677     l_valid_obj := is_ca_v2_bo_comp(
4678                      p_ca_v2_objs    => p_ca_v2_objs,
4679                      p_bus_object => l_ca_bus_object
4680                    );
4681     IF NOT(l_valid_obj) THEN
4682       RETURN FALSE;
4683     END IF;
4684 
4685     RETURN TRUE;
4686   END is_pca_v2_bo_comp;
4687 
4688 -- FUNCTION is_oca_v2_bo_comp
4689 --
4690 -- DESCRIPTION
4691 --     Return true if organization customer object is complete.
4692 --     Otherwise, return false.
4693 --
4694 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4695 --
4696 -- ARGUMENTS
4697 --   IN:
4698 --     p_org_obj                Organization business object.
4699 --     p_ca_v2_objs                List of customer account objects.
4700 -- NOTES
4701 --
4702 -- MODIFICATION HISTORY
4703 --
4704 --   1-FEB-2008    vsegu   o Created.
4705 
4706   FUNCTION is_oca_v2_bo_comp(
4707     p_org_obj                 IN     HZ_ORGANIZATION_BO,
4708     p_ca_v2_objs              IN     HZ_CUST_ACCT_V2_BO_TBL
4709   ) RETURN BOOLEAN IS
4710     l_org_bus_object          COMPLETENESS_REC_TYPE;
4711     l_ca_bus_object           COMPLETENESS_REC_TYPE;
4712     l_valid_obj               BOOLEAN;
4713   BEGIN
4714     IF(p_org_obj IS NULL) THEN
4715       RETURN FALSE;
4716     END IF;
4717     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4718       RETURN FALSE;
4719     END IF;
4720 
4721     -- check organization object for org cust acct
4722     get_bus_obj_struct(
4723       p_bus_object_code         => 'ORG',
4724       x_bus_object              => l_org_bus_object
4725     );
4726     l_valid_obj := is_org_bo_comp(
4727                      p_organization_obj => p_org_obj,
4728                      p_bus_object       => l_org_bus_object
4729                    );
4730     IF NOT(l_valid_obj) THEN
4731       RETURN FALSE;
4732     END IF;
4733 
4734     -- check cust account for org cust acct
4735     get_bus_obj_struct(
4736       p_bus_object_code         => 'CUST_ACCT',
4737       x_bus_object              => l_ca_bus_object
4738     );
4739     l_valid_obj := is_ca_v2_bo_comp(
4740                      p_ca_v2_objs          => p_ca_v2_objs,
4741                      p_bus_object       => l_ca_bus_object
4742                    );
4743     IF NOT(l_valid_obj) THEN
4744       RETURN FALSE;
4745     END IF;
4746 
4747     RETURN TRUE;
4748   END is_oca_v2_bo_comp;
4749 
4750 END HZ_REGISTRY_VALIDATE_BO_PVT;