1 PACKAGE BODY HZ_GNR_UTIL_PKG AS
2 /*$Header: ARHGNRUB.pls 120.33 2007/11/15 01:42:50 nsinghai ship $ */
3
4
5 --------------------------------------
6 -- declaration of private global varibles
7 --------------------------------------
8
9 g_debug_count NUMBER := 0;
10 --g_debug BOOLEAN := FALSE;
11
12 --------------------------------------
13 -- declaration of private procedures and functions
14 --------------------------------------
15
16 /*PROCEDURE enable_debug;
17
18 PROCEDURE disable_debug;
19 */
20
21 --------------------------------------
22 -- private procedures and functions
23 --------------------------------------
24
25 --------------------------------------
26 /*PROCEDURE enable_debug IS
27 BEGIN
28 g_debug_count := g_debug_count + 1;
29
30 IF g_debug_count = 1 THEN
31 IF fnd_profile.value('HZ_API_FILE_DEBUG_ON') = 'Y' OR
32 fnd_profile.value('HZ_API_DBMS_DEBUG_ON') = 'Y'
33 THEN
34 hz_utility_v2pub.enable_debug;
35 g_debug := TRUE;
36 END IF;
37 END IF;
38 END enable_debug; -- end procedure
39 */
40 --------------------------------------
41 --------------------------------------
42 /*PROCEDURE disable_debug IS
43 BEGIN
44
45 IF g_debug THEN
46 g_debug_count := g_debug_count - 1;
47 IF g_debug_count = 0 THEN
48 hz_utility_v2pub.disable_debug;
49 g_debug := FALSE;
50 END IF;
51 END IF;
52
53 END disable_debug;
54 */
55 --------------------------------------
56 /**
57 Function : gnr_exists
58
59 DESCRIPTION :
60 Function to tell if the GNR already processed for a given
61 location record or not.
62
63 ARGUMENTS :
64 IN p_location_id NUMBER
65 IN p_location_table_name VARCHAR2
66
67 RETURNS : BOOLEAN
68 TRUE : If GNR exists
69 FALSE : If GNR does not exists
70
71 MODIFICATION HISTORY:
72 17-FEB-2006 Baiju.nair Created
73
74 **/
75 FUNCTION gnr_exists(p_location_id IN NUMBER,
76 p_location_table_name IN VARCHAR2) RETURN BOOLEAN IS
77
78 CURSOR c_gnr IS
79 SELECT MAP_STATUS
80 FROM HZ_GEO_NAME_REFERENCE_LOG
81 WHERE LOCATION_TABLE_NAME = p_location_table_name
82 AND LOCATION_ID = p_location_id;
83
84 l_address_status VARCHAR2(30);
85 l_return_value BOOLEAN;
86
87 BEGIN
88
89 OPEN c_gnr;
90 FETCH c_gnr INTO l_address_status;
91 IF c_gnr%NOTFOUND THEN
92 l_return_value := FALSE;
93 ELSE
94 l_return_value := TRUE;
95 END IF;
96 CLOSE c_gnr;
97
98 RETURN l_return_value;
99
100 END gnr_exists;
101
102 --------------------------------------
103
104 /**
105 Function : location_updation_allowed
106
107 DESCRIPTION :
108 Function to tell if the location can be updated or not. It directly calls
109 ARH_ADDR_PKG.check_tran_for_all_accts to do this validation. This function is
110 just a wrapper for ease of use in GNR code
111
112 EXTERNAL PROCEDURES/FUNCTIONS ACCESSED :
113 ARH_ADDR_PKG
114
115 ARGUMENTS :
116 IN p_location_id NUMBER
117
118 RETURNS : BOOLEAN
119 TRUE : Location updation is allowed
120 FALSE : Location updation is not allowed
121
122 MODIFICATION HISTORY:
123 16-FEB-2006 Nishant Singhai Created
124
125 **/
126 FUNCTION location_updation_allowed(p_location_id IN NUMBER) RETURN BOOLEAN IS
127 BEGIN
128 -- Tax location Validation
129 IF ARH_ADDR_PKG.check_tran_for_all_accts(p_location_id) THEN
130 -- Transaction exists
131 RETURN FALSE;
132 ELSE
133 -- Transaction does not exists. OK to update location.
134 RETURN TRUE;
135 END IF;
136 END location_updation_allowed;
137
138 /**
139 Procedure : pre_location_update
140
141 DESCRIPTION :
142 Procedure to do pre-update processing for a given location record. This will
143 be used in GNR program, where it updates the location components.
144
145 EXTERNAL PROCEDURES/FUNCTIONS ACCESSED :
146 HZ_LOCATION_V2PUB
147 hz_fuzzy_pub
148 hz_timezone_pub
149
150 ARGUMENTS :
151 IN p_old_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE
152
153 IN OUT p_new_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE
154 IN OUT p_other_location_params HZ_GNR_UTIL_PKG.location_other_param_rec_type
155 (extendible - for future use)
156
157 MODIFICATION HISTORY:
158 16-FEB-2006 Nishant Singhai Created
159 **/
160 PROCEDURE pre_location_update (
161 p_old_location_rec IN HZ_LOCATION_V2PUB.LOCATION_REC_TYPE,
162 p_new_location_rec IN OUT NOCOPY HZ_LOCATION_V2PUB.LOCATION_REC_TYPE,
163 p_other_location_params IN OUT NOCOPY HZ_GNR_UTIL_PKG.loc_other_param_rec_type,
164 x_return_status OUT NOCOPY VARCHAR2,
165 x_msg_count OUT NOCOPY NUMBER,
166 x_msg_data OUT NOCOPY VARCHAR2
167 ) IS
168
169 l_changed_flag VARCHAR2(10);
170 l_message_count NUMBER;
171 l_msg_count NUMBER;
172 l_msg_data VARCHAR2(1000);
173 l_return_status VARCHAR2(30);
174
175 BEGIN
176 x_return_status := FND_API.G_RET_STS_SUCCESS;
177
178 -- get timezone id for changed location, if timezone_id is NULL
179 -- Same code as in HZ_LOCATION_V2PUB.UPDATE_LOCATION (to make it modular)
180 IF (p_new_location_rec.country IS NOT NULL AND
181 NVL(UPPER(p_old_location_rec.country), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.country))
182 OR (p_new_location_rec.city IS NOT NULL AND
183 NVL(UPPER(p_old_location_rec.city), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.city))
184 OR (p_new_location_rec.state IS NOT NULL AND
185 NVL(UPPER(p_old_location_rec.state), fnd_api.g_miss_char)<> UPPER(p_new_location_rec.state))
186 OR (p_new_location_rec.postal_code IS NOT NULL AND
187 NVL(UPPER(p_old_location_rec.postal_code), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.postal_code))
188 THEN
189 l_changed_flag := 'Y';
190 END IF;
191
192 IF ((l_changed_flag = 'Y') AND
193 (p_new_location_rec.timezone_id IS NULL
194 OR p_new_location_rec.timezone_id = fnd_api.g_miss_num)
195 )
196 THEN
197
198 l_message_count := fnd_msg_pub.count_msg();
199 hz_timezone_pub.get_timezone_id(
200 p_api_version => 1.0,
201 p_init_msg_list => FND_API.G_FALSE,
202 p_postal_code => p_new_location_rec.postal_code,
203 p_city => p_new_location_rec.city,
204 p_state => p_new_location_rec.state,
205 p_country => p_new_location_rec.country,
206 x_timezone_id => p_new_location_rec.timezone_id,
207 x_return_status => l_return_status ,
208 x_msg_count => l_msg_count ,
209 x_msg_data => l_msg_data);
210
211 IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
212 -- we don't raise error
213 p_new_location_rec.timezone_id := fnd_api.g_miss_num;
214 FOR i IN 1..(l_msg_count - l_message_count) LOOP
215 fnd_msg_pub.delete_msg(l_msg_count - l_message_count + 1 - i);
216 END LOOP;
217 l_return_status := FND_API.G_RET_STS_SUCCESS;
218 END IF;
219 END IF;
220
221 -- call address key generation program
222 p_new_location_rec.address_key := hz_fuzzy_pub.generate_key (
223 'ADDRESS',
224 NULL,
225 p_new_location_rec.address1,
226 p_new_location_rec.address2,
227 p_new_location_rec.address3,
228 p_new_location_rec.address4,
229 p_new_location_rec.postal_code,
230 NULL,
231 NULL
232 );
233
234 -- x_return_status to be ignored as it it be always success
235 x_return_status := l_return_status;
236
237 EXCEPTION WHEN OTHERS THEN
238 NULL;
239 END pre_location_update;
240
241 /**
242 Procedure : post_location_update
243
244 DESCRIPTION :
245 Procedure to do post-update processing for a given location record. This will
246 be used in GNR program, where it updates the location components.
247
248 EXTERNAL PROCEDURES/FUNCTIONS ACCESSED :
249 HZ_LOCATION_V2PUB
250 HZ_UTILITY_V2PUB
251 HZ_DQM_SYNC
252 HZ_BUSINESS_EVENT_V2PVT
253 HZ_POPULATE_BOT_PKG
254
255 ARGUMENTS :
256 IN p_old_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE
257
258 IN OUT p_new_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE
259 IN OUT p_other_location_params HZ_GNR_UTIL_PKG.location_other_param_rec_type
260 (extendible - for future use)
261
262 MODIFICATION HISTORY:
263 16-FEB-2006 Nishant Singhai Created
264 **/
265 PROCEDURE post_location_update (
266 p_old_location_rec IN HZ_LOCATION_V2PUB.LOCATION_REC_TYPE,
267 p_new_location_rec IN OUT NOCOPY HZ_LOCATION_V2PUB.LOCATION_REC_TYPE,
268 p_other_location_params IN OUT NOCOPY HZ_GNR_UTIL_PKG.loc_other_param_rec_type,
269 x_return_status OUT NOCOPY VARCHAR2,
270 x_msg_count OUT NOCOPY NUMBER,
271 x_msg_data OUT NOCOPY VARCHAR2
272 ) IS
273
274 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
275 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
276 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
277 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
278 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
279 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
280 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
281 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
282 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
283 l_program_update_date DATE; -- hz_utility_v2pub.program_update_date;
284
285 BEGIN
286
287 -- Initialize variables (perf improvement bug 5130993)
288 l_last_updated_by := hz_utility_v2pub.last_updated_by;
289 l_creation_date := hz_utility_v2pub.creation_date;
290 l_created_by := hz_utility_v2pub.created_by;
291 l_last_update_date := hz_utility_v2pub.last_update_date;
292 l_last_update_login := hz_utility_v2pub.last_update_login;
293 l_program_id := hz_utility_v2pub.program_id;
294 l_conc_login_id := fnd_global.conc_login_id;
295 l_program_application_id := hz_utility_v2pub.program_application_id;
296 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
297 l_program_update_date := hz_utility_v2pub.program_update_date;
298
299 -- update de-normalized location components in HZ_PARTIES for parties
300 -- having this location as an identifying location. There can be multiple
301 -- such parties.
302 DECLARE
303 l_party_id NUMBER;
304
305 CURSOR c1 IS
306 SELECT hps.party_id
307 FROM hz_party_sites hps
308 WHERE hps.location_id = p_new_location_rec.location_id
309 AND hps.identifying_address_flag = 'Y';
310 BEGIN
311 IF (p_new_location_rec.country IS NOT NULL AND
312 NVL(UPPER(p_old_location_rec.country), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.country))
313 OR (p_new_location_rec.address1 IS NOT NULL AND
314 NVL(UPPER(p_old_location_rec.address1),fnd_api.g_miss_char) <> UPPER(p_new_location_rec.address1))
315 OR (p_new_location_rec.address2 IS NOT NULL AND
316 NVL(UPPER(p_old_location_rec.address2),fnd_api.g_miss_char) <> UPPER(p_new_location_rec.address2))
317 OR (p_new_location_rec.address3 IS NOT NULL AND
318 NVL(UPPER(p_old_location_rec.address3),fnd_api.g_miss_char) <> UPPER(p_new_location_rec.address3))
319 OR (p_new_location_rec.address4 IS NOT NULL AND
320 NVL(UPPER(p_old_location_rec.address4),fnd_api.g_miss_char) <> UPPER(p_new_location_rec.address4))
321 OR (p_new_location_rec.city IS NOT NULL AND
322 NVL(UPPER(p_old_location_rec.city), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.city))
323 OR (p_new_location_rec.postal_code IS NOT NULL AND
324 NVL(UPPER(p_old_location_rec.postal_code), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.postal_code))
325 OR (p_new_location_rec.state IS NOT NULL AND
326 NVL(UPPER(p_old_location_rec.state), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.state))
327 OR (p_new_location_rec.province IS NOT NULL AND
328 NVL(UPPER(p_old_location_rec.province),fnd_api.g_miss_char) <> UPPER(p_new_location_rec.province))
329 OR (p_new_location_rec.county IS NOT NULL AND
330 NVL(UPPER(p_old_location_rec.county), fnd_api.g_miss_char) <> UPPER(p_new_location_rec.county))
331 THEN
332 BEGIN
333 OPEN c1;
334 LOOP
335 FETCH c1 INTO l_party_id;
336 EXIT WHEN c1%NOTFOUND;
337
338 -- Debug info.
339 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
340 hz_utility_v2pub.debug(p_message=>'Denormalizing party with ID: ' ||
341 l_party_id,
342 p_prefix =>'INFO:',
343 p_msg_level=>fnd_log.level_statement);
344 END IF;
345
346 -- Bug 2246041: Denormalization should not be done for Remit To
347 -- Addresses.
348
349 IF l_party_id <> -1 THEN
350 SELECT party_id
351 INTO l_party_id
352 FROM hz_parties
353 WHERE party_id = l_party_id
354 FOR UPDATE NOWAIT;
355
356 UPDATE hz_parties
357 SET country = p_new_location_rec.country,
358 address1 = p_new_location_rec.address1,
359 address2 = p_new_location_rec.address2,
360 address3 = p_new_location_rec.address3,
361 address4 = p_new_location_rec.address4,
362 city = p_new_location_rec.city,
363 postal_code = p_new_location_rec.postal_code,
364 state = p_new_location_rec.state,
365 province = p_new_location_rec.province,
366 county = p_new_location_rec.county,
367 last_update_date = l_last_update_date,
368 last_updated_by = l_last_updated_by,
369 last_update_login = l_last_update_login,
370 request_id = l_request_id,
371 program_id = l_program_id,
372 program_application_id = l_program_application_id,
373 program_update_date = l_program_update_date
374 WHERE party_id = l_party_id;
375
376 END IF; -- Only if address is not a Remit to.
377 END LOOP;
378 CLOSE c1;
379
380 EXCEPTION
381 WHEN OTHERS THEN
382 /*
383 fnd_message.set_name('AR', 'HZ_API_RECORD_CHANGED');
384 fnd_message.set_token('TABLE', 'HZ_PARTIES');
385 fnd_msg_pub.add;
386 */
387 CLOSE c1;
388 -- RAISE fnd_api.g_exc_error;
389 END;
390 END IF; -- location components have been modified
391 END;
392
393 -- Call to indicate location update to DQM
394 HZ_DQM_SYNC.sync_location(p_new_location_rec.location_id,'U');
395
396 -- Invoke business event system.
397
398 -- SSM SST Integration and Extension
399 -- For non-profile entities, the concept of select/de-select data-sources is obsoleted.
400 -- There is no need to check if the data-source is selected.
401 -- l_old_location_rec.orig_system := p_location_rec.orig_system;
402 IF(HZ_UTILITY_V2PUB.G_EXECUTE_API_CALLOUTS in ('EVENTS_ENABLED', 'Y')) THEN
403 HZ_BUSINESS_EVENT_V2PVT.update_location_event (
404 p_new_location_rec,
405 p_old_location_rec);
406 END IF;
407
408 IF(HZ_UTILITY_V2PUB.G_EXECUTE_API_CALLOUTS in ('EVENTS_ENABLED', 'BO_EVENTS_ENABLED')) THEN
409 -- populate function for integration service
410 HZ_POPULATE_BOT_PKG.pop_hz_locations(
411 p_operation => 'U',
412 p_location_id => p_new_location_rec.location_id );
413 END IF;
414
415 EXCEPTION WHEN OTHERS THEN
416 NULL;
417 END post_location_update;
418 ---------------------------------------
419
420 /**
421 * procedure delGNR
422 *
423 * DESCRIPTION
424 * This is to delete the rows from GNR table
425 * for a given combination of location id and table
426 *
427 * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
428 * None. Only gnrins and gnrl in this package
429 * procedure use this.
430 * ARGUMENTS
431 * IN:
432 *
433 * p_locId Location Identifier
434 * p_locTbl Location Table
435 *
436 * OUT:
437 * x_status Y in case of success, otherwise error message name
438 *
439 * NOTES
440 *
441 *
442 * MODIFICATION HISTORY
443 *
444 *
445 */
446 --------------------------------------
447 PROCEDURE delGNR (
448 p_locid IN number,
449 p_loctbl IN varchar2,
450 x_status OUT NOCOPY varchar2
451 ) IS
452
453 BEGIN
454
455 -- initializing the return status
456 x_status := fnd_api.g_ret_sts_success;
457
458 -- delete thing the location id and table name combination from gnr
459
460 DELETE FROM hz_geo_name_references
461 WHERE location_id = p_locid AND
462 location_table_name = p_loctbl;
463 EXCEPTION
464 WHEN others THEN
465 --dbms_output.put_line('error in del gnr' ||sqlerrm);
466 x_status := fnd_api.g_ret_sts_unexp_error;
467 END delGNR;
468 --------------------------------------
469 -- procedures and functions
470 --------------------------------------
471 /**
472 * PROCEDURE getMapId
473 *
474 * DESCRIPTION
475 * This private procedure is used to gets the
476 * map identifier for a given location id, loc table name
477 *
478 * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
479 *
480 * ARGUMENTS
481 * IN:
482 *
483 * p_locId Location Identifier
484 * p_locTbl Location Table
485 *
486 * OUT:
487 * x_mapId map identifier
488 * x_status Y in case of success, otherwise error message name
489 *
490 * NOTES
491 *
492 *
493 * MODIFICATION HISTORY
494 *
495 *
496 */
497 ----------------------------------------------
498 PROCEDURE getMapId(
499 p_locId IN NUMBER,
500 p_locTbl IN VARCHAR2,
501 x_cntry OUT NOCOPY VARCHAR2,
502 x_mapId OUT NOCOPY NUMBER,
503 x_status OUT NOCOPY VARCHAR2
504 ) IS
505
506 l_addrstyle varchar2(30);
507 l_sql1 varchar2(1000);
508 l_eflag varchar2(2);
509
510 BEGIN
511 x_status := fnd_api.g_ret_sts_success; -- defaulting the sucess status.
512 /* flow:
513 1. getcntrystyle()
514 2. if both addrstyle and country are not null,
515 get mapId using both else use country
516 */
517 --dbms_output.put_line('***bfr getcntrystyle');
518 hz_gnr_util_pkg.getcntrystyle(p_locid,p_loctbl,x_cntry,l_addrstyle,x_status);
519
520 IF (x_status <> fnd_api.g_ret_sts_success) THEN
521 -- there is some error in getcntrystyle(), hence exit
522 RAISE FND_API.G_EXC_ERROR;
523 END IF;
524 --dbms_output.put_line('***after getcntrystyle');
525
526 -- as getcntrystyle() validates the country - in this procedure
527 -- there is no need to validate it again.
528
529 /* if performance mandates, the following execute immediate stmts against
530 the map tbl can be converted into cursor stmts later.- srikanth
531 */
532
533 -- no data found can come from any of the three sqls in this procedure.
534 -- hence, to identify them appropriately to give user friedly mesg
535 -- l_eflag is used.
536
537 IF (l_addrstyle IS NULL) THEN
538 l_sql1 := 'select map_id from hz_geo_struct_map where loc_tbl_name =:tbl and
539 country_code = :cntry and address_style is null';
540 l_eflag := 'AN'; -- address style null case
541
542 execute IMMEDIATE l_sql1 INTO x_mapId USING IN p_loctbl, x_cntry;
543 ELSE
544 l_sql1 := 'select map_id from hz_geo_struct_map where loc_tbl_name =:tbl and
545 country_code = :cntry and address_style = :style';
546 l_eflag := 'A'; -- address style case
547
548 execute IMMEDIATE l_sql1 INTO x_mapId USING IN p_loctbl, x_cntry, l_addrstyle;
549 END IF;
550
551 EXCEPTION
552 WHEN no_data_found THEN
553
554 IF (l_eflag IS NULL) THEN
555 -- no map details for given map record
556 x_status := fnd_api.G_RET_STS_ERROR;
557 --dbms_output.put_line('***bfr mesglog() in exception');
558 mesglog(p_locid,p_loctbl,'HZ_GEO_NO_MAP_DTL', 'COUNTRY_CODE', x_cntry, NULL, NULL);
559 RAISE FND_API.G_EXC_ERROR;
560 ELSIF (l_eflag = 'AN') THEN
561 -- address style case is null case
562 x_status := fnd_api.G_RET_STS_ERROR;
563 --dbms_output.put_line('***bfr mesglog() when address style is null');
564 mesglog(p_locid,p_loctbl,'HZ_GEO_NOMAP', 'COUNTRY', x_cntry, NULL, NULL);
565 RAISE FND_API.G_EXC_ERROR;
566 ELSIF (l_eflag = 'A') THEN
567 -- address style and country code combinatio does not exist
568 x_status := fnd_api.G_RET_STS_ERROR;
569 --dbms_output.put_line('***bfr mesglog() when address style is not null');
570 mesglog(p_locid,p_loctbl,'HZ_GEO_NOMAP_ASTYLE', 'COUNTRY', x_cntry, 'STYLE', l_addrstyle);
571 RAISE FND_API.G_EXC_ERROR;
572 ELSE
573 RAISE FND_API.G_EXC_ERROR;
574 END IF;
575 END getMapId;
576
577 -----------------------------------------
578
579 --------------------------------------
580 /**
581 * procedure getmaprec
582 *
583 * description
584 * this private procedure is used to gets
585 * 1. the map record for a given location.
586 * 2. populates component values from loc rec
587 *
588 * external procedures/functions accessed
589 *
590 * arguments
591 * in:
592 *
593 * p_locid location identifier
594 * p_loctbl location table
595 *
596 * out:
597 *
598 * x_mltbl table of records that has
599 * geo element, type and loc components and their values
600 * x_status y in case of success, otherwise error message name
601 * x_mapId map identifier
602 * x_cntry country code
603 *
604 * notes
605 * following are the exceptions raised
606 * hz_geo_nomap
607 * hz_geo_nomap_astyle
608 * HZ_GEO_NO_MAP_DTL
609 * modification history
610 *
611 *
612 */
613 PROCEDURE getmaprec(
614 p_locid IN number,
615 p_loctbl IN varchar2,
616 x_mltbl OUT NOCOPY maploc_rec_tbl_type,
617 x_mapId OUT NOCOPY NUMBER,
618 x_cntry OUT NOCOPY varchar2,
619 x_status OUT NOCOPY varchar2
620 )IS
621
622 -- temp variable declaration
623 -- l_cntry varchar2(2);
624 l_addrstyle varchar2(30);
625 l_sql1 varchar2(1000);
626 l_mapdtl hz_geo_struct_map_dtl%ROWTYPE;
627 i number;
628 l_eflag varchar2(2);
629 l_debug_prefix VARCHAR2(30) := '';
630
631 CURSOR c1 (cp_map_id number) IS
632 SELECT loc_seq_num, loc_component,
633 geography_type, geo_element_col
634 FROM hz_geo_struct_map_dtl
635 WHERE map_id = cp_map_id
636 ORDER BY loc_seq_num ASC;
637
638 BEGIN
639 x_status := fnd_api.g_ret_sts_success; -- defaulting the sucess status.
640 -- Check if API is called in debug mode. If yes, enable debug.
641 --enable_debug;
642
643 /* flow:
644 1. given a mapid , gte map details
645 2. if both addrstyle and country are not null, get map rec using both
646 else use country to fetch map rec
647 3. getlocrec() is called to get the component details.
648 */
649
650 -- Debug info.
651 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
652 hz_utility_v2pub.debug(p_message=>'bfr getMapId()',
653 p_prefix =>l_debug_prefix,
654 p_msg_level=>fnd_log.level_statement);
655 END IF;
656
657 hz_gnr_util_pkg.getMapId(p_locid, p_loctbl, x_cntry, x_mapId, x_status );
658
659 -- given a mapid, get the details of the map
660 IF (x_status <> fnd_api.g_ret_sts_success) THEN
661 -- Debug info.
662 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
663 hz_utility_v2pub.debug(p_message=>'getMapId() failed',
664 p_prefix=>'ERROR',
665 p_msg_level=>fnd_log.level_error);
666 END IF;
667
668 -- there is some error in getcntrystyle(), hence exit
669 RAISE FND_API.G_EXC_ERROR;
670 END IF;
671
672 i := 1;
673 FOR c1rec IN c1(x_mapId)
674 LOOP
675 x_mltbl(i).loc_seq_num := c1rec.loc_seq_num;
676 x_mltbl(i).loc_component := c1rec.loc_component;
677 x_mltbl(i).geography_type := c1rec.geography_type;
678 x_mltbl(i).geo_element_col := c1rec.geo_element_col;
679 i := i+1;
680 END LOOP;
681 --disable_debug;
682 EXCEPTION
683 WHEN no_data_found THEN
684
685 -- Debug info.
686 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
687 hz_utility_v2pub.debug(p_message=>'in getMapRec Exception blk. No data found',
688 p_prefix=>'ERROR',
689 p_msg_level=>fnd_log.level_error);
690 END IF;
691
692 RAISE FND_API.G_EXC_ERROR;
693 END getmaprec;
694 -----------------------------------------
695 /**
696 * procedure getlocrec
697 *
698 * description
699 * this private procedure is used to get
700 * the location record. in addition, this would return
701 * country code address style of the location records
702 * in separate variables.
703 *
704 * external procedures/functions accessed
705 *
706 * arguments
707 * in:
708 *
709 * p_locid location identifier
710 * p_loctbl location table
711 *
712 * out:
713 *
714 * x_cntry country code
715 * x_addrstyle address style
716 * x_hrla rec type for hr_locations_all
717 * x_hzl rec type for hz_locations
718 * x_po rec type for po_vendor_sites_all
719 *
720 * exceptions raised
721 *
722 * HZ_GEO_LOC_TABLE_INVALID
723 * hz_geo_invalid_country
724 * hz_geo_no_loc_rec
725 *
726 * notes
727 *
728 *
729 * modification history
730 *
731 *
732 */
733 PROCEDURE getlocrec (
734 p_locid IN number,
735 p_loctbl IN varchar2,
736 x_mltbl IN OUT NOCOPY maploc_rec_tbl_type,
737 x_status OUT NOCOPY varchar2
738 ) IS
739
740 l_sql_1 varchar2(1000);
741 l_len number;
742 l_debug_prefix VARCHAR2(30) := '';
743
744 BEGIN
745 x_status := fnd_api.g_ret_sts_success; -- defaulting the sucess status.
746
747 l_sql_1 := 'select ';
748 FOR i IN x_mltbl.first..x_mltbl.last
749 LOOP
750 l_sql_1 := l_sql_1||x_mltbl(i).loc_component||',';
751 END LOOP;
752 l_sql_1 := SUBSTRB(l_sql_1, 1, LENGTHB(l_sql_1)-1);
753 l_sql_1 := l_sql_1||' from '|| p_loctbl||' where ';
754
755 -- Removed PO_VENDOR_SITES_ALL from the below if condition. Bug # 4584465
756 --IF p_loctbl = 'PO_VENDOR_SITES_ALL' THEN
757 -- check to see if theer are multiple rows for the same id.
758 -- l_sql_1 := l_sql_1||' vendor_site_id = :id and rownum =1 ';
759 --ELSE
760 -- l_sql_1 := l_sql_1||' location_id = :id and rownum =1 ';
761 --END IF;
762 l_sql_1 := l_sql_1||' location_id = :id and rownum =1 ';
763
764 l_len := x_mltbl.count;
765
766 IF (l_len = 1) THEN
767 execute IMMEDIATE l_sql_1
768 INTO x_mltbl(1).loc_compval USING IN p_locid;
769 ELSIF (l_len = 2) THEN
770 execute IMMEDIATE l_sql_1
771 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval
772 USING IN p_locid;
773 ELSIF (l_len = 3) THEN
774 execute IMMEDIATE l_sql_1
775 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval
776 USING IN p_locid;
777 ELSIF (l_len = 4) THEN
778 execute IMMEDIATE l_sql_1
779 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
780 x_mltbl(4).loc_compval
781 USING IN p_locid;
782 ELSIF (l_len = 5) THEN
783 execute IMMEDIATE l_sql_1
784 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
785 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval
786 USING IN p_locid;
787 ELSIF (l_len = 6) THEN
788 execute IMMEDIATE l_sql_1
789 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
790 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval, x_mltbl(6).loc_compval
791 USING IN p_locid;
792 ELSIF (l_len = 7) THEN
793 execute IMMEDIATE l_sql_1
794 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
795 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval, x_mltbl(6).loc_compval,
796 x_mltbl(7).loc_compval
797 USING IN p_locid;
798 ELSIF (l_len = 8) THEN
799 execute IMMEDIATE l_sql_1
800 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
801 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval, x_mltbl(6).loc_compval,
802 x_mltbl(7).loc_compval,x_mltbl(8).loc_compval
803 USING IN p_locid;
804 ELSIF (l_len = 9) THEN
805 execute IMMEDIATE l_sql_1
806 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
807 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval, x_mltbl(6).loc_compval,
808 x_mltbl(7).loc_compval,x_mltbl(8).loc_compval,x_mltbl(9).loc_compval
809 USING IN p_locid;
810 ELSIF (l_len = 10) THEN
811 execute IMMEDIATE l_sql_1
812 INTO x_mltbl(1).loc_compval, x_mltbl(2).loc_compval,x_mltbl(3).loc_compval,
813 x_mltbl(4).loc_compval, x_mltbl(5).loc_compval, x_mltbl(6).loc_compval,
814 x_mltbl(7).loc_compval,x_mltbl(8).loc_compval,x_mltbl(9).loc_compval
815 ,x_mltbl(10).loc_compval
816 USING IN p_locid;
817 ELSE
818 x_status := fnd_api.G_RET_STS_ERROR;
819 mesglog(p_locid,p_loctbl,'HZ_GEO_TOO_MANY_MAP_DTLS', NULL, NULL, NULL, NULL);
820 RAISE FND_API.G_EXC_ERROR;
821 END IF;
822
823 EXCEPTION
824 WHEN no_data_found THEN
825 x_status := fnd_api.G_RET_STS_ERROR;
826 mesglog(p_locid,p_loctbl,'HZ_GEO_NO_LOC_REC', 'LOC_ID',p_locid, 'TABLE_NAME', p_loctbl);
827 RAISE FND_API.G_EXC_ERROR;
828 END getlocrec;
829 -------------------------------------------
830 /**
831 * procedure getcntrystyle
832 *
833 * description
834 * this private procedure is used to get the country code address style for a location.
835 *
836 * external procedures/functions accessed
837 *
838 * arguments
839 * in:
840 *
841 * p_locid location identifier
842 * p_loctbl location table
843 *
844 * out:
845 *
846 * x_cntry country code
847 * x_addrstyle address style
848 *
849 * exceptions raised
850 *
851 * HZ_GEO_LOC_TABLE_INVALID
852 * hz_geo_invalid_country
853 * hz_geo_no_loc_rec
854 *
855 * notes
856 *
857 *
858 * modification history
859 *
860 *
861 */
862
863 PROCEDURE getcntrystyle (
864 p_locid IN number,
865 p_loctbl IN varchar2,
866 x_cntry OUT NOCOPY varchar2,
867 x_addrstyle OUT NOCOPY varchar2,
868 x_status OUT NOCOPY varchar2
869 ) IS
870
871 l_sql_1 varchar2(500);
872 l_sql_2 varchar2(500);
873 l_sql_3 varchar2(500);
874 l_sql_4 varchar2(300);
875 l_tmp number;
876 l_len number;
877 l_debug_prefix VARCHAR2(30) := '';
878
879 BEGIN
880 x_status := fnd_api.g_ret_sts_success; -- defaulting the sucess status.
881 -- Check if API is called in debug mode. If yes, enable debug.
882 --enable_debug;
883 -- three sql statements are necessary depending for three location tables.
884 -- the three tables are:
885 --
886 l_sql_3 := 'select country, style from hr_locations_all where location_id = :id and rownum = 1 ';
887 l_sql_2 := 'select country, address_style from hz_locations where location_id = :id and rownum =1 ';
888 -- l_sql_1 := 'select country, address_style from po_vendor_sites_all where vendor_site_id = :id and rownum =1 ';
889
890 l_sql_4 := 'select 1 from fnd_territories f where f.territory_code = :code';
891
892 -- Removed PO_VENDOR_SITES_ALL from the below if condition. Bug # 4584465
893 --IF p_loctbl = 'PO_VENDOR_SITES_ALL' THEN
894 -- Debug info.
895 -- IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
896 -- hz_utility_v2pub.debug(p_message=>'***sql for po_vendor_sites:'||l_sql_1,
897 -- p_prefix =>l_debug_prefix,
898 -- p_msg_level=>fnd_log.level_statement);
899 -- END IF;
900 -- execute IMMEDIATE l_sql_1 INTO x_cntry, x_addrstyle USING IN p_locid;
901 IF p_loctbl = 'HZ_LOCATIONS' THEN
902 -- Debug info.
903 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
904 hz_utility_v2pub.debug(p_message=>'***sql for hz_locations'||l_sql_2,
905 p_prefix =>l_debug_prefix,
906 p_msg_level=>fnd_log.level_statement);
907 END IF;
908 execute IMMEDIATE l_sql_2 INTO x_cntry, x_addrstyle USING IN p_locid;
909 ELSIF p_loctbl = 'HR_LOCATIONS_ALL' THEN
910 -- Debug info.
911 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
912 hz_utility_v2pub.debug(p_message=>'***sql for HR_LOCATIONS_ALL'||l_sql_3,
913 p_prefix =>l_debug_prefix,
914 p_msg_level=>fnd_log.level_statement);
915 END IF;
916 execute IMMEDIATE l_sql_3 INTO x_cntry, x_addrstyle USING IN p_locid;
917 ELSE
918 -- this means that the supplied table name is not supported by gnr in hz.k
919 x_status := fnd_api.G_RET_STS_ERROR;
920 -- Debug info.
921 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
922 hz_utility_v2pub.debug(p_message=>'***bfr mesglog() when tbl name is invalid',
923 p_prefix=>'ERROR',
924 p_msg_level=>fnd_log.level_error);
925 END IF;
926 mesglog(p_locid,p_loctbl,'HZ_GEO_LOC_TABLE_INVALID', NULL, NULL, NULL, NULL);
927 RAISE FND_API.G_EXC_ERROR;
928 END IF;
929 IF (x_cntry IS NULL) THEN
930 -- Debug info.
931 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
932 hz_utility_v2pub.debug(p_message=>'country code is null',
933 p_prefix=>'ERROR',
934 p_msg_level=>fnd_log.level_error);
935 END IF;
936 x_status := fnd_api.G_RET_STS_ERROR;
937 mesglog(p_locid,p_loctbl,'HZ_GEO_INVALID_COUNTRY', 'LOC_ID',p_locid, 'TABLE_NAME', p_loctbl);
938 RAISE FND_API.G_EXC_ERROR;
939 ELSE
940 l_len := LENGTHB(x_cntry);
941 IF l_len = 2 THEN
942 execute IMMEDIATE l_sql_4 INTO l_tmp USING IN x_cntry;
943 IF (l_tmp <> 1) THEN
944 x_status := fnd_api.G_RET_STS_ERROR;
945 mesglog(p_locid,p_loctbl,'HZ_GEO_INVALID_COUNTRY', 'LOC_ID',p_locid, 'TABLE_NAME', p_loctbl);
946 RAISE FND_API.G_EXC_ERROR;
947 END IF;
948 ELSE
949 x_status := fnd_api.G_RET_STS_ERROR;
950 mesglog(p_locid,p_loctbl,'HZ_GEO_INVALID_COUNTRY', 'LOC_ID',p_locid, 'TABLE_NAME', p_loctbl);
951 RAISE FND_API.G_EXC_ERROR;
952 END IF;
953 END IF;
954 --disable_debug;
955 EXCEPTION
956 WHEN no_data_found THEN
957 x_status := fnd_api.G_RET_STS_ERROR;
958 -- Debug info.
959 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
960 hz_utility_v2pub.debug(p_message=>'***bfr mesglog() in no data found',
961 p_prefix=>'ERROR',
962 p_msg_level=>fnd_log.level_error);
963 END IF;
964 mesglog(p_locid,p_loctbl,'HZ_GEO_NO_LOC_REC', 'LOC_ID',p_locid, 'TABLE_NAME', p_loctbl);
965 RAISE FND_API.G_EXC_ERROR;
966
967 END getcntrystyle;
968 ----------------------------------------------------
969
970 /**
971 * procedure gnrins
972 *
973 * description
974 * this private procedure is used to insert or update the
975 * gnr table.
976 * this procedure will update if the same location id and
977 * geography id combination is existing otherwise this will insert.
978 *
979 * external procedures/functions accessed
980 *
981 * arguments
982 * in:
983 *
984 * p_locid location identifier
985 * p_loctbl location table
986 *
987 * p_maptbl table of records that has location sequence number,
988 * geo element, type and loc components and their values
989 *
990 * out:
991 *
992 * x_status procedure status
993 *
994 *
995 * exceptions raised
996 *
997 *
998 * notes
999 *
1000 *
1001 * modification history
1002 *
1003 *
1004 */
1005 -----------------------------------------------------------
1006 PROCEDURE gnrins (
1007 p_locid IN number,
1008 p_loctbl IN varchar2,
1009 p_maptbl IN maploc_rec_tbl_type,
1010 x_status OUT NOCOPY varchar2
1011 ) IS
1012 l_debug_prefix VARCHAR2(30) := '';
1013
1014 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
1015 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
1016 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
1017 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
1018 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
1019 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
1020 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
1021 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
1022 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
1023
1024 BEGIN
1025
1026 /*
1027 flow:
1028 1. delete the locId and locTbl combination
1029 2. loop through the table of records and insert
1030 */
1031
1032 -- Initialize variables (perf improvement bug 5130993)
1033 l_last_updated_by := hz_utility_v2pub.last_updated_by;
1034 l_creation_date := hz_utility_v2pub.creation_date;
1035 l_created_by := hz_utility_v2pub.created_by;
1036 l_last_update_date := hz_utility_v2pub.last_update_date;
1037 l_last_update_login := hz_utility_v2pub.last_update_login;
1038 l_program_id := hz_utility_v2pub.program_id;
1039 l_conc_login_id := fnd_global.conc_login_id;
1040 l_program_application_id := hz_utility_v2pub.program_application_id;
1041 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
1042
1043 -- initializing the return status
1044 x_status := fnd_api.g_ret_sts_success;
1045
1046 -- Check if API is called in debug mode. If yes, enable debug.
1047 --enable_debug;
1048
1049
1050 -- Debug info.
1051 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1052 hz_utility_v2pub.debug(p_message=>'deleting loc id, table name combo from gnr',
1053 p_prefix =>l_debug_prefix,
1054 p_msg_level=>fnd_log.level_statement);
1055 hz_utility_v2pub.debug(p_message=>'bfr delgnr()',
1056 p_prefix =>l_debug_prefix,
1057 p_msg_level=>fnd_log.level_statement);
1058 END IF;
1059
1060 -- delete thing the location id and table name combination from gnr
1061 delgnr(p_locid,p_loctbl,x_status);
1062
1063 -- Debug info.
1064 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1065 hz_utility_v2pub.debug(p_message=>'aft delGnr()',
1066 p_prefix =>l_debug_prefix,
1067 p_msg_level=>fnd_log.level_statement);
1068 END IF;
1069
1070 IF x_status = FND_API.G_RET_STS_SUCCESS THEN
1071 FOR i IN p_maptbl.first .. p_maptbl.last
1072 LOOP
1073 IF (x_status = FND_API.G_RET_STS_SUCCESS) AND
1074 (p_maptbl(i).geography_id IS NOT NULL) THEN
1075 BEGIN
1076 INSERT INTO hz_geo_name_references
1077 (location_id, geography_id, location_table_name,
1078 object_version_number, geography_type, last_updated_by,
1079 creation_date, created_by, last_update_date,
1080 last_update_login, program_id, program_login_id,
1081 program_application_id,request_id)
1082 VALUES
1083 (p_locid, p_maptbl(i).geography_id,p_loctbl,
1084 1, p_maptbl(i).geography_type, l_last_updated_by,
1085 l_creation_date, l_created_by,
1086 l_last_update_date, l_last_update_login,
1087 l_program_id, l_conc_login_id,
1088 l_program_application_id, l_request_id);
1089 --disable_debug;
1090 EXCEPTION
1091 WHEN others THEN
1092
1093 -- Debug info.
1094 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
1095 hz_utility_v2pub.debug(p_message=>'error in ins gnr rec',
1096 p_prefix=>'ERROR',
1097 p_msg_level=>fnd_log.level_error);
1098 END IF;
1099 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1100 hz_utility_v2pub.debug(p_message=>'loc id:'||p_locid,
1101 p_prefix =>l_debug_prefix,
1102 p_msg_level=>fnd_log.level_statement);
1103 hz_utility_v2pub.debug(p_message=>'loc tbl:'||p_loctbl,
1104 p_prefix =>l_debug_prefix,
1105 p_msg_level=>fnd_log.level_statement);
1106 hz_utility_v2pub.debug(p_message=>'loc comp type:'||p_maptbl(i).geography_type,
1107 p_prefix =>l_debug_prefix,
1108 p_msg_level=>fnd_log.level_statement);
1109 hz_utility_v2pub.debug(p_message=>'loc comp geo id:'||p_maptbl(i).geography_id,
1110 p_prefix =>l_debug_prefix,
1111 p_msg_level=>fnd_log.level_statement);
1112 END IF;
1113
1114 x_status := fnd_api.g_ret_sts_unexp_error;
1115 END;
1116 END IF;
1117 END LOOP;
1118 ELSE
1119 x_status := fnd_api.g_ret_sts_unexp_error;
1120 END IF;
1121 --disable_debug;
1122 EXCEPTION
1123 WHEN others THEN
1124
1125 -- Debug info.
1126 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1127 hz_utility_v2pub.debug(p_message=>'in gnrIns() excep blk',
1128 p_prefix =>l_debug_prefix,
1129 p_msg_level=>fnd_log.level_statement);
1130 END IF;
1131 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
1132 hz_utility_v2pub.debug(p_message=>'sqlerrm:'||sqlerrm,
1133 p_prefix=>'ERROR',
1134 p_msg_level=>fnd_log.level_error);
1135 END IF;
1136
1137 x_status := fnd_api.g_ret_sts_unexp_error;
1138 END gnrins;
1139 -----------------------------------------------------------
1140 /**
1141 * procedure gnrl
1142 *
1143 * description
1144 * this private procedure is used to insert or update the
1145 * gnr log table. this log table will be updated irrespective
1146 * of whether the gnring of a location record is sucessfull or not.
1147 *
1148 * external procedures/functions accessed
1149 *
1150 * arguments
1151 * in:
1152 * p_locid location identifier
1153 * p_loctbl location table
1154 * p_mapstatus sucess, error or warning
1155 * in out:
1156 * x_status procedure return status/message name
1157 * that must be logged along with map status.
1158 *
1159 *
1160 * exceptions raised
1161 *
1162 *
1163 * notes
1164 *
1165 *
1166 * modification history
1167 *
1168 *
1169 */
1170
1171 PROCEDURE gnrl (
1172 p_locid IN number,
1173 p_loctbl IN varchar2,
1174 p_mapStatus IN varchar2,
1175 p_mesg IN varchar2
1176 ) IS
1177
1178 l_status varchar2(1);
1179 l_debug_prefix VARCHAR2(30) := '';
1180
1181 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
1182 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
1183 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
1184 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
1185 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
1186 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
1187 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
1188 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
1189 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
1190
1191 BEGIN
1192 -- Check if API is called in debug mode. If yes, enable debug.
1193 --enable_debug;
1194 -- flow:
1195 -- 1. delete the records with (locId, locTbl) combination
1196 --
1197 -- 2. in case of map status being error, delete records from gnr
1198 -- table also.
1199 --
1200 -- 3. insert the record in the GNRL
1201
1202 -- Initialize variables (perf improvement bug 5130993)
1203 l_last_updated_by := hz_utility_v2pub.last_updated_by;
1204 l_creation_date := hz_utility_v2pub.creation_date;
1205 l_created_by := hz_utility_v2pub.created_by;
1206 l_last_update_date := hz_utility_v2pub.last_update_date;
1207 l_last_update_login := hz_utility_v2pub.last_update_login;
1208 l_program_id := hz_utility_v2pub.program_id;
1209 l_conc_login_id := fnd_global.conc_login_id;
1210 l_program_application_id := hz_utility_v2pub.program_application_id;
1211 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
1212
1213 -- initializing the return status
1214 l_status := fnd_api.g_ret_sts_success;
1215
1216
1217 -- Debug info.
1218 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1219 hz_utility_v2pub.debug(p_message=>'in gnrl(), bfr deleting locid, tbl nm combo',
1220 p_prefix =>l_debug_prefix,
1221 p_msg_level=>fnd_log.level_statement);
1222 END IF;
1223
1224 -- delete thing the location id and table name combination from gnr
1225 BEGIN
1226 DELETE FROM hz_geo_name_reference_log
1227 WHERE location_id = p_locid
1228 AND location_table_name = p_loctbl;
1229 EXCEPTION
1230 WHEN others THEN
1231
1232 -- Debug info.
1233 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1234 hz_utility_v2pub.debug(p_message=>'excep when deleting locid, tbl nm combo frm gnrl tbl',
1235 p_prefix =>l_debug_prefix,
1236 p_msg_level=>fnd_log.level_statement);
1237 END IF;
1238
1239 RAISE FND_API.G_EXC_ERROR;
1240 -- x_status := fnd_api.g_ret_sts_unexp_error;
1241 END;
1242
1243
1244 -- This is to make the GNRL and GNR table in sync.
1245 -- In the case of GNR being sucess - gnrins() function
1246 -- deletes and re-creates rows for locationId and table
1247 -- combinations. Only in the case of Error, as gnrins() will not be called
1248 -- when ever there is a need to provide the previously GNRed
1249 -- location id and table combination but still need to write the
1250 -- result of the latest run in GNRL table comment the following
1251 -- delete statement.
1252
1253 IF (p_mapStatus = FND_API.G_RET_STS_ERROR) THEN
1254
1255 -- Debug info.
1256 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1257 hz_utility_v2pub.debug(p_message=>'bfr delGNR()',
1258 p_prefix =>l_debug_prefix,
1259 p_msg_level=>fnd_log.level_statement);
1260 END IF;
1261
1262 delGNR(p_locid,p_loctbl, l_status);
1263
1264 -- Debug info.
1265 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1266 hz_utility_v2pub.debug(p_message=>'aft delGNR()',
1267 p_prefix =>l_debug_prefix,
1268 p_msg_level=>fnd_log.level_statement);
1269 END IF;
1270
1271 END IF;
1272
1273 IF (l_status = fnd_api.g_ret_sts_success) THEN
1274 INSERT INTO hz_geo_name_reference_log
1275 (location_id, location_table_name,
1276 message_text,
1277 object_version_number, map_status,
1278 last_updated_by, creation_date,
1279 created_by, last_update_date,
1280 last_update_login, program_id,
1281 program_login_id,program_application_id,request_id)
1282 VALUES
1283 (p_locid, p_loctbl, p_mesg, 1, p_mapStatus,
1284 l_last_updated_by, l_creation_date,
1285 l_created_by, l_last_update_date,
1286 l_last_update_login, l_program_id,
1287 l_conc_login_id, l_program_application_id, l_request_id);
1288
1289 ELSE
1290
1291 -- Debug info.
1292 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
1293 hz_utility_v2pub.debug(p_message=>'unable to insert into GNRL tbl',
1294 p_prefix=>'ERROR',
1295 p_msg_level=>fnd_log.level_error);
1296 hz_utility_v2pub.debug(p_message=>'sqlerrm:'||sqlerrm,
1297 p_prefix=>'ERROR',
1298 p_msg_level=>fnd_log.level_error);
1299 END IF;
1300
1301 RAISE FND_API.G_EXC_ERROR;
1302 END IF;
1303
1304 --disable_debug;
1305 -- x_status := fnd_api.g_ret_sts_success;
1306 EXCEPTION
1307 WHEN others THEN
1308
1309 -- Debug info.
1310 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1311 hz_utility_v2pub.debug(p_message=>'in gnrl excep blk',
1312 p_prefix =>l_debug_prefix,
1313 p_msg_level=>fnd_log.level_statement);
1314 END IF;
1315 IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
1316 hz_utility_v2pub.debug(p_message=>'sqlerrm:'||sqlerrm,
1317 p_prefix=>'ERROR',
1318 p_msg_level=>fnd_log.level_error);
1319 END IF;
1320
1321 RAISE FND_API.G_EXC_ERROR;
1322 -- x_status := fnd_api.g_ret_sts_unexp_error;
1323 END gnrl;
1324 ----------------------------------------------
1325 /**
1326 * Procedure to write a message to the out file
1327 **/
1328 ----------------------------------------------
1329 PROCEDURE out(
1330 message IN VARCHAR2,
1331 newline IN BOOLEAN DEFAULT TRUE) IS
1332 BEGIN
1333 IF message = 'NEWLINE' THEN
1334 FND_FILE.NEW_LINE(FND_FILE.OUTPUT, 1);
1335 ELSIF (newline) THEN
1336 FND_FILE.put_line(fnd_file.output,message);
1337 ELSE
1338 FND_FILE.put(fnd_file.output,message);
1339 END IF;
1340 END out;
1341 ----------------------------------------------
1342 /**
1343 * Procedure to write a message to the log file
1344 **/
1345 ----------------------------------------------
1346 PROCEDURE log(
1347 message IN VARCHAR2,
1348 newline IN BOOLEAN DEFAULT TRUE) IS
1349 BEGIN
1350 IF message = 'NEWLINE' THEN
1351 FND_FILE.NEW_LINE(FND_FILE.LOG, 1);
1352 ELSIF (newline) THEN
1353 FND_FILE.put_line(fnd_file.log,message);
1354 ELSE
1355 FND_FILE.put_line(fnd_file.log,message);
1356 END IF;
1357 END log;
1358 ----------------------------------------------
1359 /**
1360 * Procedure to write a message to the out and log files
1361 **/
1362 ----------------------------------------------
1363 PROCEDURE outandlog(
1364 message IN VARCHAR2,
1365 newline IN BOOLEAN DEFAULT TRUE) IS
1366 BEGIN
1367 out(message, newline);
1368 log(message);
1369 END outandlog;
1370 ----------------------------------------------
1371 /**
1372 * procedure to fetch messages of the stack and log the error
1373 **/
1374 ----------------------------------------------
1375
1376 PROCEDURE logerr IS
1377 l_msg_data VARCHAR2(2000);
1378 BEGIN
1379 FND_MSG_PUB.Reset;
1380 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1381 log(FND_MSG_PUB.Get(p_encoded => FND_API.G_FALSE ));
1382 END LOOP;
1383 -- FND_MSG_PUB.Delete_Msg;
1384 END logerr;
1385 ----------------------------------------------
1386 /**
1387 * Function to fetch messages of the stack and log the error
1388 * Also returns the error
1389 **/
1390 ----------------------------------------------
1391 FUNCTION logerror RETURN VARCHAR2 IS
1392 l_msg_data VARCHAR2(2000);
1393 BEGIN
1394 FND_MSG_PUB.Reset;
1395
1396 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1397 l_msg_data := l_msg_data || ' ' || FND_MSG_PUB.Get(p_encoded => FND_API.G_FALSE );
1398 END LOOP;
1399 log(l_msg_data);
1400 RETURN l_msg_data;
1401 END logerror;
1402 ----------------------------------------------
1403 /*
1404 this procedure takes a message_name and enters into the message stack
1405 and writes into the log file also.
1406 */
1407 ----------------------------------------------
1408 PROCEDURE mesglog(
1409 p_locId IN NUMBER,
1410 p_locTbl IN VARCHAR2,
1411 p_message IN VARCHAR2,
1412 p_tkn1_name IN VARCHAR2,
1413 p_tkn1_val IN VARCHAR2,
1414 p_tkn2_name IN VARCHAR2,
1415 p_tkn2_val IN VARCHAR2
1416 ) IS
1417 BEGIN
1418
1419 FND_MESSAGE.SET_NAME('AR', p_message);
1420 IF (p_tkn1_name IS NOT NULL) THEN
1421 fnd_message.set_token(p_tkn1_name, p_tkn1_val);
1422 END IF;
1423 IF (p_tkn2_name IS NOT NULL) THEN
1424 fnd_message.set_token(p_tkn2_name, p_tkn2_val);
1425 END IF;
1426 FND_MSG_PUB.ADD;
1427 FND_MSG_PUB.Reset;
1428
1429 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1430 log(FND_MSG_PUB.Get(p_encoded => FND_API.G_FALSE ));
1431 END LOOP;
1432 --hz_gnr_util_pkg.gnrl(p_locid,p_loctbl,G_ERROR,FND_MSG_PUB.Get(p_encoded => FND_API.G_TRUE));
1433 hz_gnr_util_pkg.gnrl(p_locid,p_loctbl,FND_API.G_RET_STS_ERROR,FND_MSG_PUB.Get(p_encoded => FND_API.G_TRUE));
1434 END mesglog;
1435 ----------------------------------------------
1436 FUNCTION getQuery(
1437 p_map_dtls_tbl IN maploc_rec_tbl_type,
1438 p_mdu_tbl IN maploc_rec_tbl_type,
1439 x_status OUT NOCOPY VARCHAR2
1440 ) RETURN VARCHAR2 IS
1441
1442 -- Bug 6507596 : Changed length of query variables to handle more than 5 geography elements
1443 -- In such cases, for example, for 6 parameters, length of l_where itself becomes 1844
1444 -- causing l_query to be > 2000
1445 l_query varchar2(9000); -- (2000)
1446 l_select varchar2(1000); -- (2000)
1447 l_where varchar2(7000); -- (2000)
1448 l_from varchar2(1000); -- (2000)
1449 i number;
1450 l_lowest_value_index number;
1451
1452 BEGIN
1453
1454 x_status := FND_API.g_ret_sts_success;
1455
1456 IF P_MDU_TBL.COUNT = 1 THEN
1457 RETURN NULL;
1458 END IF;
1459
1460 l_select := 'SELECT g.GEOGRAPHY_ID,g.MULTIPLE_PARENT_FLAG';
1461 l_select := l_select||',GEOGRAPHY_ELEMENT1_ID';
1462 l_from := ' FROM HZ_GEOGRAPHIES g ';
1463 l_where := ' WHERE g.GEOGRAPHY_USE = ''MASTER_REF''';
1464 l_where := l_where||' AND g.COUNTRY_CODE = :country_code';
1465 -- Added +0 in the below line to fix the performance bug # 4642581
1466 l_where := l_where||' AND g.GEOGRAPHY_ELEMENT1_ID+0 = :id1';
1467 l_where := l_where||' AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE ';
1468
1469
1470 i := 0;
1471 IF P_MAP_DTLS_TBL.COUNT > 1 THEN
1472 i := P_MAP_DTLS_TBL.FIRST;
1473 i := P_MAP_DTLS_TBL.NEXT(i);
1474 LOOP
1475 l_select := l_select||','||P_MAP_DTLS_TBL(i).GEO_ELEMENT_COL||'_ID';
1476 EXIT WHEN i = P_MAP_DTLS_TBL.LAST;
1477 i := P_MAP_DTLS_TBL.NEXT(i);
1478 END LOOP;
1479 END IF;
1480
1481 -- Derive the index of the lowest value passed.
1482 i := 0;
1483 IF P_MDU_TBL.COUNT > 1 THEN
1484 i := P_MDU_TBL.FIRST;
1485 i := P_MDU_TBL.NEXT(i);
1486 LOOP
1487 IF P_MDU_TBL(i).LOC_COMPVAL IS NOT NULL THEN
1488 l_lowest_value_index := i;
1489 END IF;
1490 EXIT WHEN i = P_MDU_TBL.LAST;
1491 i := P_MDU_TBL.NEXT(i);
1492 END LOOP;
1493 END IF;
1494
1495 i := 0;
1496 IF P_MDU_TBL.COUNT > 1 THEN
1497 i := P_MDU_TBL.FIRST;
1498 i := P_MDU_TBL.NEXT(i);
1499 LOOP
1500 IF P_MDU_TBL(i).LOC_COMPVAL IS NOT NULL THEN
1501 IF i = l_lowest_value_index THEN
1502 -- lowest passed in value will not be null in element column
1503 -- So the OR clause to deal the multiparent element column null value is not required.
1504 l_where := l_where||' AND EXISTS( SELECT NULL FROM HZ_GEOGRAPHY_IDENTIFIERS i'||i;
1505 l_where := l_where||' WHERE i'||i||'.GEOGRAPHY_TYPE = :l_type'||i;
1506 l_where := l_where||' AND i'||i||'.GEOGRAPHY_USE = ''MASTER_REF''';
1507 l_where := l_where||' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID = i'||i||'.GEOGRAPHY_ID ';
1508 l_where := l_where||' AND upper(i'||i||'.IDENTIFIER_VALUE) = upper(:l_val'||i||'))';
1509 ELSE
1510 l_where := l_where||' AND (EXISTS( SELECT /*+ index(i'||i||',HZ_GEOGRAPHY_IDENTIFIERS_U1) */ NULL FROM HZ_GEOGRAPHY_IDENTIFIERS i'||i;
1511 l_where := l_where||' WHERE i'||i||'.GEOGRAPHY_TYPE = :l_type'||i;
1512 l_where := l_where||' AND i'||i||'.GEOGRAPHY_USE = ''MASTER_REF''';
1513 l_where := l_where||' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID = i'||i||'.GEOGRAPHY_ID ';
1514 l_where := l_where||' AND upper(i'||i||'.IDENTIFIER_VALUE) = upper(:l_val'||i||'))';
1515 l_where := l_where||' OR (g.multiple_parent_flag = ''Y'' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID IS NULL))';
1516 END IF;
1517 ELSE
1518 l_where := l_where||' AND :l_type'||i||' = ''X'' AND :l_val'||i||' =''X''';
1519 END IF;
1520
1521 IF i = P_MDU_TBL.LAST THEN
1522 l_where := l_where || ' AND g.GEOGRAPHY_TYPE = :geography_type';
1523 l_where := l_where || ' AND rownum < 3';
1524 EXIT;
1525 END IF;
1526
1527 i := P_MDU_TBL.NEXT(i);
1528 END LOOP;
1529 END IF;
1530 l_query := l_select || l_from || l_where;
1531 RETURN l_query;
1532 END getQuery;
1533 --------------------------------------
1534 --------------------------------------
1535 -- Below function is for creating the query when there is a cause MULTIPLE_MATCH
1536 -- In this case the query is same as the query created by getQuery function except that
1537 -- this also add the check to verify the identifier_type is NAME
1538 -- Fix for bug #
1539 FUNCTION getQueryforMultiMatch(
1540 p_map_dtls_tbl IN maploc_rec_tbl_type,
1541 p_mdu_tbl IN maploc_rec_tbl_type,
1542 x_status OUT NOCOPY VARCHAR2
1543 ) RETURN VARCHAR2 IS
1544
1545 -- Bug 6507596 : Changed length of query variables to handle more than 5 geography elements
1546 -- In such cases, for example, for 6 parameters, length of l_where itself becomes 1844
1547 -- causing l_query to be > 2000
1548 l_query varchar2(9000); -- (2000)
1549 l_select varchar2(1000); -- (2000)
1550 l_where varchar2(7000); -- (2000)
1551 l_from varchar2(1000); -- (2000)
1552 i number;
1553 l_lowest_value_index number;
1554
1555 BEGIN
1556
1557 x_status := FND_API.g_ret_sts_success;
1558
1559 IF P_MDU_TBL.COUNT = 1 THEN
1560 RETURN NULL;
1561 END IF;
1562
1563 l_select := 'SELECT g.GEOGRAPHY_ID,g.MULTIPLE_PARENT_FLAG';
1564 l_select := l_select||',GEOGRAPHY_ELEMENT1_ID';
1565 l_from := ' FROM HZ_GEOGRAPHIES g ';
1566 l_where := ' WHERE g.GEOGRAPHY_USE = ''MASTER_REF''';
1567 l_where := l_where||' AND g.COUNTRY_CODE = :country_code';
1568 -- Added +0 in the below line to fix the performance bug # 4642581
1569 l_where := l_where||' AND g.GEOGRAPHY_ELEMENT1_ID+0 = :id1';
1570 l_where := l_where||' AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE ';
1571
1572
1573 i := 0;
1574 IF P_MAP_DTLS_TBL.COUNT > 1 THEN
1575 i := P_MAP_DTLS_TBL.FIRST;
1576 i := P_MAP_DTLS_TBL.NEXT(i);
1577 LOOP
1578 l_select := l_select||','||P_MAP_DTLS_TBL(i).GEO_ELEMENT_COL||'_ID';
1579 EXIT WHEN i = P_MAP_DTLS_TBL.LAST;
1580 i := P_MAP_DTLS_TBL.NEXT(i);
1581 END LOOP;
1582 END IF;
1583
1584 -- Derive the index of the lowest value passed.
1585 i := 0;
1586 IF P_MDU_TBL.COUNT > 1 THEN
1587 i := P_MDU_TBL.FIRST;
1588 i := P_MDU_TBL.NEXT(i);
1589 LOOP
1590 IF P_MDU_TBL(i).LOC_COMPVAL IS NOT NULL THEN
1591 l_lowest_value_index := i;
1592 END IF;
1593 EXIT WHEN i = P_MDU_TBL.LAST;
1594 i := P_MDU_TBL.NEXT(i);
1595 END LOOP;
1596 END IF;
1597
1598 i := 0;
1599 IF P_MDU_TBL.COUNT > 1 THEN
1600 i := P_MDU_TBL.FIRST;
1601 i := P_MDU_TBL.NEXT(i);
1602 LOOP
1603 IF P_MDU_TBL(i).LOC_COMPVAL IS NOT NULL THEN
1604 IF i = l_lowest_value_index THEN
1605 -- lowest passed in value will not be null in element column
1606 -- So the OR clause to deal the multiparent element column null value is not required.
1607 l_where := l_where||' AND EXISTS( SELECT NULL FROM HZ_GEOGRAPHY_IDENTIFIERS i'||i;
1608 l_where := l_where||' WHERE i'||i||'.GEOGRAPHY_TYPE = :l_type'||i;
1609 l_where := l_where||' AND i'||i||'.GEOGRAPHY_USE = ''MASTER_REF''';
1610 l_where := l_where||' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID = i'||i||'.GEOGRAPHY_ID ';
1611 l_where := l_where||' AND upper(i'||i||'.IDENTIFIER_VALUE) = upper(:l_val'||i||')';
1612 l_where := l_where||' AND i'||i||'.IDENTIFIER_TYPE = ''NAME''';
1613 l_where := l_where||' AND i'||i||'.PRIMARY_FLAG = ''Y'')';
1614 ELSE
1615 l_where := l_where||' AND (EXISTS( SELECT /*+ index(i'||i||',HZ_GEOGRAPHY_IDENTIFIERS_U1) */ NULL FROM HZ_GEOGRAPHY_IDENTIFIERS i'||i;
1616 l_where := l_where||' WHERE i'||i||'.GEOGRAPHY_TYPE = :l_type'||i;
1617 l_where := l_where||' AND i'||i||'.GEOGRAPHY_USE = ''MASTER_REF''';
1618 l_where := l_where||' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID = i'||i||'.GEOGRAPHY_ID ';
1619 l_where := l_where||' AND upper(i'||i||'.IDENTIFIER_VALUE) = upper(:l_val'||i||')';
1620 l_where := l_where||' AND i'||i||'.IDENTIFIER_TYPE = ''NAME''';
1621 l_where := l_where||' AND i'||i||'.PRIMARY_FLAG = ''Y'')';
1622 l_where := l_where||' OR (g.multiple_parent_flag = ''Y'' AND g.'||P_MDU_TBL(i).GEO_ELEMENT_COL||'_ID IS NULL))';
1623 END IF;
1624 ELSE
1625 l_where := l_where||' AND :l_type'||i||' = ''X'' AND :l_val'||i||' =''X''';
1626 END IF;
1627
1628 IF i = P_MDU_TBL.LAST THEN
1629 l_where := l_where || ' AND g.GEOGRAPHY_TYPE = :geography_type';
1630 l_where := l_where || ' AND rownum < 3';
1631 EXIT;
1632 END IF;
1633
1634 i := P_MDU_TBL.NEXT(i);
1635 END LOOP;
1636 END IF;
1637 l_query := l_select || l_from || l_where;
1638 RETURN l_query;
1639 END getQueryforMultiMatch;
1640 --------------------------------------
1641 --------------------------------------
1642 PROCEDURE reverse_tbl(P_MAP_DTLS_TBL IN HZ_GNR_UTIL_PKG.MAPLOC_REC_TBL_TYPE,
1643 X_MAP_DTLS_TBL IN OUT NOCOPY HZ_GNR_UTIL_PKG.MAPLOC_REC_TBL_TYPE) IS
1644
1645 l_map_dtls_tbl HZ_GNR_UTIL_PKG.MAPLOC_REC_TBL_TYPE;
1646 i number;
1647 j number;
1648 BEGIN
1649 l_map_dtls_tbl := P_MAP_DTLS_TBL;
1650 IF l_map_dtls_tbl.COUNT > 0 THEN
1651 i := l_map_dtls_tbl.FIRST;
1652 LOOP
1653 IF i = l_map_dtls_tbl.LAST THEN
1654 IF X_MAP_DTLS_TBL.COUNT > 0 THEN
1655 j := X_MAP_DTLS_TBL.LAST + 1;
1656 ELSE
1657 j := 1;
1658 END IF;
1659 X_MAP_DTLS_TBL(j).LOC_SEQ_NUM := l_map_dtls_tbl(i).LOC_SEQ_NUM;
1660 X_MAP_DTLS_TBL(j).LOC_COMPONENT := l_map_dtls_tbl(i).LOC_COMPONENT;
1661 X_MAP_DTLS_TBL(j).GEOGRAPHY_TYPE := l_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1662 X_MAP_DTLS_TBL(j).GEO_ELEMENT_COL := l_map_dtls_tbl(i).GEO_ELEMENT_COL;
1663 X_MAP_DTLS_TBL(j).LOC_COMPVAL := l_map_dtls_tbl(i).LOC_COMPVAL;
1664 X_MAP_DTLS_TBL(j).GEOGRAPHY_ID := l_map_dtls_tbl(i).GEOGRAPHY_ID;
1665 l_map_dtls_tbl.DELETE(i);
1666 reverse_tbl(l_map_dtls_tbl,X_MAP_DTLS_TBL);
1667 EXIT;
1668 END IF;
1669 i := l_map_dtls_tbl.NEXT(i);
1670 END LOOP;
1671 END IF;
1672 END reverse_tbl;
1673 --------------------------------------
1674 --------------------------------------
1675 FUNCTION get_geo_id(p_geography_type IN VARCHAR2,p_mdtl_derived_tbl IN maploc_rec_tbl_type) RETURN NUMBER IS
1676 i number;
1677 BEGIN
1678 IF p_mdtl_derived_tbl.COUNT > 0 THEN
1679 i := p_mdtl_derived_tbl.FIRST;
1680 LOOP
1681 IF p_mdtl_derived_tbl(i).GEOGRAPHY_TYPE = p_geography_type AND p_mdtl_derived_tbl(i).GEOGRAPHY_ID IS NOT NULL THEN
1682 RETURN p_mdtl_derived_tbl(i).GEOGRAPHY_ID;
1683 END IF;
1684 EXIT WHEN i = p_mdtl_derived_tbl.LAST;
1685 i := p_mdtl_derived_tbl.NEXT(i);
1686 END LOOP;
1687 END IF;
1688 RETURN NULL;
1689 END get_geo_id;
1690 --------------------------------------
1691 --------------------------------------
1692 FUNCTION get_usage_val_status(p_map_dtls_tbl IN maploc_rec_tbl_type,p_mdu_tbl IN maploc_rec_tbl_type) RETURN VARCHAR2 IS
1693 i number;
1694 BEGIN
1695 IF p_mdu_tbl.COUNT > 0 THEN
1696 i := p_mdu_tbl.FIRST;
1697 LOOP
1698 IF get_geo_id(p_mdu_tbl(i).GEOGRAPHY_TYPE,p_map_dtls_tbl) IS NULL THEN
1699 RETURN FND_API.G_RET_STS_ERROR; -- Usage level validation has to go through.
1700 END IF;
1701 EXIT WHEN i = p_mdu_tbl.LAST;
1702 i := p_mdu_tbl.NEXT(i);
1703 END LOOP;
1704 END IF;
1705 RETURN FND_API.G_RET_STS_SUCCESS;
1706 END get_usage_val_status;
1707 --------------------------------------
1708 -- The below finction is to get the address validation status
1709 -- depends on the map status and address validation level
1710 --------------------------------------
1711 FUNCTION getAddrValStatus(
1712 p_map_dtls_tbl IN maploc_rec_tbl_type,
1713 p_mdu_tbl IN maploc_rec_tbl_type,
1714 p_called_from IN VARCHAR2,
1715 p_addr_val_level IN VARCHAR2,
1716 x_addr_warn_msg OUT NOCOPY VARCHAR2,
1717 x_map_status IN VARCHAR2,
1718 x_status IN OUT NOCOPY VARCHAR2
1719 ) RETURN VARCHAR2 IS
1720 l_addr_val_status VARCHAR2(2);
1721 i NUMBER;
1722 l_missing_elements VARCHAR2(2000);
1723 l_invalid_elements VARCHAR2(2000);
1724 l_addr_warn_msg VARCHAR2(2000);
1725
1726 l_module_prefix CONSTANT VARCHAR2(30) := 'HZ:ARHGNRUB:HZ_GNR_UTIL_PKG';
1727 l_module CONSTANT VARCHAR2(30) := 'ADDRESS_VALIDATION';
1728 l_debug_prefix VARCHAR2(30);
1729 BEGIN
1730
1731 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1732 hz_utility_v2pub.debug
1733 (p_message => 'Begin of getAddrValStatus procedure',
1734 p_prefix => l_debug_prefix,
1735 p_msg_level => fnd_log.level_procedure,
1736 p_module_prefix => l_module_prefix,
1737 p_module => l_module
1738 );
1739 END IF;
1740
1741 l_addr_val_status := fnd_api.g_ret_sts_success;
1742 l_missing_elements := NULL;
1743 -- If the map status = 'S' returm addr_val_status as 'S'
1744 IF x_map_status = 'S' then
1745 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1746 hz_utility_v2pub.debug
1747 (p_message => ' Map status is S. So, return address validation status as S ',
1748 p_prefix => l_debug_prefix,
1749 p_msg_level => fnd_log.level_statement,
1750 p_module_prefix => l_module_prefix,
1751 p_module => l_module
1752 );
1753 END IF;
1754 RETURN l_addr_val_status;
1755 -- If the called from is GNR returm addr_val_status as x_return_status
1756 ELSIF p_called_from = 'GNR' then
1757 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1758 hz_utility_v2pub.debug
1759 (p_message => ' Called from is GNR. So, return address validation status and return status as S ',
1760 p_prefix => l_debug_prefix,
1761 p_msg_level => fnd_log.level_statement,
1762 p_module_prefix => l_module_prefix,
1763 p_module => l_module
1764 );
1765 END IF;
1766 l_addr_val_status := x_status;
1767 RETURN l_addr_val_status;
1768 -- If the map status is 'E' and called from is <> GNR
1769 ELSE
1770 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1771 hz_utility_v2pub.debug
1772 (p_message => ' Map status is E. Check for address validation level.',
1773 p_prefix => l_debug_prefix,
1774 p_msg_level => fnd_log.level_statement,
1775 p_module_prefix => l_module_prefix,
1776 p_module => l_module
1777 );
1778 END IF;
1779 -- If validation level is NONE, return addr_val_status as 'S'
1780 IF p_addr_val_level = 'NONE' then
1781 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1782 hz_utility_v2pub.debug
1783 (p_message => ' Address validation level is NONE. So, return address validation status and return status as S',
1784 p_prefix => l_debug_prefix,
1785 p_msg_level => fnd_log.level_statement,
1786 p_module_prefix => l_module_prefix,
1787 p_module => l_module
1788 );
1789 END IF;
1790 -- If the addr_val_level is NONE, both return_status and addr_val_status
1791 -- will be set to success even if the validation fails.
1792 x_status := l_addr_val_status;
1793 RETURN l_addr_val_status;
1794 -- If validation level is ERROR, return addr_val_status as 'E'
1795 -- also set the message with the missing parameters.
1796 ELSIF p_addr_val_level = 'ERROR' then
1797 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1798 hz_utility_v2pub.debug
1799 (p_message => ' Address validation level is ERROR.',
1800 p_prefix => l_debug_prefix,
1801 p_msg_level => fnd_log.level_statement,
1802 p_module_prefix => l_module_prefix,
1803 p_module => l_module
1804 );
1805 END IF;
1806 l_addr_val_status := fnd_api.g_ret_sts_error;
1807 IF p_mdu_tbl.COUNT > 0 THEN
1808 i := p_mdu_tbl.FIRST;
1809 LOOP
1810 IF p_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL THEN
1811 l_addr_val_status := fnd_api.g_ret_sts_error;
1812 IF l_missing_elements is NULL then
1813 l_missing_elements := p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1814 ELSE
1815 l_missing_elements := l_missing_elements ||', ' || p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1816 END IF;
1817 END IF;
1818 EXIT WHEN i = p_mdu_tbl.LAST;
1819 i := p_mdu_tbl.NEXT(i);
1820 END LOOP;
1821 END IF;
1822 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1823 hz_utility_v2pub.debug
1824 (p_message => 'Please enter valid address elements : '||l_missing_elements,
1825 p_prefix => l_debug_prefix,
1826 p_msg_level => fnd_log.level_statement,
1827 p_module_prefix => l_module_prefix,
1828 p_module => l_module
1829 );
1830 END IF;
1831 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_ADDRESS');
1832 FND_MESSAGE.SET_TOKEN('P_MISSING_ELEMENTS', l_missing_elements);
1833 FND_MSG_PUB.ADD;
1834 RETURN l_addr_val_status;
1835 -- If validation level is WARNING, check the minimum parameters passed.
1836 -- If yes, set the addr_val_status to 'W' and return status to 'S'
1837 -- If not, set the message with the missing parameters
1838 ELSIF p_addr_val_level = 'WARNING' then
1839 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1840 hz_utility_v2pub.debug
1841 (p_message => ' Address validation level is WARNING.',
1842 p_prefix => l_debug_prefix,
1843 p_msg_level => fnd_log.level_statement,
1844 p_module_prefix => l_module_prefix,
1845 p_module => l_module
1846 );
1847 END IF;
1848 l_addr_val_status := 'W';
1849 x_status := fnd_api.g_ret_sts_success;
1850 IF p_mdu_tbl.COUNT > 0 THEN
1851 i := p_mdu_tbl.FIRST;
1852 LOOP
1853 -- Remove the code the find out the missing elements in case of WARNING
1854 -- This is to allow null values for Warning address validation level. Bug # 5011366
1855 -- IF p_map_dtls_tbl(i).LOC_COMPVAL IS NULL THEN
1856 -- l_addr_val_status := fnd_api.g_ret_sts_error;
1857 -- IF l_missing_elements is NULL then
1858 -- l_missing_elements := p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1859 -- ELSE
1860 -- l_missing_elements := l_missing_elements ||', ' || p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1861 -- END IF;
1862 -- ELSE
1863 IF p_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL THEN
1864 IF l_invalid_elements is NULL then
1865 l_invalid_elements := p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1866 ELSE
1867 l_invalid_elements := l_invalid_elements ||', ' || p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1868 END IF;
1869 END IF;
1870 -- END IF;
1871 EXIT WHEN i = p_mdu_tbl.LAST;
1872 i := p_mdu_tbl.NEXT(i);
1873 END LOOP;
1874 -- IF l_missing_elements is NULL then
1875 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_WARN_ADDRESS');
1876 FND_MESSAGE.SET_TOKEN('P_ALL_ELEMENTS', l_invalid_elements);
1877 x_addr_warn_msg := FND_MESSAGE.get;
1878 x_status := fnd_api.g_ret_sts_success;
1879 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1880 hz_utility_v2pub.debug
1881 (p_message => 'These address elements are not validated : '||l_invalid_elements,
1882 p_prefix => l_debug_prefix,
1883 p_msg_level => fnd_log.level_statement,
1884 p_module_prefix => l_module_prefix,
1885 p_module => l_module
1886 );
1887 END IF;
1888 -- ELSE
1889 -- FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_NULL_ADDRESS');
1890 -- FND_MESSAGE.SET_TOKEN('P_MISSING_ELEMENTS', l_missing_elements);
1891 -- FND_MSG_PUB.ADD;
1892 -- x_status := l_addr_val_status;
1893 -- IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1894 -- hz_utility_v2pub.debug
1895 -- (p_message => 'Please enter required address elements : '||l_missing_elements,
1896 -- p_prefix => l_debug_prefix,
1897 -- p_msg_level => fnd_log.level_statement,
1898 -- p_module_prefix => l_module_prefix,
1899 -- p_module => l_module
1900 -- );
1901 -- END IF;
1902 -- END IF;
1903 RETURN l_addr_val_status;
1904 END IF;
1905
1906 l_addr_val_status := 'W';
1907 RETURN l_addr_val_status;
1908 -- If validation level is MINIMUM, check the minimum parameters passed.
1909 -- If yes, set the addr_val_status to 'S' and return status to 'S'
1910 -- If not, set the message with the missing parameters
1911 ELSIF p_addr_val_level = 'MINIMUM' then
1912 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1913 hz_utility_v2pub.debug
1914 (p_message => ' Address validation level is MINIMUM.',
1915 p_prefix => l_debug_prefix,
1916 p_msg_level => fnd_log.level_statement,
1917 p_module_prefix => l_module_prefix,
1918 p_module => l_module
1919 );
1920 END IF;
1921 IF p_mdu_tbl.COUNT > 0 THEN
1922 i := p_mdu_tbl.FIRST;
1923 LOOP
1924 IF p_map_dtls_tbl(i).LOC_COMPVAL IS NULL THEN
1925 l_addr_val_status := fnd_api.g_ret_sts_error;
1926 IF l_missing_elements is NULL then
1927 l_missing_elements := p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1928 ELSE
1929 l_missing_elements := l_missing_elements ||', ' || p_map_dtls_tbl(i).GEOGRAPHY_TYPE;
1930 END IF;
1931 END IF;
1932 EXIT WHEN i = p_mdu_tbl.LAST;
1933 i := p_mdu_tbl.NEXT(i);
1934 END LOOP;
1935
1936 IF l_missing_elements is NULL then
1937 x_status := fnd_api.g_ret_sts_success;
1938 ELSE
1939 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_NULL_ADDRESS');
1940 FND_MESSAGE.SET_TOKEN('P_MISSING_ELEMENTS', l_missing_elements);
1941 FND_MSG_PUB.ADD;
1942 -- hk_debugl('Please enter required address elements: '|| l_missing_elements);
1943 -- hk_debugl('l_addr_val_status : '|| l_addr_val_status);
1944 x_status := l_addr_val_status;
1945 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1946 hz_utility_v2pub.debug
1947 (p_message => 'Please enter required address elements : '||l_missing_elements,
1948 p_prefix => l_debug_prefix,
1949 p_msg_level => fnd_log.level_statement,
1950 p_module_prefix => l_module_prefix,
1951 p_module => l_module
1952 );
1953 END IF;
1954 END IF;
1955
1956 RETURN l_addr_val_status;
1957 END IF;
1958 END IF;
1959 END IF;
1960 END;
1961 --------------------------------------
1962 --------------------------------------
1963 -- This function will be called only if the validation for entire map is a failure.
1964 FUNCTION do_usage_val(
1965 p_cause IN VARCHAR2,
1966 p_map_dtls_tbl IN maploc_rec_tbl_type,
1967 p_mdu_tbl IN maploc_rec_tbl_type,
1968 x_mdtl_derived_tbl IN OUT NOCOPY maploc_rec_tbl_type,
1969 x_status OUT NOCOPY varchar2
1970 ) RETURN BOOLEAN IS
1971 l_mapped_value_count number;
1972 l_usage_value_count number;
1973 i number;
1974
1975 BEGIN
1976 x_status := FND_API.g_ret_sts_success;
1977
1978 IF p_map_dtls_tbl.COUNT = p_mdu_tbl.COUNT THEN
1979 -- Validation for the entire map is already performed. IF the counts are equal, the mapping for the usage is same
1980 -- as the total mapping. So no need to repeat the same validation.
1981 IF (p_cause <> 'MISSING_CHILD' AND p_cause <> 'NO_MATCH') THEN
1982 x_mdtl_derived_tbl := p_map_dtls_tbl;
1983 END IF;
1984 RETURN FALSE;
1985 ELSE
1986 l_mapped_value_count := 0;
1987 l_usage_value_count := 0;
1988
1989 i:=0;
1990 IF p_map_dtls_tbl.COUNT > 0 THEN
1991 i := p_map_dtls_tbl.FIRST;
1992 LOOP
1993 IF p_map_dtls_tbl(i).LOC_COMPVAL IS NOT NULL THEN
1994 l_mapped_value_count := l_mapped_value_count + 1;
1995 END IF;
1996 EXIT WHEN i = p_map_dtls_tbl.LAST;
1997 i := p_map_dtls_tbl.NEXT(i);
1998 END LOOP;
1999 END IF;
2000
2001 i:=0;
2002 IF p_mdu_tbl.COUNT > 0 THEN
2003 i := p_mdu_tbl.FIRST;
2004 LOOP
2005 IF p_mdu_tbl(i).LOC_COMPVAL IS NOT NULL THEN
2006 l_usage_value_count := l_usage_value_count + 1;
2007 END IF;
2008 EXIT WHEN i = p_mdu_tbl.LAST;
2009 i := p_mdu_tbl.NEXT(i);
2010 END LOOP;
2011 END IF;
2012
2013 IF l_mapped_value_count = l_usage_value_count THEN
2014 -- Even if the mapping for a usage is a subset of total mapping, if the passed in values are the same
2015 -- We will not be able to derive additional information from Geography model
2016 -- So no need to repeat the same validation.
2017 IF (p_cause <> 'MISSING_CHILD' AND p_cause <> 'NO_MATCH' and p_cause <> 'MULTIPLE_PARENT') THEN
2018 x_mdtl_derived_tbl := p_map_dtls_tbl;
2019 END IF;
2020 RETURN FALSE;
2021 END IF;
2022 END IF;
2023
2024 IF p_cause = 'MISSING_CHILD' THEN
2025 i:=0;
2026 IF p_mdu_tbl.COUNT > 0 THEN
2027 i := p_mdu_tbl.FIRST;
2028 LOOP
2029 IF get_geo_id(p_mdu_tbl(i).GEOGRAPHY_TYPE,x_mdtl_derived_tbl) IS NULL THEN
2030 RETURN TRUE; -- Usage level validation has to go through.
2031 END IF;
2032 EXIT WHEN i = p_mdu_tbl.LAST;
2033 i := p_mdu_tbl.NEXT(i);
2034 END LOOP;
2035 END IF;
2036 RETURN FALSE; -- All the Usage level mapped columns were derived. So no need to repeat the validation.
2037 END IF;
2038
2039 RETURN TRUE; -- Usage level validation has to go through.
2040 END do_usage_val;
2041 --------------------------------------
2042 --------------------------------------
2043 PROCEDURE fill_values(
2044 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type
2045 ) IS
2046 i number;
2047 l_module_prefix CONSTANT VARCHAR2(30) := 'HZ:ARHGNRUB:HZ_GNR_UTIL_PKG';
2048 l_module CONSTANT VARCHAR2(30) := 'ADDRESS_VALIDATION';
2049 l_debug_prefix VARCHAR2(30);
2050 BEGIN
2051
2052 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2053 hz_utility_v2pub.debug
2054 (p_message => 'Begin of fill_values procedure',
2055 p_prefix => l_debug_prefix,
2056 p_msg_level => fnd_log.level_procedure,
2057 p_module_prefix => l_module_prefix,
2058 p_module => l_module
2059 );
2060 END IF;
2061 IF x_map_dtls_tbl.COUNT > 0 THEN
2062 i:= x_map_dtls_tbl.FIRST;
2063 -- Added the below line to skip the first record from the table (COUNTRY)
2064 i := i+1;
2065 LOOP
2066 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NOT NULL) THEN
2067 -- IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NOT NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NULL) THEN
2068 SELECT GEOGRAPHY_NAME, GEOGRAPHY_CODE
2069 INTO x_map_dtls_tbl(i).LOC_COMPVAL, x_map_dtls_tbl(i).GEOGRAPHY_CODE
2070 FROM HZ_GEOGRAPHIES
2071 WHERE GEOGRAPHY_ID = x_map_dtls_tbl(i).GEOGRAPHY_ID;
2072 END IF;
2073 EXIT WHEN i = x_map_dtls_tbl.LAST;
2074 i := x_map_dtls_tbl.NEXT(i);
2075 END LOOP;
2076 END IF;
2077 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2078 hz_utility_v2pub.debug
2079 (p_message => 'End of fill_values procedure',
2080 p_prefix => l_debug_prefix,
2081 p_msg_level => fnd_log.level_procedure,
2082 p_module_prefix => l_module_prefix,
2083 p_module => l_module
2084 );
2085 END IF;
2086 END fill_values;
2087 --------------------------------------
2088 --------------------------------------
2089 PROCEDURE putLocCompValues(
2090 p_map_dtls_tbl IN maploc_rec_tbl_type,
2091 x_loc_components_rec IN OUT NOCOPY loc_components_rec_type
2092 ) IS
2093
2094 FUNCTION map_exists(p_location_component IN VARCHAR2,
2095 p_map_dtls_tbl IN maploc_rec_tbl_type
2096 ) RETURN BOOLEAN IS
2097 i number;
2098 BEGIN
2099 IF p_map_dtls_tbl.COUNT > 0 THEN
2100 i:= p_map_dtls_tbl.FIRST;
2101 LOOP
2102 IF p_map_dtls_tbl(i).GEOGRAPHY_ID IS NOT NULL AND p_map_dtls_tbl(i).LOC_COMPONENT = p_location_component THEN
2103 RETURN TRUE;
2104 END IF;
2105 EXIT WHEN i = p_map_dtls_tbl.LAST;
2106 i := p_map_dtls_tbl.NEXT(i);
2107 END LOOP;
2108 END IF;
2109 RETURN FALSE;
2110 END map_exists;
2111
2112 FUNCTION getValue(p_location_component IN VARCHAR2,
2113 p_map_dtls_tbl IN maploc_rec_tbl_type
2114 ) RETURN VARCHAR2 IS
2115 i number :=0;
2116 BEGIN
2117 IF p_map_dtls_tbl.COUNT > 0 THEN
2118 i:= p_map_dtls_tbl.FIRST;
2119 LOOP
2120 IF p_map_dtls_tbl(i).LOC_COMPONENT = p_location_component THEN
2121 RETURN p_map_dtls_tbl(i).LOC_COMPVAL;
2122 END IF;
2123 EXIT WHEN i = p_map_dtls_tbl.LAST;
2124 i := p_map_dtls_tbl.NEXT(i);
2125 END LOOP;
2126 END IF;
2127 RETURN NULL;
2128 END getValue;
2129
2130 BEGIN
2131
2132 -- This API will overwrite the location component, only if that component is mapped and which has a valid geography id
2133 -- in the map details table.
2134 IF map_exists ('COUNTRY',p_map_dtls_tbl) = TRUE THEN
2135 x_loc_components_rec.COUNTRY := getValue('COUNTRY',p_map_dtls_tbl);
2136 END IF;
2137 IF map_exists ('CITY',p_map_dtls_tbl) = TRUE THEN
2138 x_loc_components_rec.CITY := getValue('CITY',p_map_dtls_tbl);
2139 END IF;
2140 IF map_exists ('POSTAL_CODE',p_map_dtls_tbl) = TRUE THEN
2141 x_loc_components_rec.POSTAL_CODE := getValue('POSTAL_CODE',p_map_dtls_tbl);
2142 END IF;
2143 IF map_exists ('STATE',p_map_dtls_tbl) = TRUE THEN
2144 x_loc_components_rec.STATE := getValue('STATE',p_map_dtls_tbl);
2145 END IF;
2146 IF map_exists ('PROVINCE',p_map_dtls_tbl) = TRUE THEN
2147 x_loc_components_rec.PROVINCE := getValue('PROVINCE',p_map_dtls_tbl);
2148 END IF;
2149 IF map_exists ('COUNTY',p_map_dtls_tbl) = TRUE THEN
2150 x_loc_components_rec.COUNTY := getValue('COUNTY',p_map_dtls_tbl);
2151 END IF;
2152 IF map_exists ('POSTAL_PLUS4_CODE',p_map_dtls_tbl) = TRUE THEN
2153 x_loc_components_rec.POSTAL_PLUS4_CODE := getValue('POSTAL_PLUS4_CODE',p_map_dtls_tbl);
2154 END IF;
2155 IF map_exists ('ATTRIBUTE1',p_map_dtls_tbl) = TRUE THEN
2156 x_loc_components_rec.ATTRIBUTE1 := getValue('ATTRIBUTE1',p_map_dtls_tbl);
2157 END IF;
2158 IF map_exists ('ATTRIBUTE2',p_map_dtls_tbl) = TRUE THEN
2159 x_loc_components_rec.ATTRIBUTE2 := getValue('ATTRIBUTE2',p_map_dtls_tbl);
2160 END IF;
2161 IF map_exists ('ATTRIBUTE3',p_map_dtls_tbl) = TRUE THEN
2162 x_loc_components_rec.ATTRIBUTE3 := getValue('ATTRIBUTE3',p_map_dtls_tbl);
2163 END IF;
2164 IF map_exists ('ATTRIBUTE4',p_map_dtls_tbl) = TRUE THEN
2165 x_loc_components_rec.ATTRIBUTE4 := getValue('ATTRIBUTE4',p_map_dtls_tbl);
2166 END IF;
2167 IF map_exists ('ATTRIBUTE5',p_map_dtls_tbl) = TRUE THEN
2168 x_loc_components_rec.ATTRIBUTE5 := getValue('ATTRIBUTE5',p_map_dtls_tbl);
2169 END IF;
2170 IF map_exists ('ATTRIBUTE6',p_map_dtls_tbl) = TRUE THEN
2171 x_loc_components_rec.ATTRIBUTE6 := getValue('ATTRIBUTE6',p_map_dtls_tbl);
2172 END IF;
2173 IF map_exists ('ATTRIBUTE7',p_map_dtls_tbl) = TRUE THEN
2174 x_loc_components_rec.ATTRIBUTE7 := getValue('ATTRIBUTE7',p_map_dtls_tbl);
2175 END IF;
2176 IF map_exists ('ATTRIBUTE8',p_map_dtls_tbl) = TRUE THEN
2177 x_loc_components_rec.ATTRIBUTE8 := getValue('ATTRIBUTE8',p_map_dtls_tbl);
2178 END IF;
2179 IF map_exists ('ATTRIBUTE9',p_map_dtls_tbl) = TRUE THEN
2180 x_loc_components_rec.ATTRIBUTE9 := getValue('ATTRIBUTE9',p_map_dtls_tbl);
2181 END IF;
2182 IF map_exists ('ATTRIBUTE10',p_map_dtls_tbl) = TRUE THEN
2183 x_loc_components_rec.ATTRIBUTE10 := getValue('ATTRIBUTE10',p_map_dtls_tbl);
2184 END IF;
2185 END putLocCompValues;
2186
2187 --------------------------------------
2188 PROCEDURE update_location (
2189 p_location_id IN number,
2190 p_loc_components_rec IN loc_components_rec_type,
2191 p_lock_flag IN varchar2,
2192 p_map_dtls_tbl IN maploc_rec_tbl_type,
2193 x_status OUT NOCOPY varchar2
2194 ) IS
2195
2196
2197 db_city VARCHAR2(60);
2198 db_state VARCHAR2(60);
2199 db_country VARCHAR2(60);
2200 db_county VARCHAR2(60);
2201 db_province VARCHAR2(60);
2202 db_postal_code VARCHAR2(60);
2203 db_postal_plus4_code VARCHAR2(60);
2204 db_attribute1 VARCHAR2(150);
2205 db_attribute2 VARCHAR2(150);
2206 db_attribute3 VARCHAR2(150);
2207 db_attribute4 VARCHAR2(150);
2208 db_attribute5 VARCHAR2(150);
2209 db_attribute6 VARCHAR2(150);
2210 db_attribute7 VARCHAR2(150);
2211 db_attribute8 VARCHAR2(150);
2212 db_attribute9 VARCHAR2(150);
2213 db_attribute10 VARCHAR2(150);
2214 db_wh_update_date DATE;
2215
2216 l_location_profile_rec hz_location_profile_pvt.location_profile_rec_type;
2217 l_loc_components_rec loc_components_rec_type;
2218 l_old_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE;
2219 l_new_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE;
2220 l_other_param_rec HZ_GNR_UTIL_PKG.loc_other_param_rec_type;
2221 l_wh_update_date DATE;
2222 l_address1 VARCHAR2(240);
2223 l_address2 VARCHAR2(240);
2224 l_address3 VARCHAR2(240);
2225 l_address4 VARCHAR2(240);
2226 l_actual_content_source VARCHAR2(30);
2227 l_address_key VARCHAR2(500);
2228 l_time_zone_id NUMBER;
2229 l_return_status VARCHAR2(30);
2230 l_msg_count NUMBER;
2231 l_msg_data VARCHAR2(2000);
2232 ll_return_status VARCHAR2(30);
2233 ll_msg_count NUMBER;
2234 ll_msg_data VARCHAR2(2000);
2235
2236 BEGIN
2237 l_loc_components_rec := p_loc_components_rec;
2238 -- if p_loc_flag is not true then the location has been locked already.
2239
2240 -- If the Location updation is allowed
2241 IF location_updation_allowed(p_location_id) then
2242
2243 IF p_lock_flag = 'T' OR p_lock_flag = FND_API.G_TRUE THEN
2244 -- get location components
2245 BEGIN
2246 SELECT COUNTRY, CITY, STATE, COUNTY, PROVINCE, POSTAL_CODE,POSTAL_PLUS4_CODE,
2247 ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5,
2248 ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, ATTRIBUTE9, ATTRIBUTE10,
2249 WH_UPDATE_DATE, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, ACTUAL_CONTENT_SOURCE,
2250 TIMEZONE_ID, ADDRESS_KEY
2251 INTO l_loc_components_rec.country, l_loc_components_rec.city, l_loc_components_rec.state,
2252 l_loc_components_rec.county, l_loc_components_rec.province,
2253 l_loc_components_rec.postal_code, l_loc_components_rec.postal_plus4_code,
2254 l_loc_components_rec.attribute1,l_loc_components_rec.attribute2,
2255 l_loc_components_rec.attribute3,l_loc_components_rec.attribute4,
2256 l_loc_components_rec.attribute5, l_loc_components_rec.attribute6,
2257 l_loc_components_rec.attribute7,l_loc_components_rec.attribute8,
2258 l_loc_components_rec.attribute9,l_loc_components_rec.attribute10,
2259 l_wh_update_date, l_address1, l_address2, l_address3, l_address4
2260 , l_actual_content_source, l_time_zone_id, l_address_key
2261 FROM HZ_LOCATIONS
2262 WHERE LOCATION_ID = p_location_id
2263 FOR UPDATE OF LOCATION_ID NOWAIT;
2264 EXCEPTION
2265 WHEN NO_DATA_FOUND THEN
2266 FND_MESSAGE.SET_NAME('AR', 'HZ_API_NO_RECORD');
2267 FND_MESSAGE.SET_TOKEN('RECORD', 'hz_locations');
2268 FND_MESSAGE.SET_TOKEN('VALUE', to_char(p_location_id));
2269 FND_MSG_PUB.ADD;
2270 x_status := FND_API.G_RET_STS_ERROR;
2271 END; -- end of SELECT
2272
2273 ELSE -- do not lock the location record
2274 -- get location components
2275 BEGIN
2276 SELECT COUNTRY, CITY, STATE, COUNTY, PROVINCE, POSTAL_CODE,POSTAL_PLUS4_CODE,
2277 ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5,
2278 ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, ATTRIBUTE9, ATTRIBUTE10,
2279 WH_UPDATE_DATE, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, ACTUAL_CONTENT_SOURCE,
2280 TIMEZONE_ID, ADDRESS_KEY
2281 INTO l_loc_components_rec.country, l_loc_components_rec.city, l_loc_components_rec.state,
2282 l_loc_components_rec.county, l_loc_components_rec.province,
2283 l_loc_components_rec.postal_code, l_loc_components_rec.postal_plus4_code,
2284 l_loc_components_rec.attribute1,l_loc_components_rec.attribute2,
2285 l_loc_components_rec.attribute3,l_loc_components_rec.attribute4,
2286 l_loc_components_rec.attribute5, l_loc_components_rec.attribute6,
2287 l_loc_components_rec.attribute7,l_loc_components_rec.attribute8,
2288 l_loc_components_rec.attribute9,l_loc_components_rec.attribute10,
2289 l_wh_update_date, l_address1, l_address2, l_address3, l_address4
2290 , l_actual_content_source, l_time_zone_id, l_address_key
2291 FROM HZ_LOCATIONS
2292 WHERE LOCATION_ID = p_location_id;
2293 EXCEPTION
2294 WHEN NO_DATA_FOUND THEN
2295 FND_MESSAGE.SET_NAME('AR', 'HZ_API_NO_RECORD');
2296 FND_MESSAGE.SET_TOKEN('RECORD', 'hz_locations');
2297 FND_MESSAGE.SET_TOKEN('VALUE', to_char(p_location_id));
2298 FND_MSG_PUB.ADD;
2299 x_status := FND_API.G_RET_STS_ERROR;
2300 END; -- end of SELECT ;
2301 END IF;
2302
2303 db_country := l_loc_components_rec.country;
2304 db_city := l_loc_components_rec.city ;
2305 db_state := l_loc_components_rec.state ;
2306 db_county := l_loc_components_rec.county ;
2307 db_province := l_loc_components_rec.province;
2308 db_postal_code := l_loc_components_rec.postal_code;
2309 db_postal_plus4_code := l_loc_components_rec.postal_plus4_code;
2310 db_attribute1 := l_loc_components_rec.attribute1;
2311 db_attribute2 := l_loc_components_rec.attribute2;
2312 db_attribute3 := l_loc_components_rec.attribute3;
2313 db_attribute4 := l_loc_components_rec.attribute4;
2314 db_attribute5 := l_loc_components_rec.attribute5;
2315 db_attribute6 := l_loc_components_rec.attribute6;
2316 db_attribute7 := l_loc_components_rec.attribute7;
2317 db_attribute8 := l_loc_components_rec.attribute8;
2318 db_attribute9 := l_loc_components_rec.attribute9;
2319 db_attribute10 := l_loc_components_rec.attribute10;
2320 db_wh_update_date := l_wh_update_date;
2321
2322 putLocCompValues(p_map_dtls_tbl,l_loc_components_rec);
2323
2324 -- Fix for Bug 5231893. Added UPPER to make case insensitive comaprison. It does not make sense to update
2325 -- location rec as part of GNR creation, just because fetched value from hz_locations is in different case
2326 -- than that derived from HZ_GEOGRAPHIES. It also improves performance by not updating that location rec
2327 -- and doing subsequent processes related to update_location. (18-MAY-2006 Nishant)
2328 IF NVL(UPPER(db_country),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.country),fnd_api.g_miss_char)
2329 AND NVL(UPPER(db_city),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2330 AND NVL(UPPER(db_state),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2331 AND NVL(UPPER(db_county),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.county),fnd_api.g_miss_char)
2332 AND NVL(UPPER(db_province),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2333 AND NVL(UPPER(db_postal_code),fnd_api.g_miss_char)= NVL(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2334 AND NVL(UPPER(db_attribute1),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute1),fnd_api.g_miss_char)
2335 AND NVL(UPPER(db_attribute2),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute2),fnd_api.g_miss_char)
2336 AND NVL(UPPER(db_attribute3),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute3),fnd_api.g_miss_char)
2337 AND NVL(UPPER(db_attribute4),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute4),fnd_api.g_miss_char)
2338 AND NVL(UPPER(db_attribute5),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute5),fnd_api.g_miss_char)
2339 AND NVL(UPPER(db_attribute6),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute6),fnd_api.g_miss_char)
2340 AND NVL(UPPER(db_attribute7),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute7),fnd_api.g_miss_char)
2341 AND NVL(UPPER(db_attribute8),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute8),fnd_api.g_miss_char)
2342 AND NVL(UPPER(db_attribute9),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute9),fnd_api.g_miss_char)
2343 AND NVL(UPPER(db_attribute10),fnd_api.g_miss_char)= NVL(UPPER(l_loc_components_rec.attribute10),fnd_api.g_miss_char)
2344 THEN
2345 NULL;
2346 ELSE
2347
2348 -- Old location record will have the data from database.
2349 l_old_location_rec.location_id := p_location_id;
2350 l_old_location_rec.country := db_country;
2351 l_old_location_rec.city := db_city;
2352 l_old_location_rec.state := db_state;
2353 l_old_location_rec.county := db_county;
2354 l_old_location_rec.province := db_province;
2355 l_old_location_rec.postal_code := db_postal_code;
2356 l_old_location_rec.postal_plus4_code := db_postal_plus4_code;
2357 l_old_location_rec.attribute1 := db_attribute1;
2358 l_old_location_rec.attribute2 := db_attribute2;
2359 l_old_location_rec.attribute3 := db_attribute3;
2360 l_old_location_rec.attribute4 := db_attribute4;
2361 l_old_location_rec.attribute5 := db_attribute5;
2362 l_old_location_rec.attribute6 := db_attribute6;
2363 l_old_location_rec.attribute7 := db_attribute7;
2364 l_old_location_rec.attribute8 := db_attribute8;
2365 l_old_location_rec.attribute9 := db_attribute9;
2366 l_old_location_rec.attribute10 := db_attribute10;
2367 l_old_location_rec.address1 := l_address1;
2368 l_old_location_rec.address2 := l_address2;
2369 l_old_location_rec.address3 := l_address3;
2370 l_old_location_rec.address4 := l_address4;
2371 l_old_location_rec.timezone_id := l_time_zone_id;
2372 l_old_location_rec.address_key := l_address_key;
2373
2374 -- Old location record will have the data derived by GNR.
2375 -- If country, city, state or postal_code is changed
2376 -- set the timezone_id is NULL so that pre_location_update
2377 -- will get the timezone based on new values.
2378 l_new_location_rec.location_id := p_location_id;
2379 l_new_location_rec.country := l_loc_components_rec.country;
2380 l_new_location_rec.city := l_loc_components_rec.city;
2381 l_new_location_rec.state := l_loc_components_rec.state;
2382 l_new_location_rec.county := l_loc_components_rec.county;
2383 l_new_location_rec.province := l_loc_components_rec.province;
2384 l_new_location_rec.postal_code := l_loc_components_rec.postal_code;
2385 l_new_location_rec.postal_plus4_code := l_loc_components_rec.postal_plus4_code;
2386 l_new_location_rec.attribute1 := l_loc_components_rec.attribute1;
2387 l_new_location_rec.attribute2 := l_loc_components_rec.attribute2;
2388 l_new_location_rec.attribute3 := l_loc_components_rec.attribute3;
2389 l_new_location_rec.attribute4 := l_loc_components_rec.attribute4;
2390 l_new_location_rec.attribute5 := l_loc_components_rec.attribute5;
2391 l_new_location_rec.attribute6 := l_loc_components_rec.attribute6;
2392 l_new_location_rec.attribute7 := l_loc_components_rec.attribute7;
2393 l_new_location_rec.attribute8 := l_loc_components_rec.attribute8;
2394 l_new_location_rec.attribute9 := l_loc_components_rec.attribute9;
2395 l_new_location_rec.attribute10 := l_loc_components_rec.attribute10;
2396 l_new_location_rec.address1 := l_address1;
2397 l_new_location_rec.address2 := l_address2;
2398 l_new_location_rec.address3 := l_address3;
2399 l_new_location_rec.address4 := l_address4;
2400 l_new_location_rec.address_key := l_address_key;
2401 IF (l_new_location_rec.country IS NOT NULL AND
2402 NVL(UPPER(l_old_location_rec.country), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.country))
2403 OR
2404 (l_new_location_rec.city IS NOT NULL AND
2405 NVL(UPPER(l_old_location_rec.city), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.city))
2406 OR
2407 (l_new_location_rec.state IS NOT NULL AND
2408 NVL(UPPER(l_old_location_rec.state), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.state))
2409 OR
2410 (l_new_location_rec.postal_code IS NOT NULL AND
2411 NVL(UPPER(l_old_location_rec.postal_code), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.postal_code))
2412 THEN
2413 l_new_location_rec.timezone_id := NULL;
2414 ELSE
2415 l_new_location_rec.timezone_id := l_time_zone_id;
2416 END IF;
2417
2418 -- Call pre_location_update to get timezone_id and address_key.
2419 begin
2420 pre_location_update( p_old_location_rec => l_old_location_rec,
2421 p_new_location_rec => l_new_location_rec,
2422 p_other_location_params => l_other_param_rec,
2423 x_return_status => ll_return_status,
2424 x_msg_count => ll_msg_count,
2425 x_msg_data => ll_msg_data );
2426 exception when others then
2427 null;
2428 end;
2429
2430 UPDATE HZ_LOCATIONS
2431 SET
2432 COUNTRY = l_loc_components_rec.country,
2433 CITY = l_loc_components_rec.city ,
2434 STATE = l_loc_components_rec.state ,
2435 COUNTY = l_loc_components_rec.county ,
2436 PROVINCE = l_loc_components_rec.province,
2437 POSTAL_CODE = l_loc_components_rec.postal_code,
2438 ATTRIBUTE1 = l_loc_components_rec.attribute1,
2439 ATTRIBUTE2 = l_loc_components_rec.attribute2,
2440 ATTRIBUTE3 = l_loc_components_rec.attribute3,
2441 ATTRIBUTE4 = l_loc_components_rec.attribute4,
2442 ATTRIBUTE5 = l_loc_components_rec.attribute5,
2443 ATTRIBUTE6 = l_loc_components_rec.attribute6,
2444 ATTRIBUTE7 = l_loc_components_rec.attribute7,
2445 ATTRIBUTE8 = l_loc_components_rec.attribute8,
2446 ATTRIBUTE9 = l_loc_components_rec.attribute9,
2447 ATTRIBUTE10 = l_loc_components_rec.attribute10,
2448 TIMEZONE_ID = l_new_location_rec.timezone_id,
2449 ADDRESS_KEY = l_new_location_rec.address_key
2450 WHERE LOCATION_ID = p_location_id;
2451
2452 -- fix for bug # 4169728. Set address_text to null in hz_cust_acct_sites_all table if,
2453 -- city, state, province or postal_code changes in hz_location table.
2454 -- address_text column in hz_cust_acct_sites_all is populated by the concurrent program,
2455 -- "Customer text data creation and indexing", if address_text is null.
2456 IF nvl(UPPER(db_city),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2457 AND nvl(UPPER(db_state),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2458 AND nvl(UPPER(db_province),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2459 AND nvl(UPPER(db_postal_code),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2460 THEN
2461 NULL;
2462 ELSE
2463 UPDATE hz_cust_acct_sites_all cas
2464 SET cas.address_text = null
2465 WHERE cas.address_text IS NOT NULL
2466 AND EXISTS
2467 ( SELECT 1
2468 FROM HZ_PARTY_SITES ps
2469 WHERE ps.location_id = p_location_id
2470 AND cas.party_site_id = ps.party_site_id );
2471 END IF;
2472
2473 IF nvl(UPPER(db_country),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.country),fnd_api.g_miss_char)
2474 AND nvl(UPPER(db_city),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2475 AND nvl(UPPER(db_state),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2476 AND nvl(UPPER(db_county),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.county),fnd_api.g_miss_char)
2477 AND nvl(UPPER(db_province),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2478 AND nvl(UPPER(db_postal_code),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2479 THEN
2480 NULL;
2481 ELSE
2482 l_location_profile_rec.location_profile_id := NULL;
2483 l_location_profile_rec.location_id := p_location_id;
2484 l_location_profile_rec.actual_content_source := l_actual_content_source;
2485 l_location_profile_rec.effective_start_date := NULL;
2486 l_location_profile_rec.effective_end_date := NULL;
2487 l_location_profile_rec.date_validated := NULL;
2488 l_location_profile_rec.city := l_loc_components_rec.city;
2489 l_location_profile_rec.postal_code := l_loc_components_rec.postal_code;
2490 l_location_profile_rec.county := l_loc_components_rec.county;
2491 l_location_profile_rec.country := l_loc_components_rec.country;
2492 l_location_profile_rec.address1 := l_address1;
2493 l_location_profile_rec.address2 := l_address2;
2494 l_location_profile_rec.address3 := l_address3;
2495 l_location_profile_rec.address4 := l_address4;
2496
2497 IF(l_loc_components_rec.state IS NOT NULL) THEN
2498 l_location_profile_rec.prov_state_admin_code := l_loc_components_rec.state;
2499 ELSIF(l_loc_components_rec.province IS NOT NULL) THEN
2500 l_location_profile_rec.prov_state_admin_code := l_loc_components_rec.province;
2501 ELSE
2502 l_location_profile_rec.prov_state_admin_code := NULL;
2503 END IF;
2504
2505 l_return_status := FND_API.G_RET_STS_SUCCESS;
2506
2507 hz_location_profile_pvt.update_location_profile (
2508 p_location_profile_rec => l_location_profile_rec
2509 ,x_return_status => l_return_status
2510 ,x_msg_count => l_msg_count
2511 ,x_msg_data => l_msg_data );
2512
2513 IF(l_return_status = FND_API.G_RET_STS_ERROR) THEN
2514 RAISE fnd_api.g_exc_error;
2515 ELSIF(l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2516 RAISE fnd_api.g_exc_unexpected_error;
2517 END IF;
2518 END IF;
2519
2520 -- Call post_location_update to do post update process.
2521 -- 1. Update de-normalized location components in HZ_PARTIES
2522 -- 2. Call to indicate location update to DQM(HZ_DQM_SYNC.sync_location).
2523 -- 3. 6. Invoke business event system.
2524 begin
2525 post_location_update( p_old_location_rec => l_old_location_rec,
2526 p_new_location_rec => l_new_location_rec,
2527 p_other_location_params => l_other_param_rec,
2528 x_return_status => ll_return_status,
2529 x_msg_count => ll_msg_count,
2530 x_msg_data => ll_msg_data );
2531 exception when others then
2532 null;
2533 end;
2534 END IF;
2535 END IF;
2536
2537 END update_location;
2538 --------------------------------------
2539 PROCEDURE create_gnr (
2540 p_location_id IN number,
2541 p_location_table_name IN varchar2,
2542 p_usage_code IN varchar2,
2543 p_map_status IN varchar2,
2544 p_loc_components_rec IN loc_components_rec_type,
2545 p_lock_flag IN varchar2,
2546 p_map_dtls_tbl IN maploc_rec_tbl_type,
2547 x_status OUT NOCOPY varchar2
2548 ) IS
2549 i number;
2550 l_module_prefix CONSTANT VARCHAR2(30) := 'HZ:ARHGNRUB:HZ_GNR_UTIL_PKG';
2551 l_module CONSTANT VARCHAR2(30) := 'ADDRESS_VALIDATION';
2552 l_debug_prefix VARCHAR2(30) := p_location_id;
2553 l_retain_flag VARCHAR2(10);
2554 l_map_dtls_tbl maploc_rec_tbl_type;
2555
2556 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
2557 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
2558 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
2559 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
2560 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
2561 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
2562 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
2563 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
2564 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
2565 l_api_purpose VARCHAR2(30);
2566
2567 -- Created below 2 cursors for performance reasons (perf team advice)
2568 -- to avoid DUP_VAL_ON_INDEX exception which is proving very costly
2569 -- during upgrade (Bug 5929771 : Nishant 16-APR-2007)
2570 l_gnr_log_exist VARCHAR2(10);
2571 l_gnr_exist VARCHAR2(10);
2572 l_gnr_deleted VARCHAR2(10);
2573
2574 CURSOR c_check_gnr_log_exist (p_location_id NUMBER,
2575 p_location_table_name VARCHAR2,
2576 p_usage_code VARCHAR2) IS
2577 SELECT 'Y'
2578 FROM hz_geo_name_reference_log
2579 WHERE location_id = p_location_id
2580 AND location_table_name = p_location_table_name
2581 AND usage_code = p_usage_code
2582 ;
2583
2584 CURSOR c_check_gnr_exist (p_location_id NUMBER,
2585 p_location_table_name VARCHAR2,
2586 p_geography_type VARCHAR2) IS
2587 SELECT 'Y'
2588 FROM hz_geo_name_references
2589 WHERE location_id = p_location_id
2590 AND location_table_name = p_location_table_name
2591 AND geography_type = p_geography_type
2592 ;
2593
2594 FUNCTION update_loc_yn(
2595 p_loc_components_rec IN loc_components_rec_type,
2596 p_map_dtls_tbl IN maploc_rec_tbl_type
2597 ) RETURN VARCHAR2 IS
2598 l_map_dtls_tbl maploc_rec_tbl_type;
2599 l_status varchar2(1);
2600 l_return varchar2(1);
2601 i number;
2602 j number;
2603 BEGIN
2604 l_return := 'N';
2605 l_map_dtls_tbl := p_map_dtls_tbl; -- This will populate all the derived Geography IDs
2606 getLocCompValues(
2607 P_loc_table => 'HZ_LOCATIONS',
2608 p_loc_components_rec => p_loc_components_rec,
2609 x_map_dtls_tbl => l_map_dtls_tbl,
2610 x_status => l_status);
2611
2612 IF p_map_dtls_tbl.COUNT > 0 THEN
2613 i := p_map_dtls_tbl.FIRST;
2614 LOOP
2615 IF p_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL THEN
2616 EXIT;
2617 END IF;
2618
2619 IF l_map_dtls_tbl.COUNT > 0 THEN
2620 j := l_map_dtls_tbl.FIRST;
2621 LOOP
2622 IF p_map_dtls_tbl(i).GEOGRAPHY_ID = l_map_dtls_tbl(j).GEOGRAPHY_ID THEN
2623 -- Fix for Bug 5231893 (added UPPER to do case insensitive comaprison
2624 -- Added on 18-May-2006 Nishant)
2625 IF NVL(UPPER(p_map_dtls_tbl(i).LOC_COMPVAL),FND_API.G_MISS_CHAR) <>
2626 NVL(UPPER(l_map_dtls_tbl(j).LOC_COMPVAL),FND_API.G_MISS_CHAR) THEN
2627 l_return := 'Y';
2628 END IF;
2629 END IF;
2630 EXIT WHEN j = l_map_dtls_tbl.LAST;
2631 j := l_map_dtls_tbl.NEXT(j);
2632 END LOOP;
2633 END IF;
2634
2635 EXIT WHEN i = p_map_dtls_tbl.LAST;
2636 i := p_map_dtls_tbl.NEXT(i);
2637 END LOOP;
2638 END IF;
2639 RETURN l_return;
2640 END update_loc_yn;
2641
2642 FUNCTION retain_gnr_yn(
2643 p_location_id IN number,
2644 p_map_status IN varchar2,
2645 p_map_dtls_tbl IN maploc_rec_tbl_type
2646 ) RETURN VARCHAR2 IS
2647 l_map_dtls_tbl maploc_rec_tbl_type;
2648 l_old_map_status varchar2(1);
2649 l_geography_type varchar2(30);
2650 l_retain varchar2(1);
2651 i number;
2652 j number;
2653
2654 cursor get_old_map_status is
2655 select map_status
2656 from HZ_GEO_NAME_REFERENCE_LOG
2657 where location_id = p_location_id
2658 and map_status = 'S';
2659
2660 cursor get_gnr_superloc_rec is
2661 select geography_type
2662 from HZ_GEO_NAME_REFERENCES
2663 where location_id = p_location_id
2664 and geography_id in (-99,-98);
2665
2666 BEGIN
2667 l_retain := 'N';
2668 l_old_map_status := 'E';
2669
2670 OPEN get_old_map_status;
2671 FETCH get_old_map_status INTO l_old_map_status;
2672 IF get_old_map_status%NOTFOUND THEN
2673 l_old_map_status := 'E';
2674 END IF;
2675 CLOSE get_old_map_status;
2676
2677 -- If old status is Success and new is Error,
2678 -- Check for nay record in gnr table is a Super Loc
2679 -- If yes, retain the old one
2680 if l_old_map_status = 'S' and p_map_status = 'E' then
2681
2682 OPEN get_gnr_superloc_rec;
2683 LOOP
2684 FETCH get_gnr_superloc_rec INTO l_geography_type;
2685 EXIT WHEN get_gnr_superloc_rec%NOTFOUND;
2686 IF p_map_dtls_tbl.COUNT > 0 THEN
2687 j := l_map_dtls_tbl.FIRST;
2688 l_retain := 'Y';
2689 LOOP
2690 IF p_map_dtls_tbl(j).GEOGRAPHY_TYPE = l_geography_type THEN
2691 if ( nvl(p_map_dtls_tbl(j).GEOGRAPHY_CODE,'NOVALUE') = 'MISSING' OR
2692 nvl(p_map_dtls_tbl(j).GEOGRAPHY_CODE,'NOVALUE') = 'UNKNOWN' ) THEN
2693 l_retain := 'N';
2694 EXIT;
2695 end if;
2696 END IF;
2697 EXIT WHEN j = p_map_dtls_tbl.LAST;
2698 j := p_map_dtls_tbl.NEXT(j);
2699 END LOOP;
2700 IF l_retain = 'Y' THEN
2701 EXIT;
2702 END IF;
2703 END IF;
2704 END LOOP;
2705 CLOSE get_gnr_superloc_rec;
2706 else
2707 l_retain := 'N';
2708 end if;
2709
2710 RETURN l_retain;
2711 END retain_gnr_yn;
2712
2713 BEGIN
2714
2715 -- Initialize variables (perf improvement bug 5130993)
2716 l_last_updated_by := hz_utility_v2pub.last_updated_by;
2717 l_creation_date := hz_utility_v2pub.creation_date;
2718 l_created_by := hz_utility_v2pub.created_by;
2719 l_last_update_date := hz_utility_v2pub.last_update_date;
2720 l_last_update_login := hz_utility_v2pub.last_update_login;
2721 l_program_id := hz_utility_v2pub.program_id;
2722 l_conc_login_id := fnd_global.conc_login_id;
2723 l_program_application_id := hz_utility_v2pub.program_application_id;
2724 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
2725 l_api_purpose := HZ_GNR_PKG.G_API_PURPOSE;
2726
2727 x_status := FND_API.g_ret_sts_success;
2728
2729 -- retain_gnr_yn will tell whether we have retain old GNR records or not.
2730 -- If l_retain_flag = 'Y' then exit without ceate/update of GNR and hz_location
2731
2732 -- Check if call is for R12UPGRADE then we do not want to do retain_gnr_check at all
2733 -- This Global variable is set in HZ_GNR_PKG during making call to create GNR for R12UPGRADE
2734 IF ( NVL(l_api_purpose,'xxya') = 'R12UPGRADE') THEN
2735 l_retain_flag := 'N';
2736 ELSE
2737 l_retain_flag := retain_gnr_yn(p_location_id, p_map_status, p_map_dtls_tbl);
2738 END IF;
2739
2740 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2741 hz_utility_v2pub.debug
2742 (p_message => 'Retain GNR Flag value l_retain_flag='||l_retain_flag,
2743 p_prefix => l_debug_prefix,
2744 p_msg_level => fnd_log.level_statement,
2745 p_module_prefix => l_module_prefix,
2746 p_module => l_module
2747 );
2748 END IF;
2749
2750 IF l_retain_flag = 'N' THEN -- Then only do the processing of GNR, otherwise keep old value
2751
2752 l_map_dtls_tbl := p_map_dtls_tbl;
2753
2754 BEGIN
2755
2756 -- Bug 5929771 : Check unique value existence before inserting to avoid
2757 -- expensive DUP_VAL_ON_INDEX exception (Nishant 16-APR-2007)
2758 OPEN c_check_gnr_log_exist(p_location_id,p_location_table_name,p_usage_code);
2759 FETCH c_check_gnr_log_exist INTO l_gnr_log_exist;
2760 l_gnr_log_exist := NVL(l_gnr_log_exist,'N');
2761 CLOSE c_check_gnr_log_exist;
2762
2763 IF (l_gnr_log_exist <> 'Y') THEN
2764
2765 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2766 hz_utility_v2pub.debug
2767 (p_message => 'Before inserting record into hz_geo_name_reference_log with map status '||p_map_status,
2768 p_prefix => l_debug_prefix,
2769 p_msg_level => fnd_log.level_statement,
2770 p_module_prefix => l_module_prefix,
2771 p_module => l_module
2772 );
2773 END IF;
2774
2775 INSERT INTO hz_geo_name_reference_log
2776 (location_id, location_table_name,usage_code,
2777 message_text,
2778 object_version_number, map_status,
2779 last_updated_by, creation_date,
2780 created_by, last_update_date,
2781 last_update_login, program_id,
2782 program_login_id,program_application_id,request_id)
2783 VALUES
2784 (p_location_id, p_location_table_name, p_usage_code, NULL, 1, p_map_status,
2785 l_last_updated_by, l_creation_date,
2786 l_created_by, l_last_update_date,
2787 l_last_update_login, l_program_id,
2788 l_conc_login_id, l_program_application_id, l_request_id);
2789
2790 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2791 hz_utility_v2pub.debug
2792 (p_message => 'After inserting record into hz_geo_name_reference_log ',
2793 p_prefix => l_debug_prefix,
2794 p_msg_level => fnd_log.level_statement,
2795 p_module_prefix => l_module_prefix,
2796 p_module => l_module
2797 );
2798 END IF;
2799
2800 ELSE -- GNR Log already exists, we will update it
2801
2802 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2803 hz_utility_v2pub.debug
2804 (p_message => 'Before updating record into hz_geo_name_reference_log with map status '||p_map_status,
2805 p_prefix => l_debug_prefix,
2806 p_msg_level => fnd_log.level_statement,
2807 p_module_prefix => l_module_prefix,
2808 p_module => l_module
2809 );
2810 END IF;
2811
2812 UPDATE hz_geo_name_reference_log
2813 SET map_status = p_map_status,
2814 object_version_number = object_version_number + 1,
2815 last_updated_by = l_last_updated_by,
2816 last_update_date = l_last_update_date,
2817 last_update_login = l_last_update_login
2818 WHERE location_id = p_location_id
2819 AND location_table_name = p_location_table_name
2820 AND usage_code = p_usage_code;
2821
2822 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2823 hz_utility_v2pub.debug
2824 (p_message => 'After updating record into hz_geo_name_reference_log ',
2825 p_prefix => l_debug_prefix,
2826 p_msg_level => fnd_log.level_statement,
2827 p_module_prefix => l_module_prefix,
2828 p_module => l_module
2829 );
2830 END IF;
2831
2832 -- delete the location id and table name combination from hz_geo_name_references
2833 -- This call is needed only if data exists in hz_geo_name_references table
2834 -- blind delete is bad for performance
2835 IF ( nvl(l_api_purpose,'xxya') <> 'R12UPGRADE') THEN
2836 delGNR(p_location_id,p_location_table_name,x_status);
2837 l_gnr_deleted := 'Y'; -- set it to 'Y' because we just deleted it. Later we can avoid again doing this check
2838 END IF;
2839
2840 END IF; -- end of check if l_gnr_log_exist
2841
2842 EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- should not hit this error anymore (bug 5929771)
2843 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2844 hz_utility_v2pub.debug
2845 (p_message => 'EXCEPTION DUP_VAL_ON_INDEX during GNR Log insert/update for '||
2846 'Location Id:'||p_location_id||',usage_code:'||p_usage_code||
2847 ' -'||SUBSTR(SQLERRM,1,100),
2848 p_prefix => l_debug_prefix,
2849 p_msg_level => fnd_log.level_statement,
2850 p_module_prefix => l_module_prefix,
2851 p_module => l_module
2852 );
2853 END IF;
2854 END; -- END of GNR Log Insert BEGIN Stmt
2855
2856 -- Now Insert data in hz_geo_name_references table (Child table)
2857 IF p_map_dtls_tbl.COUNT > 0 THEN
2858
2859 i := p_map_dtls_tbl.FIRST;
2860
2861 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2862 hz_utility_v2pub.debug
2863 (p_message => 'Before inserting records into hz_geo_name_references ',
2864 p_prefix => l_debug_prefix,
2865 p_msg_level => fnd_log.level_statement,
2866 p_module_prefix => l_module_prefix,
2867 p_module => l_module
2868 );
2869 END IF;
2870
2871 LOOP
2872 -- intialize l_gnr_exist
2873 l_gnr_exist := NULL;
2874
2875 IF p_map_dtls_tbl(i).geography_id IS NOT NULL THEN
2876
2877 IF p_map_dtls_tbl(i).geography_code = 'MISSING' THEN
2878 l_map_dtls_tbl(i).geography_id := -99;
2879 l_map_dtls_tbl(i).loc_compval := NULL;
2880 ELSIF p_map_dtls_tbl(i).geography_code = 'UNKNOWN' THEN
2881 l_map_dtls_tbl(i).geography_id := -98;
2882 l_map_dtls_tbl(i).loc_compval := NULL;
2883 END IF;
2884
2885 BEGIN
2886 -- Bug 5929771 : Check unique value existence before inserting to avoid
2887 -- expensive DUP_VAL_ON_INDEX exception (Nishant 16-APR-2007)
2888 -- If it was existing before, we would have deleted it when we checked
2889 -- existence in GNR Log table (above).
2890 -- if data already deleted above then no need to perform existence check here.
2891 IF (l_gnr_deleted = 'Y' ) THEN
2892 l_gnr_exist := 'N';
2893 ELSE
2894 OPEN c_check_gnr_exist(p_location_id,p_location_table_name,p_map_dtls_tbl(i).geography_type);
2895 FETCH c_check_gnr_exist INTO l_gnr_exist;
2896 l_gnr_exist := NVL(l_gnr_exist,'N');
2897 CLOSE c_check_gnr_exist;
2898 END IF;
2899
2900 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2901 hz_utility_v2pub.debug
2902 (p_message => 'For Location Id:'||p_location_id||',geo type:'||
2903 p_map_dtls_tbl(i).geography_type||', GNR Exists :'||l_gnr_exist,
2904 p_prefix => l_debug_prefix,
2905 p_msg_level => fnd_log.level_statement,
2906 p_module_prefix => l_module_prefix,
2907 p_module => l_module
2908 );
2909 END IF;
2910
2911 IF (l_gnr_exist <> 'Y') THEN
2912 INSERT INTO hz_geo_name_references
2913 (location_id, geography_id, location_table_name,
2914 object_version_number, geography_type, last_updated_by,
2915 creation_date, created_by, last_update_date,
2916 last_update_login, program_id, program_login_id,
2917 program_application_id,request_id)
2918 VALUES
2919 (p_location_id, l_map_dtls_tbl(i).geography_id,p_location_table_name,
2920 1, p_map_dtls_tbl(i).geography_type, l_last_updated_by,
2921 l_creation_date, l_created_by,
2922 l_last_update_date, l_last_update_login,
2923 l_program_id, l_conc_login_id,
2924 l_program_application_id, l_request_id);
2925 END IF;
2926
2927 EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- should not hit this error anymore (bug 5929771)
2928 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2929 hz_utility_v2pub.debug
2930 (p_message => 'EXCEPTION DUP_VAL_ON_INDEX during GNR insert/update for '||
2931 'Location Id:'||p_location_id||',geo_type:'||p_map_dtls_tbl(i).geography_type||
2932 ' -'||SUBSTR(SQLERRM,1,100),
2933 p_prefix => l_debug_prefix,
2934 p_msg_level => fnd_log.level_statement,
2935 p_module_prefix => l_module_prefix,
2936 p_module => l_module
2937 );
2938 END IF;
2939 END; -- End of BEGIN for inserting in GNR Log
2940
2941 ELSE -- geography_id = NULL
2942 EXIT;
2943 END IF; -- End of geography id is NOT NULL check
2944
2945 EXIT WHEN i = p_map_dtls_tbl.LAST;
2946 i := p_map_dtls_tbl.NEXT(i);
2947 END LOOP;
2948
2949 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2950 hz_utility_v2pub.debug
2951 (p_message => 'After inserting records into hz_geo_name_references ',
2952 p_prefix => l_debug_prefix,
2953 p_msg_level => fnd_log.level_statement,
2954 p_module_prefix => l_module_prefix,
2955 p_module => l_module
2956 );
2957 END IF;
2958
2959 END IF; -- END OF p_map_dtls_table.count > 0 check for inserting into GNR tables
2960
2961 -- Update Location not to be done for GNR calls, only for Online Validate API
2962 IF ((NVL(l_api_purpose,'xxya') NOT IN ('R12UPGRADE','GNR'))
2963 AND
2964 (p_location_table_name = 'HZ_LOCATIONS'
2965 AND
2966 update_loc_yn(p_loc_components_rec,l_map_dtls_tbl) = 'Y')) THEN
2967
2968 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2969 hz_utility_v2pub.debug
2970 (p_message => 'Before updating record into update_location ',
2971 p_prefix => l_debug_prefix,
2972 p_msg_level => fnd_log.level_statement,
2973 p_module_prefix => l_module_prefix,
2974 p_module => l_module
2975 );
2976 END IF;
2977
2978 update_location (p_location_id, p_loc_components_rec,p_lock_flag, l_map_dtls_tbl,x_status);
2979
2980 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2981 hz_utility_v2pub.debug
2982 (p_message => 'After updating record into update_location ',
2983 p_prefix => l_debug_prefix,
2984 p_msg_level => fnd_log.level_statement,
2985 p_module_prefix => l_module_prefix,
2986 p_module => l_module
2987 );
2988 END IF;
2989
2990 END IF; -- END of update_location
2991
2992 END IF; -- END of retain_gnr check
2993
2994 EXCEPTION WHEN OTHERS THEN
2995 x_status := fnd_api.g_ret_sts_unexp_error;
2996 IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level) THEN
2997 hz_utility_v2pub.debug
2998 (p_message => 'EXCEPTION during create_gnr for '||
2999 'Location Id:'||p_location_id||',usage_code:'||p_usage_code||
3000 ' -'||SUBSTR(SQLERRM,1,100),
3001 p_prefix => l_debug_prefix,
3002 p_msg_level => fnd_log.level_exception,
3003 p_module_prefix => l_module_prefix,
3004 p_module => l_module
3005 );
3006 END IF;
3007 END create_gnr;
3008 --------------------------------------
3009 --------------------------------------
3010 FUNCTION check_GNR_For_Usage(
3011 p_location_id IN NUMBER,
3012 p_location_table_name IN VARCHAR2,
3013 p_usage_code IN VARCHAR2,
3014 p_mdu_tbl IN maploc_rec_tbl_type,
3015 x_status OUT NOCOPY varchar2
3016 ) RETURN BOOLEAN IS
3017
3018 CURSOR c_gnr(p_geography_type in varchar2) IS
3019 SELECT GEOGRAPHY_ID
3020 FROM HZ_GEO_NAME_REFERENCES
3021 WHERE LOCATION_ID = p_location_id
3022 AND GEOGRAPHY_TYPE = p_geography_type
3023 AND LOCATION_TABLE_NAME = p_location_table_name;
3024
3025 CURSOR c_gnr_log IS
3026 SELECT MAP_STATUS,USAGE_CODE
3027 FROm HZ_GEO_NAME_REFERENCE_LOG
3028 WHERE LOCATION_ID = p_location_id
3029 AND LOCATION_TABLE_NAME = p_location_table_name;
3030
3031 l_gnr_exists varchar2(1);
3032 l_success varchar2(1);
3033 l_usage_log_exists varchar2(1);
3034 l_geography_id number;
3035 i number;
3036
3037 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
3038 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
3039 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
3040 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
3041 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
3042 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
3043 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
3044 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
3045 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
3046
3047 BEGIN
3048
3049 -- Initialize variables (perf improvement bug 5130993)
3050 l_last_updated_by := hz_utility_v2pub.last_updated_by;
3051 l_creation_date := hz_utility_v2pub.creation_date;
3052 l_created_by := hz_utility_v2pub.created_by;
3053 l_last_update_date := hz_utility_v2pub.last_update_date;
3054 l_last_update_login := hz_utility_v2pub.last_update_login;
3055 l_program_id := hz_utility_v2pub.program_id;
3056 l_conc_login_id := fnd_global.conc_login_id;
3057 l_program_application_id := hz_utility_v2pub.program_application_id;
3058 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
3059
3060 x_status := FND_API.g_ret_sts_success;
3061
3062 l_success := 'N';
3063 l_usage_log_exists := 'N';
3064 FOR l_c_gnr_log IN c_gnr_log LOOP
3065 l_gnr_exists := 'Y';
3066 IF l_c_gnr_log.USAGE_CODE = p_usage_code THEN
3067 IF l_c_gnr_log.MAP_STATUS = 'S' THEN
3068 RETURN TRUE;
3069 ELSE
3070 l_usage_log_exists := 'Y';
3071 END IF;
3072 END IF;
3073 END LOOP;
3074
3075 IF l_gnr_exists = 'Y' THEN
3076 l_success := 'Y';
3077 IF p_mdu_tbl.COUNT > 0 THEN
3078 i := p_mdu_tbl.FIRST;
3079 LOOP
3080
3081 OPEN c_gnr(p_mdu_tbl(i).GEOGRAPHY_TYPE);
3082 FETCH c_gnr INTO l_geography_id;
3083 IF c_gnr%NOTFOUND THEN
3084 l_success := 'N';
3085 END IF;
3086 CLOSE c_gnr;
3087 EXIT WHEN i = p_mdu_tbl.LAST;
3088 i := p_mdu_tbl.NEXT(i);
3089 END LOOP;
3090 END IF;
3091 END IF;
3092
3093 IF l_success = 'Y' THEN
3094 IF l_usage_log_exists = 'Y' THEN
3095 UPDATE hz_geo_name_reference_log
3096 SET map_status = 'S',
3097 object_version_number = object_version_number + 1,
3098 last_updated_by = l_last_updated_by,
3099 last_update_date = l_last_update_date,
3100 last_update_login = l_last_update_login
3101 WHERE location_id = p_location_id
3102 AND location_table_name = p_location_table_name
3103 AND usage_code = p_usage_code;
3104 ELSE
3105 INSERT INTO hz_geo_name_reference_log
3106 (location_id, location_table_name,usage_code,
3107 message_text,
3108 object_version_number, map_status,
3109 last_updated_by, creation_date,
3110 created_by, last_update_date,
3111 last_update_login, program_id,
3112 program_login_id,program_application_id,request_id)
3113 VALUES
3114 (p_location_id, p_location_table_name, p_usage_code, NULL, 1, 'S',
3115 l_last_updated_by,l_creation_date,
3116 l_created_by, l_last_update_date,
3117 l_last_update_login,l_program_id,
3118 l_conc_login_id, l_program_application_id,
3119 l_request_id);
3120 END IF;
3121 RETURN TRUE;
3122 ELSE
3123 RETURN FALSE;
3124 END IF;
3125
3126 RETURN FALSE;
3127 EXCEPTION WHEN OTHERS THEN
3128 x_status := fnd_api.g_ret_sts_unexp_error;
3129 RETURN FALSE;
3130 END check_GNR_For_Usage;
3131 --------------------------------------
3132 --------------------------------------
3133 FUNCTION fix_multiparent(
3134 p_geography_id IN NUMBER,
3135 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type
3136 ) RETURN BOOLEAN IS
3137 i number;
3138 l_parent_geography_id number;
3139 l_parent_geography_type varchar2(30);
3140 BEGIN
3141 IF x_map_dtls_tbl.COUNT > 0 THEN
3142 i:= x_map_dtls_tbl.FIRST;
3143 LOOP
3144 IF x_map_dtls_tbl(i).GEOGRAPHY_ID = p_geography_id THEN
3145 RETURN TRUE;
3146 END IF;
3147
3148 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NULL) THEN
3149 -- This is a multiple parent case and user has not passed in a value to identify a unique record.
3150 -- MUST be done later. (two level missing, second level value passed. If we can identify the record, it will still fail)
3151 -- Need to think about a new logic.
3152 RETURN FALSE;
3153 END IF;
3154
3155 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NOT NULL) THEN
3156 BEGIN
3157 SELECT g.GEOGRAPHY_ID
3158 INTO x_map_dtls_tbl(i).GEOGRAPHY_ID
3159 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3160 WHERE g.GEOGRAPHY_ID = hn.CHILD_ID
3161 AND g.GEOGRAPHY_TYPE = hn.CHILD_OBJECT_TYPE
3162 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3163 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3164 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3165 AND hn.PARENT_ID = l_parent_geography_id
3166 AND hn.PARENT_OBJECT_TYPE = l_parent_geography_type
3167 AND SYSDATE between hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3168 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3169 AND EXISTS (SELECT NULL
3170 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3171 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3172 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3173 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3174 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(i).LOC_COMPVAL));
3175 EXCEPTION WHEN OTHERS THEN
3176 RETURN FALSE;
3177 END;
3178 END IF;
3179
3180 l_parent_geography_id := x_map_dtls_tbl(i).GEOGRAPHY_ID;
3181 l_parent_geography_type := x_map_dtls_tbl(i).GEOGRAPHY_TYPE;
3182 EXIT WHEN i = x_map_dtls_tbl.LAST;
3183 i := x_map_dtls_tbl.NEXT(i);
3184 END LOOP;
3185 END IF;
3186 RETURN TRUE;
3187 END fix_multiparent;
3188 --------------------------------------
3189 -------------------------------------
3190 PROCEDURE fix_no_match(
3191 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3192 x_status OUT NOCOPY VARCHAR2
3193 ) IS
3194 l_map_dtls_tbl maploc_rec_tbl_type;
3195 l_map_dtls_tbl_null maploc_rec_tbl_type;
3196
3197 PROCEDURE prcess_no_match(
3198 p_iteration IN NUMBER,
3199 p_country_geo_id IN NUMBER,
3200 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3201 x_status OUT NOCOPY VARCHAR2
3202 ) IS
3203
3204 i number;
3205 l_child_geography_id number;
3206 l_geography_id number;
3207 l_geography_name varchar2(360);
3208 l_child_geography_type varchar2(30);
3209 l_country_geo_type varchar2(30);
3210
3211 BEGIN
3212 x_status := FND_API.g_ret_sts_success;
3213
3214 --hk_debugl('Iteration : '||to_char(p_iteration));
3215 l_country_geo_type := 'COUNTRY';
3216
3217 IF p_iteration = 1 THEN
3218 l_child_geography_id := NULL;
3219 l_child_geography_type := NULL;
3220 ELSE
3221 l_child_geography_id := x_map_dtls_tbl(p_iteration-1).GEOGRAPHY_ID;
3222 l_child_geography_type := x_map_dtls_tbl(p_iteration-1).GEOGRAPHY_TYPE;
3223 END IF;
3224
3225 IF x_map_dtls_tbl(p_iteration).LOC_COMPVAL IS NULL THEN
3226 IF l_child_geography_id IS NOT NULL THEN
3227 BEGIN
3228 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3229 INTO l_geography_id,l_geography_name
3230 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3231 WHERE g.GEOGRAPHY_ID = hn.PARENT_ID
3232 AND g.GEOGRAPHY_TYPE = hn.PARENT_OBJECT_TYPE
3233 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3234 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3235 AND hn.level_number = 1
3236 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3237 AND hn.CHILD_ID = l_child_geography_id
3238 AND hn.CHILD_OBJECT_TYPE = l_child_geography_type
3239 AND SYSDATE between hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3240 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE;
3241
3242 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3243 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3244
3245 --hk_debugl('Case 1');
3246 EXCEPTION WHEN OTHERS THEN
3247 --hk_debugl('Case 1 Exception');
3248 --hk_debugl('Child Geo : '||to_char(l_child_geography_id));
3249 --hk_debugl('Child Geo Type : '||l_child_geography_type);
3250 NULL;
3251 END;
3252 END IF;
3253 ELSE -- Location component value is not null
3254 IF l_child_geography_id IS NOT NULL THEN
3255 BEGIN
3256 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3257 INTO l_geography_id,l_geography_name
3258 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3259 -- Nishant
3260 --WHERE g.GEOGRAPHY_ID = hn.PARENT_ID
3261 WHERE g.GEOGRAPHY_ID = hn.PARENT_ID+0
3262 AND g.GEOGRAPHY_TYPE = hn.PARENT_OBJECT_TYPE
3263 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3264 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3265 AND hn.level_number = 1
3266 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3267 AND hn.CHILD_ID = l_child_geography_id
3268 AND hn.CHILD_OBJECT_TYPE = l_child_geography_type
3269 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3270 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3271 AND EXISTS (SELECT NULL
3272 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3273 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3274 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3275 AND gi.geography_type = x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE
3276 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3277 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(p_iteration).LOC_COMPVAL));
3278
3279 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3280 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3281
3282 --hk_debugl('Case 2');
3283 EXCEPTION WHEN OTHERS THEN
3284 --hk_debugl('Case 2 Exception');
3285 --hk_debugl('Child Geo : '||to_char(l_child_geography_id));
3286 --hk_debugl('Child Geo Type : '||l_child_geography_type);
3287 --hk_debugl('Geography Type : '||x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE);
3288 --hk_debugl('Loc Comp Val : '||x_map_dtls_tbl(p_iteration).LOC_COMPVAL);
3289 NULL;
3290 END;
3291 ELSE -- Loc compoent value is not null and child_geo_id is null
3292 BEGIN
3293 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3294 INTO l_geography_id,l_geography_name
3295 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3296 WHERE g.GEOGRAPHY_ID = hn.CHILD_ID
3297 AND g.GEOGRAPHY_TYPE = hn.CHILD_OBJECT_TYPE
3298 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3299 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3300 AND hn.level_number = x_map_dtls_tbl(p_iteration).LOC_SEQ_NUM - 1
3301 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3302 AND hn.PARENT_ID+0 = p_country_geo_id
3303 AND hn.PARENT_OBJECT_TYPE = l_country_geo_type
3304 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3305 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3306 AND EXISTS (SELECT NULL
3307 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3308 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3309 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3310 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3311 AND gi.geography_type = x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE
3312 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(p_iteration).LOC_COMPVAL));
3313
3314 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3315 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3316
3317 --hk_debugl('Case 3');
3318 EXCEPTION WHEN OTHERS THEN
3319 --hk_debugl('Case 3 Exception');
3320 --hk_debugl('Country Geo : '||to_char(p_country_geo_id));
3321 --hk_debugl('Geography Type : '||x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE);
3322 --hk_debugl('Loc Comp Val : '||x_map_dtls_tbl(p_iteration).LOC_COMPVAL);
3323 NULL;
3324 END;
3325 END IF;
3326 END IF;
3327
3328 IF p_iteration < x_map_dtls_tbl.COUNT - 1 THEN
3329 prcess_no_match(p_iteration+1,p_country_geo_id,x_map_dtls_tbl,x_status);
3330 END IF;
3331
3332 END prcess_no_match;
3333 BEGIN
3334 x_status := FND_API.g_ret_sts_success;
3335 IF x_map_dtls_tbl.COUNT > 0 THEN
3336 reverse_tbl(x_map_dtls_tbl,l_map_dtls_tbl);
3337 END IF;
3338
3339 prcess_no_match(1,x_map_dtls_tbl(1).GEOGRAPHY_ID,l_map_dtls_tbl,x_status);
3340
3341 x_map_dtls_tbl := l_map_dtls_tbl_null;
3342 reverse_tbl(l_map_dtls_tbl,x_map_dtls_tbl);
3343 END fix_no_match;
3344 --------------------------------------
3345 --------------------------------------
3346 PROCEDURE getMinValStatus(
3347 p_mdu_tbl IN maploc_rec_tbl_type,
3348 x_status IN OUT NOCOPY VARCHAR2
3349 ) IS
3350 i number;
3351 BEGIN
3352 -- If there is null component value found this API will return status "E'. If all components are not null
3353 -- Then success status will be returned. else it will return the status that came in.
3354 IF p_mdu_tbl.COUNT > 0 THEN
3355 i := p_mdu_tbl.FIRST;
3356 LOOP
3357 If p_mdu_tbl(i).LOC_COMPVAL IS NULL THEN
3358 x_status := FND_API.g_ret_sts_error;
3359 RETURN;
3360 END IF;
3361 EXIT WHEN i = p_mdu_tbl.LAST;
3362 i := p_mdu_tbl.NEXT(i);
3363 END LOOP;
3364 x_status := FND_API.g_ret_sts_success;
3365
3366 END IF;
3367 END getMinValStatus;
3368 --------------------------------------
3369 --------------------------------------
3370 FUNCTION fix_child(
3371 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type
3372 ) RETURN BOOLEAN IS
3373 i number;
3374 l_parent_geography_id number;
3375 l_parent_geography_type varchar2(30);
3376 BEGIN
3377 IF x_map_dtls_tbl.COUNT > 0 THEN
3378 i:= x_map_dtls_tbl.FIRST;
3379 LOOP
3380 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NULL) THEN
3381 BEGIN
3382 SELECT hn.CHILD_ID
3383 INTO x_map_dtls_tbl(i).GEOGRAPHY_ID
3384 FROM HZ_HIERARCHY_NODES hn
3385 WHERE hn.CHILD_OBJECT_TYPE = x_map_dtls_tbl(i).GEOGRAPHY_TYPE
3386 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3387 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3388 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3389 AND hn.PARENT_ID = l_parent_geography_id
3390 AND hn.PARENT_OBJECT_TYPE = l_parent_geography_type
3391 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE;
3392 EXCEPTION WHEN OTHERS THEN
3393 RETURN FALSE;
3394 END;
3395 END IF;
3396
3397 l_parent_geography_id := x_map_dtls_tbl(i).GEOGRAPHY_ID;
3398 l_parent_geography_type := x_map_dtls_tbl(i).GEOGRAPHY_TYPE;
3399 EXIT WHEN i = x_map_dtls_tbl.LAST;
3400 i := x_map_dtls_tbl.NEXT(i);
3401 END LOOP;
3402 END IF;
3403 RETURN TRUE;
3404 END fix_child;
3405 --------------------------------------
3406 --------------------------------------
3407 FUNCTION getLocCompCount(
3408 p_map_dtls_tbl IN maploc_rec_tbl_type) RETURN NUMBER IS
3409 i number;
3410 j number;
3411 BEGIN
3412 j := 0;
3413 IF p_map_dtls_tbl.COUNT > 1 THEN
3414 i:= p_map_dtls_tbl.FIRST;
3415 i:= p_map_dtls_tbl.NEXT(i);
3416 LOOP
3417 IF p_map_dtls_tbl(i).LOC_COMPVAL IS NOT NULL THEN
3418 j := j + 1;
3419 END IF;
3420 EXIT WHEN i = p_map_dtls_tbl.LAST;
3421 i := p_map_dtls_tbl.NEXT(i);
3422 END LOOP;
3423 END IF;
3424 RETURN j;
3425 END getLocCompCount;
3426 --------------------------------------
3427 --------------------------------------
3428 PROCEDURE getLocCompValues(
3429 P_loc_table IN VARCHAR2,
3430 p_loc_components_rec IN loc_components_rec_type,
3431 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3432 x_status OUT NOCOPY VARCHAR2
3433 ) IS
3434
3435 TYPE NameValueRecType IS RECORD
3436 (Name varchar2(30),
3437 Value varchar2(150));
3438 TYPE NameValueTblType IS TABLE OF NameValueRecType
3439 INDEX BY BINARY_INTEGER;
3440
3441 l_name_value NameValueTblType;
3442 i number :=0;
3443
3444 FUNCTION getValue(p_name IN VARCHAR2) RETURN VARCHAR2 IS
3445 i number :=0;
3446 BEGIN
3447 IF l_name_value.COUNT > 0 THEN
3448 i := l_name_value.FIRST;
3449 LOOP
3450 IF l_name_value(i).name = p_name THEN
3451 RETURN l_name_value(i).value;
3452 END IF;
3453 EXIT WHEN i = l_name_value.LAST;
3454 i := l_name_value.NEXT(i);
3455 END LOOP;
3456 END IF;
3457 RETURN NULL;
3458 END;
3459
3460 BEGIN
3461
3462 x_status := FND_API.g_ret_sts_success;
3463 l_name_value(2).name := 'ADDRESS_STYLE';
3464 l_name_value(2).value := p_loc_components_rec.ADDRESS_STYLE;
3465 l_name_value(3).name := 'COUNTRY';
3466 l_name_value(3).value := p_loc_components_rec.COUNTRY;
3467 l_name_value(4).name := 'CITY';
3468 l_name_value(4).value := p_loc_components_rec.CITY;
3469 l_name_value(5).name := 'POSTAL_CODE';
3470 l_name_value(5).value := p_loc_components_rec.POSTAL_CODE;
3471 l_name_value(6).name := 'STATE';
3472 l_name_value(6).value := p_loc_components_rec.STATE;
3473 l_name_value(7).name := 'PROVINCE';
3474 l_name_value(7).value := p_loc_components_rec.PROVINCE;
3475 l_name_value(8).name := 'COUNTY';
3476 l_name_value(8).value := p_loc_components_rec.COUNTY;
3477 l_name_value(9).name := 'VALIDATE_COUNTRY_AGAINST';
3478 l_name_value(9).value := p_loc_components_rec.VALIDATE_COUNTRY_AGAINST;
3479 l_name_value(10).name := 'VALIDATE_STATE_AGAINST';
3480 l_name_value(10).value := p_loc_components_rec.VALIDATE_STATE_AGAINST;
3481 l_name_value(11).name := 'VALIDATE_PROVINCE_AGAINST';
3482 l_name_value(11).value := p_loc_components_rec.VALIDATE_PROVINCE_AGAINST;
3483 l_name_value(12).name := 'POSTAL_PLUS4_CODE';
3484 l_name_value(12).value := p_loc_components_rec.POSTAL_PLUS4_CODE;
3485 l_name_value(13).name := 'ATTRIBUTE1';
3486 l_name_value(13).value := p_loc_components_rec.ATTRIBUTE1;
3487 l_name_value(14).name := 'ATTRIBUTE2';
3488 l_name_value(14).value := p_loc_components_rec.ATTRIBUTE2;
3489 l_name_value(15).name := 'ATTRIBUTE3';
3490 l_name_value(15).value := p_loc_components_rec.ATTRIBUTE3;
3491 l_name_value(16).name := 'ATTRIBUTE4';
3492 l_name_value(16).value := p_loc_components_rec.ATTRIBUTE4;
3493 l_name_value(17).name := 'ATTRIBUTE5';
3494 l_name_value(17).value := p_loc_components_rec.ATTRIBUTE5;
3495 l_name_value(18).name := 'ATTRIBUTE6';
3496 l_name_value(18).value := p_loc_components_rec.ATTRIBUTE6;
3497 l_name_value(19).name := 'ATTRIBUTE7';
3498 l_name_value(19).value := p_loc_components_rec.ATTRIBUTE7;
3499 l_name_value(20).name := 'ATTRIBUTE8';
3500 l_name_value(20).value := p_loc_components_rec.ATTRIBUTE8;
3501 l_name_value(21).name := 'ATTRIBUTE9';
3502 l_name_value(21).value := p_loc_components_rec.ATTRIBUTE9;
3503 l_name_value(22).name := 'ATTRIBUTE10';
3504 l_name_value(22).value := p_loc_components_rec.ATTRIBUTE10;
3505
3506 IF x_map_dtls_tbl.COUNT > 0 THEN
3507 i := x_map_dtls_tbl.FIRST;
3508 LOOP
3509 x_map_dtls_tbl(i).LOC_COMPVAL := getValue(x_map_dtls_tbl(i).LOC_COMPONENT);
3510 EXIT WHEN i = x_map_dtls_tbl.LAST;
3511 i := x_map_dtls_tbl.NEXT(i);
3512 END LOOP;
3513 END IF;
3514 END;
3515
3516 END hz_gnr_util_pkg;