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 2008/02/06 10:08:56 vsegu 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 HZ_PARTY_SITE_USES
1123     WHERE party_site_id = l_party_site_id
1124     AND site_use_type = l_site_use_type
1125     AND status in ('A','I')
1126     AND rownum = 1;
1127 
1128     l_ps_id       NUMBER;
1129   BEGIN
1130     IF(px_party_site_use_id IS NULL) THEN
1131       OPEN is_party_site_use_exist(p_party_site_id, p_site_use_type);
1132       FETCH is_party_site_use_exist INTO x_object_version_number, px_party_site_use_id;
1133       CLOSE is_party_site_use_exist;
1134     ELSE
1135       OPEN is_party_site_use_id_exist(px_party_site_use_id);
1136       FETCH is_party_site_use_id_exist INTO x_object_version_number, l_ps_id;
1137       CLOSE is_party_site_use_id_exist;
1138       IF(l_ps_id <> p_party_site_id) OR (l_ps_id IS NULL AND p_party_site_id IS NOT NULL) THEN
1139         -- return -1 to indicate that the combination of parent and object id do not match
1140         x_object_version_number := -1;
1141       END IF;
1142     END IF;
1143   END check_party_site_use_op;
1144 
1145 -- PROCEDURE check_relationship_op
1146 --
1147 -- DESCRIPTION
1148 --     Check the operation of relationship based on pass in parameter.
1149 --
1150 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1151 --
1152 -- ARGUMENTS
1153 --   IN:
1154 --     p_subject_id             Subject Id.
1155 --     p_object_id              Object Id.
1156 --     p_relationship_type      Relationship type.
1157 --     p_relationship_code      Relationship code.
1158 --   IN/OUT:
1159 --     px_relationship_id       Relationship Id.
1160 --   OUT:
1161 --     x_object_version_number  Object version number of relationship.
1162 --     x_party_object_version_number  Object version number of relationship party.
1163 -- NOTES
1164 --
1165 -- MODIFICATION HISTORY
1166 --
1167 --   13-Jul-2005    Arnold Ng   o Created.
1168 
1169   PROCEDURE check_relationship_op(
1170     p_subject_id                 IN     NUMBER,
1171     p_object_id                  IN     NUMBER,
1172     px_relationship_id           IN OUT NOCOPY NUMBER,
1173     p_relationship_type          IN     VARCHAR2,
1174     p_relationship_code          IN     VARCHAR2,
1175     x_object_version_number      OUT NOCOPY NUMBER,
1176     x_party_obj_version_number   OUT NOCOPY NUMBER
1177   ) IS
1178     CURSOR is_relationship_id_exist(l_subject_id NUMBER, l_object_id NUMBER, l_rel_id NUMBER) IS
1179     SELECT rel.object_version_number, p.object_version_number
1180     FROM HZ_RELATIONSHIPS rel, HZ_PARTIES p
1181     WHERE rel.subject_id = l_subject_id
1182     AND rel.object_id = l_object_id
1183     AND rel.relationship_id = l_rel_id
1184     AND rel.party_id = p.party_id
1185     AND rel.status in ('A','I')
1186     AND rownum = 1;
1187 
1188     CURSOR is_relationship_exist(l_subject_id NUMBER, l_object_id NUMBER,
1189                                  l_relationship_type VARCHAR2, l_relationship_code VARCHAR2)IS
1190     SELECT rel.object_version_number, p.object_version_number, rel.relationship_id
1191     FROM HZ_RELATIONSHIPS rel, HZ_PARTIES p
1192     WHERE rel.subject_id = l_subject_id
1193     AND rel.object_id = l_object_id
1194     AND rel.relationship_type = l_relationship_type
1195     AND rel.relationship_code = l_relationship_code
1196     AND sysdate between rel.start_date and nvl(rel.end_date, sysdate)
1197     AND rel.party_id = p.party_id
1198     AND rel.status in ('A','I')
1199     AND rownum = 1;
1200   BEGIN
1201     IF(px_relationship_id IS NULL) THEN
1202       OPEN is_relationship_exist(p_subject_id, p_object_id, p_relationship_type, p_relationship_code);
1203       FETCH is_relationship_exist INTO x_object_version_number, x_party_obj_version_number, px_relationship_id;
1204       CLOSE is_relationship_exist;
1205     ELSE
1206       OPEN is_relationship_id_exist(p_subject_id, p_object_id, px_relationship_id);
1207       FETCH is_relationship_id_exist INTO x_object_version_number, x_party_obj_version_number;
1208       CLOSE is_relationship_id_exist;
1209     END IF;
1210   END check_relationship_op;
1211 
1212 -- PROCEDURE check_org_contact_role_op
1213 --
1214 -- DESCRIPTION
1215 --     Check the operation of org contact role based on pass in parameter.
1216 --
1217 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1218 --
1219 -- ARGUMENTS
1220 --   IN:
1221 --     p_org_contact_id         Org contact Id.
1222 --     p_role_type              Role type.
1223 --   IN/OUT:
1224 --     px_org_contact_role_id   Org contact role Id.
1225 --   OUT:
1226 --     x_object_version_number  Object version number of org contact role.
1227 -- NOTES
1228 --
1229 -- MODIFICATION HISTORY
1230 --
1231 --   13-Jul-2005    Arnold Ng   o Created.
1232 
1233   PROCEDURE check_org_contact_role_op(
1234     p_org_contact_id             IN     NUMBER,
1235     px_org_contact_role_id       IN OUT NOCOPY NUMBER,
1236     p_role_type                  IN     VARCHAR2,
1237     x_object_version_number      OUT NOCOPY NUMBER
1238   ) IS
1239     CURSOR is_org_contact_role_id_exist(l_role_id NUMBER)IS
1240     SELECT nvl(object_version_number,1), org_contact_id
1241     FROM HZ_ORG_CONTACT_ROLES
1242     WHERE org_contact_role_id = l_role_id
1243     AND rownum = 1;
1244 
1245     CURSOR is_org_contact_role_exist(l_org_contact_id NUMBER, l_role_type VARCHAR2)IS
1246     SELECT nvl(object_version_number,1), org_contact_role_id
1247     FROM HZ_ORG_CONTACT_ROLES
1248     WHERE org_contact_id = l_org_contact_id
1249     AND role_type = l_role_type
1250     AND status in ('A','I')
1251     AND rownum = 1;
1252 
1253     l_oc_id       NUMBER;
1254   BEGIN
1255     IF(px_org_contact_role_id IS NULL) THEN
1256       OPEN is_org_contact_role_exist(p_org_contact_id, p_role_type);
1257       FETCH is_org_contact_role_exist INTO x_object_version_number, px_org_contact_role_id;
1258       CLOSE is_org_contact_role_exist;
1259     ELSE
1260       OPEN is_org_contact_role_id_exist(px_org_contact_role_id);
1261       FETCH is_org_contact_role_id_exist INTO x_object_version_number, l_oc_id;
1262       CLOSE is_org_contact_role_id_exist;
1263       IF(l_oc_id <> p_org_contact_id) OR (l_oc_id IS NULL AND p_org_contact_id IS NOT NULL) THEN
1264         -- return -1 to indicate that the combination of parent and object id do not match
1265         x_object_version_number := -1;
1266       END IF;
1267     END IF;
1268   END check_org_contact_role_op;
1269 
1270 -- PROCEDURE check_certification_op
1271 --
1272 -- DESCRIPTION
1273 --     Check the operation of certification based on pass in parameter.
1274 --
1275 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1276 --
1277 -- ARGUMENTS
1278 --   IN:
1279 --     p_party_id               Party Id.
1280 --     p_certification_name     Name of certification.
1281 --   IN/OUT:
1282 --     px_certification_id      Certification Id.
1283 --   OUT:
1284 --     x_last_update_date       Last update date of certification.
1285 -- NOTES
1286 --
1287 -- MODIFICATION HISTORY
1288 --
1289 --   13-Jul-2005    Arnold Ng   o Created.
1290 
1291   PROCEDURE check_certification_op(
1292     p_party_id                   IN     NUMBER,
1293     px_certification_id          IN OUT NOCOPY NUMBER,
1294     p_certification_name         IN     VARCHAR2,
1295     x_last_update_date           OUT NOCOPY DATE,
1296     x_return_status              OUT NOCOPY VARCHAR2
1297   ) IS
1298     CURSOR is_cert_id_exist(l_cert_id NUMBER) IS
1299     SELECT last_update_date, party_id
1300     FROM HZ_CERTIFICATIONS
1301     WHERE certification_id = l_cert_id
1302     AND rownum = 1;
1303 
1304     CURSOR is_cert_exist(l_party_id NUMBER, l_cert_name VARCHAR2) IS
1305     SELECT last_update_date, certification_id
1306     FROM HZ_CERTIFICATIONS
1307     WHERE party_id = l_party_id
1308     AND certification_name = l_cert_name
1309     AND status in ('A','I')
1310     AND rownum = 1;
1311 
1312     l_party_id    NUMBER;
1313   BEGIN
1314     x_return_status := FND_API.G_RET_STS_SUCCESS;
1315     IF(px_certification_id IS NULL) THEN
1316       OPEN is_cert_exist(p_party_id, p_certification_name);
1317       FETCH is_cert_exist INTO x_last_update_date, px_certification_id;
1318       CLOSE is_cert_exist;
1319     ELSE
1320       OPEN is_cert_id_exist(px_certification_id);
1321       FETCH is_cert_id_exist INTO x_last_update_date, l_party_id;
1322       CLOSE is_cert_id_exist;
1323       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1324         -- return -1 to indicate that the combination of parent and object id do not match
1325         x_return_status := FND_API.G_RET_STS_ERROR;
1326       END IF;
1327     END IF;
1328   END check_certification_op;
1329 
1330 -- PROCEDURE check_financial_prof_op
1331 --
1332 -- DESCRIPTION
1333 --     Check the operation of financial profile based on pass in parameter.
1334 --
1335 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1336 --
1337 -- ARGUMENTS
1338 --   IN:
1339 --     p_party_id               Party Id.
1340 --     p_financial_profile_id   Financial profile Id.
1341 --   OUT:
1342 --     x_last_update_date       Last update date of financial profile.
1343 -- NOTES
1344 --
1345 -- MODIFICATION HISTORY
1346 --
1347 --   13-Jul-2005    Arnold Ng   o Created.
1348 
1349   PROCEDURE check_financial_prof_op(
1350     p_party_id                   IN     NUMBER,
1351     p_financial_profile_id       IN     NUMBER,
1352     x_last_update_date           OUT NOCOPY DATE,
1353     x_return_status              OUT NOCOPY VARCHAR2
1354   ) IS
1355     CURSOR is_fin_exist(l_fin_prof_id NUMBER) IS
1356     SELECT last_update_date, party_id
1357     FROM HZ_FINANCIAL_PROFILE
1358     WHERE financial_profile_id = l_fin_prof_id
1359     AND rownum = 1;
1360 
1361     l_party_id    NUMBER;
1362   BEGIN
1363     x_return_status := FND_API.G_RET_STS_SUCCESS;
1364     IF(p_financial_profile_id IS NULL) THEN
1365       x_last_update_date := NULL;
1366     ELSE
1367       OPEN is_fin_exist(p_financial_profile_id);
1368       FETCH is_fin_exist INTO x_last_update_date, l_party_id;
1369       CLOSE is_fin_exist;
1370       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1371          x_return_status := FND_API.G_RET_STS_ERROR;
1372       END IF;
1373     END IF;
1374   END check_financial_prof_op;
1375 
1376 -- PROCEDURE check_code_assign_op
1377 --
1378 -- DESCRIPTION
1379 --     Check the operation of classification based on pass in parameter.
1380 --
1381 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1382 --
1383 -- ARGUMENTS
1384 --   IN:
1385 --     p_owner_table_name       Owner table name.
1386 --     p_owner_table_id         Owner table Id.
1387 --     p_class_category         Class category.
1388 --     p_class_code             Class code.
1389 --   IN/OUT:
1390 --     px_code_assignment_id    Code assignment Id.
1391 --   OUT:
1392 --     x_object_version_number  Object version number of classification.
1393 -- NOTES
1394 --
1395 -- MODIFICATION HISTORY
1396 --
1397 --   13-Jul-2005    Arnold Ng   o Created.
1398 
1399   PROCEDURE check_code_assign_op(
1400     p_owner_table_name           IN     VARCHAR2,
1401     p_owner_table_id             IN     NUMBER,
1402     px_code_assignment_id        IN OUT NOCOPY NUMBER,
1403     p_class_category             IN     VARCHAR2,
1404     p_class_code                 IN     VARCHAR2,
1405     x_object_version_number      OUT NOCOPY NUMBER
1406   ) IS
1407     CURSOR is_code_assign_id_exist(l_code_assignment_id NUMBER)IS
1408     SELECT nvl(object_version_number,1), owner_table_name, owner_table_id
1409     FROM HZ_CODE_ASSIGNMENTS
1410     WHERE code_assignment_id = l_code_assignment_id
1411     AND rownum = 1;
1412 
1413     CURSOR is_code_assign_exist(l_owner_table_name VARCHAR2, l_owner_table_id   NUMBER,
1414                                 l_class_category   VARCHAR2, l_class_code       VARCHAR2)IS
1415     SELECT nvl(object_version_number,1), code_assignment_id
1416     FROM HZ_CODE_ASSIGNMENTS
1417     WHERE owner_table_name = l_owner_table_name
1418     AND owner_table_id = l_owner_table_id
1419     AND class_category = l_class_category
1420     AND class_code = l_class_code
1421     AND sysdate between start_date_active and nvl(end_date_active, sysdate)
1422     AND status in ('A','I')
1423     AND rownum = 1;
1424 
1425     l_ot_name     VARCHAR2(30);
1426     l_ot_id       NUMBER;
1427   BEGIN
1428     IF(px_code_assignment_id IS NULL) THEN
1429       OPEN is_code_assign_exist(p_owner_table_name, p_owner_table_id, p_class_category, p_class_code);
1430       FETCH is_code_assign_exist INTO x_object_version_number, px_code_assignment_id;
1431       CLOSE is_code_assign_exist;
1432     ELSE
1433       OPEN is_code_assign_id_exist(px_code_assignment_id);
1434       FETCH is_code_assign_id_exist INTO x_object_version_number, l_ot_name, l_ot_id;
1435       CLOSE is_code_assign_id_exist;
1436       IF(l_ot_name <> p_owner_table_name OR l_ot_id <> p_owner_table_id) OR
1437         (l_ot_id IS NULL OR (p_owner_table_name IS NOT NULL OR p_owner_table_id IS NOT NULL)) THEN
1438         -- return -1 to indicate that the combination of parent and object id do not match
1439         x_object_version_number := -1;
1440       END IF;
1441     END IF;
1442   END check_code_assign_op;
1443 
1444 -- PROCEDURE check_party_pref_op
1445 --
1446 -- DESCRIPTION
1447 --     Check the operation of party preference based on pass in parameter.
1448 --
1449 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1450 --
1451 -- ARGUMENTS
1452 --   IN:
1453 --     p_party_id               Party Id.
1454 --     p_module                 Module.
1455 --     p_category               Category.
1456 --     p_preference_code        Preference code.
1457 --   OUT:
1458 --     x_object_version_number  Object version number of party preference.
1459 -- NOTES
1460 --
1461 -- MODIFICATION HISTORY
1462 --
1463 --   13-Jul-2005    Arnold Ng   o Created.
1464 
1465   PROCEDURE check_party_pref_op(
1466     p_party_id                   IN     NUMBER,
1467     p_module                     IN     VARCHAR2,
1468     p_category                   IN     VARCHAR2,
1469     p_preference_code            IN     VARCHAR2,
1470     x_object_version_number      OUT NOCOPY NUMBER
1471   ) IS
1472     CURSOR is_party_pref_exist(l_party_id NUMBER, l_module VARCHAR2,
1473                                l_category VARCHAR2, l_preference_code VARCHAR2) IS
1474     SELECT nvl(object_version_number,1)
1475     FROM HZ_PARTY_PREFERENCES
1476     WHERE party_id = l_party_id
1477     AND module = l_module
1478     AND category = l_category
1479     AND preference_code = l_preference_code
1480     AND rownum = 1;
1481   BEGIN
1482     OPEN is_party_pref_exist(p_party_id, p_module, p_category, p_preference_code);
1483     FETCH is_party_pref_exist INTO x_object_version_number;
1484     CLOSE is_party_pref_exist;
1485   END check_party_pref_op;
1486 
1487 -- PROCEDURE check_credit_rating_op
1488 --
1489 -- DESCRIPTION
1490 --     Check the operation of credit rating based on pass in parameter.
1491 --
1492 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1493 --
1494 -- ARGUMENTS
1495 --   IN:
1496 --     p_party_id               Party Id.
1497 --     p_rating_organization    Rating organization.
1498 --     p_rated_as_of_date       Rated date.
1499 --   IN/OUT:
1500 --     px_credit_rating_id      Credit rating Id.
1501 --   OUT:
1502 --     x_object_version_number  Object version number of credit rating.
1503 -- NOTES
1504 --
1505 -- MODIFICATION HISTORY
1506 --
1507 --   13-Jul-2005    Arnold Ng   o Created.
1508 
1509   PROCEDURE check_credit_rating_op(
1510     p_party_id                   IN     NUMBER,
1511     px_credit_rating_id          IN OUT NOCOPY NUMBER,
1512     p_rating_organization        IN     VARCHAR2,
1513     p_rated_as_of_date           IN     DATE,
1514     x_object_version_number      OUT NOCOPY NUMBER
1515   ) IS
1516     CURSOR is_credit_rating_id_exist(l_credit_rating_id NUMBER)IS
1517     SELECT nvl(object_version_number,1), party_id
1518     FROM HZ_CREDIT_RATINGS
1519     WHERE credit_rating_id = l_credit_rating_id
1520     AND rownum = 1;
1521 
1522     CURSOR is_credit_rating_exist(l_party_id NUMBER, l_rating_organization VARCHAR2,
1523                      l_rated_as_of_date DATE)IS
1524     SELECT nvl(object_version_number,1), credit_rating_id
1525     FROM HZ_CREDIT_RATINGS
1526     WHERE party_id = l_party_id
1527     AND nvl(rating_organization,'A') = nvl(l_rating_organization,'A')
1528     AND trunc(nvl(rated_as_of_date,sysdate)) = trunc(nvl(l_rated_as_of_date,sysdate))
1529     AND status in ('A','I')
1530     AND rownum = 1;
1531 
1532     l_party_id    NUMBER;
1533   BEGIN
1534     IF(px_credit_rating_id IS NULL) THEN
1535       OPEN is_credit_rating_exist(p_party_id, p_rating_organization, p_rated_as_of_date);
1536       FETCH is_credit_rating_exist INTO x_object_version_number, px_credit_rating_id;
1537       CLOSE is_credit_rating_exist;
1538     ELSE
1539       OPEN is_credit_rating_id_exist(px_credit_rating_id);
1540       FETCH is_credit_rating_id_exist INTO x_object_version_number, l_party_id;
1541       CLOSE is_credit_rating_id_exist;
1542       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1543         -- return -1 to indicate that the combination of parent and object id do not match
1544         x_object_version_number := -1;
1545       END IF;
1546     END IF;
1547   END check_credit_rating_op;
1548 
1549 -- PROCEDURE check_fin_report_op
1550 --
1551 -- DESCRIPTION
1552 --     Check the operation of financial report based on pass in parameter.
1553 --
1554 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1555 --
1556 -- ARGUMENTS
1557 --   IN:
1558 --     p_party_id               Party Id.
1559 --     p_type_of_financial_report  Type of financial report.
1560 --     p_document_reference     Document reference.
1561 --     p_date_report_issued     Report issued date.
1562 --     p_issued_period          Issued period.
1563 --   IN/OUT:
1564 --     px_fin_report_id         Financial report Id.
1565 --   OUT:
1566 --     x_object_version_number  Object version number of financial report.
1567 -- NOTES
1568 --
1569 -- MODIFICATION HISTORY
1570 --
1571 --   13-Jul-2005    Arnold Ng   o Created.
1572 
1573   PROCEDURE check_fin_report_op(
1574     p_party_id                   IN     NUMBER,
1575     px_fin_report_id             IN OUT NOCOPY NUMBER,
1576     p_type_of_financial_report   IN     VARCHAR2,
1577     p_document_reference         IN     VARCHAR2,
1578     p_date_report_issued         IN     DATE,
1579     p_issued_period              IN     VARCHAR2,
1580     x_object_version_number      OUT NOCOPY NUMBER
1581   ) IS
1582     CURSOR is_fin_report_id_exist(l_fin_report_id NUMBER)IS
1583     SELECT nvl(object_version_number,1), party_id
1584     FROM HZ_FINANCIAL_REPORTS
1585     WHERE financial_report_id = l_fin_report_id
1586     AND rownum = 1;
1587 
1588     CURSOR is_fin_report_exist(l_party_id NUMBER, l_type_of_fin_report VARCHAR2,
1589                                l_doc_reference VARCHAR2, l_date_report_issued DATE,
1590                                l_issued_period VARCHAR2 )IS
1591     SELECT nvl(object_version_number,1), financial_report_id
1592     FROM HZ_FINANCIAL_REPORTS
1593     WHERE party_id = l_party_id
1594     AND type_of_financial_report = l_type_of_fin_report
1595     AND document_reference = l_doc_reference
1596     AND (trunc(date_report_issued) = trunc(l_date_report_issued) OR
1597          issued_period = l_issued_period OR
1598          sysdate between nvl(report_start_date,sysdate) and nvl(report_end_date, sysdate))
1599     AND status in ('A','I')
1600     AND rownum = 1;
1601 
1602     l_party_id    NUMBER;
1603   BEGIN
1604     IF(px_fin_report_id IS NULL) THEN
1605       OPEN is_fin_report_exist(p_party_id, p_type_of_financial_report, p_document_reference,
1606                                p_date_report_issued, p_issued_period);
1607       FETCH is_fin_report_exist INTO x_object_version_number, px_fin_report_id;
1608       CLOSE is_fin_report_exist;
1609     ELSE
1610       OPEN is_fin_report_id_exist(px_fin_report_id);
1611       FETCH is_fin_report_id_exist INTO x_object_version_number, l_party_id;
1612       CLOSE is_fin_report_id_exist;
1613       IF(l_party_id <> p_party_id) OR (l_party_id IS NULL AND p_party_id IS NOT NULL) THEN
1614         -- return -1 to indicate that the combination of parent and object id do not match
1615         x_object_version_number := -1;
1616       END IF;
1617     END IF;
1618   END check_fin_report_op;
1619 
1620 -- PROCEDURE check_fin_number_op
1621 --
1622 -- DESCRIPTION
1623 --     Check the operation of financial number based on pass in parameter.
1624 --
1625 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1626 --
1627 -- ARGUMENTS
1628 --   IN:
1629 --     p_fin_report_id          Financial report Id.
1630 --     p_financial_number_name  Name of financial number.
1631 --   IN/OUT:
1632 --     px_fin_number_id         Financial number Id.
1633 --   OUT:
1634 --     x_object_version_number  Object version number of financial number.
1635 -- NOTES
1636 --
1637 -- MODIFICATION HISTORY
1638 --
1639 --   13-Jul-2005    Arnold Ng   o Created.
1640 
1641   PROCEDURE check_fin_number_op(
1642     p_fin_report_id              IN     NUMBER,
1643     px_fin_number_id             IN OUT NOCOPY NUMBER,
1644     p_financial_number_name      IN     VARCHAR2,
1645     x_object_version_number      OUT NOCOPY NUMBER
1646   ) IS
1647     CURSOR is_fin_number_id_exist(l_fin_number_id NUMBER) IS
1648     SELECT nvl(object_version_number,1), financial_report_id
1649     FROM HZ_FINANCIAL_NUMBERS
1650     WHERE financial_number_id = l_fin_number_id
1651     AND rownum = 1;
1652 
1653     CURSOR is_fin_number_exist(l_fin_report_id NUMBER, l_fin_number_name VARCHAR2) IS
1654     SELECT nvl(object_version_number,1), financial_number_id
1655     FROM HZ_FINANCIAL_NUMBERS
1656     WHERE financial_report_id = l_fin_report_id
1657     AND financial_number_name = l_fin_number_name
1658     AND status in ('A','I')
1659     AND rownum = 1;
1660 
1661     l_fr_id       NUMBER;
1662   BEGIN
1663     IF(px_fin_number_id IS NULL) THEN
1664       OPEN is_fin_number_exist(p_fin_report_id, p_financial_number_name);
1665       FETCH is_fin_number_exist INTO x_object_version_number, px_fin_number_id;
1666       CLOSE is_fin_number_exist;
1667     ELSE
1668       OPEN is_fin_number_id_exist(px_fin_number_id);
1669       FETCH is_fin_number_id_exist INTO x_object_version_number, l_fr_id;
1670       CLOSE is_fin_number_id_exist;
1671       IF(l_fr_id <> p_fin_report_id) OR (l_fr_id IS NULL AND p_fin_report_id IS NOT NULL) THEN
1672         -- return -1 to indicate that the combination of parent and object id do not match
1673         x_object_version_number := -1;
1674       END IF;
1675     END IF;
1676   END check_fin_number_op;
1677 
1678 -- PROCEDURE check_role_resp_op
1679 --
1680 -- DESCRIPTION
1681 --     Check the operation of role responsibility based on pass in parameter.
1682 --
1683 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1684 --
1685 -- ARGUMENTS
1686 --   IN:
1687 --     p_cust_acct_contact_id   Customer account contact Id.
1688 --     p_responsibility_type    Role responsibility type.
1689 --   IN/OUT:
1690 --     px_responsibility_id     Role responsibility Id.
1691 --   OUT:
1692 --     x_object_version_number  Object version number of role responsibility.
1693 -- NOTES
1694 --
1695 -- MODIFICATION HISTORY
1696 --
1697 --   13-Jul-2005    Arnold Ng   o Created.
1698 
1699   PROCEDURE check_role_resp_op(
1700     p_cust_acct_contact_id       IN     NUMBER,
1701     px_responsibility_id         IN OUT NOCOPY NUMBER,
1702     p_responsibility_type        IN     VARCHAR2,
1703     x_object_version_number      OUT NOCOPY NUMBER
1704   ) IS
1705     CURSOR is_role_resp_id_exist(l_resp_id NUMBER) IS
1706     SELECT nvl(object_version_number,1), cust_account_role_id
1707     FROM HZ_ROLE_RESPONSIBILITY
1708     WHERE responsibility_id = l_resp_id
1709     AND rownum = 1;
1710 
1711     CURSOR is_role_resp_exist(l_cac_id NUMBER, l_resp_type VARCHAR2) IS
1712     SELECT nvl(object_version_number,1), responsibility_id
1713     FROM HZ_ROLE_RESPONSIBILITY
1714     WHERE cust_account_role_id = l_cac_id
1715     AND responsibility_type = l_resp_type
1716     AND rownum = 1;
1717 
1718     l_cac_id      NUMBER;
1719   BEGIN
1720     IF(px_responsibility_id IS NULL) THEN
1721       OPEN is_role_resp_exist(p_cust_acct_contact_id, p_responsibility_type);
1722       FETCH is_role_resp_exist INTO x_object_version_number, px_responsibility_id;
1723       CLOSE is_role_resp_exist;
1724     ELSE
1725       OPEN is_role_resp_id_exist(px_responsibility_id);
1726       FETCH is_role_resp_id_exist INTO x_object_version_number, l_cac_id;
1727       CLOSE is_role_resp_id_exist;
1728       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
1729         -- return -1 to indicate that the combination of parent and object id do not match
1730         x_object_version_number := -1;
1731       END IF;
1732     END IF;
1733   END check_role_resp_op;
1734 
1735 -- PROCEDURE check_cust_profile_op
1736 --
1737 -- DESCRIPTION
1738 --     Check the operation of customer profile based on pass in parameter.
1739 --
1740 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1741 --
1742 -- ARGUMENTS
1743 --   IN:
1744 --     p_cust_acct_id           Customer account Id.
1745 --     p_site_use_id            Customer site use Id.
1746 --     p_profile_class_id       Profile class Id.
1747 --   IN/OUT:
1748 --     px_cust_acct_profile_id  Customer profile Id.
1749 --   OUT:
1750 --     x_object_version_number  Object version number of customer profile.
1751 -- NOTES
1752 --
1753 -- MODIFICATION HISTORY
1754 --
1755 --   13-Jul-2005    Arnold Ng   o Created.
1756 
1757   PROCEDURE check_cust_profile_op(
1758     p_cust_acct_id               IN     NUMBER,
1759     px_cust_acct_profile_id      IN OUT NOCOPY NUMBER,
1760     p_site_use_id                IN     NUMBER,
1761     p_profile_class_id           IN     NUMBER,
1762     x_object_version_number      OUT NOCOPY NUMBER
1763   ) IS
1764     CURSOR is_cust_profile_id_exist(l_cust_acct_prof_id NUMBER) IS
1765     SELECT nvl(object_version_number,1), cust_account_id, site_use_id
1766     FROM HZ_CUSTOMER_PROFILES
1767     WHERE cust_account_profile_id = l_cust_acct_prof_id
1768     AND rownum = 1;
1769 
1770     CURSOR is_cust_profile_exist(l_ca_id NUMBER, l_site_use_id NUMBER, l_profile_class_id NUMBER) IS
1771     SELECT nvl(object_version_number,1), cust_account_profile_id
1772     FROM HZ_CUSTOMER_PROFILES
1773     WHERE cust_account_id = l_ca_id
1774     AND nvl(site_use_id, -99) = nvl(l_site_use_id, -99)
1775     AND profile_class_id = l_profile_class_id
1776     AND status in ('A','I')
1777     AND rownum = 1;
1778 
1779     l_ca_id       NUMBER;
1780     l_casu_id     NUMBER;
1781   BEGIN
1782     IF(px_cust_acct_profile_id IS NULL) THEN
1783       OPEN is_cust_profile_exist(p_cust_acct_id, p_site_use_id, p_profile_class_id);
1784       FETCH is_cust_profile_exist INTO x_object_version_number, px_cust_acct_profile_id;
1785       CLOSE is_cust_profile_exist;
1786     ELSE
1787       OPEN is_cust_profile_id_exist(px_cust_acct_profile_id);
1788       FETCH is_cust_profile_id_exist INTO x_object_version_number, l_ca_id, l_casu_id;
1789       CLOSE is_cust_profile_id_exist;
1790       IF((l_ca_id <> p_cust_acct_id) OR (nvl(l_casu_id,-99) <> nvl(p_site_use_id,-99))) OR
1791         ((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
1792         -- return -1 to indicate that the combination of parent and object id do not match
1793         x_object_version_number := -1;
1794       END IF;
1795     END IF;
1796   END check_cust_profile_op;
1797 
1798 -- PROCEDURE check_cust_profile_amt_op
1799 --
1800 -- DESCRIPTION
1801 --     Check the operation of customer profile amount based on pass in parameter.
1802 --
1803 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1804 --
1805 -- ARGUMENTS
1806 --   IN:
1807 --     p_cust_profile_id        Customer profile Id.
1808 --     p_currency_code          Currency code.
1809 --   IN/OUT:
1810 --     px_cust_acct_prof_amt_id Customer profile amount Id.
1811 --   OUT:
1812 --     x_object_version_number  Object version number of customer profile amount.
1813 -- NOTES
1814 --
1815 -- MODIFICATION HISTORY
1816 --
1817 --   13-Jul-2005    Arnold Ng   o Created.
1818 
1819   PROCEDURE check_cust_profile_amt_op(
1820     p_cust_profile_id            IN     NUMBER,
1821     px_cust_acct_prof_amt_id     IN OUT NOCOPY NUMBER,
1822     p_currency_code              IN     VARCHAR2,
1823     x_object_version_number      OUT NOCOPY NUMBER
1824   ) IS
1825     CURSOR is_cust_profile_amt_id_exist(l_cust_prof_amt_id NUMBER) IS
1826     SELECT nvl(object_version_number,1), cust_account_profile_id
1827     FROM HZ_CUST_PROFILE_AMTS
1828     WHERE cust_acct_profile_amt_id = l_cust_prof_amt_id
1829     AND rownum = 1;
1830 
1831     CURSOR is_cust_profile_amt_exist(l_cap_id NUMBER, l_currency_code VARCHAR2) IS
1832     SELECT nvl(object_version_number,1), cust_acct_profile_amt_id
1833     FROM HZ_CUST_PROFILE_AMTS
1834     WHERE cust_account_profile_id = l_cap_id
1835     AND currency_code = l_currency_code
1836     AND rownum = 1;
1837 
1838     l_cap_id      NUMBER;
1839   BEGIN
1840     IF(px_cust_acct_prof_amt_id IS NULL) THEN
1841       OPEN is_cust_profile_amt_exist(p_cust_profile_id, p_currency_code);
1842       FETCH is_cust_profile_amt_exist INTO x_object_version_number, px_cust_acct_prof_amt_id;
1843       CLOSE is_cust_profile_amt_exist;
1844     ELSE
1845       OPEN is_cust_profile_amt_id_exist(px_cust_acct_prof_amt_id);
1846       FETCH is_cust_profile_amt_id_exist INTO x_object_version_number, l_cap_id;
1847       CLOSE is_cust_profile_amt_id_exist;
1848       IF(l_cap_id <> p_cust_profile_id) OR (l_cap_id IS NULL AND p_cust_profile_id IS NOT NULL) THEN
1849         -- return -1 to indicate that the combination of parent and object id do not match
1850         x_object_version_number := -1;
1851       END IF;
1852     END IF;
1853   END check_cust_profile_amt_op;
1854 
1855 -- PROCEDURE check_cust_acct_relate_op
1856 --
1857 -- DESCRIPTION
1858 --     Check the operation of customer account relationship based on pass in parameter.
1859 --
1860 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1861 --
1862 -- ARGUMENTS
1863 --   IN:
1864 --     p_cust_acct_id           Customer account Id.
1865 --     p_related_cust_acct_id   Related customer account Id.
1866 --   OUT:
1867 --     x_object_version_number  Object version number of customer account relationship.
1868 -- NOTES
1869 --
1870 -- MODIFICATION HISTORY
1871 --
1872 --   13-Jul-2005    Arnold Ng   o Created.
1873 
1874   PROCEDURE check_cust_acct_relate_op(
1875     p_cust_acct_id               IN     NUMBER,
1876     p_related_cust_acct_id       IN     NUMBER,
1877     x_object_version_number      OUT NOCOPY NUMBER
1878   ) IS
1879     CURSOR is_cust_acct_relate_exist(l_ca_id NUMBER, l_rca_id NUMBER) IS
1880     SELECT nvl(object_version_number,1)
1881     FROM HZ_CUST_ACCT_RELATE
1882     WHERE cust_account_id = l_ca_id
1883     AND related_cust_account_id = l_rca_id
1884     AND status in ('A','I')
1885     AND rownum = 1;
1886   BEGIN
1887     OPEN is_cust_acct_relate_exist(p_cust_acct_id, p_related_cust_acct_id);
1888     FETCH is_cust_acct_relate_exist INTO x_object_version_number;
1889     CLOSE is_cust_acct_relate_exist;
1890   END check_cust_acct_relate_op;
1891 
1892 -- PROCEDURE check_payment_method_op
1893 --
1894 -- DESCRIPTION
1895 --     Check the operation of payment method based on pass in parameter.
1896 --
1897 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1898 --
1899 -- ARGUMENTS
1900 --   IN:
1901 --     p_cust_receipt_method_id Payment method Id.
1902 --   OUT:
1903 --     x_last_update_date       Last update date of payment method.
1904 -- NOTES
1905 --
1906 -- MODIFICATION HISTORY
1907 --
1908 --   13-Jul-2005    Arnold Ng   o Created.
1909 
1910   PROCEDURE check_payment_method_op(
1911     p_cust_receipt_method_id     IN     NUMBER,
1912     x_last_update_date           OUT NOCOPY DATE
1913   ) IS
1914     CURSOR is_payment_method_exist(l_pm_id NUMBER) IS
1915     SELECT last_update_date
1916     FROM RA_CUST_RECEIPT_METHODS
1917     WHERE cust_receipt_method_id = l_pm_id
1918     AND rownum = 1;
1919   BEGIN
1920     OPEN is_payment_method_exist(p_cust_receipt_method_id);
1921     FETCH is_payment_method_exist INTO x_last_update_date;
1922     CLOSE is_payment_method_exist;
1923   END check_payment_method_op;
1924 
1925 -- FUNCTION check_bo_op
1926 --
1927 -- DESCRIPTION
1928 --     Return the operation of business object based on pass in parameter.
1929 --     Return value can be 'C' (create) or 'U' (update)
1930 --
1931 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1932 --
1933 -- ARGUMENTS
1934 --   IN:
1935 --     p_entity_id              Business object Id.
1936 --     p_entity_os              Business object original system.
1937 --     p_entity_osr             Business object original system reference.
1938 --     p_entity_type            Business object type.
1939 --     p_cp_type                Contact point type.
1940 --     p_parent_id              Parent Id,
1941 --     p_parent_table           Parent table
1942 -- NOTES
1943 --
1944 -- MODIFICATION HISTORY
1945 --
1946 --   13-Jul-2005    Arnold Ng   o Created.
1947 
1948   FUNCTION check_bo_op(
1949     p_entity_id                  IN     NUMBER,
1950     p_entity_os                  IN     VARCHAR2,
1951     p_entity_osr                 IN     VARCHAR2,
1952     p_entity_type                IN     VARCHAR2,
1953     p_cp_type                    IN     VARCHAR2 := NULL,
1954     p_parent_id                  IN     NUMBER,
1955     p_parent_obj_type            IN     VARCHAR2
1956   ) RETURN VARCHAR2 IS
1957     CURSOR is_contact_point_exist(l_contact_point_id NUMBER, l_contact_point_type VARCHAR2) IS
1958     SELECT owner_table_id, owner_table_name
1959     FROM HZ_CONTACT_POINTS
1960     WHERE contact_point_id = l_contact_point_id
1961     AND contact_point_type = l_contact_point_type;
1962 
1963     CURSOR is_party_site_exist(l_ps_id NUMBER) IS
1964     SELECT party_id
1965     FROM HZ_PARTY_SITES
1966     WHERE party_site_id = l_ps_id;
1967 
1968     CURSOR is_location_exist(l_loc_id NUMBER) IS
1969     SELECT 'X'
1970     FROM HZ_LOCATIONS
1971     WHERE location_id = l_loc_id;
1972 
1973     CURSOR is_party_exist(l_party_id NUMBER) IS
1974     SELECT 'X'
1975     FROM HZ_PARTIES
1976     WHERE party_id = l_party_id;
1977 
1978     CURSOR is_org_contact_exist(l_org_contact_id NUMBER) IS
1979     SELECT r.object_id
1980     FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
1981     WHERE oc.org_contact_id = l_org_contact_id
1982     AND oc.party_relationship_id = r.relationship_id
1983     AND r.object_type = 'ORGANIZATION'
1984     AND r.subject_type = 'PERSON'
1985     AND rownum = 1;
1986 
1987     CURSOR is_cust_account_exist(l_cust_acct_id NUMBER) IS
1988     SELECT party_id
1989     FROM HZ_CUST_ACCOUNTS
1990     WHERE cust_account_id = l_cust_acct_id;
1991 
1992     CURSOR is_cust_acct_site_exist(l_cust_acct_site_id NUMBER) IS
1993     SELECT cust_account_id
1994     FROM HZ_CUST_ACCT_SITES_ALL
1995     WHERE cust_acct_site_id = l_cust_acct_site_id;
1996 
1997     CURSOR is_cust_site_use_exist(l_site_use_id NUMBER) IS
1998     SELECT cust_acct_site_id
1999     FROM HZ_CUST_SITE_USES
2000     WHERE site_use_id = l_site_use_id;
2001 
2002     CURSOR is_cust_acct_role_exist(l_cust_acct_role_id NUMBER) IS
2003     SELECT cust_account_id, nvl(cust_acct_site_id, -99)
2004     FROM HZ_CUST_ACCOUNT_ROLES
2005     WHERE cust_account_role_id = l_cust_acct_role_id;
2006 
2007     l_create_update_flag       VARCHAR2(1);
2008     l_dummy                    VARCHAR2(1);
2009     l_ss_flag                  VARCHAR2(1);
2010     l_owner_table_id           NUMBER;
2011     l_debug_prefix             VARCHAR2(30);
2012     l_return_status            VARCHAR2(30);
2013     l_count                    NUMBER;
2014     l_parent_id                NUMBER;
2015     l_acct_site_id             NUMBER;
2016     l_input_parent_table       VARCHAR2(30);
2017     l_parent_table             VARCHAR2(30);
2018   BEGIN
2019     l_dummy := NULL;
2020 
2021     l_ss_flag := is_ss_provided(p_os  => p_entity_os,
2022                                 p_osr => p_entity_osr);
2023 
2024     -- Return as 'Create' if no TCA id and no os+osr pass in
2025     -- Fix bug 4748851
2026     IF(p_entity_id IS NULL) AND (l_ss_flag = 'N') THEN
2027       RETURN 'C';
2028     END IF;
2029 
2030     -- if TCA id pass in, check if it is valid or not
2031     IF(p_entity_id IS NOT NULL) THEN
2032       l_input_parent_table := get_owner_table_name(p_parent_obj_type);
2033 
2034       IF(p_entity_type = 'HZ_CONTACT_POINTS') THEN
2035         OPEN is_contact_point_exist(p_entity_id, p_cp_type);
2036         FETCH is_contact_point_exist INTO l_parent_id, l_parent_table;
2037         CLOSE is_contact_point_exist;
2038         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id OR l_parent_table <> l_input_parent_table) THEN
2039           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2040           FND_MSG_PUB.ADD;
2041           RETURN 'E';
2042         END IF;
2043         l_dummy := 'X';
2044       ELSIF(p_entity_type = 'HZ_PARTY_SITES') THEN
2045         OPEN is_party_site_exist(p_entity_id);
2046         FETCH is_party_site_exist INTO l_parent_id;
2047         CLOSE is_party_site_exist;
2048         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2049           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2050           FND_MSG_PUB.ADD;
2051           RETURN 'E';
2052         END IF;
2053         l_dummy := 'X';
2054       ELSIF(p_entity_type = 'HZ_LOCATIONS') THEN
2055         OPEN is_location_exist(p_entity_id);
2056         FETCH is_location_exist INTO l_dummy;
2057         CLOSE is_location_exist;
2058       ELSIF(p_entity_type = 'HZ_PARTIES') THEN
2059         OPEN is_party_exist(p_entity_id);
2060         FETCH is_party_exist INTO l_dummy;
2061         CLOSE is_party_exist;
2062       ELSIF(p_entity_type = 'HZ_ORG_CONTACTS') THEN
2063         OPEN is_org_contact_exist(p_entity_id);
2064         FETCH is_org_contact_exist INTO l_parent_id;
2065         CLOSE is_org_contact_exist;
2066         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2067           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2068           FND_MSG_PUB.ADD;
2069           RETURN 'E';
2070         END IF;
2071         l_dummy := 'X';
2072       ELSIF(p_entity_type = 'HZ_CUST_ACCOUNTS') THEN
2073         OPEN is_cust_account_exist(p_entity_id);
2074         FETCH is_cust_account_exist INTO l_parent_id;
2075         CLOSE is_cust_account_exist;
2076         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2077           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2078           FND_MSG_PUB.ADD;
2079           RETURN 'E';
2080         END IF;
2081         l_dummy := 'X';
2082       ELSIF(p_entity_type = 'HZ_CUST_ACCT_SITES_ALL') THEN
2083         OPEN is_cust_acct_site_exist(p_entity_id);
2084         FETCH is_cust_acct_site_exist INTO l_parent_id;
2085         CLOSE is_cust_acct_site_exist;
2086         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2087           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2088           FND_MSG_PUB.ADD;
2089           RETURN 'E';
2090         END IF;
2091         l_dummy := 'X';
2092       ELSIF(p_entity_type = 'HZ_CUST_SITE_USES_ALL') THEN
2093         OPEN is_cust_site_use_exist(p_entity_id);
2094         FETCH is_cust_site_use_exist INTO l_parent_id;
2095         CLOSE is_cust_site_use_exist;
2096         IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2097           FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2098           FND_MSG_PUB.ADD;
2099           RETURN 'E';
2100         END IF;
2101         l_dummy := 'X';
2102       ELSIF(p_entity_type = 'HZ_CUST_ACCOUNT_ROLES') THEN
2103         OPEN is_cust_acct_role_exist(p_entity_id);
2104         FETCH is_cust_acct_role_exist INTO l_parent_id, l_acct_site_id;
2105         CLOSE is_cust_acct_role_exist;
2106         IF(p_parent_obj_type = 'CUST_ACCT_SITE') THEN
2107           IF(l_parent_id IS NULL OR l_acct_site_id <> p_parent_id) THEN
2108             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2109             FND_MSG_PUB.ADD;
2110             RETURN 'E';
2111           END IF;
2112         ELSIF(p_parent_obj_type = 'CUST_ACCT') THEN
2113           IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id) THEN
2114             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2115             FND_MSG_PUB.ADD;
2116             RETURN 'E';
2117           END IF;
2118         END IF;
2119         l_dummy := 'X';
2120       END IF;
2121     END IF;
2122 
2123     IF(l_ss_flag = 'Y') THEN
2124       -- Get how many rows return
2125       l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
2126                    p_orig_system           => p_entity_os,
2127                    p_orig_system_reference => p_entity_osr,
2128                    p_owner_table_name      => p_entity_type);
2129 
2130       IF(l_count > 0) THEN
2131         HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
2132           p_orig_system           => p_entity_os,
2133           p_orig_system_reference => p_entity_osr,
2134           p_owner_table_name      => p_entity_type,
2135           x_owner_table_id        => l_owner_table_id,
2136           x_return_status         => l_return_status);
2137 
2138         -- For contact point, check if the id and type is the same
2139         IF(p_entity_type = 'HZ_CONTACT_POINTS') THEN
2140           OPEN is_contact_point_exist(l_owner_table_id, p_cp_type);
2141           FETCH is_contact_point_exist INTO l_parent_id, l_parent_table;
2142           CLOSE is_contact_point_exist;
2143           IF(l_parent_id IS NULL OR l_parent_id <> p_parent_id OR l_parent_table <> l_input_parent_table) THEN
2144             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_ID');
2145             FND_MSG_PUB.ADD;
2146             RETURN 'E';
2147           END IF;
2148         END IF;
2149       END IF;
2150     END IF;
2151 
2152     -- no TCA id
2153     IF(p_entity_id IS NULL) THEN
2154       -- ssm is invalid
2155       IF(l_ss_flag = 'Y') AND (l_count = 0) THEN
2156         RETURN 'C';
2157       END IF;
2158       -- ssm is valid
2159       IF(l_ss_flag = 'Y') AND (l_count > 0) AND (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2160         RETURN 'U';
2161       ELSE
2162         RETURN 'E';
2163       END IF;
2164     ELSE
2165       -- invalid TCA id
2166       IF(l_dummy IS NULL) THEN
2167         -- ssm is valid
2168         IF(l_ss_flag = 'Y') AND (l_count > 0) AND (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2169           RETURN 'E';
2170         END IF;
2171         RETURN 'C';
2172       -- valid TCA id
2173       ELSE
2174         RETURN 'U';
2175       END IF;
2176     END IF;
2177   END check_bo_op;
2178 
2179 -- PROCEDURE check_party_usage_op
2180 --
2181 -- DESCRIPTION
2182 --     Checks if a row exists in  party_usg_assigments table for agiven
2183 --      party_id and party_usages_code.
2184 --     If exists Return last_update_date value. otherwise null.
2185 --
2186 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2187 --
2188 -- ARGUMENTS
2189 --   IN:
2190 --    p_party_id              id of a party for whicch party_usage was created.
2191 --    p_party_usage_code         seeded usage code.
2192 
2193 --   OUT:
2194 --    x_last_update_date       last_update_date column,
2195 --    x_return_status              status of the call
2196 -- NOTES
2197 --
2198 -- MODIFICATION HISTORY
2199 --
2200 --   01-Mar-2006    Hadi Alatasi   o Created.
2201 
2202   PROCEDURE check_party_usage_op(
2203     p_party_id                   IN     NUMBER,
2204     p_party_usage_code          IN     VARCHAR2,
2205     x_last_update_date          OUT NOCOPY DATE,
2206     x_return_status              OUT NOCOPY VARCHAR2
2207   ) IS
2208     CURSOR is_usg_exist(l_party_id NUMBER, l_party_usage_code VARCHAR2 ) IS
2209     SELECT last_update_date
2210     FROM HZ_PARTY_USG_ASSIGNMENTS
2211     WHERE PARTY_USAGE_CODE = l_party_usage_code
2212 	AND PARTY_ID= l_party_id
2213     AND rownum = 1;
2214 
2215     l_party_id    NUMBER;
2216   BEGIN
2217     x_return_status := FND_API.G_RET_STS_SUCCESS;
2218     IF(p_party_usage_code IS NULL OR p_party_id IS NULL) THEN
2219       x_last_update_date := NULL;
2220     ELSE
2221       OPEN is_usg_exist(p_party_id,p_party_usage_code);
2222       FETCH is_usg_exist INTO x_last_update_date;
2223       CLOSE is_usg_exist;
2224     END IF;
2225   EXCEPTION
2226    when NO_DATA_FOUND then
2227      x_last_update_date := NULL;
2228    when OTHERS then
2229      x_return_status := FND_API.G_RET_STS_ERROR;
2230 
2231   END check_party_usage_op;
2232 
2233 
2234 -- PRIVATE FUNCTION is_ss_provided
2235 --
2236 -- DESCRIPTION
2237 --     Return a flag to indicate that original system and original system reference
2238 --     are provided.
2239 --
2240 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2241 --
2242 -- ARGUMENTS
2243 --   IN:
2244 --     p_os                     Original system.
2245 --     p_osr                    Original system reference.
2246 -- NOTES
2247 --
2248 -- MODIFICATION HISTORY
2249 --
2250 --   13-Jul-2005    Arnold Ng   o Created.
2251 
2252   FUNCTION is_ss_provided(
2253     p_os                  IN     VARCHAR2,
2254     p_osr                 IN     VARCHAR2
2255   ) RETURN VARCHAR2 IS
2256   BEGIN
2257     IF((p_os is null or p_os = fnd_api.g_miss_char)
2258       and (p_osr is null or p_osr = fnd_api.g_miss_char))THEN
2259       RETURN 'N';
2260     ELSE
2261       RETURN 'Y';
2262     END IF;
2263   END is_ss_provided;
2264 
2265 -- FUNCTION get_owner_table_name
2266 --
2267 -- DESCRIPTION
2268 --     Return the owner table name based on object type.
2269 --
2270 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2271 --
2272 -- ARGUMENTS
2273 --   IN:
2274 --     p_obj_type               Object type.
2275 -- NOTES
2276 --
2277 -- MODIFICATION HISTORY
2278 --
2279 --   13-Jul-2005    Arnold Ng   o Created.
2280 
2281   FUNCTION get_owner_table_name(
2282     p_obj_type            IN     VARCHAR2
2283   ) RETURN VARCHAR2 IS
2284   BEGIN
2285     -- Base on HZ_BUSINESS_OBJECTS lookup code
2286     IF(p_obj_type = 'PARTY_SITE') THEN
2287       RETURN 'HZ_PARTY_SITES';
2288     ELSIF((p_obj_type = 'ORG') OR (p_obj_type = 'PERSON') OR (p_obj_type = 'ORG_CONTACT')) THEN
2289       RETURN 'HZ_PARTIES';
2290     ELSIF((p_obj_type = 'ORG_CUST') OR (p_obj_type = 'PERSON_CUST') OR (p_obj_type = 'CUST_ACCT')) THEN
2291       RETURN 'HZ_CUST_ACCOUNTS';
2292     ELSIF(p_obj_type = 'CUST_ACCT_CONTACT') THEN
2293       RETURN 'HZ_CUST_ACCOUNT_ROLES';
2294     ELSIF(p_obj_type = 'CUST_ACCT_SITE') THEN
2295       RETURN 'HZ_CUST_ACCT_SITES_ALL';
2296     ELSIF(p_obj_type in ('PHONE', 'EMAIL', 'TLX', 'WEB', 'EDI', 'EFT', 'SMS')) THEN
2297       RETURN 'HZ_CONTACT_POINTS';
2298     ELSIF(p_obj_type = 'LOCATION') THEN
2299       RETURN 'HZ_LOCATIONS';
2300     ELSIF(p_obj_type = 'CUST_ACCT_SITE_USE') THEN
2301       RETURN 'HZ_CUST_SITE_USES_ALL';
2302     END IF;
2303     RETURN NULL;
2304   END get_owner_table_name;
2305 
2306 -- FUNCTION get_parent_object_type
2307 --
2308 -- DESCRIPTION
2309 --     Return the object type based on parent table and Id.
2310 --
2311 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2312 --
2313 -- ARGUMENTS
2314 --   IN:
2315 --     p_parent_table_name      Parent table name.
2316 --     p_parent_id              Parent Id.
2317 -- NOTES
2318 --
2319 -- MODIFICATION HISTORY
2320 --
2321 --   13-Jul-2005    Arnold Ng   o Created.
2322 
2323   FUNCTION get_parent_object_type(
2324     p_parent_table_name         IN     VARCHAR2,
2325     p_parent_id                 IN     NUMBER
2326   ) RETURN VARCHAR2 IS
2327 
2328     l_party_type VARCHAR2(30) := null;
2329 
2330     CURSOR c1 IS
2331       SELECT party_type FROM hz_parties
2332       WHERE party_id = p_parent_id;
2333 
2334     CURSOR c2 IS
2335       SELECT party_type
2336       FROM hz_parties p, hz_cust_accounts ca
2337       WHERE p.party_id = ca.party_id
2338       AND ca.cust_account_id = p_parent_id;
2339 
2340   BEGIN
2341     -- Base on owner_table_name to return HZ_BUSINESS_OBJECTS lookup code
2342     IF p_parent_table_name = 'HZ_PARTIES' THEN
2343       OPEN c1;
2344       FETCH c1 INTO l_party_type;
2345       CLOSE c1;
2346     ELSIF p_parent_table_name = 'HZ_CUST_ACCOUNTS' THEN
2347       OPEN c2;
2348       FETCH c2 INTO l_party_type;
2349       CLOSE c2;
2350     END IF;
2351 
2352     IF(p_parent_table_name = 'HZ_PARTY_SITES') THEN
2353       RETURN 'PARTY_SITE';
2354     ELSIF(p_parent_table_name = 'HZ_PARTIES') THEN
2355       IF(l_party_type = 'ORGANIZATION') THEN
2356         RETURN 'ORG';
2357       ELSIF(l_party_type = 'PERSON') THEN
2358         RETURN 'PERSON';
2359       ELSIF(l_party_type = 'PARTY_RELATIONSHIP') THEN
2360         RETURN 'ORG_CONTACT';
2361       END IF;
2362     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNTS') THEN
2363       IF(l_party_type = 'ORGANIZATION') THEN
2364         RETURN 'ORG_CUST';
2365       ELSIF(l_party_type = 'PERSON') THEN
2366         RETURN 'PERSON_CUST';
2367       ELSIF(l_party_type IS NULL) THEN
2368         RETURN 'CUST_ACCT';
2369       END IF;
2370     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNT_ROLES') THEN
2371       RETURN 'CUST_ACCT_CONTACT';
2372     ELSIF(p_parent_table_name = 'HZ_CUST_ACCT_SITES_ALL') THEN
2373       RETURN 'CUST_ACCT_SITE';
2374     END IF;
2375     RETURN NULL;
2376   END get_parent_object_type;
2377 
2378 -- FUNCTION is_cp_bo_comp
2379 --
2380 -- DESCRIPTION
2381 --     Return true if contact point object is complete.  Otherwise, return false.
2382 --
2383 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2384 --
2385 -- ARGUMENTS
2386 --   IN:
2387 --     p_phone_objs             List of phone business objects.
2388 --     p_email_objs             List of email business objects.
2389 --     p_telex_objs             List of telex business objects.
2390 --     p_web_objs               List of web business objects.
2391 --     p_edi_objs               List of edi business objects.
2392 --     p_eft_objs               List of eft business objects.
2393 --     p_sms_objs               List of sms business objects.
2394 --     p_bus_object             Business object structure for contact point.
2395 -- NOTES
2396 --
2397 -- MODIFICATION HISTORY
2398 --
2399 --   13-Jul-2005    Arnold Ng   o Created.
2400 
2401   FUNCTION is_cp_bo_comp(
2402     p_phone_objs              IN     HZ_PHONE_CP_BO_TBL,
2403     p_email_objs              IN     HZ_EMAIL_CP_BO_TBL,
2404     p_telex_objs              IN     HZ_TELEX_CP_BO_TBL,
2405     p_web_objs                IN     HZ_WEB_CP_BO_TBL,
2406     p_edi_objs                IN     HZ_EDI_CP_BO_TBL,
2407     p_eft_objs                IN     HZ_EFT_CP_BO_TBL,
2408     p_sms_objs                IN     HZ_SMS_CP_BO_TBL,
2409     p_bus_object              IN     COMPLETENESS_REC_TYPE
2410   ) RETURN BOOLEAN IS
2411 
2412     l_phone_cpref             BOOLEAN;
2413     l_email_cpref             BOOLEAN;
2414     l_telex_cpref             BOOLEAN;
2415     l_web_cpref               BOOLEAN;
2416     l_edi_cpref               BOOLEAN;
2417     l_eft_cpref               BOOLEAN;
2418     l_sms_cpref               BOOLEAN;
2419     l_bus_object              COMPLETENESS_REC_TYPE;
2420     l_bo_num                  NUMBER;
2421   BEGIN
2422     -- Contact point only has contact preference entity, use boolean to
2423     -- indicate whether it must be present or not
2424     l_bo_num       := 0;
2425     l_phone_cpref  := FALSE;
2426     l_email_cpref  := FALSE;
2427     l_telex_cpref  := FALSE;
2428     l_web_cpref    := FALSE;
2429     l_edi_cpref    := FALSE;
2430     l_eft_cpref    := FALSE;
2431     l_sms_cpref    := FALSE;
2432     l_bus_object.business_object_code := boc_tbl();
2433     l_bus_object.child_bo_code := cbc_tbl();
2434     l_bus_object.tca_mandated_flag := tmf_tbl();
2435     l_bus_object.user_mandated_flag := umf_tbl();
2436     l_bus_object.root_node_flag := rnf_tbl();
2437     l_bus_object.entity_name := ent_tbl();
2438 
2439     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2440       -- get all entity of contact point, for contact point, the only possible
2441       -- entity is HZ_CONTACT_PREFERENCES
2442       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2443          p_bus_object.user_mandated_flag(i) = 'Y' AND
2444          p_bus_object.root_node_flag(i) = 'N') THEN
2445         CASE
2446           WHEN p_bus_object.business_object_code(i) = 'PHONE' THEN
2447             l_phone_cpref := TRUE;
2448           WHEN p_bus_object.business_object_code(i) = 'EMAIL' THEN
2449             l_email_cpref := TRUE;
2450           WHEN p_bus_object.business_object_code(i) = 'TELEX' THEN
2451             l_telex_cpref := TRUE;
2452           WHEN p_bus_object.business_object_code(i) = 'WEB' THEN
2453             l_web_cpref := TRUE;
2454           WHEN p_bus_object.business_object_code(i) = 'EDI' THEN
2455             l_edi_cpref := TRUE;
2456           WHEN p_bus_object.business_object_code(i) = 'EFT' THEN
2457             l_eft_cpref := TRUE;
2458           WHEN p_bus_object.business_object_code(i) = 'SMS' THEN
2459             l_sms_cpref := TRUE;
2460           ELSE
2461             null;
2462         END CASE;
2463       ELSIF(p_bus_object.tca_mandated_flag(i) = 'Y' AND
2464             p_bus_object.user_mandated_flag(i) = 'Y' AND
2465             p_bus_object.root_node_flag(i) = 'Y') THEN
2466         l_bo_num := l_bo_num + 1;
2467         l_bus_object.business_object_code.EXTEND;
2468         l_bus_object.child_bo_code.EXTEND;
2469         l_bus_object.tca_mandated_flag.EXTEND;
2470         l_bus_object.user_mandated_flag.EXTEND;
2471         l_bus_object.root_node_flag.EXTEND;
2472         l_bus_object.entity_name.EXTEND;
2473         l_bus_object.business_object_code(l_bo_num) := p_bus_object.business_object_code(i);
2474         l_bus_object.child_bo_code(l_bo_num) := p_bus_object.child_bo_code(i);
2475         l_bus_object.tca_mandated_flag(l_bo_num) := p_bus_object.tca_mandated_flag(i);
2476         l_bus_object.user_mandated_flag(l_bo_num) := p_bus_object.user_mandated_flag(i);
2477         l_bus_object.root_node_flag(l_bo_num) := p_bus_object.root_node_flag(i);
2478         l_bus_object.entity_name(l_bo_num) := p_bus_object.entity_name(i);
2479       END IF;
2480     END LOOP;
2481 
2482     -- loop through l_bus_object to find out which contact point must be present
2483     FOR i IN 1..l_bo_num LOOP
2484       CASE
2485         WHEN l_bus_object.business_object_code(i) = 'PHONE' THEN
2486           IF(p_phone_objs IS NULL OR p_phone_objs.COUNT < 1) THEN
2487             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2488             fnd_message.set_token('OBJECT' ,'PHONE');
2489             fnd_msg_pub.add;
2490             RETURN FALSE;
2491           ELSE
2492             FOR j IN 1..p_phone_objs.COUNT LOOP
2493               IF(l_phone_cpref AND
2494                  (p_phone_objs(j).contact_pref_objs IS NULL OR
2495                   p_phone_objs(j).contact_pref_objs.COUNT < 1)) THEN
2496                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2497                 fnd_message.set_token('ENTITY' ,'PHONE-CONTACT_PREFERENCE');
2498                 fnd_msg_pub.add;
2499                 RETURN FALSE;
2500               END IF;
2501             END LOOP;
2502           END IF;
2503         WHEN l_bus_object.business_object_code(i) = 'EMAIL' THEN
2504           IF(p_email_objs IS NULL OR p_email_objs.COUNT < 1) THEN
2505             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2506             fnd_message.set_token('OBJECT' ,'EMAIL');
2507             fnd_msg_pub.add;
2508             RETURN FALSE;
2509           ELSE
2510             FOR j IN 1..p_email_objs.COUNT LOOP
2511               IF(l_email_cpref AND
2512                  (p_email_objs(j).contact_pref_objs IS NULL OR
2513                   p_email_objs(j).contact_pref_objs.COUNT < 1)) THEN
2514                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2515                 fnd_message.set_token('ENTITY' ,'EMAIL-CONTACT_PREFERENCE');
2516                 fnd_msg_pub.add;
2517                 RETURN FALSE;
2518               END IF;
2519             END LOOP;
2520           END IF;
2521         WHEN l_bus_object.business_object_code(i) = 'TLX' THEN
2522           IF(p_telex_objs IS NULL OR p_telex_objs.COUNT < 1) THEN
2523             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2524             fnd_message.set_token('OBJECT' ,'TELEX');
2525             fnd_msg_pub.add;
2526             RETURN FALSE;
2527           ELSE
2528             FOR j IN 1..p_telex_objs.COUNT LOOP
2529               IF(l_telex_cpref AND
2530                  (p_telex_objs(j).contact_pref_objs IS NULL OR
2531                   p_telex_objs(j).contact_pref_objs.COUNT < 1)) THEN
2532                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2533                 fnd_message.set_token('ENTITY' ,'TLX-CONTACT_PREFERENCE');
2534                 fnd_msg_pub.add;
2535                 RETURN FALSE;
2536               END IF;
2537             END LOOP;
2538           END IF;
2539         WHEN l_bus_object.business_object_code(i) = 'WEB' THEN
2540           IF(p_web_objs IS NULL OR p_web_objs.COUNT < 1) THEN
2541             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2542             fnd_message.set_token('OBJECT' ,'WEB');
2543             fnd_msg_pub.add;
2544             RETURN FALSE;
2545           ELSE
2546             FOR j IN 1..p_web_objs.COUNT LOOP
2547               IF(l_web_cpref AND
2548                  (p_web_objs(j).contact_pref_objs IS NULL OR
2549                   p_web_objs(j).contact_pref_objs.COUNT < 1)) THEN
2550                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2551                 fnd_message.set_token('ENTITY' ,'WEB-CONTACT_PREFERENCE');
2552                 fnd_msg_pub.add;
2553                 RETURN FALSE;
2554               END IF;
2555             END LOOP;
2556           END IF;
2557         WHEN l_bus_object.business_object_code(i) = 'EDI' THEN
2558           IF(p_edi_objs IS NULL OR p_edi_objs.COUNT < 1) THEN
2559             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2560             fnd_message.set_token('OBJECT' ,'EDI');
2561             fnd_msg_pub.add;
2562             RETURN FALSE;
2563           ELSE
2564             FOR j IN 1..p_edi_objs.COUNT LOOP
2565               IF(l_edi_cpref AND
2566                  (p_edi_objs(j).contact_pref_objs IS NULL OR
2567                   p_edi_objs(j).contact_pref_objs.COUNT < 1)) THEN
2568                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2569                 fnd_message.set_token('ENTITY' ,'EDI-CONTACT_PREFERENCE');
2570                 fnd_msg_pub.add;
2571                 RETURN FALSE;
2572               END IF;
2573             END LOOP;
2574           END IF;
2575         WHEN l_bus_object.business_object_code(i) = 'EFT' THEN
2576           IF(p_eft_objs IS NULL OR p_eft_objs.COUNT < 1) THEN
2577             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2578             fnd_message.set_token('OBJECT' ,'EFT');
2579             fnd_msg_pub.add;
2580             RETURN FALSE;
2581           ELSE
2582             FOR j IN 1..p_eft_objs.COUNT LOOP
2583               IF(l_eft_cpref AND
2584                  (p_eft_objs(j).contact_pref_objs IS NULL OR
2585                   p_eft_objs(j).contact_pref_objs.COUNT < 1)) THEN
2586                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2587                 fnd_message.set_token('ENTITY' ,'EFT-CONTACT_PREFERENCE');
2588                 fnd_msg_pub.add;
2589                 RETURN FALSE;
2590               END IF;
2591             END LOOP;
2592           END IF;
2593         WHEN l_bus_object.business_object_code(i) = 'SMS' THEN
2594           IF(p_sms_objs IS NULL OR p_sms_objs.COUNT < 1) THEN
2595             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2596             fnd_message.set_token('OBJECT' ,'SMS');
2597             fnd_msg_pub.add;
2598             RETURN FALSE;
2599           ELSE
2600             FOR j IN 1..p_sms_objs.COUNT LOOP
2601               IF(l_sms_cpref AND
2602                  (p_sms_objs(j).contact_pref_objs IS NULL OR
2603                   p_sms_objs(j).contact_pref_objs.COUNT < 1)) THEN
2604                 fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2605                 fnd_message.set_token('ENTITY' ,'SMS-CONTACT_PREFERENCE');
2606                 fnd_msg_pub.add;
2607                 RETURN FALSE;
2608               END IF;
2609             END LOOP;
2610           END IF;
2611         ELSE
2612           null;
2613         END CASE;
2614     END LOOP;
2615 
2616     RETURN TRUE;
2617   END is_cp_bo_comp;
2618 
2619 -- FUNCTION is_ps_bo_comp
2620 --
2621 -- DESCRIPTION
2622 --     Return true if party site object is complete.  Otherwise, return false.
2623 --
2624 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2625 --
2626 -- ARGUMENTS
2627 --   IN:
2628 --     p_ps_objs                List of party site business objects.
2629 --     p_bus_object             Business object structure for party site.
2630 -- NOTES
2631 --
2632 -- MODIFICATION HISTORY
2633 --
2634 --   13-Jul-2005    Arnold Ng   o Created.
2635 
2636   FUNCTION is_ps_bo_comp(
2637     p_ps_objs                 IN     HZ_PARTY_SITE_BO_TBL,
2638     p_bus_object              IN     COMPLETENESS_REC_TYPE
2639   ) RETURN BOOLEAN IS
2640 
2641     l_bus_object              COMPLETENESS_REC_TYPE;
2642     l_cp_bus_object           COMPLETENESS_REC_TYPE;
2643     l_valid_obj               BOOLEAN;
2644     l_psu                     BOOLEAN;
2645     l_cpref                   BOOLEAN;
2646     l_ps_ext                  BOOLEAN;
2647     l_loc_ext                 BOOLEAN;
2648     l_phone_code              VARCHAR2(30);
2649     l_telex_code              VARCHAR2(30);
2650     l_email_code              VARCHAR2(30);
2651     l_web_code                VARCHAR2(30);
2652   BEGIN
2653     l_psu          := FALSE;
2654     l_cpref        := FALSE;
2655     l_ps_ext       := FALSE;
2656     l_loc_ext      := FALSE;
2657     l_phone_code   := NULL;
2658     l_telex_code   := NULL;
2659     l_email_code   := NULL;
2660     l_web_code     := NULL;
2661 
2662     IF(p_ps_objs IS NULL OR p_ps_objs.COUNT < 1) THEN
2663       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2664       fnd_message.set_token('OBJECT' ,'PARTY_SITE');
2665       fnd_msg_pub.add;
2666       RETURN FALSE;
2667     END IF;
2668 
2669     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2670       -- get all entities of party site, for party site, the only possible
2671       -- entites are HZ_PARTY_SITE_USES, HZ_CONTACT_PREFERENCES
2672       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2673          p_bus_object.user_mandated_flag(i) = 'Y' AND
2674          p_bus_object.business_object_code(i) = 'PARTY_SITE' AND
2675          p_bus_object.child_bo_code(i) IS NULL) THEN
2676         CASE
2677           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_SITE_USES' THEN
2678             l_psu := TRUE;
2679           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
2680             l_cpref := TRUE;
2681           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_SITES_EXT_VL' THEN
2682             l_ps_ext := TRUE;
2683         END CASE;
2684       -- Get contact point business object
2685       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
2686             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2687         CASE
2688           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
2689             l_phone_code := 'PHONE';
2690           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
2691             l_telex_code := 'TLX';
2692           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
2693             l_email_code := 'EMAIL';
2694           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
2695             l_web_code := 'WEB';
2696           ELSE
2697             null;
2698         END CASE;
2699       -- Get location object
2700       ELSIF(p_bus_object.business_object_code(i) = 'LOCATION' AND
2701             p_bus_object.user_mandated_flag(i) = 'Y' AND
2702             p_bus_object.tca_mandated_flag(i) = 'N' AND
2703             p_bus_object.child_bo_code(i) IS NULL) THEN
2704         IF p_bus_object.entity_name(i) = 'HZ_LOCATIONS_EXT_VL' THEN
2705           l_loc_ext := TRUE;
2706         END IF;
2707       END IF;
2708     END LOOP;
2709 
2710     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
2711        l_email_code IS NOT NULL OR l_web_code IS NOT NULL) THEN
2712       get_cp_from_rec(
2713         p_phone_code         => l_phone_code,
2714         p_email_code         => l_email_code,
2715         p_telex_code         => l_telex_code,
2716         p_web_code           => l_web_code,
2717         p_edi_code           => NULL,
2718         p_eft_code           => NULL,
2719         p_sms_code           => NULL,
2720         p_bus_object         => p_bus_object,
2721         x_bus_object         => l_cp_bus_object
2722       );
2723     END IF;
2724 
2725     FOR i IN 1..p_ps_objs.COUNT LOOP
2726       IF(p_ps_objs(i).location_obj IS NULL) THEN
2727         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
2728         fnd_message.set_token('OBJECT' ,'LOCATION');
2729         fnd_msg_pub.add;
2730         RETURN FALSE;
2731       END IF;
2732       IF(l_psu AND
2733         (p_ps_objs(i).party_site_use_objs IS NULL OR
2734          p_ps_objs(i).party_site_use_objs.COUNT < 1)) THEN
2735         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2736         fnd_message.set_token('OBJECT' ,'PARTY_SITE_USE');
2737         fnd_msg_pub.add;
2738         RETURN FALSE;
2739       END IF;
2740       IF(l_cpref AND
2741          (p_ps_objs(i).contact_pref_objs IS NULL OR
2742           p_ps_objs(i).contact_pref_objs.COUNT < 1)) THEN
2743         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2744         fnd_message.set_token('OBJECT' ,'PARTY_SITE: CONTACT_PREFERENCE');
2745         fnd_msg_pub.add;
2746         RETURN FALSE;
2747       END IF;
2748       IF(l_ps_ext AND
2749          (p_ps_objs(i).ext_attributes_objs IS NULL OR
2750           p_ps_objs(i).ext_attributes_objs.COUNT < 1)) THEN
2751         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2752         fnd_message.set_token('OBJECT' ,'PARTY_SITE: EXTENSIBILITY');
2753         fnd_msg_pub.add;
2754         RETURN FALSE;
2755       END IF;
2756       IF(l_loc_ext AND
2757          (p_ps_objs(i).location_obj.ext_attributes_objs IS NULL OR
2758           p_ps_objs(i).location_obj.ext_attributes_objs.COUNT < 1)) THEN
2759         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2760         fnd_message.set_token('OBJECT' ,'LOCATION: EXTENSIBILITY');
2761         fnd_msg_pub.add;
2762         RETURN FALSE;
2763       END IF;
2764       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
2765          l_email_code IS NOT NULL OR l_web_code IS NOT NULL) THEN
2766         -- check contact point business object for party site
2767         l_valid_obj := is_cp_bo_comp(
2768                          p_phone_objs             => p_ps_objs(i).phone_objs,
2769                          p_email_objs             => p_ps_objs(i).email_objs,
2770                          p_telex_objs             => p_ps_objs(i).telex_objs,
2771                          p_web_objs               => p_ps_objs(i).web_objs,
2772                          p_edi_objs               => NULL,
2773                          p_eft_objs               => NULL,
2774                          p_sms_objs               => NULL,
2775                          p_bus_object             => l_cp_bus_object
2776                        );
2777         IF NOT(l_valid_obj) THEN
2778           RETURN FALSE;
2779         END IF;
2780       END IF;
2781     END LOOP;
2782 
2783     RETURN TRUE;
2784   END is_ps_bo_comp;
2785 
2786 -- FUNCTION is_person_bo_comp
2787 --
2788 -- DESCRIPTION
2789 --     Return true if person object is complete.  Otherwise, return false.
2790 --
2791 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2792 --
2793 -- ARGUMENTS
2794 --   IN:
2795 --     p_person_obj             Person business objects.
2796 --     p_bus_object             Business object structure for person.
2797 -- NOTES
2798 --
2799 -- MODIFICATION HISTORY
2800 --
2801 --   13-Jul-2005    Arnold Ng   o Created.
2802 
2803   FUNCTION is_person_bo_comp(
2804     p_person_obj              IN     HZ_PERSON_BO,
2805     p_bus_object              IN     COMPLETENESS_REC_TYPE
2806   ) RETURN BOOLEAN IS
2807     l_bus_object              COMPLETENESS_REC_TYPE;
2808     l_cp_bus_object           COMPLETENESS_REC_TYPE;
2809     l_ps_bus_object           COMPLETENESS_REC_TYPE;
2810     l_valid_obj               BOOLEAN;
2811 
2812     l_pref                    BOOLEAN;
2813     l_rel                     BOOLEAN;
2814     l_class                   BOOLEAN;
2815     l_lang                    BOOLEAN;
2816     l_edu                     BOOLEAN;
2817     l_citiz                   BOOLEAN;
2818     l_emp_hist                BOOLEAN;
2819     l_work_class              BOOLEAN;
2820     l_int                     BOOLEAN;
2821     l_cert                    BOOLEAN;
2822     l_fin_prof                BOOLEAN;
2823     l_cpref                   BOOLEAN;
2824     l_ps                      BOOLEAN;
2825     l_ext                     BOOLEAN;
2826 
2827     l_phone_code              VARCHAR2(30);
2828     l_email_code              VARCHAR2(30);
2829     l_web_code                VARCHAR2(30);
2830     l_sms_code                VARCHAR2(30);
2831   BEGIN
2832     l_pref         := FALSE;
2833     l_rel          := FALSE;
2834     l_class        := FALSE;
2835     l_lang         := FALSE;
2836     l_edu          := FALSE;
2837     l_citiz        := FALSE;
2838     l_emp_hist     := FALSE;
2839     l_work_class   := FALSE;
2840     l_int          := FALSE;
2841     l_cert         := FALSE;
2842     l_fin_prof     := FALSE;
2843     l_cpref        := FALSE;
2844     l_ps           := FALSE;
2845     l_ext          := FALSE;
2846 
2847     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
2848       -- get all entities of person, for person, the possible entites are
2849       -- HZ_PARTY_PREFERENCES, HZ_RELATIONSHIPS, HZ_CODE_ASSIGNMENTS,
2850       -- HZ_PERSON_LANGUAGE, HZ_EDUCATION, HZ_CITIZENSHIP, HZ_EMPLOYMENT_HISTORY
2851       -- HZ_PERSON_INTEREST, HZ_CERTIFICATIONS, HZ_FINANCIAL_PROFILE,
2852       -- HZ_CONTACT_PREFERENCES
2853       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
2854          p_bus_object.user_mandated_flag(i) = 'Y' AND
2855          p_bus_object.business_object_code(i) = 'PERSON' AND
2856          p_bus_object.child_bo_code(i) IS NULL) THEN
2857         CASE
2858           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_PREFERENCES' THEN
2859             l_pref := TRUE;
2860           WHEN p_bus_object.entity_name(i) = 'HZ_RELATIONSHIPS' THEN
2861             l_rel := TRUE;
2862           WHEN p_bus_object.entity_name(i) = 'HZ_CODE_ASSIGNMENTS' THEN
2863             l_class := TRUE;
2864           WHEN p_bus_object.entity_name(i) = 'HZ_PERSON_LANGUAGE' THEN
2865             l_lang := TRUE;
2866           WHEN p_bus_object.entity_name(i) = 'HZ_EDUCATION' THEN
2867             l_edu := TRUE;
2868           WHEN p_bus_object.entity_name(i) = 'HZ_CITIZENSHIP' THEN
2869             l_citiz := TRUE;
2870           WHEN p_bus_object.entity_name(i) = 'HZ_PERSON_INTEREST' THEN
2871             l_int := TRUE;
2872           WHEN p_bus_object.entity_name(i) = 'HZ_CERTIFICATIONS' THEN
2873             l_cert := TRUE;
2874           WHEN p_bus_object.entity_name(i) = 'HZ_FINANCIAL_PROFILE' THEN
2875             l_fin_prof := TRUE;
2876           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
2877             l_cpref := TRUE;
2878           WHEN p_bus_object.entity_name(i) = 'HZ_PER_PROFILES_EXT_VL' THEN
2879             l_ext := TRUE;
2880         END CASE;
2881       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
2882             p_bus_object.business_object_code(i) = 'PERSON' AND
2883             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2884         CASE
2885           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
2886             l_phone_code := 'PHONE';
2887           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
2888             l_email_code := 'EMAIL';
2889           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
2890             l_web_code := 'WEB';
2891           WHEN p_bus_object.child_bo_code(i) = 'SMS' THEN
2892             l_sms_code := 'SMS';
2893           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
2894             l_ps := TRUE;
2895           WHEN p_bus_object.child_bo_code(i) = 'EMP_HIST' THEN
2896             l_emp_hist := TRUE;
2897         END CASE;
2898       ELSIF(p_bus_object.business_object_code(i) = 'EMP_HIST' AND
2899             p_bus_object.entity_name(i) = 'HZ_WORK_CLASS' AND
2900             p_bus_object.user_mandated_flag(i) = 'Y') THEN
2901         l_work_class := TRUE;
2902       END IF;
2903     END LOOP;
2904 
2905     IF(l_phone_code IS NOT NULL OR l_email_code IS NOT NULL OR
2906        l_web_code IS NOT NULL OR l_sms_code IS NOT NULL) THEN
2907       get_cp_from_rec(
2908         p_phone_code         => l_phone_code,
2909         p_email_code         => l_email_code,
2910         p_telex_code         => NULL,
2911         p_web_code           => l_web_code,
2912         p_edi_code           => NULL,
2913         p_eft_code           => NULL,
2914         p_sms_code           => l_sms_code,
2915         p_bus_object         => p_bus_object,
2916         x_bus_object         => l_cp_bus_object
2917       );
2918     END IF;
2919 
2920     IF(l_ps) THEN
2921       get_ps_from_rec(
2922         p_bus_object         => p_bus_object,
2923         x_bus_object         => l_ps_bus_object
2924       );
2925     END IF;
2926 
2927       IF(l_pref AND
2928         (p_person_obj.preference_objs IS NULL OR
2929          p_person_obj.preference_objs.COUNT < 1)) THEN
2930         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2931         fnd_message.set_token('OBJECT' ,'PARTY_PREFERENCE');
2932         fnd_msg_pub.add;
2933         RETURN FALSE;
2934       END IF;
2935       IF(l_class AND
2936         (p_person_obj.class_objs IS NULL OR
2937          p_person_obj.class_objs.COUNT < 1)) THEN
2938         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2939         fnd_message.set_token('OBJECT' ,'CLASSIFICATION');
2940         fnd_msg_pub.add;
2941         RETURN FALSE;
2942       END IF;
2943       IF(l_lang AND
2944         (p_person_obj.language_objs IS NULL OR
2945          p_person_obj.language_objs.COUNT < 1)) THEN
2946         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2947         fnd_message.set_token('OBJECT' ,'LANGUAGE');
2948         fnd_msg_pub.add;
2949         RETURN FALSE;
2950       END IF;
2951       IF(l_edu AND
2952         (p_person_obj.education_objs IS NULL OR
2953          p_person_obj.education_objs.COUNT < 1)) THEN
2954         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2955         fnd_message.set_token('OBJECT' ,'EDUCATION');
2956         fnd_msg_pub.add;
2957         RETURN FALSE;
2958       END IF;
2959       IF(l_citiz AND
2960         (p_person_obj.citizenship_objs IS NULL OR
2961          p_person_obj.citizenship_objs.COUNT < 1)) THEN
2962         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2963         fnd_message.set_token('OBJECT' ,'CITIZENSHIP');
2964         fnd_msg_pub.add;
2965         RETURN FALSE;
2966       END IF;
2967       IF(l_emp_hist AND
2968         (p_person_obj.employ_hist_objs IS NULL OR
2969          p_person_obj.employ_hist_objs.COUNT < 1)) THEN
2970         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2971         fnd_message.set_token('OBJECT' ,'EMPLOYMENT_HISTORY');
2972         fnd_msg_pub.add;
2973         RETURN FALSE;
2974         FOR j IN 1..p_person_obj.employ_hist_objs.COUNT LOOP
2975           IF(l_work_class AND
2976             (p_person_obj.employ_hist_objs(j).work_class_objs IS NULL OR
2977              p_person_obj.employ_hist_objs(j).work_class_objs.COUNT < 1)) THEN
2978             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2979             fnd_message.set_token('OBJECT' ,'WORK_CLASS');
2980             fnd_msg_pub.add;
2981             RETURN FALSE;
2982           END IF;
2983         END LOOP;
2984       END IF;
2985       IF(l_int AND
2986         (p_person_obj.interest_objs IS NULL OR
2987          p_person_obj.interest_objs.COUNT < 1)) THEN
2988         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2989         fnd_message.set_token('OBJECT' ,'PERSON_INTEREST');
2990         fnd_msg_pub.add;
2991         RETURN FALSE;
2992       END IF;
2993       IF(l_cert AND
2994         (p_person_obj.certification_objs IS NULL OR
2995          p_person_obj.certification_objs.COUNT < 1)) THEN
2996         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
2997         fnd_message.set_token('OBJECT' ,'CERTIFICATION');
2998         fnd_msg_pub.add;
2999         RETURN FALSE;
3000       END IF;
3001       IF(l_fin_prof AND
3002         (p_person_obj.financial_prof_objs IS NULL OR
3003          p_person_obj.financial_prof_objs.COUNT < 1)) THEN
3004         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3005         fnd_message.set_token('OBJECT' ,'FINANCIAL_PROFILE');
3006         fnd_msg_pub.add;
3007         RETURN FALSE;
3008       END IF;
3009       IF(l_rel AND
3010         (p_person_obj.relationship_objs IS NULL OR
3011          p_person_obj.relationship_objs.COUNT < 1)) THEN
3012         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3013         fnd_message.set_token('OBJECT' ,'RELATIONSHIP');
3014         fnd_msg_pub.add;
3015         RETURN FALSE;
3016       END IF;
3017       IF(l_cpref AND
3018         (p_person_obj.contact_pref_objs IS NULL OR
3019          p_person_obj.contact_pref_objs.COUNT < 1)) THEN
3020         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3021         fnd_message.set_token('OBJECT' ,'PERSON: CONTACT_PREFERENCE');
3022         fnd_msg_pub.add;
3023         RETURN FALSE;
3024       END IF;
3025       IF(l_ext AND
3026         (p_person_obj.ext_attributes_objs IS NULL OR
3027          p_person_obj.ext_attributes_objs.COUNT < 1)) THEN
3028         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3029         fnd_message.set_token('OBJECT' ,'PERSON: EXTENSIBILITY');
3030         fnd_msg_pub.add;
3031         RETURN FALSE;
3032       END IF;
3033       IF(l_phone_code IS NOT NULL OR l_email_code IS NOT NULL OR
3034          l_web_code IS NOT NULL OR l_sms_code IS NOT NULL) THEN
3035         -- check contact point business object for person
3036         l_valid_obj := is_cp_bo_comp(
3037                          p_phone_objs             => p_person_obj.phone_objs,
3038                          p_email_objs             => p_person_obj.email_objs,
3039                          p_telex_objs             => NULL,
3040                          p_web_objs               => p_person_obj.web_objs,
3041                          p_edi_objs               => NULL,
3042                          p_eft_objs               => NULL,
3043                          p_sms_objs               => p_person_obj.sms_objs,
3044                          p_bus_object             => l_cp_bus_object
3045                        );
3046         IF NOT(l_valid_obj) THEN
3047           RETURN FALSE;
3048         END IF;
3049       END IF;
3050       IF(l_ps) THEN
3051         -- check contact point business object for person
3052         l_valid_obj := is_ps_bo_comp(
3053                          p_ps_objs                => p_person_obj.party_site_objs,
3054                          p_bus_object             => l_ps_bus_object
3055                        );
3056         IF NOT(l_valid_obj) THEN
3057           RETURN FALSE;
3058         END IF;
3059       END IF;
3060 
3061     RETURN TRUE;
3062   END is_person_bo_comp;
3063 
3064 -- FUNCTION is_oc_bo_comp
3065 --
3066 -- DESCRIPTION
3067 --     Return true if org contact object is complete.  Otherwise, return false.
3068 --
3069 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3070 --
3071 -- ARGUMENTS
3072 --   IN:
3073 --     p_oc_objs                List of organization contact business objects.
3074 --     p_bus_object             Business object structure for organization contact.
3075 -- NOTES
3076 --
3077 -- MODIFICATION HISTORY
3078 --
3079 --   13-Jul-2005    Arnold Ng   o Created.
3080 
3081   FUNCTION is_oc_bo_comp(
3082     p_oc_objs                 IN     HZ_ORG_CONTACT_BO_TBL,
3083     p_bus_object              IN     COMPLETENESS_REC_TYPE
3084   ) RETURN BOOLEAN IS
3085     l_bus_object              COMPLETENESS_REC_TYPE;
3086     l_cp_bus_object           COMPLETENESS_REC_TYPE;
3087     l_ps_bus_object           COMPLETENESS_REC_TYPE;
3088     l_per_bus_object          COMPLETENESS_REC_TYPE;
3089     l_valid_obj               BOOLEAN;
3090 
3091     l_ocr                     BOOLEAN;
3092     l_cpref                   BOOLEAN;
3093     l_ps                      BOOLEAN;
3094 
3095     l_phone_code              VARCHAR2(30);
3096     l_telex_code              VARCHAR2(30);
3097     l_email_code              VARCHAR2(30);
3098     l_web_code                VARCHAR2(30);
3099     l_sms_code                VARCHAR2(30);
3100   BEGIN
3101     -- For org contact, person bo is a must and person only has one
3102     -- object, not a list of object
3103     l_ocr    := FALSE;
3104     l_cpref  := FALSE;
3105     l_ps     := FALSE;
3106 
3107     IF(p_oc_objs IS NULL OR p_oc_objs.COUNT < 1) THEN
3108       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3109       fnd_message.set_token('OBJECT' ,'ORG_CONTACT');
3110       fnd_msg_pub.add;
3111       RETURN FALSE;
3112     END IF;
3113 
3114     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3115       -- get all entities of org contact, for org contact, the possible entites are
3116       -- HZ_ORG_CONTACT_ROLES
3117       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3118          p_bus_object.user_mandated_flag(i) = 'Y' AND
3119          p_bus_object.business_object_code(i) = 'ORG_CONTACT' AND
3120          p_bus_object.child_bo_code(i) IS NULL) THEN
3121         IF(p_bus_object.entity_name(i) = 'HZ_ORG_CONTACT_ROLES') THEN
3122           l_ocr := TRUE;
3123         ELSIF(p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES') THEN
3124           l_cpref := TRUE;
3125         END IF;
3126       -- Get contact point business object
3127       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3128             p_bus_object.business_object_code(i) = 'ORG_CONTACT' AND
3129             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3130         CASE
3131           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
3132             l_phone_code := 'PHONE';
3133           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
3134             l_telex_code := 'TLX';
3135           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
3136             l_email_code := 'EMAIL';
3137           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
3138             l_web_code := 'WEB';
3139           WHEN p_bus_object.child_bo_code(i) = 'SMS' THEN
3140             l_sms_code := 'SMS';
3141           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
3142             l_ps := TRUE;
3143           ELSE
3144             null;
3145         END CASE;
3146       END IF;
3147     END LOOP;
3148 
3149     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3150        l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3151        l_sms_code IS NOT NULL) THEN
3152       get_cp_from_rec(
3153         p_phone_code         => l_phone_code,
3154         p_email_code         => l_email_code,
3155         p_telex_code         => l_telex_code,
3156         p_web_code           => l_web_code,
3157         p_edi_code           => NULL,
3158         p_eft_code           => NULL,
3159         p_sms_code           => l_sms_code,
3160         p_bus_object         => p_bus_object,
3161         x_bus_object         => l_cp_bus_object
3162       );
3163     END IF;
3164 
3165     IF(l_ps) THEN
3166       get_ps_from_rec(
3167         p_bus_object         => p_bus_object,
3168         x_bus_object         => l_ps_bus_object
3169       );
3170     END IF;
3171 
3172     FOR i IN 1..p_oc_objs.COUNT LOOP
3173       IF(p_oc_objs(i).person_profile_obj IS NULL) THEN
3174         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3175         fnd_message.set_token('OBJECT' ,'PERSON_CONTACT');
3176         fnd_msg_pub.add;
3177         RETURN FALSE;
3178       END IF;
3179 
3180       IF(l_ocr AND
3181         (p_oc_objs(i).org_contact_role_objs IS NULL OR
3182          p_oc_objs(i).org_contact_role_objs.COUNT < 1)) THEN
3183         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3184         fnd_message.set_token('OBJECT' ,'ORG_CONTACT_ROLE');
3185         fnd_msg_pub.add;
3186         RETURN FALSE;
3187       END IF;
3188       IF(l_cpref AND
3189          (p_oc_objs(i).contact_pref_objs IS NULL OR
3190           p_oc_objs(i).contact_pref_objs.COUNT < 1)) THEN
3191         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3192         fnd_message.set_token('OBJECT' ,'ORG_CONTACT: CONTACT_PREFERENCE');
3193         fnd_msg_pub.add;
3194         RETURN FALSE;
3195       END IF;
3196 
3197       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3198          l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3199          l_sms_code IS NOT NULL) THEN
3200         -- check contact point business object for org contact
3201         l_valid_obj := is_cp_bo_comp(
3202                          p_phone_objs             => p_oc_objs(i).phone_objs,
3203                          p_email_objs             => p_oc_objs(i).email_objs,
3204                          p_telex_objs             => p_oc_objs(i).telex_objs,
3205                          p_web_objs               => p_oc_objs(i).web_objs,
3206                          p_edi_objs               => NULL,
3207                          p_eft_objs               => NULL,
3208                          p_sms_objs               => p_oc_objs(i).sms_objs,
3209                          p_bus_object             => l_cp_bus_object
3210                        );
3211         IF NOT(l_valid_obj) THEN
3212           RETURN FALSE;
3213         END IF;
3214       END IF;
3215       IF(l_ps) THEN
3216         -- check contact point business object for org contact
3217         l_valid_obj := is_ps_bo_comp(
3218                          p_ps_objs                => p_oc_objs(i).party_site_objs,
3219                          p_bus_object             => l_ps_bus_object
3220                        );
3221         IF NOT(l_valid_obj) THEN
3222           RETURN FALSE;
3223         END IF;
3224       END IF;
3225     END LOOP;
3226 
3227     RETURN TRUE;
3228   END is_oc_bo_comp;
3229 
3230 -- FUNCTION is_org_bo_comp
3231 --
3232 -- DESCRIPTION
3233 --     Return true if organization object is complete.  Otherwise, return false.
3234 --
3235 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3236 --
3237 -- ARGUMENTS
3238 --   IN:
3239 --     p_organization_obj       Organization business objects.
3240 --     p_bus_object             Business object structure for organization.
3241 -- NOTES
3242 --
3243 -- MODIFICATION HISTORY
3244 --
3245 --   13-Jul-2005    Arnold Ng   o Created.
3246 
3247   FUNCTION is_org_bo_comp(
3248     p_organization_obj        IN     HZ_ORGANIZATION_BO,
3249     p_bus_object              IN     COMPLETENESS_REC_TYPE
3250   ) RETURN BOOLEAN IS
3251     l_bus_object              COMPLETENESS_REC_TYPE;
3252     l_cp_bus_object           COMPLETENESS_REC_TYPE;
3253     l_ps_bus_object           COMPLETENESS_REC_TYPE;
3254     l_oc_bus_object           COMPLETENESS_REC_TYPE;
3255     l_valid_obj               BOOLEAN;
3256 
3257     l_pref                    BOOLEAN;
3258     l_credit                  BOOLEAN;
3259     l_rel                     BOOLEAN;
3260     l_class                   BOOLEAN;
3261     l_fin_report              BOOLEAN;
3262     l_cpref                   BOOLEAN;
3263     l_cert                    BOOLEAN;
3264     l_fin_prof                BOOLEAN;
3265     l_ps                      BOOLEAN;
3266     l_oc                      BOOLEAN;
3267     l_ext                     BOOLEAN;
3268 
3269     l_phone_code              VARCHAR2(30);
3270     l_telex_code              VARCHAR2(30);
3271     l_email_code              VARCHAR2(30);
3272     l_web_code                VARCHAR2(30);
3273     l_edi_code                VARCHAR2(30);
3274     l_eft_code                VARCHAR2(30);
3275   BEGIN
3276     l_pref       := FALSE;
3277     l_credit     := FALSE;
3278     l_rel        := FALSE;
3279     l_class      := FALSE;
3280     l_fin_report := FALSE;
3281     l_cpref      := FALSE;
3282     l_cert       := FALSE;
3283     l_fin_prof   := FALSE;
3284     l_ps         := FALSE;
3285     l_oc         := FALSE;
3286     l_ext        := FALSE;
3287 
3288     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3289       -- get all entities of org, for org, the possible entites are
3290       -- HZ_PARTY_PREFERENCES, HZ_CREDIT_RATINGS, HZ_RELATIONSHIPS,
3291       -- HZ_CODE_ASSIGNMENTS, HZ_FINANCIAL_REPORTS, HZ_FINANCIAL_NUMBERS,
3292       -- HZ_CERTIFICATIONS, HZ_FINANCIAL_PROFILE, HZ_CONTACT_PREFERENCES
3293       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3294          p_bus_object.user_mandated_flag(i) = 'Y' AND
3295          p_bus_object.business_object_code(i) = 'ORG' AND
3296          p_bus_object.child_bo_code(i) IS NULL) THEN
3297         CASE
3298           WHEN p_bus_object.entity_name(i) = 'HZ_PARTY_PREFERENCES' THEN
3299             l_pref := TRUE;
3300           WHEN p_bus_object.entity_name(i) = 'HZ_CREDIT_RATINGS' THEN
3301             l_credit := TRUE;
3302           WHEN p_bus_object.entity_name(i) = 'HZ_RELATIONSHIPS' THEN
3303             l_rel := TRUE;
3304           WHEN p_bus_object.entity_name(i) = 'HZ_CODE_ASSIGNMENTS' THEN
3305             l_class := TRUE;
3306           WHEN p_bus_object.entity_name(i) = 'HZ_CERTIFICATIONS' THEN
3307             l_cert := TRUE;
3308           WHEN p_bus_object.entity_name(i) = 'HZ_FINANCIAL_PROFILE' THEN
3309             l_fin_prof := TRUE;
3310           WHEN p_bus_object.entity_name(i) = 'HZ_CONTACT_PREFERENCES' THEN
3311             l_cpref := TRUE;
3312           WHEN p_bus_object.entity_name(i) = 'HZ_ORG_PROFILES_EXT_VL' THEN
3313             l_ext := TRUE;
3314         END CASE;
3315       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3316             p_bus_object.business_object_code(i) = 'ORG' AND
3317             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3318         CASE
3319           WHEN p_bus_object.child_bo_code(i) = 'PHONE' THEN
3320             l_phone_code := 'PHONE';
3321           WHEN p_bus_object.child_bo_code(i) = 'TLX' THEN
3322             l_telex_code := 'TLX';
3323           WHEN p_bus_object.child_bo_code(i) = 'EMAIL' THEN
3324             l_email_code := 'EMAIL';
3325           WHEN p_bus_object.child_bo_code(i) = 'WEB' THEN
3326             l_web_code := 'WEB';
3327           WHEN p_bus_object.child_bo_code(i) = 'EDI' THEN
3328             l_edi_code := 'EDI';
3329           WHEN p_bus_object.child_bo_code(i) = 'EFT' THEN
3330             l_eft_code := 'EFT';
3331           WHEN p_bus_object.child_bo_code(i) = 'PARTY_SITE' THEN
3332             l_ps := TRUE;
3333           WHEN p_bus_object.child_bo_code(i) = 'ORG_CONTACT' THEN
3334             l_oc := TRUE;
3335           WHEN p_bus_object.child_bo_code(i) = 'FIN_REPORT' THEN
3336             l_fin_report := TRUE;
3337         END CASE;
3338       END IF;
3339     END LOOP;
3340 
3341     IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3342        l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3343        l_edi_code IS NOT NULL OR l_eft_code IS NOT NULL) THEN
3344       get_cp_from_rec(
3345         p_phone_code         => l_phone_code,
3346         p_email_code         => l_email_code,
3347         p_telex_code         => l_telex_code,
3348         p_web_code           => l_web_code,
3349         p_edi_code           => l_edi_code,
3350         p_eft_code           => l_eft_code,
3351         p_sms_code           => NULL,
3352         p_bus_object         => p_bus_object,
3353         x_bus_object         => l_cp_bus_object
3354       );
3355     END IF;
3356 
3357     IF(l_ps) THEN
3358       get_ps_from_rec(
3359         p_bus_object         => p_bus_object,
3360         x_bus_object         => l_ps_bus_object
3361       );
3362     END IF;
3363 
3364     IF(l_oc) THEN
3365       get_bus_obj_struct(
3366         p_bus_object_code    => 'ORG_CONTACT',
3367         x_bus_object         => l_oc_bus_object
3368       );
3369     END IF;
3370 
3371       IF(l_pref AND
3372         (p_organization_obj.preference_objs IS NULL OR
3373          p_organization_obj.preference_objs.COUNT < 1)) THEN
3374         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3375         fnd_message.set_token('OBJECT' ,'PARTY_PREFERENCE');
3376         fnd_msg_pub.add;
3377         RETURN FALSE;
3378       END IF;
3379       IF(l_credit AND
3380         (p_organization_obj.credit_rating_objs IS NULL OR
3381          p_organization_obj.credit_rating_objs.COUNT < 1)) THEN
3382         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3383         fnd_message.set_token('OBJECT' ,'CREDIT_RATING');
3384         fnd_msg_pub.add;
3385         RETURN FALSE;
3386       END IF;
3387       IF(l_rel AND
3388         (p_organization_obj.relationship_objs IS NULL OR
3389          p_organization_obj.relationship_objs.COUNT < 1)) THEN
3390         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3391         fnd_message.set_token('OBJECT' ,'RELATIONSHIP');
3392         fnd_msg_pub.add;
3393         RETURN FALSE;
3394       END IF;
3395       IF(l_class AND
3396         (p_organization_obj.class_objs IS NULL OR
3397          p_organization_obj.class_objs.COUNT < 1)) THEN
3398         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3399         fnd_message.set_token('OBJECT' ,'CLASSIFICATION');
3400         fnd_msg_pub.add;
3401         RETURN FALSE;
3402       END IF;
3403       IF(l_fin_report AND
3404         (p_organization_obj.financial_report_objs IS NULL OR
3405          p_organization_obj.financial_report_objs.COUNT < 1)) THEN
3406         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3407         fnd_message.set_token('OBJECT' ,'FINANCIAL_REPORT');
3408         fnd_msg_pub.add;
3409         RETURN FALSE;
3410 
3411         -- financial report always require financial number
3412         FOR j IN 1..p_organization_obj.financial_report_objs.COUNT LOOP
3413           IF(p_organization_obj.financial_report_objs(j).financial_number_objs IS NULL OR
3414              p_organization_obj.financial_report_objs(j).financial_number_objs.COUNT < 1) THEN
3415             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3416             fnd_message.set_token('OBJECT' ,'FINANCIAL_NUMBER');
3417             fnd_msg_pub.add;
3418             RETURN FALSE;
3419           END IF;
3420         END LOOP;
3421       END IF;
3422       IF(l_cert AND
3423         (p_organization_obj.certification_objs IS NULL OR
3424          p_organization_obj.certification_objs.COUNT < 1)) THEN
3425         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3426         fnd_message.set_token('OBJECT' ,'CERTIFICATION');
3427         fnd_msg_pub.add;
3428         RETURN FALSE;
3429       END IF;
3430       IF(l_fin_prof AND
3431         (p_organization_obj.financial_prof_objs IS NULL OR
3432          p_organization_obj.financial_prof_objs.COUNT < 1)) THEN
3433         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3434         fnd_message.set_token('OBJECT' ,'FINANCIAL_PROFILE');
3435         fnd_msg_pub.add;
3436         RETURN FALSE;
3437       END IF;
3438       IF(l_cpref AND
3439         (p_organization_obj.contact_pref_objs IS NULL OR
3440          p_organization_obj.contact_pref_objs.COUNT < 1)) THEN
3441         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3442         fnd_message.set_token('OBJECT' ,'ORG: CONTACT_PREFERENCE');
3443         fnd_msg_pub.add;
3444         RETURN FALSE;
3445       END IF;
3446       IF(l_ext AND
3447         (p_organization_obj.ext_attributes_objs IS NULL OR
3448          p_organization_obj.ext_attributes_objs.COUNT < 1)) THEN
3449         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3450         fnd_message.set_token('OBJECT' ,'ORG: EXTENSIBILITY');
3451         fnd_msg_pub.add;
3452         RETURN FALSE;
3453       END IF;
3454 
3455       IF(l_phone_code IS NOT NULL OR l_telex_code IS NOT NULL OR
3456          l_email_code IS NOT NULL OR l_web_code IS NOT NULL OR
3457          l_edi_code IS NOT NULL OR l_eft_code IS NOT NULL) THEN
3458         -- check contact point business object for org
3459         l_valid_obj := is_cp_bo_comp(
3460                          p_phone_objs  => p_organization_obj.phone_objs,
3461                          p_email_objs  => p_organization_obj.email_objs,
3462                          p_telex_objs  => p_organization_obj.telex_objs,
3463                          p_web_objs    => p_organization_obj.web_objs,
3464                          p_edi_objs    => p_organization_obj.edi_objs,
3465                          p_eft_objs    => p_organization_obj.eft_objs,
3466                          p_sms_objs    => NULL,
3467                          p_bus_object  => l_cp_bus_object
3468                        );
3469         IF NOT(l_valid_obj) THEN
3470           RETURN FALSE;
3471         END IF;
3472       END IF;
3473 
3474       IF(l_ps) THEN
3475         -- check party site business object for org
3476         l_valid_obj := is_ps_bo_comp(
3477                          p_ps_objs     => p_organization_obj.party_site_objs,
3478                          p_bus_object  => l_ps_bus_object
3479                        );
3480         IF NOT(l_valid_obj) THEN
3481           RETURN FALSE;
3482         END IF;
3483       END IF;
3484 
3485       IF(l_oc) THEN
3486         -- check org contact business object for org
3487         l_valid_obj := is_oc_bo_comp(
3488                          p_oc_objs     => p_organization_obj.contact_objs,
3489                          p_bus_object  => l_oc_bus_object
3490                        );
3491         IF NOT(l_valid_obj) THEN
3492           RETURN FALSE;
3493         END IF;
3494       END IF;
3495 
3496     RETURN TRUE;
3497   END is_org_bo_comp;
3498 
3499 -- FUNCTION is_cac_bo_comp
3500 --
3501 -- DESCRIPTION
3502 --     Return true if customer account contact object is complete.
3503 --     Otherwise, return false.
3504 --
3505 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3506 --
3507 -- ARGUMENTS
3508 --   IN:
3509 --     p_cac_objs               List of customer account contact business objects.
3510 --     p_bus_object             Business object structure for customer account contact.
3511 -- NOTES
3512 --
3513 -- MODIFICATION HISTORY
3514 --
3515 --   13-Jul-2005    Arnold Ng   o Created.
3516 
3517   FUNCTION is_cac_bo_comp(
3518     p_cac_objs                IN     HZ_CUST_ACCT_CONTACT_BO_TBL,
3519     p_bus_object              IN     COMPLETENESS_REC_TYPE
3520   ) RETURN BOOLEAN IS
3521     l_valid_obj               BOOLEAN;
3522     l_rr                      BOOLEAN;
3523   BEGIN
3524     l_rr := FALSE;
3525 
3526     IF(p_cac_objs IS NULL OR p_cac_objs.COUNT < 1) THEN
3527       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3528       fnd_message.set_token('OBJECT' ,'CUST_ACCT_CONTACT');
3529       fnd_msg_pub.add;
3530       RETURN FALSE;
3531     END IF;
3532 
3533     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3534       -- get all entities of cust acct contact, for cust acct contact, the possible entites are
3535       -- HZ_ROLE_RESPONSIBILITY
3536       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3537          p_bus_object.user_mandated_flag(i) = 'Y' AND
3538          p_bus_object.business_object_code(i) = 'CUST_ACCT_CONTACT' AND
3539          p_bus_object.child_bo_code(i) IS NULL) THEN
3540         IF(p_bus_object.entity_name(i) = 'HZ_ROLE_RESPONSIBILITY') THEN
3541             l_rr := TRUE;
3542         END IF;
3543       END IF;
3544     END LOOP;
3545 
3546     FOR i IN 1..p_cac_objs.COUNT LOOP
3547       -- Check role responsibility objects
3548       IF(l_rr AND
3549         (p_cac_objs(i).contact_role_objs IS NULL OR
3550          p_cac_objs(i).contact_role_objs.COUNT < 1)) THEN
3551         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3552         fnd_message.set_token('OBJECT' ,'ROLE_RESPONSIBILITY');
3553         fnd_msg_pub.add;
3554         RETURN FALSE;
3555       END IF;
3556     END LOOP;
3557 
3558     RETURN TRUE;
3559   END is_cac_bo_comp;
3560 
3561 -- FUNCTION is_cas_bo_comp
3562 --
3563 -- DESCRIPTION
3564 --     Return true if customer account site object is complete.
3565 --     Otherwise, return false.
3566 --
3567 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3568 --
3569 -- ARGUMENTS
3570 --   IN:
3571 --     p_cas_objs               List of customer account site business objects.
3572 --     p_bus_object             Business object structure for customer account site.
3573 -- NOTES
3574 --
3575 -- MODIFICATION HISTORY
3576 --
3577 --   13-Jul-2005    Arnold Ng   o Created.
3578 
3579   FUNCTION is_cas_bo_comp(
3580     p_cas_objs                IN     HZ_CUST_ACCT_SITE_BO_TBL,
3581     p_bus_object              IN     COMPLETENESS_REC_TYPE
3582   ) RETURN BOOLEAN IS
3583     l_valid_obj               BOOLEAN;
3584     l_casu                    BOOLEAN;
3585     l_cp                      BOOLEAN;
3586     l_cac                     BOOLEAN;
3587     l_cpa                     BOOLEAN;
3588     l_bau                     BOOLEAN;
3589     l_pm                      BOOLEAN;
3590     l_cac_bus_object          COMPLETENESS_REC_TYPE;
3591   BEGIN
3592     l_casu := FALSE;
3593     l_cp   := FALSE;
3594     l_cpa  := FALSE;
3595     l_cac  := FALSE;
3596     l_bau  := FALSE;
3597     l_pm   := FALSE;
3598 
3599     IF(p_cas_objs IS NULL OR p_cas_objs.COUNT < 1) THEN
3600       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3601       fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE');
3602       fnd_msg_pub.add;
3603       RETURN FALSE;
3604     END IF;
3605 
3606     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3607       -- no entities of cust acct site
3608       IF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3609          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE' AND
3610          p_bus_object.user_mandated_flag(i) = 'Y') THEN
3611         CASE
3612           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE_USE' AND
3613                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
3614             l_casu := TRUE;
3615           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT' AND
3616                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
3617             l_cac := TRUE;
3618         END CASE;
3619       ELSIF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3620          p_bus_object.user_mandated_flag(i) = 'Y' AND
3621          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
3622          p_bus_object.child_bo_code(i) IS NULL) THEN
3623         CASE
3624           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
3625             l_pm := TRUE;
3626           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
3627             l_bau := TRUE;
3628         END CASE;
3629       ELSIF(p_bus_object.child_bo_code(i) = 'CUST_PROFILE' AND
3630             p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
3631             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3632         l_cp := TRUE;
3633       ELSIF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS' AND
3634             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
3635             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3636         l_cpa := TRUE;
3637       END IF;
3638     END LOOP;
3639 
3640     IF(l_cac) THEN
3641       get_bus_obj_struct(
3642         p_bus_object_code    => 'CUST_ACCT_CONTACT',
3643         x_bus_object         => l_cac_bus_object
3644       );
3645     END IF;
3646 
3647     FOR i IN 1..p_cas_objs.COUNT LOOP
3648       IF(l_cac) THEN
3649         l_valid_obj := is_cac_bo_comp(
3650                          p_cac_objs    => p_cas_objs(i).cust_acct_contact_objs,
3651                          p_bus_object  => l_cac_bus_object
3652                        );
3653         IF NOT(l_valid_obj) THEN
3654           RETURN FALSE;
3655         END IF;
3656       END IF;
3657 
3658       IF(l_casu AND
3659         (p_cas_objs(i).cust_acct_site_use_objs IS NULL OR
3660          p_cas_objs(i).cust_acct_site_use_objs.COUNT < 1)) THEN
3661         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3662         fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE_USE');
3663         fnd_msg_pub.add;
3664         RETURN FALSE;
3665 
3666         FOR j IN 1..p_cas_objs(i).cust_acct_site_use_objs.COUNT LOOP
3667           IF(l_cp AND p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj IS NULL) THEN
3668             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3669             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE');
3670             fnd_msg_pub.add;
3671             RETURN FALSE;
3672           END IF;
3673           IF(l_cpa AND
3674             (p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs IS NULL OR
3675              p_cas_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
3676             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3677             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE_AMOUNT');
3678             fnd_msg_pub.add;
3679             RETURN FALSE;
3680           END IF;
3681           -- for bank account use and payment method
3682           IF(l_bau AND
3683             (p_cas_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs IS NULL OR
3684              p_cas_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs.COUNT < 1)) THEN
3685             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3686             fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
3687             fnd_msg_pub.add;
3688             RETURN FALSE;
3689           END IF;
3690           IF(l_pm AND
3691             (p_cas_objs(i).cust_acct_site_use_objs(j).payment_method_obj IS NULL)) THEN
3692             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3693             fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
3694             fnd_msg_pub.add;
3695             RETURN FALSE;
3696           END IF;
3697         END LOOP;
3698       END IF;
3699     END LOOP;
3700 
3701     RETURN TRUE;
3702   END is_cas_bo_comp;
3703 
3704 -- FUNCTION is_ca_bo_comp
3705 --
3706 -- DESCRIPTION
3707 --     Return true if customer account object is complete.  Otherwise, return false.
3708 --
3709 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3710 --
3711 -- ARGUMENTS
3712 --   IN:
3713 --     p_ca_objs                List of customer account business objects.
3714 --     p_bus_object             Business object structure for customer account.
3715 -- NOTES
3716 --
3717 -- MODIFICATION HISTORY
3718 --
3719 --   13-Jul-2005    Arnold Ng   o Created.
3720 
3721   FUNCTION is_ca_bo_comp(
3722     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL,
3723     p_bus_object              IN     COMPLETENESS_REC_TYPE
3724   ) RETURN BOOLEAN IS
3725     l_valid_obj               BOOLEAN;
3726     l_carel                   BOOLEAN;
3727     l_cas                     BOOLEAN;
3728     l_cac                     BOOLEAN;
3729     l_cp                      BOOLEAN;
3730     l_cpa                     BOOLEAN;
3731     l_bau                     BOOLEAN;
3732     l_pm                      BOOLEAN;
3733     l_cas_bus_object          COMPLETENESS_REC_TYPE;
3734     l_cac_bus_object          COMPLETENESS_REC_TYPE;
3735   BEGIN
3736     l_carel := FALSE;
3737     l_cas   := FALSE;
3738     l_cac   := FALSE;
3739     l_cp    := FALSE;
3740     l_cpa   := FALSE;
3741     l_bau   := FALSE;
3742     l_pm    := FALSE;
3743 
3744     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3745       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
3746       fnd_message.set_token('OBJECT' ,'CUST_ACCT');
3747       fnd_msg_pub.add;
3748       RETURN FALSE;
3749     END IF;
3750 
3751     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
3752       -- get all entities of cust acct, for cust acct, the possible entites are
3753       -- HZ_BANK_ACCOUNT_USE, HZ_PAYMENT_METHOD, HZ_CUST_ACCT_RELATE
3754       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
3755          p_bus_object.user_mandated_flag(i) = 'Y' AND
3756          p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
3757          p_bus_object.child_bo_code(i) IS NULL) THEN
3758         CASE
3759           WHEN(p_bus_object.entity_name(i) = 'HZ_CUST_ACCT_RELATE_ALL') THEN
3760             l_carel := TRUE;
3761           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
3762             l_pm := TRUE;
3763           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
3764             l_bau := TRUE;
3765         END CASE;
3766       -- Get other business object
3767       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3768             p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
3769             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3770         CASE
3771           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE') THEN
3772             l_cas := TRUE;
3773           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT') THEN
3774             l_cac := TRUE;
3775           ELSE
3776             null;
3777         END CASE;
3778       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
3779             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
3780             p_bus_object.user_mandated_flag(i) = 'Y') THEN
3781         IF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS') THEN
3782           l_cpa := TRUE;
3783         END IF;
3784       END IF;
3785     END LOOP;
3786 
3787     -- customer profile is mandatory for customer account
3788     l_cp := TRUE;
3789 
3790     IF(l_cas) THEN
3791       get_bus_obj_struct(
3792         p_bus_object_code    => 'CUST_ACCT_SITE',
3793         x_bus_object         => l_cas_bus_object
3794       );
3795     END IF;
3796 
3797     IF(l_cac) THEN
3798       get_bus_obj_struct(
3799         p_bus_object_code    => 'CUST_ACCT_CONTACT',
3800         x_bus_object         => l_cac_bus_object
3801       );
3802     END IF;
3803 
3804     FOR i IN 1..p_ca_objs.COUNT LOOP
3805       IF(l_cas) THEN
3806         l_valid_obj := is_cas_bo_comp(
3807                          p_cas_objs    => p_ca_objs(i).cust_acct_site_objs,
3808                          p_bus_object  => l_cas_bus_object
3809                        );
3810         IF NOT(l_valid_obj) THEN
3811           RETURN FALSE;
3812         END IF;
3813       END IF;
3814 
3815       IF(l_cac) THEN
3816         l_valid_obj := is_cac_bo_comp(
3817                          p_cac_objs    => p_ca_objs(i).cust_acct_contact_objs,
3818                          p_bus_object  => l_cac_bus_object
3819                        );
3820         IF NOT(l_valid_obj) THEN
3821           RETURN FALSE;
3822         END IF;
3823       END IF;
3824 
3825       IF(l_carel AND
3826         (p_ca_objs(i).acct_relate_objs IS NULL OR
3827          p_ca_objs(i).acct_relate_objs.COUNT < 1)) THEN
3828         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3829         fnd_message.set_token('OBJECT' ,'CUSTOMER_ACCOUNT_RELATE');
3830         fnd_msg_pub.add;
3831         RETURN FALSE;
3832       END IF;
3833 
3834 -- for bank account use and payment method
3835       IF(l_bau AND
3836         (p_ca_objs(i).bank_acct_use_objs IS NULL OR
3837          p_ca_objs(i).bank_acct_use_objs.COUNT < 1)) THEN
3838         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3839         fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
3840         fnd_msg_pub.add;
3841         RETURN FALSE;
3842       END IF;
3843       IF(l_pm AND
3844         (p_ca_objs(i).payment_method_obj IS NULL)) THEN
3845         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3846         fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
3847         fnd_msg_pub.add;
3848         RETURN FALSE;
3849       END IF;
3850 
3851       IF(l_cp AND p_ca_objs(i).cust_profile_obj IS NULL) THEN
3852         RETURN FALSE;
3853       ELSE
3854         IF(l_cpa AND
3855           (p_ca_objs(i).cust_profile_obj.cust_profile_amt_objs IS NULL OR
3856            p_ca_objs(i).cust_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
3857           fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
3858           fnd_message.set_token('OBJECT' ,'CUSTOMER_PROFILE_AMOUNT');
3859           fnd_msg_pub.add;
3860           RETURN FALSE;
3861         END IF;
3862       END IF;
3863     END LOOP;
3864 
3865     RETURN TRUE;
3866   END is_ca_bo_comp;
3867 
3868 -- FUNCTION is_pca_bo_comp
3869 --
3870 -- DESCRIPTION
3871 --     Return true if person customer object is complete.  Otherwise, return false.
3872 --
3873 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3874 --
3875 -- ARGUMENTS
3876 --   IN:
3877 --     p_person_obj             Person business object.
3878 --     p_ca_objs                List of customer account objects.
3879 -- NOTES
3880 --
3881 -- MODIFICATION HISTORY
3882 --
3883 --   13-Jul-2005    Arnold Ng   o Created.
3884 
3885   FUNCTION is_pca_bo_comp(
3886     p_person_obj              IN     HZ_PERSON_BO,
3887     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL
3888   ) RETURN BOOLEAN IS
3889     l_per_bus_object          COMPLETENESS_REC_TYPE;
3890     l_ca_bus_object           COMPLETENESS_REC_TYPE;
3891     l_valid_obj               BOOLEAN;
3892   BEGIN
3893     IF(p_person_obj IS NULL) THEN
3894       RETURN FALSE;
3895     END IF;
3896     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3897       RETURN FALSE;
3898     END IF;
3899 
3900     -- check person object for person cust acct
3901     get_bus_obj_struct(
3902       p_bus_object_code         => 'PERSON',
3903       x_bus_object              => l_per_bus_object
3904     );
3905     l_valid_obj := is_person_bo_comp(
3906                      p_person_obj  => p_person_obj,
3907                      p_bus_object  => l_per_bus_object
3908                    );
3909     IF NOT(l_valid_obj) THEN
3910       RETURN FALSE;
3911     END IF;
3912 
3913     -- check cust account for person cust acct
3914     get_bus_obj_struct(
3915       p_bus_object_code         => 'CUST_ACCT',
3916       x_bus_object              => l_ca_bus_object
3917     );
3918     l_valid_obj := is_ca_bo_comp(
3919                      p_ca_objs    => p_ca_objs,
3920                      p_bus_object => l_ca_bus_object
3921                    );
3922     IF NOT(l_valid_obj) THEN
3923       RETURN FALSE;
3924     END IF;
3925 
3926     RETURN TRUE;
3927   END is_pca_bo_comp;
3928 
3929 -- FUNCTION is_oca_bo_comp
3930 --
3931 -- DESCRIPTION
3932 --     Return true if organization customer object is complete.
3933 --     Otherwise, return false.
3934 --
3935 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3936 --
3937 -- ARGUMENTS
3938 --   IN:
3939 --     p_org_obj                Organization business object.
3940 --     p_ca_objs                List of customer account objects.
3941 -- NOTES
3942 --
3943 -- MODIFICATION HISTORY
3944 --
3945 --   13-Jul-2005    Arnold Ng   o Created.
3946 
3947   FUNCTION is_oca_bo_comp(
3948     p_org_obj                 IN     HZ_ORGANIZATION_BO,
3949     p_ca_objs                 IN     HZ_CUST_ACCT_BO_TBL
3950   ) RETURN BOOLEAN IS
3951     l_org_bus_object          COMPLETENESS_REC_TYPE;
3952     l_ca_bus_object           COMPLETENESS_REC_TYPE;
3953     l_valid_obj               BOOLEAN;
3954   BEGIN
3955     IF(p_org_obj IS NULL) THEN
3956       RETURN FALSE;
3957     END IF;
3958     IF(p_ca_objs IS NULL OR p_ca_objs.COUNT < 1) THEN
3959       RETURN FALSE;
3960     END IF;
3961 
3962     -- check organization object for org cust acct
3963     get_bus_obj_struct(
3964       p_bus_object_code         => 'ORG',
3965       x_bus_object              => l_org_bus_object
3966     );
3967     l_valid_obj := is_org_bo_comp(
3968                      p_organization_obj => p_org_obj,
3969                      p_bus_object       => l_org_bus_object
3970                    );
3971     IF NOT(l_valid_obj) THEN
3972       RETURN FALSE;
3973     END IF;
3974 
3975     -- check cust account for org cust acct
3976     get_bus_obj_struct(
3977       p_bus_object_code         => 'CUST_ACCT',
3978       x_bus_object              => l_ca_bus_object
3979     );
3980     l_valid_obj := is_ca_bo_comp(
3981                      p_ca_objs          => p_ca_objs,
3982                      p_bus_object       => l_ca_bus_object
3983                    );
3984     IF NOT(l_valid_obj) THEN
3985       RETURN FALSE;
3986     END IF;
3987 
3988     RETURN TRUE;
3989   END is_oca_bo_comp;
3990 
3991 -- FUNCTION get_bus_object_struct
3992 --
3993 -- DESCRIPTION
3994 --     Get contact point business object structure.
3995 --
3996 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3997 --
3998 -- ARGUMENTS
3999 --   IN:
4000 --     p_bus_object_code        Business object code, such as 'PARTY_SITE',
4001 --                              'ORG_CONTACT'
4002 --   OUT:
4003 --     x_bus_object             Business object structure.
4004 -- NOTES
4005 --
4006 -- MODIFICATION HISTORY
4007 --
4008 --   13-Jul-2005    Arnold Ng   o Created.
4009 
4010   PROCEDURE get_bus_obj_struct(
4011     p_bus_object_code         IN         VARCHAR2,
4012     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4013   ) IS
4014     CURSOR get_bus_obj(l_bus_obj VARCHAR2) IS
4015     SELECT d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4016            d.user_mandated_flag, d.root_node_flag, d.entity_name
4017     FROM hz_bus_obj_definitions d
4018     start with d.business_object_code = l_bus_obj and d.user_mandated_flag = 'Y'
4019     connect by prior d.child_bo_code = d.business_object_code and d.user_mandated_flag = 'Y'
4020     group by 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   BEGIN
4023     OPEN get_bus_obj(p_bus_object_code);
4024     FETCH get_bus_obj BULK COLLECT
4025       INTO x_bus_object.business_object_code,
4026            x_bus_object.child_bo_code,
4027            x_bus_object.tca_mandated_flag,
4028            x_bus_object.user_mandated_flag,
4029            x_bus_object.root_node_flag,
4030            x_bus_object.entity_name;
4031     CLOSE get_bus_obj;
4032   END get_bus_obj_struct;
4033 
4034 -- FUNCTION get_cp_bus_obj_struct
4035 --
4036 -- DESCRIPTION
4037 --     Get contact point business object structure.
4038 --
4039 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4040 --
4041 -- ARGUMENTS
4042 --   IN:
4043 --     p_phone_code             'PHONE'.
4044 --     p_email_code             'EMAIL'.
4045 --     p_telex_code             'TLX'.
4046 --     p_web_code               'WEB'.
4047 --     p_edi_code               'EDI'.
4048 --     p_eft_code               'EFT'.
4049 --     p_sms_code               'SMS'.
4050 --   OUT:
4051 --     x_bus_object             Contact point business object structure.
4052 -- NOTES
4053 --
4054 -- MODIFICATION HISTORY
4055 --
4056 --   13-Jul-2005    Arnold Ng   o Created.
4057 
4058   PROCEDURE get_cp_bus_obj_struct(
4059     p_phone_code              IN         VARCHAR2,
4060     p_email_code              IN         VARCHAR2,
4061     p_telex_code              IN         VARCHAR2,
4062     p_web_code                IN         VARCHAR2,
4063     p_edi_code                IN         VARCHAR2,
4064     p_eft_code                IN         VARCHAR2,
4065     p_sms_code                IN         VARCHAR2,
4066     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4067   ) IS
4068     CURSOR get_cp_bus_obj(l_phone VARCHAR2, l_email VARCHAR2,
4069                           l_telex VARCHAR2, l_web VARCHAR2, l_edi VARCHAR2,
4070                           l_eft VARCHAR2, l_sms VARCHAR2) IS
4071     SELECT d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4072            d.user_mandated_flag, d.root_node_flag, d.entity_name
4073     FROM hz_bus_obj_definitions d
4074     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'
4075     connect by prior d.child_bo_code = d.business_object_code
4076                 and d.user_mandated_flag = 'Y'
4077     group by d.business_object_code, d.child_bo_code, d.tca_mandated_flag,
4078              d.user_mandated_flag, d.root_node_flag, d.entity_name;
4079   BEGIN
4080     OPEN get_cp_bus_obj(p_phone_code, p_email_code, p_telex_code,
4081                         p_web_code, p_edi_code, p_eft_code, p_sms_code);
4082     FETCH get_cp_bus_obj BULK COLLECT
4083       INTO x_bus_object.business_object_code,
4084            x_bus_object.child_bo_code,
4085            x_bus_object.tca_mandated_flag,
4086            x_bus_object.user_mandated_flag,
4087            x_bus_object.root_node_flag,
4088            x_bus_object.entity_name;
4089     CLOSE get_cp_bus_obj;
4090   END get_cp_bus_obj_struct;
4091 
4092 -- PRIVATE PROCEDURE get_cp_from_rec
4093 --
4094 -- DESCRIPTION
4095 --     Extract business object structure of contact point.
4096 --
4097 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4098 --
4099 -- ARGUMENTS
4100 --   IN:
4101 --     p_phone_code             'PHONE'.
4102 --     p_email_code             'EMAIL'.
4103 --     p_telex_code             'TLX'.
4104 --     p_web_code               'WEB'.
4105 --     p_edi_code               'EDI'.
4106 --     p_eft_code               'EFT'.
4107 --     p_sms_code               'SMS'.
4108 --   OUT:
4109 --     x_bus_object             Business object structure of contact point.
4110 -- NOTES
4111 --
4112 -- MODIFICATION HISTORY
4113 --
4114 --   13-Jul-2005    Arnold Ng   o Created.
4115 
4116   PROCEDURE get_cp_from_rec(
4117     p_phone_code              IN         VARCHAR2,
4118     p_email_code              IN         VARCHAR2,
4119     p_telex_code              IN         VARCHAR2,
4120     p_web_code                IN         VARCHAR2,
4121     p_edi_code                IN         VARCHAR2,
4122     p_eft_code                IN         VARCHAR2,
4123     p_sms_code                IN         VARCHAR2,
4124     p_bus_object              IN         COMPLETENESS_REC_TYPE,
4125     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4126   ) IS
4127     l_count                   NUMBER;
4128   BEGIN
4129     l_count := 0;
4130     x_bus_object.business_object_code := boc_tbl();
4131     x_bus_object.child_bo_code := cbc_tbl();
4132     x_bus_object.tca_mandated_flag := tmf_tbl();
4133     x_bus_object.user_mandated_flag := umf_tbl();
4134     x_bus_object.root_node_flag := rnf_tbl();
4135     x_bus_object.entity_name := ent_tbl();
4136     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4137       IF(p_bus_object.business_object_code(i) = p_phone_code OR
4138          p_bus_object.business_object_code(i) = p_email_code OR
4139          p_bus_object.business_object_code(i) = p_telex_code OR
4140          p_bus_object.business_object_code(i) = p_web_code OR
4141          p_bus_object.business_object_code(i) = p_edi_code OR
4142          p_bus_object.business_object_code(i) = p_eft_code OR
4143          p_bus_object.business_object_code(i) = p_sms_code) THEN
4144           l_count := l_count + 1;
4145           x_bus_object.business_object_code.EXTEND;
4146           x_bus_object.child_bo_code.EXTEND;
4147           x_bus_object.tca_mandated_flag.EXTEND;
4148           x_bus_object.user_mandated_flag.EXTEND;
4149           x_bus_object.root_node_flag.EXTEND;
4150           x_bus_object.entity_name.EXTEND;
4151           x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4152           x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4153           x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4154           x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4155           x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4156           x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4157       END IF;
4158     END LOOP;
4159   END get_cp_from_rec;
4160 
4161 -- PRIVATE PROCEDURE get_ps_from_rec
4162 --
4163 -- DESCRIPTION
4164 --     Extract business object structure of party site.
4165 --
4166 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4167 --
4168 -- ARGUMENTS
4169 --   IN:
4170 --     p_bus_object             Business object structure.
4171 --   OUT:
4172 --     x_bus_object             Business object structure of party site.
4173 -- NOTES
4174 --
4175 -- MODIFICATION HISTORY
4176 --
4177 --   13-Jul-2005    Arnold Ng   o Created.
4178 
4179   PROCEDURE get_ps_from_rec(
4180     p_bus_object              IN         COMPLETENESS_REC_TYPE,
4181     x_bus_object              OUT NOCOPY COMPLETENESS_REC_TYPE
4182   ) IS
4183     l_count                   NUMBER;
4184     l_phone                   VARCHAR2(30);
4185     l_telex                   VARCHAR2(30);
4186     l_email                   VARCHAR2(30);
4187     l_web                     VARCHAR2(30);
4188     l_edi                     VARCHAR2(30);
4189     l_eft                     VARCHAR2(30);
4190     l_sms                     VARCHAR2(30);
4191   BEGIN
4192     l_count := 0;
4193     x_bus_object.business_object_code := boc_tbl();
4194     x_bus_object.child_bo_code := cbc_tbl();
4195     x_bus_object.tca_mandated_flag := tmf_tbl();
4196     x_bus_object.user_mandated_flag := umf_tbl();
4197     x_bus_object.root_node_flag := rnf_tbl();
4198     x_bus_object.entity_name := ent_tbl();
4199     -- find all rows related to PARTY_SITE
4200     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4201       IF(p_bus_object.business_object_code(i) = 'PARTY_SITE') THEN
4202         l_count := l_count + 1;
4203         x_bus_object.business_object_code.EXTEND;
4204         x_bus_object.child_bo_code.EXTEND;
4205         x_bus_object.tca_mandated_flag.EXTEND;
4206         x_bus_object.user_mandated_flag.EXTEND;
4207         x_bus_object.root_node_flag.EXTEND;
4208         x_bus_object.entity_name.EXTEND;
4209         x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4210         x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4211         x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4212         x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4213         x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4214         x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4215       END IF;
4216     END LOOP;
4217 
4218     -- find all PARTY_SITE rows with child_bo_code, all rows must be CONTACT POINT
4219     FOR i IN 1..x_bus_object.business_object_code.COUNT LOOP
4220       IF(x_bus_object.child_bo_code(i) IS NOT NULL) THEN
4221         CASE
4222           WHEN x_bus_object.child_bo_code(i) = 'PHONE' THEN
4223             l_phone := x_bus_object.child_bo_code(i);
4224           WHEN x_bus_object.child_bo_code(i) = 'TLX' THEN
4225             l_telex := x_bus_object.child_bo_code(i);
4226           WHEN x_bus_object.child_bo_code(i) = 'EMAIL' THEN
4227             l_email := x_bus_object.child_bo_code(i);
4228           WHEN x_bus_object.child_bo_code(i) = 'WEB' THEN
4229             l_web := x_bus_object.child_bo_code(i);
4230           WHEN x_bus_object.child_bo_code(i) = 'EDI' THEN
4231             l_edi := x_bus_object.child_bo_code(i);
4232           WHEN x_bus_object.child_bo_code(i) = 'EFT' THEN
4233             l_eft := x_bus_object.child_bo_code(i);
4234           WHEN x_bus_object.child_bo_code(i) = 'SMS' THEN
4235             l_sms := x_bus_object.child_bo_code(i);
4236           ELSE -- for 'LOCATION'
4237             NULL;
4238         END CASE;
4239       END IF;
4240     END LOOP;
4241 
4242     -- find all contact point rows for PARTY_SITE
4243     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4244       IF(p_bus_object.business_object_code(i) = l_phone OR
4245          p_bus_object.business_object_code(i) = l_telex OR
4246          p_bus_object.business_object_code(i) = l_email OR
4247          p_bus_object.business_object_code(i) = l_web OR
4248          p_bus_object.business_object_code(i) = l_edi OR
4249          p_bus_object.business_object_code(i) = l_eft OR
4250          p_bus_object.business_object_code(i) = l_sms) THEN
4251         l_count := l_count + 1;
4252         x_bus_object.business_object_code.EXTEND;
4253         x_bus_object.child_bo_code.EXTEND;
4254         x_bus_object.tca_mandated_flag.EXTEND;
4255         x_bus_object.user_mandated_flag.EXTEND;
4256         x_bus_object.root_node_flag.EXTEND;
4257         x_bus_object.entity_name.EXTEND;
4258         x_bus_object.business_object_code(l_count) := p_bus_object.business_object_code(i);
4259         x_bus_object.child_bo_code(l_count) := p_bus_object.child_bo_code(i);
4260         x_bus_object.tca_mandated_flag(l_count) := p_bus_object.tca_mandated_flag(i);
4261         x_bus_object.user_mandated_flag(l_count) := p_bus_object.user_mandated_flag(i);
4262         x_bus_object.root_node_flag(l_count) := p_bus_object.root_node_flag(i);
4263         x_bus_object.entity_name(l_count) := p_bus_object.entity_name(i);
4264       END IF;
4265     END LOOP;
4266   END get_ps_from_rec;
4267 
4268 -- FUNCTION get_id_from_ososr
4269 --
4270 -- DESCRIPTION
4271 --     Get TCA Id based on original system and original system reference.
4272 --
4273 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4274 --
4275 -- ARGUMENTS
4276 --   IN:
4277 --     p_os                     Original system
4278 --     p_osr                    Original system reference
4279 --     p_owner_table_name       Owner table name
4280 -- NOTES
4281 --
4282 -- MODIFICATION HISTORY
4283 --
4284 --   13-Jul-2005    Arnold Ng   o Created.
4285 
4286   FUNCTION get_id_from_ososr(
4287     p_os                 IN VARCHAR2,
4288     p_osr                IN VARCHAR2,
4289     p_owner_table_name   IN VARCHAR2
4290   ) RETURN NUMBER IS
4291     l_count              NUMBER;
4292     l_owner_table_id     NUMBER;
4293     l_return_status      VARCHAR2(30);
4294   BEGIN
4295     l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
4296                  p_orig_system           => p_os,
4297                  p_orig_system_reference => p_osr,
4298                  p_owner_table_name      => p_owner_table_name);
4299 
4300     IF(l_count = 1) THEN
4301       -- Get owner_table_id
4302       HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
4303         p_orig_system           => p_os,
4304         p_orig_system_reference => p_osr,
4305         p_owner_table_name      => p_owner_table_name,
4306         x_owner_table_id        => l_owner_table_id,
4307         x_return_status         => l_return_status);
4308     END IF;
4309 
4310     RETURN l_owner_table_id;
4311   END get_id_from_ososr;
4312 
4313 -- FUNCTION is_cas_v2_bo_comp
4314 --
4315 -- DESCRIPTION
4316 --     Return true if customer account site object is complete.
4317 --     Otherwise, return false.
4318 --
4319 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4320 --
4321 -- ARGUMENTS
4322 --   IN:
4323 --     p_cas_v2_objs               List of customer account site business objects.
4324 --     p_bus_object             Business object structure for customer account site.
4325 -- NOTES
4326 --
4327 -- MODIFICATION HISTORY
4328 --
4329 --   1-FEB-2008    vsegu   o Created.
4330 
4331   FUNCTION is_cas_v2_bo_comp(
4332     p_cas_v2_objs                IN     HZ_CUST_ACCT_SITE_V2_BO_TBL,
4333     p_bus_object              IN     COMPLETENESS_REC_TYPE
4334   ) RETURN BOOLEAN IS
4335     l_valid_obj               BOOLEAN;
4336     l_casu                    BOOLEAN;
4337     l_cp                      BOOLEAN;
4338     l_cac                     BOOLEAN;
4339     l_cpa                     BOOLEAN;
4340     l_bau                     BOOLEAN;
4341     l_pm                      BOOLEAN;
4342     l_cac_bus_object          COMPLETENESS_REC_TYPE;
4343   BEGIN
4344     l_casu := FALSE;
4345     l_cp   := FALSE;
4346     l_cpa  := FALSE;
4347     l_cac  := FALSE;
4348     l_bau  := FALSE;
4349     l_pm   := FALSE;
4350 
4351     IF(p_cas_v2_objs IS NULL OR p_cas_v2_objs.COUNT < 1) THEN
4352       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
4353       fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE');
4354       fnd_msg_pub.add;
4355       RETURN FALSE;
4356     END IF;
4357 
4358     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4359       -- no entities of cust acct site
4360       IF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4361          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE' AND
4362          p_bus_object.user_mandated_flag(i) = 'Y') THEN
4363         CASE
4364           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE_USE' AND
4365                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
4366             l_casu := TRUE;
4367           WHEN(p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT' AND
4368                p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE') THEN
4369             l_cac := TRUE;
4370         END CASE;
4371       ELSIF(p_bus_object.tca_mandated_flag(i) = 'N' AND
4372          p_bus_object.user_mandated_flag(i) = 'Y' AND
4373          p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
4374          p_bus_object.child_bo_code(i) IS NULL) THEN
4375         CASE
4376           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
4377             l_pm := TRUE;
4378           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
4379             l_bau := TRUE;
4380         END CASE;
4381       ELSIF(p_bus_object.child_bo_code(i) = 'CUST_PROFILE' AND
4382             p_bus_object.business_object_code(i) = 'CUST_ACCT_SITE_USE' AND
4383             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4384         l_cp := TRUE;
4385       ELSIF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS' AND
4386             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
4387             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4388         l_cpa := TRUE;
4389       END IF;
4390     END LOOP;
4391 
4392     IF(l_cac) THEN
4393       get_bus_obj_struct(
4394         p_bus_object_code    => 'CUST_ACCT_CONTACT',
4395         x_bus_object         => l_cac_bus_object
4396       );
4397     END IF;
4398 
4399     FOR i IN 1..p_cas_v2_objs.COUNT LOOP
4400       IF(l_cac) THEN
4401         l_valid_obj := is_cac_bo_comp(
4402                          p_cac_objs    => p_cas_v2_objs(i).cust_acct_contact_objs,
4403                          p_bus_object  => l_cac_bus_object
4404                        );
4405         IF NOT(l_valid_obj) THEN
4406           RETURN FALSE;
4407         END IF;
4408       END IF;
4409 
4410       IF(l_casu AND
4411         (p_cas_v2_objs(i).cust_acct_site_use_objs IS NULL OR
4412          p_cas_v2_objs(i).cust_acct_site_use_objs.COUNT < 1)) THEN
4413         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4414         fnd_message.set_token('OBJECT' ,'CUST_ACCT_SITE_USE');
4415         fnd_msg_pub.add;
4416         RETURN FALSE;
4417 
4418         FOR j IN 1..p_cas_v2_objs(i).cust_acct_site_use_objs.COUNT LOOP
4419           IF(l_cp AND p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj IS NULL) THEN
4420             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4421             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE');
4422             fnd_msg_pub.add;
4423             RETURN FALSE;
4424           END IF;
4425           IF(l_cpa AND
4426             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs IS NULL OR
4427              p_cas_v2_objs(i).cust_acct_site_use_objs(j).site_use_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
4428             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4429             fnd_message.set_token('OBJECT' ,'SITE_USE_PROFILE_AMOUNT');
4430             fnd_msg_pub.add;
4431             RETURN FALSE;
4432           END IF;
4433           -- for bank account use and payment method
4434           IF(l_bau AND
4435             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs IS NULL OR
4436              p_cas_v2_objs(i).cust_acct_site_use_objs(j).bank_acct_use_objs.COUNT < 1)) THEN
4437             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4438             fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
4439             fnd_msg_pub.add;
4440             RETURN FALSE;
4441           END IF;
4442           IF(l_pm AND
4443             (p_cas_v2_objs(i).cust_acct_site_use_objs(j).payment_method_objs IS NULL OR
4444              p_cas_v2_objs(i).cust_acct_site_use_objs(j).payment_method_objs.COUNT < 1)) THEN
4445             fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4446             fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
4447             fnd_msg_pub.add;
4448             RETURN FALSE;
4449           END IF;
4450         END LOOP;
4451       END IF;
4452     END LOOP;
4453 
4454     RETURN TRUE;
4455   END is_cas_v2_bo_comp;
4456 
4457 -- FUNCTION is_ca_v2_bo_comp
4458 --
4459 -- DESCRIPTION
4460 --     Return true if customer account object is complete.  Otherwise, return false.
4461 --
4462 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4463 --
4464 -- ARGUMENTS
4465 --   IN:
4466 --     p_ca_v2_objs                List of customer account business objects.
4467 --     p_bus_object             Business object structure for customer account.
4468 -- NOTES
4469 --
4470 -- MODIFICATION HISTORY
4471 --
4472 --   1-FEB-2008    vsegu   o Created.
4473 
4474   FUNCTION is_ca_v2_bo_comp(
4475     p_ca_v2_objs                 IN     HZ_CUST_ACCT_V2_BO_TBL,
4476     p_bus_object              IN     COMPLETENESS_REC_TYPE
4477   ) RETURN BOOLEAN IS
4478     l_valid_obj               BOOLEAN;
4479     l_carel                   BOOLEAN;
4480     l_cas                     BOOLEAN;
4481     l_cac                     BOOLEAN;
4482     l_cp                      BOOLEAN;
4483     l_cpa                     BOOLEAN;
4484     l_bau                     BOOLEAN;
4485     l_pm                      BOOLEAN;
4486     l_cas_bus_object          COMPLETENESS_REC_TYPE;
4487     l_cac_bus_object          COMPLETENESS_REC_TYPE;
4488   BEGIN
4489     l_carel := FALSE;
4490     l_cas   := FALSE;
4491     l_cac   := FALSE;
4492     l_cp    := FALSE;
4493     l_cpa   := FALSE;
4494     l_bau   := FALSE;
4495     l_pm    := FALSE;
4496 
4497     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4498       fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_OBJ');
4499       fnd_message.set_token('OBJECT' ,'CUST_ACCT');
4500       fnd_msg_pub.add;
4501       RETURN FALSE;
4502     END IF;
4503 
4504     FOR i IN 1..p_bus_object.business_object_code.COUNT LOOP
4505       -- get all entities of cust acct, for cust acct, the possible entites are
4506       -- HZ_BANK_ACCOUNT_USE, HZ_PAYMENT_METHOD, HZ_CUST_ACCT_RELATE
4507       IF(p_bus_object.tca_mandated_flag(i) = 'N' AND
4508          p_bus_object.user_mandated_flag(i) = 'Y' AND
4509          p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
4510          p_bus_object.child_bo_code(i) IS NULL) THEN
4511         CASE
4512           WHEN(p_bus_object.entity_name(i) = 'HZ_CUST_ACCT_RELATE_ALL') THEN
4513             l_carel := TRUE;
4514           WHEN(p_bus_object.entity_name(i) = 'RA_CUST_RECEIPT_METHODS') THEN
4515             l_pm := TRUE;
4516           WHEN(p_bus_object.entity_name(i) = 'IBY_FNDCPT_PAYER_ASSGN_INSTR_V') THEN
4517             l_bau := TRUE;
4518         END CASE;
4519       -- Get other business object
4520       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4521             p_bus_object.business_object_code(i) = 'CUST_ACCT' AND
4522             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4523         CASE
4524           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_SITE') THEN
4525             l_cas := TRUE;
4526           WHEN (p_bus_object.child_bo_code(i) = 'CUST_ACCT_CONTACT') THEN
4527             l_cac := TRUE;
4528           ELSE
4529             null;
4530         END CASE;
4531       ELSIF(p_bus_object.child_bo_code(i) IS NOT NULL AND
4532             p_bus_object.business_object_code(i) = 'CUST_PROFILE' AND
4533             p_bus_object.user_mandated_flag(i) = 'Y') THEN
4534         IF(p_bus_object.entity_name(i) = 'HZ_CUST_PROFILE_AMTS') THEN
4535           l_cpa := TRUE;
4536         END IF;
4537       END IF;
4538     END LOOP;
4539 
4540     -- customer profile is mandatory for customer account
4541     l_cp := TRUE;
4542 
4543     IF(l_cas) THEN
4544       get_bus_obj_struct(
4545         p_bus_object_code    => 'CUST_ACCT_SITE',
4546         x_bus_object         => l_cas_bus_object
4547       );
4548     END IF;
4549 
4550     IF(l_cac) THEN
4551       get_bus_obj_struct(
4552         p_bus_object_code    => 'CUST_ACCT_CONTACT',
4553         x_bus_object         => l_cac_bus_object
4554       );
4555     END IF;
4556 
4557     FOR i IN 1..p_ca_v2_objs.COUNT LOOP
4558       IF(l_cas) THEN
4559         l_valid_obj := is_cas_v2_bo_comp(
4560                          p_cas_v2_objs    => p_ca_v2_objs(i).cust_acct_site_objs,
4561                          p_bus_object  => l_cas_bus_object
4562                        );
4563         IF NOT(l_valid_obj) THEN
4564           RETURN FALSE;
4565         END IF;
4566       END IF;
4567 
4568       IF(l_cac) THEN
4569         l_valid_obj := is_cac_bo_comp(
4570                          p_cac_objs    => p_ca_v2_objs(i).cust_acct_contact_objs,
4571                          p_bus_object  => l_cac_bus_object
4572                        );
4573         IF NOT(l_valid_obj) THEN
4574           RETURN FALSE;
4575         END IF;
4576       END IF;
4577 
4578       IF(l_carel AND
4579         (p_ca_v2_objs(i).acct_relate_objs IS NULL OR
4580          p_ca_v2_objs(i).acct_relate_objs.COUNT < 1)) THEN
4581         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4582         fnd_message.set_token('OBJECT' ,'CUSTOMER_ACCOUNT_RELATE');
4583         fnd_msg_pub.add;
4584         RETURN FALSE;
4585       END IF;
4586 
4587 -- for bank account use and payment method
4588       IF(l_bau AND
4589         (p_ca_v2_objs(i).bank_acct_use_objs IS NULL OR
4590          p_ca_v2_objs(i).bank_acct_use_objs.COUNT < 1)) THEN
4591         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4592         fnd_message.set_token('OBJECT' ,'BANK_ACCOUNT');
4593         fnd_msg_pub.add;
4594         RETURN FALSE;
4595       END IF;
4596       IF(l_pm AND
4597         (p_ca_v2_objs(i).payment_method_objs IS NULL OR
4598          p_ca_v2_objs(i).payment_method_objs.COUNT < 1)) THEN
4599         fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4600         fnd_message.set_token('OBJECT' ,'PAYMENT_METHOD');
4601         fnd_msg_pub.add;
4602         RETURN FALSE;
4603       END IF;
4604 
4605       IF(l_cp AND p_ca_v2_objs(i).cust_profile_obj IS NULL) THEN
4606         RETURN FALSE;
4607       ELSE
4608         IF(l_cpa AND
4609           (p_ca_v2_objs(i).cust_profile_obj.cust_profile_amt_objs IS NULL OR
4610            p_ca_v2_objs(i).cust_profile_obj.cust_profile_amt_objs.COUNT < 1)) THEN
4611           fnd_message.set_name('AR', 'HZ_API_MISSING_MANDATORY_ENT');
4612           fnd_message.set_token('OBJECT' ,'CUSTOMER_PROFILE_AMOUNT');
4613           fnd_msg_pub.add;
4614           RETURN FALSE;
4615         END IF;
4616       END IF;
4617     END LOOP;
4618 
4619     RETURN TRUE;
4620   END is_ca_v2_bo_comp;
4621 
4622 -- FUNCTION is_pca_v2_bo_comp
4623 --
4624 -- DESCRIPTION
4625 --     Return true if person customer object is complete.  Otherwise, return false.
4626 --
4627 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4628 --
4629 -- ARGUMENTS
4630 --   IN:
4631 --     p_person_obj             Person business object.
4632 --     p_ca_v2_objs             List of customer account objects.
4633 -- NOTES
4634 --
4635 -- MODIFICATION HISTORY
4636 --
4637 --   1-FEB-2008    vsegu   o Created.
4638 
4639   FUNCTION is_pca_v2_bo_comp(
4640     p_person_obj              IN     HZ_PERSON_BO,
4641     p_ca_v2_objs              IN     HZ_CUST_ACCT_V2_BO_TBL
4642   ) RETURN BOOLEAN IS
4643     l_per_bus_object          COMPLETENESS_REC_TYPE;
4644     l_ca_bus_object           COMPLETENESS_REC_TYPE;
4645     l_valid_obj               BOOLEAN;
4646   BEGIN
4647     IF(p_person_obj IS NULL) THEN
4648       RETURN FALSE;
4649     END IF;
4650     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4651       RETURN FALSE;
4652     END IF;
4653 
4654     -- check person object for person cust acct
4655     get_bus_obj_struct(
4656       p_bus_object_code         => 'PERSON',
4657       x_bus_object              => l_per_bus_object
4658     );
4659     l_valid_obj := is_person_bo_comp(
4660                      p_person_obj  => p_person_obj,
4661                      p_bus_object  => l_per_bus_object
4662                    );
4663     IF NOT(l_valid_obj) THEN
4664       RETURN FALSE;
4665     END IF;
4666 
4667     -- check cust account for person cust acct
4668     get_bus_obj_struct(
4669       p_bus_object_code         => 'CUST_ACCT',
4670       x_bus_object              => l_ca_bus_object
4671     );
4672     l_valid_obj := is_ca_v2_bo_comp(
4673                      p_ca_v2_objs    => p_ca_v2_objs,
4674                      p_bus_object => l_ca_bus_object
4675                    );
4676     IF NOT(l_valid_obj) THEN
4677       RETURN FALSE;
4678     END IF;
4679 
4680     RETURN TRUE;
4681   END is_pca_v2_bo_comp;
4682 
4683 -- FUNCTION is_oca_v2_bo_comp
4684 --
4685 -- DESCRIPTION
4686 --     Return true if organization customer object is complete.
4687 --     Otherwise, return false.
4688 --
4689 -- EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4690 --
4691 -- ARGUMENTS
4692 --   IN:
4693 --     p_org_obj                Organization business object.
4694 --     p_ca_v2_objs                List of customer account objects.
4695 -- NOTES
4696 --
4697 -- MODIFICATION HISTORY
4698 --
4699 --   1-FEB-2008    vsegu   o Created.
4700 
4701   FUNCTION is_oca_v2_bo_comp(
4702     p_org_obj                 IN     HZ_ORGANIZATION_BO,
4703     p_ca_v2_objs              IN     HZ_CUST_ACCT_V2_BO_TBL
4704   ) RETURN BOOLEAN IS
4705     l_org_bus_object          COMPLETENESS_REC_TYPE;
4706     l_ca_bus_object           COMPLETENESS_REC_TYPE;
4707     l_valid_obj               BOOLEAN;
4708   BEGIN
4709     IF(p_org_obj IS NULL) THEN
4710       RETURN FALSE;
4711     END IF;
4712     IF(p_ca_v2_objs IS NULL OR p_ca_v2_objs.COUNT < 1) THEN
4713       RETURN FALSE;
4714     END IF;
4715 
4716     -- check organization object for org cust acct
4717     get_bus_obj_struct(
4718       p_bus_object_code         => 'ORG',
4719       x_bus_object              => l_org_bus_object
4720     );
4721     l_valid_obj := is_org_bo_comp(
4722                      p_organization_obj => p_org_obj,
4723                      p_bus_object       => l_org_bus_object
4724                    );
4725     IF NOT(l_valid_obj) THEN
4726       RETURN FALSE;
4727     END IF;
4728 
4729     -- check cust account for org cust acct
4730     get_bus_obj_struct(
4731       p_bus_object_code         => 'CUST_ACCT',
4732       x_bus_object              => l_ca_bus_object
4733     );
4734     l_valid_obj := is_ca_v2_bo_comp(
4735                      p_ca_v2_objs          => p_ca_v2_objs,
4736                      p_bus_object       => l_ca_bus_object
4737                    );
4738     IF NOT(l_valid_obj) THEN
4739       RETURN FALSE;
4740     END IF;
4741 
4742     RETURN TRUE;
4743   END is_oca_v2_bo_comp;
4744 
4745 END HZ_REGISTRY_VALIDATE_BO_PVT;