1 PACKAGE BODY HZ_GNR_UTIL_PKG AS
2 /*$Header: ARHGNRUB.pls 120.35 2011/05/05 07:40:25 rgokavar 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 --Bug 8241862
2141 IF map_exists ('POSTAL_CODE',p_map_dtls_tbl) = TRUE THEN
2142 IF(HZ_GNR_UTIL_PKG.postal_code_to_validate(x_loc_components_rec.COUNTRY,x_loc_components_rec.POSTAL_CODE)=getValue('POSTAL_CODE',p_map_dtls_tbl)) THEN
2143 NULL;
2144 ELSE
2145 x_loc_components_rec.POSTAL_CODE := getValue('POSTAL_CODE',p_map_dtls_tbl);
2146 END IF;
2147 END IF;
2148 IF map_exists ('STATE',p_map_dtls_tbl) = TRUE THEN
2149 x_loc_components_rec.STATE := getValue('STATE',p_map_dtls_tbl);
2150 END IF;
2151 IF map_exists ('PROVINCE',p_map_dtls_tbl) = TRUE THEN
2152 x_loc_components_rec.PROVINCE := getValue('PROVINCE',p_map_dtls_tbl);
2153 END IF;
2154 IF map_exists ('COUNTY',p_map_dtls_tbl) = TRUE THEN
2155 x_loc_components_rec.COUNTY := getValue('COUNTY',p_map_dtls_tbl);
2156 END IF;
2157 IF map_exists ('POSTAL_PLUS4_CODE',p_map_dtls_tbl) = TRUE THEN
2158 x_loc_components_rec.POSTAL_PLUS4_CODE := getValue('POSTAL_PLUS4_CODE',p_map_dtls_tbl);
2159 END IF;
2160 IF map_exists ('ATTRIBUTE1',p_map_dtls_tbl) = TRUE THEN
2161 x_loc_components_rec.ATTRIBUTE1 := getValue('ATTRIBUTE1',p_map_dtls_tbl);
2162 END IF;
2163 IF map_exists ('ATTRIBUTE2',p_map_dtls_tbl) = TRUE THEN
2164 x_loc_components_rec.ATTRIBUTE2 := getValue('ATTRIBUTE2',p_map_dtls_tbl);
2165 END IF;
2166 IF map_exists ('ATTRIBUTE3',p_map_dtls_tbl) = TRUE THEN
2167 x_loc_components_rec.ATTRIBUTE3 := getValue('ATTRIBUTE3',p_map_dtls_tbl);
2168 END IF;
2169 IF map_exists ('ATTRIBUTE4',p_map_dtls_tbl) = TRUE THEN
2170 x_loc_components_rec.ATTRIBUTE4 := getValue('ATTRIBUTE4',p_map_dtls_tbl);
2171 END IF;
2172 IF map_exists ('ATTRIBUTE5',p_map_dtls_tbl) = TRUE THEN
2173 x_loc_components_rec.ATTRIBUTE5 := getValue('ATTRIBUTE5',p_map_dtls_tbl);
2174 END IF;
2175 IF map_exists ('ATTRIBUTE6',p_map_dtls_tbl) = TRUE THEN
2176 x_loc_components_rec.ATTRIBUTE6 := getValue('ATTRIBUTE6',p_map_dtls_tbl);
2177 END IF;
2178 IF map_exists ('ATTRIBUTE7',p_map_dtls_tbl) = TRUE THEN
2179 x_loc_components_rec.ATTRIBUTE7 := getValue('ATTRIBUTE7',p_map_dtls_tbl);
2180 END IF;
2181 IF map_exists ('ATTRIBUTE8',p_map_dtls_tbl) = TRUE THEN
2182 x_loc_components_rec.ATTRIBUTE8 := getValue('ATTRIBUTE8',p_map_dtls_tbl);
2183 END IF;
2184 IF map_exists ('ATTRIBUTE9',p_map_dtls_tbl) = TRUE THEN
2185 x_loc_components_rec.ATTRIBUTE9 := getValue('ATTRIBUTE9',p_map_dtls_tbl);
2186 END IF;
2187 IF map_exists ('ATTRIBUTE10',p_map_dtls_tbl) = TRUE THEN
2188 x_loc_components_rec.ATTRIBUTE10 := getValue('ATTRIBUTE10',p_map_dtls_tbl);
2189 END IF;
2190 END putLocCompValues;
2191
2192 --------------------------------------
2193 PROCEDURE update_location (
2194 p_location_id IN number,
2195 p_loc_components_rec IN loc_components_rec_type,
2196 p_lock_flag IN varchar2,
2197 p_map_dtls_tbl IN maploc_rec_tbl_type,
2198 x_status OUT NOCOPY varchar2
2199 ) IS
2200
2201
2202 db_city VARCHAR2(60);
2203 db_state VARCHAR2(60);
2204 db_country VARCHAR2(60);
2205 db_county VARCHAR2(60);
2206 db_province VARCHAR2(60);
2207 db_postal_code VARCHAR2(60);
2208 db_postal_plus4_code VARCHAR2(60);
2209 db_attribute1 VARCHAR2(150);
2210 db_attribute2 VARCHAR2(150);
2211 db_attribute3 VARCHAR2(150);
2212 db_attribute4 VARCHAR2(150);
2213 db_attribute5 VARCHAR2(150);
2214 db_attribute6 VARCHAR2(150);
2215 db_attribute7 VARCHAR2(150);
2216 db_attribute8 VARCHAR2(150);
2217 db_attribute9 VARCHAR2(150);
2218 db_attribute10 VARCHAR2(150);
2219 db_wh_update_date DATE;
2220
2221 l_location_profile_rec hz_location_profile_pvt.location_profile_rec_type;
2222 l_loc_components_rec loc_components_rec_type;
2223 l_old_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE;
2224 l_new_location_rec HZ_LOCATION_V2PUB.LOCATION_REC_TYPE;
2225 l_other_param_rec HZ_GNR_UTIL_PKG.loc_other_param_rec_type;
2226 l_wh_update_date DATE;
2227 l_address1 VARCHAR2(240);
2228 l_address2 VARCHAR2(240);
2229 l_address3 VARCHAR2(240);
2230 l_address4 VARCHAR2(240);
2231 l_actual_content_source VARCHAR2(30);
2232 l_address_key VARCHAR2(500);
2233 l_time_zone_id NUMBER;
2234 l_return_status VARCHAR2(30);
2235 l_msg_count NUMBER;
2236 l_msg_data VARCHAR2(2000);
2237 ll_return_status VARCHAR2(30);
2238 ll_msg_count NUMBER;
2239 ll_msg_data VARCHAR2(2000);
2240
2241 BEGIN
2242 l_loc_components_rec := p_loc_components_rec;
2243 -- if p_loc_flag is not true then the location has been locked already.
2244
2245 -- If the Location updation is allowed
2246 IF location_updation_allowed(p_location_id) then
2247
2248 IF p_lock_flag = 'T' OR p_lock_flag = FND_API.G_TRUE THEN
2249 -- get location components
2250 BEGIN
2251 SELECT COUNTRY, CITY, STATE, COUNTY, PROVINCE, POSTAL_CODE,POSTAL_PLUS4_CODE,
2252 ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5,
2253 ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, ATTRIBUTE9, ATTRIBUTE10,
2254 WH_UPDATE_DATE, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, ACTUAL_CONTENT_SOURCE,
2255 TIMEZONE_ID, ADDRESS_KEY
2256 INTO l_loc_components_rec.country, l_loc_components_rec.city, l_loc_components_rec.state,
2257 l_loc_components_rec.county, l_loc_components_rec.province,
2258 l_loc_components_rec.postal_code, l_loc_components_rec.postal_plus4_code,
2259 l_loc_components_rec.attribute1,l_loc_components_rec.attribute2,
2260 l_loc_components_rec.attribute3,l_loc_components_rec.attribute4,
2261 l_loc_components_rec.attribute5, l_loc_components_rec.attribute6,
2262 l_loc_components_rec.attribute7,l_loc_components_rec.attribute8,
2263 l_loc_components_rec.attribute9,l_loc_components_rec.attribute10,
2264 l_wh_update_date, l_address1, l_address2, l_address3, l_address4
2265 , l_actual_content_source, l_time_zone_id, l_address_key
2266 FROM HZ_LOCATIONS
2267 WHERE LOCATION_ID = p_location_id
2268 FOR UPDATE OF LOCATION_ID NOWAIT;
2269 EXCEPTION
2270 WHEN NO_DATA_FOUND THEN
2271 FND_MESSAGE.SET_NAME('AR', 'HZ_API_NO_RECORD');
2272 FND_MESSAGE.SET_TOKEN('RECORD', 'hz_locations');
2273 FND_MESSAGE.SET_TOKEN('VALUE', to_char(p_location_id));
2274 FND_MSG_PUB.ADD;
2275 x_status := FND_API.G_RET_STS_ERROR;
2276 END; -- end of SELECT
2277
2278 ELSE -- do not lock the location record
2279 -- get location components
2280 BEGIN
2281 SELECT COUNTRY, CITY, STATE, COUNTY, PROVINCE, POSTAL_CODE,POSTAL_PLUS4_CODE,
2282 ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5,
2283 ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, ATTRIBUTE9, ATTRIBUTE10,
2284 WH_UPDATE_DATE, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, ACTUAL_CONTENT_SOURCE,
2285 TIMEZONE_ID, ADDRESS_KEY
2286 INTO l_loc_components_rec.country, l_loc_components_rec.city, l_loc_components_rec.state,
2287 l_loc_components_rec.county, l_loc_components_rec.province,
2288 l_loc_components_rec.postal_code, l_loc_components_rec.postal_plus4_code,
2289 l_loc_components_rec.attribute1,l_loc_components_rec.attribute2,
2290 l_loc_components_rec.attribute3,l_loc_components_rec.attribute4,
2291 l_loc_components_rec.attribute5, l_loc_components_rec.attribute6,
2292 l_loc_components_rec.attribute7,l_loc_components_rec.attribute8,
2293 l_loc_components_rec.attribute9,l_loc_components_rec.attribute10,
2294 l_wh_update_date, l_address1, l_address2, l_address3, l_address4
2295 , l_actual_content_source, l_time_zone_id, l_address_key
2296 FROM HZ_LOCATIONS
2297 WHERE LOCATION_ID = p_location_id;
2298 EXCEPTION
2299 WHEN NO_DATA_FOUND THEN
2300 FND_MESSAGE.SET_NAME('AR', 'HZ_API_NO_RECORD');
2301 FND_MESSAGE.SET_TOKEN('RECORD', 'hz_locations');
2302 FND_MESSAGE.SET_TOKEN('VALUE', to_char(p_location_id));
2303 FND_MSG_PUB.ADD;
2304 x_status := FND_API.G_RET_STS_ERROR;
2305 END; -- end of SELECT ;
2306 END IF;
2307
2308 db_country := l_loc_components_rec.country;
2309 db_city := l_loc_components_rec.city ;
2310 db_state := l_loc_components_rec.state ;
2311 db_county := l_loc_components_rec.county ;
2312 db_province := l_loc_components_rec.province;
2313 db_postal_code := l_loc_components_rec.postal_code;
2314 db_postal_plus4_code := l_loc_components_rec.postal_plus4_code;
2315 db_attribute1 := l_loc_components_rec.attribute1;
2316 db_attribute2 := l_loc_components_rec.attribute2;
2317 db_attribute3 := l_loc_components_rec.attribute3;
2318 db_attribute4 := l_loc_components_rec.attribute4;
2319 db_attribute5 := l_loc_components_rec.attribute5;
2320 db_attribute6 := l_loc_components_rec.attribute6;
2321 db_attribute7 := l_loc_components_rec.attribute7;
2322 db_attribute8 := l_loc_components_rec.attribute8;
2323 db_attribute9 := l_loc_components_rec.attribute9;
2324 db_attribute10 := l_loc_components_rec.attribute10;
2325 db_wh_update_date := l_wh_update_date;
2326
2327 putLocCompValues(p_map_dtls_tbl,l_loc_components_rec);
2328
2329 -- Fix for Bug 5231893. Added UPPER to make case insensitive comaprison. It does not make sense to update
2330 -- location rec as part of GNR creation, just because fetched value from hz_locations is in different case
2331 -- than that derived from HZ_GEOGRAPHIES. It also improves performance by not updating that location rec
2332 -- and doing subsequent processes related to update_location. (18-MAY-2006 Nishant)
2333 IF NVL(UPPER(db_country),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.country),fnd_api.g_miss_char)
2334 AND NVL(UPPER(db_city),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2335 AND NVL(UPPER(db_state),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2336 AND NVL(UPPER(db_county),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.county),fnd_api.g_miss_char)
2337 AND NVL(UPPER(db_province),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2338 AND NVL(UPPER(db_postal_code),fnd_api.g_miss_char)= NVL(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2339 AND NVL(UPPER(db_attribute1),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute1),fnd_api.g_miss_char)
2340 AND NVL(UPPER(db_attribute2),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute2),fnd_api.g_miss_char)
2341 AND NVL(UPPER(db_attribute3),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute3),fnd_api.g_miss_char)
2342 AND NVL(UPPER(db_attribute4),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute4),fnd_api.g_miss_char)
2343 AND NVL(UPPER(db_attribute5),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute5),fnd_api.g_miss_char)
2344 AND NVL(UPPER(db_attribute6),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute6),fnd_api.g_miss_char)
2345 AND NVL(UPPER(db_attribute7),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute7),fnd_api.g_miss_char)
2346 AND NVL(UPPER(db_attribute8),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute8),fnd_api.g_miss_char)
2347 AND NVL(UPPER(db_attribute9),fnd_api.g_miss_char) = NVL(UPPER(l_loc_components_rec.attribute9),fnd_api.g_miss_char)
2348 AND NVL(UPPER(db_attribute10),fnd_api.g_miss_char)= NVL(UPPER(l_loc_components_rec.attribute10),fnd_api.g_miss_char)
2349 THEN
2350 NULL;
2351 ELSE
2352
2353 -- Old location record will have the data from database.
2354 l_old_location_rec.location_id := p_location_id;
2355 l_old_location_rec.country := db_country;
2356 l_old_location_rec.city := db_city;
2357 l_old_location_rec.state := db_state;
2358 l_old_location_rec.county := db_county;
2359 l_old_location_rec.province := db_province;
2360 l_old_location_rec.postal_code := db_postal_code;
2361 l_old_location_rec.postal_plus4_code := db_postal_plus4_code;
2362 l_old_location_rec.attribute1 := db_attribute1;
2363 l_old_location_rec.attribute2 := db_attribute2;
2364 l_old_location_rec.attribute3 := db_attribute3;
2365 l_old_location_rec.attribute4 := db_attribute4;
2366 l_old_location_rec.attribute5 := db_attribute5;
2367 l_old_location_rec.attribute6 := db_attribute6;
2368 l_old_location_rec.attribute7 := db_attribute7;
2369 l_old_location_rec.attribute8 := db_attribute8;
2370 l_old_location_rec.attribute9 := db_attribute9;
2371 l_old_location_rec.attribute10 := db_attribute10;
2372 l_old_location_rec.address1 := l_address1;
2373 l_old_location_rec.address2 := l_address2;
2374 l_old_location_rec.address3 := l_address3;
2375 l_old_location_rec.address4 := l_address4;
2376 l_old_location_rec.timezone_id := l_time_zone_id;
2377 l_old_location_rec.address_key := l_address_key;
2378
2379 -- Old location record will have the data derived by GNR.
2380 -- If country, city, state or postal_code is changed
2381 -- set the timezone_id is NULL so that pre_location_update
2382 -- will get the timezone based on new values.
2383 l_new_location_rec.location_id := p_location_id;
2384 l_new_location_rec.country := l_loc_components_rec.country;
2385 l_new_location_rec.city := l_loc_components_rec.city;
2386 l_new_location_rec.state := l_loc_components_rec.state;
2387 l_new_location_rec.county := l_loc_components_rec.county;
2388 l_new_location_rec.province := l_loc_components_rec.province;
2389 l_new_location_rec.postal_code := l_loc_components_rec.postal_code;
2390 l_new_location_rec.postal_plus4_code := l_loc_components_rec.postal_plus4_code;
2391 l_new_location_rec.attribute1 := l_loc_components_rec.attribute1;
2392 l_new_location_rec.attribute2 := l_loc_components_rec.attribute2;
2393 l_new_location_rec.attribute3 := l_loc_components_rec.attribute3;
2394 l_new_location_rec.attribute4 := l_loc_components_rec.attribute4;
2395 l_new_location_rec.attribute5 := l_loc_components_rec.attribute5;
2396 l_new_location_rec.attribute6 := l_loc_components_rec.attribute6;
2397 l_new_location_rec.attribute7 := l_loc_components_rec.attribute7;
2398 l_new_location_rec.attribute8 := l_loc_components_rec.attribute8;
2399 l_new_location_rec.attribute9 := l_loc_components_rec.attribute9;
2400 l_new_location_rec.attribute10 := l_loc_components_rec.attribute10;
2401 l_new_location_rec.address1 := l_address1;
2402 l_new_location_rec.address2 := l_address2;
2403 l_new_location_rec.address3 := l_address3;
2404 l_new_location_rec.address4 := l_address4;
2405 l_new_location_rec.address_key := l_address_key;
2406 IF (l_new_location_rec.country IS NOT NULL AND
2407 NVL(UPPER(l_old_location_rec.country), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.country))
2408 OR
2409 (l_new_location_rec.city IS NOT NULL AND
2410 NVL(UPPER(l_old_location_rec.city), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.city))
2411 OR
2412 (l_new_location_rec.state IS NOT NULL AND
2413 NVL(UPPER(l_old_location_rec.state), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.state))
2414 OR
2415 (l_new_location_rec.postal_code IS NOT NULL AND
2416 NVL(UPPER(l_old_location_rec.postal_code), fnd_api.g_miss_char) <> UPPER(l_new_location_rec.postal_code))
2417 THEN
2418 l_new_location_rec.timezone_id := NULL;
2419 ELSE
2420 l_new_location_rec.timezone_id := l_time_zone_id;
2421 END IF;
2422
2423 -- Call pre_location_update to get timezone_id and address_key.
2424 begin
2425 pre_location_update( p_old_location_rec => l_old_location_rec,
2426 p_new_location_rec => l_new_location_rec,
2427 p_other_location_params => l_other_param_rec,
2428 x_return_status => ll_return_status,
2429 x_msg_count => ll_msg_count,
2430 x_msg_data => ll_msg_data );
2431 exception when others then
2432 null;
2433 end;
2434
2435 UPDATE HZ_LOCATIONS
2436 SET
2437 COUNTRY = l_loc_components_rec.country,
2438 CITY = l_loc_components_rec.city ,
2439 STATE = l_loc_components_rec.state ,
2440 COUNTY = l_loc_components_rec.county ,
2441 PROVINCE = l_loc_components_rec.province,
2442 POSTAL_CODE = l_loc_components_rec.postal_code,
2443 ATTRIBUTE1 = l_loc_components_rec.attribute1,
2444 ATTRIBUTE2 = l_loc_components_rec.attribute2,
2445 ATTRIBUTE3 = l_loc_components_rec.attribute3,
2446 ATTRIBUTE4 = l_loc_components_rec.attribute4,
2447 ATTRIBUTE5 = l_loc_components_rec.attribute5,
2448 ATTRIBUTE6 = l_loc_components_rec.attribute6,
2449 ATTRIBUTE7 = l_loc_components_rec.attribute7,
2450 ATTRIBUTE8 = l_loc_components_rec.attribute8,
2451 ATTRIBUTE9 = l_loc_components_rec.attribute9,
2452 ATTRIBUTE10 = l_loc_components_rec.attribute10,
2453 TIMEZONE_ID = l_new_location_rec.timezone_id,
2454 ADDRESS_KEY = l_new_location_rec.address_key
2455 WHERE LOCATION_ID = p_location_id;
2456
2457 -- fix for bug # 4169728. Set address_text to null in hz_cust_acct_sites_all table if,
2458 -- city, state, province or postal_code changes in hz_location table.
2459 -- address_text column in hz_cust_acct_sites_all is populated by the concurrent program,
2460 -- "Customer text data creation and indexing", if address_text is null.
2461 IF nvl(UPPER(db_city),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2462 AND nvl(UPPER(db_state),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2463 AND nvl(UPPER(db_province),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2464 AND nvl(UPPER(db_postal_code),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2465 THEN
2466 NULL;
2467 ELSE
2468 UPDATE hz_cust_acct_sites_all cas
2469 SET cas.address_text = null
2470 WHERE cas.address_text IS NOT NULL
2471 AND EXISTS
2472 ( SELECT 1
2473 FROM HZ_PARTY_SITES ps
2474 WHERE ps.location_id = p_location_id
2475 AND cas.party_site_id = ps.party_site_id );
2476 END IF;
2477
2478 IF nvl(UPPER(db_country),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.country),fnd_api.g_miss_char)
2479 AND nvl(UPPER(db_city),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.city),fnd_api.g_miss_char)
2480 AND nvl(UPPER(db_state),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.state),fnd_api.g_miss_char)
2481 AND nvl(UPPER(db_county),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.county),fnd_api.g_miss_char)
2482 AND nvl(UPPER(db_province),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.province),fnd_api.g_miss_char)
2483 AND nvl(UPPER(db_postal_code),fnd_api.g_miss_char) = nvl(UPPER(l_loc_components_rec.postal_code),fnd_api.g_miss_char)
2484 THEN
2485 NULL;
2486 ELSE
2487 l_location_profile_rec.location_profile_id := NULL;
2488 l_location_profile_rec.location_id := p_location_id;
2489 l_location_profile_rec.actual_content_source := l_actual_content_source;
2490 l_location_profile_rec.effective_start_date := NULL;
2491 l_location_profile_rec.effective_end_date := NULL;
2492 l_location_profile_rec.date_validated := NULL;
2493 l_location_profile_rec.city := l_loc_components_rec.city;
2494 l_location_profile_rec.postal_code := l_loc_components_rec.postal_code;
2495 l_location_profile_rec.county := l_loc_components_rec.county;
2496 l_location_profile_rec.country := l_loc_components_rec.country;
2497 l_location_profile_rec.address1 := l_address1;
2498 l_location_profile_rec.address2 := l_address2;
2499 l_location_profile_rec.address3 := l_address3;
2500 l_location_profile_rec.address4 := l_address4;
2501
2502 IF(l_loc_components_rec.state IS NOT NULL) THEN
2503 l_location_profile_rec.prov_state_admin_code := l_loc_components_rec.state;
2504 ELSIF(l_loc_components_rec.province IS NOT NULL) THEN
2505 l_location_profile_rec.prov_state_admin_code := l_loc_components_rec.province;
2506 ELSE
2507 l_location_profile_rec.prov_state_admin_code := NULL;
2508 END IF;
2509
2510 l_return_status := FND_API.G_RET_STS_SUCCESS;
2511
2512 hz_location_profile_pvt.update_location_profile (
2513 p_location_profile_rec => l_location_profile_rec
2514 ,x_return_status => l_return_status
2515 ,x_msg_count => l_msg_count
2516 ,x_msg_data => l_msg_data );
2517
2518 IF(l_return_status = FND_API.G_RET_STS_ERROR) THEN
2519 RAISE fnd_api.g_exc_error;
2520 ELSIF(l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2521 RAISE fnd_api.g_exc_unexpected_error;
2522 END IF;
2523 END IF;
2524
2525 -- Call post_location_update to do post update process.
2526 -- 1. Update de-normalized location components in HZ_PARTIES
2527 -- 2. Call to indicate location update to DQM(HZ_DQM_SYNC.sync_location).
2528 -- 3. 6. Invoke business event system.
2529 begin
2530 post_location_update( p_old_location_rec => l_old_location_rec,
2531 p_new_location_rec => l_new_location_rec,
2532 p_other_location_params => l_other_param_rec,
2533 x_return_status => ll_return_status,
2534 x_msg_count => ll_msg_count,
2535 x_msg_data => ll_msg_data );
2536 exception when others then
2537 null;
2538 end;
2539 END IF;
2540 END IF;
2541
2542 END update_location;
2543 --------------------------------------
2544 PROCEDURE create_gnr (
2545 p_location_id IN number,
2546 p_location_table_name IN varchar2,
2547 p_usage_code IN varchar2,
2548 p_map_status IN varchar2,
2549 p_loc_components_rec IN loc_components_rec_type,
2550 p_lock_flag IN varchar2,
2551 p_map_dtls_tbl IN maploc_rec_tbl_type,
2552 x_status OUT NOCOPY varchar2
2553 ) IS
2554 i number;
2555 l_module_prefix CONSTANT VARCHAR2(30) := 'HZ:ARHGNRUB:HZ_GNR_UTIL_PKG';
2556 l_module CONSTANT VARCHAR2(30) := 'ADDRESS_VALIDATION';
2557 l_debug_prefix VARCHAR2(30) := p_location_id;
2558 l_retain_flag VARCHAR2(10);
2559 l_map_dtls_tbl maploc_rec_tbl_type;
2560
2561 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
2562 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
2563 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
2564 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
2565 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
2566 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
2567 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
2568 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
2569 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
2570 l_api_purpose VARCHAR2(30);
2571
2572 -- Created below 2 cursors for performance reasons (perf team advice)
2573 -- to avoid DUP_VAL_ON_INDEX exception which is proving very costly
2574 -- during upgrade (Bug 5929771 : Nishant 16-APR-2007)
2575 l_gnr_log_exist VARCHAR2(10);
2576 l_gnr_exist VARCHAR2(10);
2577 l_gnr_deleted VARCHAR2(10);
2578
2579 CURSOR c_check_gnr_log_exist (p_location_id NUMBER,
2580 p_location_table_name VARCHAR2,
2581 p_usage_code VARCHAR2) IS
2582 SELECT 'Y'
2583 FROM hz_geo_name_reference_log
2584 WHERE location_id = p_location_id
2585 AND location_table_name = p_location_table_name
2586 AND usage_code = p_usage_code
2587 ;
2588
2589 CURSOR c_check_gnr_exist (p_location_id NUMBER,
2590 p_location_table_name VARCHAR2,
2591 p_geography_type VARCHAR2) IS
2592 SELECT 'Y'
2593 FROM hz_geo_name_references
2594 WHERE location_id = p_location_id
2595 AND location_table_name = p_location_table_name
2596 AND geography_type = p_geography_type
2597 ;
2598
2599 FUNCTION update_loc_yn(
2600 p_loc_components_rec IN loc_components_rec_type,
2601 p_map_dtls_tbl IN maploc_rec_tbl_type
2602 ) RETURN VARCHAR2 IS
2603 l_map_dtls_tbl maploc_rec_tbl_type;
2604 l_status varchar2(1);
2605 l_return varchar2(1);
2606 i number;
2607 j number;
2608 BEGIN
2609 l_return := 'N';
2610 l_map_dtls_tbl := p_map_dtls_tbl; -- This will populate all the derived Geography IDs
2611 getLocCompValues(
2612 P_loc_table => 'HZ_LOCATIONS',
2613 p_loc_components_rec => p_loc_components_rec,
2614 x_map_dtls_tbl => l_map_dtls_tbl,
2615 x_status => l_status);
2616
2617 IF p_map_dtls_tbl.COUNT > 0 THEN
2618 i := p_map_dtls_tbl.FIRST;
2619 LOOP
2620 IF p_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL THEN
2621 EXIT;
2622 END IF;
2623
2624 IF l_map_dtls_tbl.COUNT > 0 THEN
2625 j := l_map_dtls_tbl.FIRST;
2626 LOOP
2627 IF p_map_dtls_tbl(i).GEOGRAPHY_ID = l_map_dtls_tbl(j).GEOGRAPHY_ID THEN
2628 -- Fix for Bug 5231893 (added UPPER to do case insensitive comaprison
2629 -- Added on 18-May-2006 Nishant)
2630 IF NVL(UPPER(p_map_dtls_tbl(i).LOC_COMPVAL),FND_API.G_MISS_CHAR) <>
2631 NVL(UPPER(l_map_dtls_tbl(j).LOC_COMPVAL),FND_API.G_MISS_CHAR) THEN
2632 l_return := 'Y';
2633 END IF;
2634 END IF;
2635 EXIT WHEN j = l_map_dtls_tbl.LAST;
2636 j := l_map_dtls_tbl.NEXT(j);
2637 END LOOP;
2638 END IF;
2639
2640 EXIT WHEN i = p_map_dtls_tbl.LAST;
2641 i := p_map_dtls_tbl.NEXT(i);
2642 END LOOP;
2643 END IF;
2644 RETURN l_return;
2645 END update_loc_yn;
2646
2647 FUNCTION retain_gnr_yn(
2648 p_location_id IN number,
2649 p_map_status IN varchar2,
2650 p_map_dtls_tbl IN maploc_rec_tbl_type
2651 ) RETURN VARCHAR2 IS
2652 l_map_dtls_tbl maploc_rec_tbl_type;
2653 l_old_map_status varchar2(1);
2654 l_geography_type varchar2(30);
2655 l_retain varchar2(1);
2656 i number;
2657 j number;
2658
2659 cursor get_old_map_status is
2660 select map_status
2661 from HZ_GEO_NAME_REFERENCE_LOG
2662 where location_id = p_location_id
2663 and map_status = 'S';
2664
2665 cursor get_gnr_superloc_rec is
2666 select geography_type
2667 from HZ_GEO_NAME_REFERENCES
2668 where location_id = p_location_id
2669 and geography_id in (-99,-98);
2670
2671 BEGIN
2672 l_retain := 'N';
2673 l_old_map_status := 'E';
2674
2675 OPEN get_old_map_status;
2676 FETCH get_old_map_status INTO l_old_map_status;
2677 IF get_old_map_status%NOTFOUND THEN
2678 l_old_map_status := 'E';
2679 END IF;
2680 CLOSE get_old_map_status;
2681
2682 -- If old status is Success and new is Error,
2683 -- Check for nay record in gnr table is a Super Loc
2684 -- If yes, retain the old one
2685 if l_old_map_status = 'S' and p_map_status = 'E' then
2686
2687 OPEN get_gnr_superloc_rec;
2688 LOOP
2689 FETCH get_gnr_superloc_rec INTO l_geography_type;
2690 EXIT WHEN get_gnr_superloc_rec%NOTFOUND;
2691 IF p_map_dtls_tbl.COUNT > 0 THEN
2692 j := l_map_dtls_tbl.FIRST;
2693 l_retain := 'Y';
2694 LOOP
2695 IF p_map_dtls_tbl(j).GEOGRAPHY_TYPE = l_geography_type THEN
2696 if ( nvl(p_map_dtls_tbl(j).GEOGRAPHY_CODE,'NOVALUE') = 'MISSING' OR
2697 nvl(p_map_dtls_tbl(j).GEOGRAPHY_CODE,'NOVALUE') = 'UNKNOWN' ) THEN
2698 l_retain := 'N';
2699 EXIT;
2700 end if;
2701 END IF;
2702 EXIT WHEN j = p_map_dtls_tbl.LAST;
2703 j := p_map_dtls_tbl.NEXT(j);
2704 END LOOP;
2705 IF l_retain = 'Y' THEN
2706 EXIT;
2707 END IF;
2708 END IF;
2709 END LOOP;
2710 CLOSE get_gnr_superloc_rec;
2711 else
2712 l_retain := 'N';
2713 end if;
2714
2715 RETURN l_retain;
2716 END retain_gnr_yn;
2717
2718 BEGIN
2719
2720 -- Initialize variables (perf improvement bug 5130993)
2721 l_last_updated_by := hz_utility_v2pub.last_updated_by;
2722 l_creation_date := hz_utility_v2pub.creation_date;
2723 l_created_by := hz_utility_v2pub.created_by;
2724 l_last_update_date := hz_utility_v2pub.last_update_date;
2725 l_last_update_login := hz_utility_v2pub.last_update_login;
2726 l_program_id := hz_utility_v2pub.program_id;
2727 l_conc_login_id := fnd_global.conc_login_id;
2728 l_program_application_id := hz_utility_v2pub.program_application_id;
2729 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
2730 l_api_purpose := HZ_GNR_PKG.G_API_PURPOSE;
2731
2732 x_status := FND_API.g_ret_sts_success;
2733
2734 -- retain_gnr_yn will tell whether we have retain old GNR records or not.
2735 -- If l_retain_flag = 'Y' then exit without ceate/update of GNR and hz_location
2736
2737 -- Check if call is for R12UPGRADE then we do not want to do retain_gnr_check at all
2738 -- This Global variable is set in HZ_GNR_PKG during making call to create GNR for R12UPGRADE
2739 IF ( NVL(l_api_purpose,'xxya') = 'R12UPGRADE') THEN
2740 l_retain_flag := 'N';
2741 ELSE
2742 l_retain_flag := retain_gnr_yn(p_location_id, p_map_status, p_map_dtls_tbl);
2743 END IF;
2744
2745 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2746 hz_utility_v2pub.debug
2747 (p_message => 'Retain GNR Flag value l_retain_flag='||l_retain_flag,
2748 p_prefix => l_debug_prefix,
2749 p_msg_level => fnd_log.level_statement,
2750 p_module_prefix => l_module_prefix,
2751 p_module => l_module
2752 );
2753 END IF;
2754
2755 IF l_retain_flag = 'N' THEN -- Then only do the processing of GNR, otherwise keep old value
2756
2757 l_map_dtls_tbl := p_map_dtls_tbl;
2758
2759 BEGIN
2760
2761 -- Bug 5929771 : Check unique value existence before inserting to avoid
2762 -- expensive DUP_VAL_ON_INDEX exception (Nishant 16-APR-2007)
2763 OPEN c_check_gnr_log_exist(p_location_id,p_location_table_name,p_usage_code);
2764 FETCH c_check_gnr_log_exist INTO l_gnr_log_exist;
2765 l_gnr_log_exist := NVL(l_gnr_log_exist,'N');
2766 CLOSE c_check_gnr_log_exist;
2767
2768 IF (l_gnr_log_exist <> 'Y') THEN
2769
2770 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2771 hz_utility_v2pub.debug
2772 (p_message => 'Before inserting record into hz_geo_name_reference_log with map status '||p_map_status,
2773 p_prefix => l_debug_prefix,
2774 p_msg_level => fnd_log.level_statement,
2775 p_module_prefix => l_module_prefix,
2776 p_module => l_module
2777 );
2778 END IF;
2779
2780 INSERT INTO hz_geo_name_reference_log
2781 (location_id, location_table_name,usage_code,
2782 message_text,
2783 object_version_number, map_status,
2784 last_updated_by, creation_date,
2785 created_by, last_update_date,
2786 last_update_login, program_id,
2787 program_login_id,program_application_id,request_id)
2788 VALUES
2789 (p_location_id, p_location_table_name, p_usage_code, NULL, 1, p_map_status,
2790 l_last_updated_by, l_creation_date,
2791 l_created_by, l_last_update_date,
2792 l_last_update_login, l_program_id,
2793 l_conc_login_id, l_program_application_id, l_request_id);
2794
2795 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2796 hz_utility_v2pub.debug
2797 (p_message => 'After inserting record into hz_geo_name_reference_log ',
2798 p_prefix => l_debug_prefix,
2799 p_msg_level => fnd_log.level_statement,
2800 p_module_prefix => l_module_prefix,
2801 p_module => l_module
2802 );
2803 END IF;
2804
2805 ELSE -- GNR Log already exists, we will update it
2806
2807 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2808 hz_utility_v2pub.debug
2809 (p_message => 'Before updating record into hz_geo_name_reference_log with map status '||p_map_status,
2810 p_prefix => l_debug_prefix,
2811 p_msg_level => fnd_log.level_statement,
2812 p_module_prefix => l_module_prefix,
2813 p_module => l_module
2814 );
2815 END IF;
2816
2817 UPDATE hz_geo_name_reference_log
2818 SET map_status = p_map_status,
2819 object_version_number = object_version_number + 1,
2820 last_updated_by = l_last_updated_by,
2821 last_update_date = l_last_update_date,
2822 last_update_login = l_last_update_login
2823 WHERE location_id = p_location_id
2824 AND location_table_name = p_location_table_name
2825 AND usage_code = p_usage_code;
2826
2827 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2828 hz_utility_v2pub.debug
2829 (p_message => 'After updating record into hz_geo_name_reference_log ',
2830 p_prefix => l_debug_prefix,
2831 p_msg_level => fnd_log.level_statement,
2832 p_module_prefix => l_module_prefix,
2833 p_module => l_module
2834 );
2835 END IF;
2836
2837 -- delete the location id and table name combination from hz_geo_name_references
2838 -- This call is needed only if data exists in hz_geo_name_references table
2839 -- blind delete is bad for performance
2840 IF ( nvl(l_api_purpose,'xxya') <> 'R12UPGRADE') THEN
2841 delGNR(p_location_id,p_location_table_name,x_status);
2842 l_gnr_deleted := 'Y'; -- set it to 'Y' because we just deleted it. Later we can avoid again doing this check
2843 END IF;
2844
2845 END IF; -- end of check if l_gnr_log_exist
2846
2847 EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- should not hit this error anymore (bug 5929771)
2848 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2849 hz_utility_v2pub.debug
2850 (p_message => 'EXCEPTION DUP_VAL_ON_INDEX during GNR Log insert/update for '||
2851 'Location Id:'||p_location_id||',usage_code:'||p_usage_code||
2852 ' -'||SUBSTR(SQLERRM,1,100),
2853 p_prefix => l_debug_prefix,
2854 p_msg_level => fnd_log.level_statement,
2855 p_module_prefix => l_module_prefix,
2856 p_module => l_module
2857 );
2858 END IF;
2859 END; -- END of GNR Log Insert BEGIN Stmt
2860
2861 -- Now Insert data in hz_geo_name_references table (Child table)
2862 IF p_map_dtls_tbl.COUNT > 0 THEN
2863
2864 i := p_map_dtls_tbl.FIRST;
2865
2866 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2867 hz_utility_v2pub.debug
2868 (p_message => 'Before inserting records into hz_geo_name_references ',
2869 p_prefix => l_debug_prefix,
2870 p_msg_level => fnd_log.level_statement,
2871 p_module_prefix => l_module_prefix,
2872 p_module => l_module
2873 );
2874 END IF;
2875
2876 LOOP
2877 -- intialize l_gnr_exist
2878 l_gnr_exist := NULL;
2879
2880 IF p_map_dtls_tbl(i).geography_id IS NOT NULL THEN
2881
2882 IF p_map_dtls_tbl(i).geography_code = 'MISSING' THEN
2883 l_map_dtls_tbl(i).geography_id := -99;
2884 l_map_dtls_tbl(i).loc_compval := NULL;
2885 ELSIF p_map_dtls_tbl(i).geography_code = 'UNKNOWN' THEN
2886 l_map_dtls_tbl(i).geography_id := -98;
2887 l_map_dtls_tbl(i).loc_compval := NULL;
2888 END IF;
2889
2890 BEGIN
2891 -- Bug 5929771 : Check unique value existence before inserting to avoid
2892 -- expensive DUP_VAL_ON_INDEX exception (Nishant 16-APR-2007)
2893 -- If it was existing before, we would have deleted it when we checked
2894 -- existence in GNR Log table (above).
2895 -- if data already deleted above then no need to perform existence check here.
2896 IF (l_gnr_deleted = 'Y' ) THEN
2897 l_gnr_exist := 'N';
2898 ELSE
2899 OPEN c_check_gnr_exist(p_location_id,p_location_table_name,p_map_dtls_tbl(i).geography_type);
2900 FETCH c_check_gnr_exist INTO l_gnr_exist;
2901 l_gnr_exist := NVL(l_gnr_exist,'N');
2902 CLOSE c_check_gnr_exist;
2903 END IF;
2904
2905 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2906 hz_utility_v2pub.debug
2907 (p_message => 'For Location Id:'||p_location_id||',geo type:'||
2908 p_map_dtls_tbl(i).geography_type||', GNR Exists :'||l_gnr_exist,
2909 p_prefix => l_debug_prefix,
2910 p_msg_level => fnd_log.level_statement,
2911 p_module_prefix => l_module_prefix,
2912 p_module => l_module
2913 );
2914 END IF;
2915
2916 IF (l_gnr_exist <> 'Y') THEN
2917 INSERT INTO hz_geo_name_references
2918 (location_id, geography_id, location_table_name,
2919 object_version_number, geography_type, last_updated_by,
2920 creation_date, created_by, last_update_date,
2921 last_update_login, program_id, program_login_id,
2922 program_application_id,request_id)
2923 VALUES
2924 (p_location_id, l_map_dtls_tbl(i).geography_id,p_location_table_name,
2925 1, p_map_dtls_tbl(i).geography_type, l_last_updated_by,
2926 l_creation_date, l_created_by,
2927 l_last_update_date, l_last_update_login,
2928 l_program_id, l_conc_login_id,
2929 l_program_application_id, l_request_id);
2930 END IF;
2931
2932 EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- should not hit this error anymore (bug 5929771)
2933 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2934 hz_utility_v2pub.debug
2935 (p_message => 'EXCEPTION DUP_VAL_ON_INDEX during GNR insert/update for '||
2936 'Location Id:'||p_location_id||',geo_type:'||p_map_dtls_tbl(i).geography_type||
2937 ' -'||SUBSTR(SQLERRM,1,100),
2938 p_prefix => l_debug_prefix,
2939 p_msg_level => fnd_log.level_statement,
2940 p_module_prefix => l_module_prefix,
2941 p_module => l_module
2942 );
2943 END IF;
2944 END; -- End of BEGIN for inserting in GNR Log
2945
2946 ELSE -- geography_id = NULL
2947 EXIT;
2948 END IF; -- End of geography id is NOT NULL check
2949
2950 EXIT WHEN i = p_map_dtls_tbl.LAST;
2951 i := p_map_dtls_tbl.NEXT(i);
2952 END LOOP;
2953
2954 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2955 hz_utility_v2pub.debug
2956 (p_message => 'After inserting records into hz_geo_name_references ',
2957 p_prefix => l_debug_prefix,
2958 p_msg_level => fnd_log.level_statement,
2959 p_module_prefix => l_module_prefix,
2960 p_module => l_module
2961 );
2962 END IF;
2963
2964 END IF; -- END OF p_map_dtls_table.count > 0 check for inserting into GNR tables
2965
2966 -- Update Location not to be done for GNR calls, only for Online Validate API
2967 IF ((NVL(l_api_purpose,'xxya') NOT IN ('R12UPGRADE','GNR'))
2968 AND
2969 (p_location_table_name = 'HZ_LOCATIONS'
2970 AND
2971 update_loc_yn(p_loc_components_rec,l_map_dtls_tbl) = 'Y')) THEN
2972
2973 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2974 hz_utility_v2pub.debug
2975 (p_message => 'Before updating record into update_location ',
2976 p_prefix => l_debug_prefix,
2977 p_msg_level => fnd_log.level_statement,
2978 p_module_prefix => l_module_prefix,
2979 p_module => l_module
2980 );
2981 END IF;
2982
2983 update_location (p_location_id, p_loc_components_rec,p_lock_flag, l_map_dtls_tbl,x_status);
2984
2985 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2986 hz_utility_v2pub.debug
2987 (p_message => 'After updating record into update_location ',
2988 p_prefix => l_debug_prefix,
2989 p_msg_level => fnd_log.level_statement,
2990 p_module_prefix => l_module_prefix,
2991 p_module => l_module
2992 );
2993 END IF;
2994
2995 END IF; -- END of update_location
2996
2997 END IF; -- END of retain_gnr check
2998
2999 EXCEPTION WHEN OTHERS THEN
3000 x_status := fnd_api.g_ret_sts_unexp_error;
3001 IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level) THEN
3002 hz_utility_v2pub.debug
3003 (p_message => 'EXCEPTION during create_gnr for '||
3004 'Location Id:'||p_location_id||',usage_code:'||p_usage_code||
3005 ' -'||SUBSTR(SQLERRM,1,100),
3006 p_prefix => l_debug_prefix,
3007 p_msg_level => fnd_log.level_exception,
3008 p_module_prefix => l_module_prefix,
3009 p_module => l_module
3010 );
3011 END IF;
3012 END create_gnr;
3013 --------------------------------------
3014 --------------------------------------
3015 FUNCTION check_GNR_For_Usage(
3016 p_location_id IN NUMBER,
3017 p_location_table_name IN VARCHAR2,
3018 p_usage_code IN VARCHAR2,
3019 p_mdu_tbl IN maploc_rec_tbl_type,
3020 x_status OUT NOCOPY varchar2
3021 ) RETURN BOOLEAN IS
3022
3023 CURSOR c_gnr(p_geography_type in varchar2) IS
3024 SELECT GEOGRAPHY_ID
3025 FROM HZ_GEO_NAME_REFERENCES
3026 WHERE LOCATION_ID = p_location_id
3027 AND GEOGRAPHY_TYPE = p_geography_type
3028 AND LOCATION_TABLE_NAME = p_location_table_name;
3029
3030 CURSOR c_gnr_log IS
3031 SELECT MAP_STATUS,USAGE_CODE
3032 FROm HZ_GEO_NAME_REFERENCE_LOG
3033 WHERE LOCATION_ID = p_location_id
3034 AND LOCATION_TABLE_NAME = p_location_table_name;
3035
3036 l_gnr_exists varchar2(1);
3037 l_success varchar2(1);
3038 l_usage_log_exists varchar2(1);
3039 l_geography_id number;
3040 i number;
3041
3042 l_last_updated_by NUMBER; -- hz_utility_v2pub.last_updated_by;
3043 l_creation_date DATE; -- hz_utility_v2pub.creation_date;
3044 l_created_by NUMBER; -- hz_utility_v2pub.created_by;
3045 l_last_update_date DATE; -- hz_utility_v2pub.last_update_date;
3046 l_last_update_login NUMBER; -- hz_utility_v2pub.last_update_login;
3047 l_program_id NUMBER; -- hz_utility_v2pub.program_id;
3048 l_conc_login_id NUMBER; -- fnd_global.conc_login_id;
3049 l_program_application_id NUMBER; --hz_utility_v2pub.program_application_id;
3050 l_request_id NUMBER; -- NVL(hz_utility_v2pub.request_id, -1);
3051
3052 BEGIN
3053
3054 -- Initialize variables (perf improvement bug 5130993)
3055 l_last_updated_by := hz_utility_v2pub.last_updated_by;
3056 l_creation_date := hz_utility_v2pub.creation_date;
3057 l_created_by := hz_utility_v2pub.created_by;
3058 l_last_update_date := hz_utility_v2pub.last_update_date;
3059 l_last_update_login := hz_utility_v2pub.last_update_login;
3060 l_program_id := hz_utility_v2pub.program_id;
3061 l_conc_login_id := fnd_global.conc_login_id;
3062 l_program_application_id := hz_utility_v2pub.program_application_id;
3063 l_request_id := NVL(hz_utility_v2pub.request_id, -1);
3064
3065 x_status := FND_API.g_ret_sts_success;
3066
3067 l_success := 'N';
3068 l_usage_log_exists := 'N';
3069 FOR l_c_gnr_log IN c_gnr_log LOOP
3070 l_gnr_exists := 'Y';
3071 IF l_c_gnr_log.USAGE_CODE = p_usage_code THEN
3072 IF l_c_gnr_log.MAP_STATUS = 'S' THEN
3073 RETURN TRUE;
3074 ELSE
3075 l_usage_log_exists := 'Y';
3076 END IF;
3077 END IF;
3078 END LOOP;
3079
3080 IF l_gnr_exists = 'Y' THEN
3081 l_success := 'Y';
3082 IF p_mdu_tbl.COUNT > 0 THEN
3083 i := p_mdu_tbl.FIRST;
3084 LOOP
3085
3086 OPEN c_gnr(p_mdu_tbl(i).GEOGRAPHY_TYPE);
3087 FETCH c_gnr INTO l_geography_id;
3088 IF c_gnr%NOTFOUND THEN
3089 l_success := 'N';
3090 END IF;
3091 CLOSE c_gnr;
3092 EXIT WHEN i = p_mdu_tbl.LAST;
3093 i := p_mdu_tbl.NEXT(i);
3094 END LOOP;
3095 END IF;
3096 END IF;
3097
3098 IF l_success = 'Y' THEN
3099 IF l_usage_log_exists = 'Y' THEN
3100 UPDATE hz_geo_name_reference_log
3101 SET map_status = 'S',
3102 object_version_number = object_version_number + 1,
3103 last_updated_by = l_last_updated_by,
3104 last_update_date = l_last_update_date,
3105 last_update_login = l_last_update_login
3106 WHERE location_id = p_location_id
3107 AND location_table_name = p_location_table_name
3108 AND usage_code = p_usage_code;
3109 ELSE
3110 INSERT INTO hz_geo_name_reference_log
3111 (location_id, location_table_name,usage_code,
3112 message_text,
3113 object_version_number, map_status,
3114 last_updated_by, creation_date,
3115 created_by, last_update_date,
3116 last_update_login, program_id,
3117 program_login_id,program_application_id,request_id)
3118 VALUES
3119 (p_location_id, p_location_table_name, p_usage_code, NULL, 1, 'S',
3120 l_last_updated_by,l_creation_date,
3121 l_created_by, l_last_update_date,
3122 l_last_update_login,l_program_id,
3123 l_conc_login_id, l_program_application_id,
3124 l_request_id);
3125 END IF;
3126 RETURN TRUE;
3127 ELSE
3128 RETURN FALSE;
3129 END IF;
3130
3131 RETURN FALSE;
3132 EXCEPTION WHEN OTHERS THEN
3133 x_status := fnd_api.g_ret_sts_unexp_error;
3134 RETURN FALSE;
3135 END check_GNR_For_Usage;
3136 --------------------------------------
3137 --------------------------------------
3138 FUNCTION fix_multiparent(
3139 p_geography_id IN NUMBER,
3140 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type
3141 ) RETURN BOOLEAN IS
3142 i number;
3143 l_parent_geography_id number;
3144 l_parent_geography_type varchar2(30);
3145 BEGIN
3146 IF x_map_dtls_tbl.COUNT > 0 THEN
3147 i:= x_map_dtls_tbl.FIRST;
3148 LOOP
3149 IF x_map_dtls_tbl(i).GEOGRAPHY_ID = p_geography_id THEN
3150 RETURN TRUE;
3151 END IF;
3152
3153 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NULL) THEN
3154 -- This is a multiple parent case and user has not passed in a value to identify a unique record.
3155 -- MUST be done later. (two level missing, second level value passed. If we can identify the record, it will still fail)
3156 -- Need to think about a new logic.
3157 RETURN FALSE;
3158 END IF;
3159
3160 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NOT NULL) THEN
3161 BEGIN
3162 SELECT g.GEOGRAPHY_ID
3163 INTO x_map_dtls_tbl(i).GEOGRAPHY_ID
3164 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3165 WHERE g.GEOGRAPHY_ID = hn.CHILD_ID
3166 AND g.GEOGRAPHY_TYPE = hn.CHILD_OBJECT_TYPE
3167 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3168 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3169 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3170 AND hn.PARENT_ID = l_parent_geography_id
3171 AND hn.PARENT_OBJECT_TYPE = l_parent_geography_type
3172 AND SYSDATE between hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3173 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3174 AND EXISTS (SELECT NULL
3175 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3176 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3177 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3178 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3179 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(i).LOC_COMPVAL));
3180 EXCEPTION WHEN OTHERS THEN
3181 RETURN FALSE;
3182 END;
3183 END IF;
3184
3185 l_parent_geography_id := x_map_dtls_tbl(i).GEOGRAPHY_ID;
3186 l_parent_geography_type := x_map_dtls_tbl(i).GEOGRAPHY_TYPE;
3187 EXIT WHEN i = x_map_dtls_tbl.LAST;
3188 i := x_map_dtls_tbl.NEXT(i);
3189 END LOOP;
3190 END IF;
3191 RETURN TRUE;
3192 END fix_multiparent;
3193 --------------------------------------
3194 -------------------------------------
3195 PROCEDURE fix_no_match(
3196 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3197 x_status OUT NOCOPY VARCHAR2
3198 ) IS
3199 l_map_dtls_tbl maploc_rec_tbl_type;
3200 l_map_dtls_tbl_null maploc_rec_tbl_type;
3201
3202 PROCEDURE prcess_no_match(
3203 p_iteration IN NUMBER,
3204 p_country_geo_id IN NUMBER,
3205 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3206 x_status OUT NOCOPY VARCHAR2
3207 ) IS
3208
3209 i number;
3210 l_child_geography_id number;
3211 l_geography_id number;
3212 l_geography_name varchar2(360);
3213 l_child_geography_type varchar2(30);
3214 l_country_geo_type varchar2(30);
3215
3216 BEGIN
3217 x_status := FND_API.g_ret_sts_success;
3218
3219 --hk_debugl('Iteration : '||to_char(p_iteration));
3220 l_country_geo_type := 'COUNTRY';
3221
3222 IF p_iteration = 1 THEN
3223 l_child_geography_id := NULL;
3224 l_child_geography_type := NULL;
3225 ELSE
3226 l_child_geography_id := x_map_dtls_tbl(p_iteration-1).GEOGRAPHY_ID;
3227 l_child_geography_type := x_map_dtls_tbl(p_iteration-1).GEOGRAPHY_TYPE;
3228 END IF;
3229
3230 IF x_map_dtls_tbl(p_iteration).LOC_COMPVAL IS NULL THEN
3231 IF l_child_geography_id IS NOT NULL THEN
3232 BEGIN
3233 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3234 INTO l_geography_id,l_geography_name
3235 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3236 WHERE g.GEOGRAPHY_ID = hn.PARENT_ID
3237 AND g.GEOGRAPHY_TYPE = hn.PARENT_OBJECT_TYPE
3238 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3239 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3240 AND hn.level_number = 1
3241 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3242 AND hn.CHILD_ID = l_child_geography_id
3243 AND hn.CHILD_OBJECT_TYPE = l_child_geography_type
3244 AND SYSDATE between hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3245 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE;
3246
3247 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3248 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3249
3250 --hk_debugl('Case 1');
3251 EXCEPTION WHEN OTHERS THEN
3252 --hk_debugl('Case 1 Exception');
3253 --hk_debugl('Child Geo : '||to_char(l_child_geography_id));
3254 --hk_debugl('Child Geo Type : '||l_child_geography_type);
3255 NULL;
3256 END;
3257 END IF;
3258 ELSE -- Location component value is not null
3259 IF l_child_geography_id IS NOT NULL THEN
3260 BEGIN
3261 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3262 INTO l_geography_id,l_geography_name
3263 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3264 -- Nishant
3265 --WHERE g.GEOGRAPHY_ID = hn.PARENT_ID
3266 WHERE g.GEOGRAPHY_ID = hn.PARENT_ID+0
3267 AND g.GEOGRAPHY_TYPE = hn.PARENT_OBJECT_TYPE
3268 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3269 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3270 AND hn.level_number = 1
3271 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3272 AND hn.CHILD_ID = l_child_geography_id
3273 AND hn.CHILD_OBJECT_TYPE = l_child_geography_type
3274 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3275 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3276 AND EXISTS (SELECT NULL
3277 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3278 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3279 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3280 AND gi.geography_type = x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE
3281 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3282 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(p_iteration).LOC_COMPVAL));
3283
3284 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3285 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3286
3287 --hk_debugl('Case 2');
3288 EXCEPTION WHEN OTHERS THEN
3289 --hk_debugl('Case 2 Exception');
3290 --hk_debugl('Child Geo : '||to_char(l_child_geography_id));
3291 --hk_debugl('Child Geo Type : '||l_child_geography_type);
3292 --hk_debugl('Geography Type : '||x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE);
3293 --hk_debugl('Loc Comp Val : '||x_map_dtls_tbl(p_iteration).LOC_COMPVAL);
3294 NULL;
3295 END;
3296 ELSE -- Loc compoent value is not null and child_geo_id is null
3297 BEGIN
3298 SELECT g.GEOGRAPHY_ID,g.GEOGRAPHY_NAME
3299 INTO l_geography_id,l_geography_name
3300 FROM HZ_GEOGRAPHIES g,HZ_HIERARCHY_NODES hn
3301 WHERE g.GEOGRAPHY_ID = hn.CHILD_ID
3302 AND g.GEOGRAPHY_TYPE = hn.CHILD_OBJECT_TYPE
3303 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3304 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3305 AND hn.level_number = x_map_dtls_tbl(p_iteration).LOC_SEQ_NUM - 1
3306 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3307 AND hn.PARENT_ID+0 = p_country_geo_id
3308 AND hn.PARENT_OBJECT_TYPE = l_country_geo_type
3309 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE
3310 AND SYSDATE BETWEEN g.START_DATE AND g.END_DATE
3311 AND EXISTS (SELECT NULL
3312 FROM HZ_GEOGRAPHY_IDENTIFIERS gi
3313 WHERE g.GEOGRAPHY_ID = gi.GEOGRAPHY_ID
3314 AND gi.GEOGRAPHY_TYPE = g.GEOGRAPHY_TYPE
3315 AND gi.GEOGRAPHY_USE = 'MASTER_REF'
3316 AND gi.geography_type = x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE
3317 AND upper(gi.IDENTIFIER_VALUE) = upper(x_map_dtls_tbl(p_iteration).LOC_COMPVAL));
3318
3319 x_map_dtls_tbl(p_iteration).GEOGRAPHY_ID := l_geography_id;
3320 x_map_dtls_tbl(p_iteration).LOC_COMPVAL := l_geography_name;
3321
3322 --hk_debugl('Case 3');
3323 EXCEPTION WHEN OTHERS THEN
3324 --hk_debugl('Case 3 Exception');
3325 --hk_debugl('Country Geo : '||to_char(p_country_geo_id));
3326 --hk_debugl('Geography Type : '||x_map_dtls_tbl(p_iteration).GEOGRAPHY_TYPE);
3327 --hk_debugl('Loc Comp Val : '||x_map_dtls_tbl(p_iteration).LOC_COMPVAL);
3328 NULL;
3329 END;
3330 END IF;
3331 END IF;
3332
3333 IF p_iteration < x_map_dtls_tbl.COUNT - 1 THEN
3334 prcess_no_match(p_iteration+1,p_country_geo_id,x_map_dtls_tbl,x_status);
3335 END IF;
3336
3337 END prcess_no_match;
3338 BEGIN
3339 x_status := FND_API.g_ret_sts_success;
3340 IF x_map_dtls_tbl.COUNT > 0 THEN
3341 reverse_tbl(x_map_dtls_tbl,l_map_dtls_tbl);
3342 END IF;
3343
3344 prcess_no_match(1,x_map_dtls_tbl(1).GEOGRAPHY_ID,l_map_dtls_tbl,x_status);
3345
3346 x_map_dtls_tbl := l_map_dtls_tbl_null;
3347 reverse_tbl(l_map_dtls_tbl,x_map_dtls_tbl);
3348 END fix_no_match;
3349 --------------------------------------
3350 --------------------------------------
3351 PROCEDURE getMinValStatus(
3352 p_mdu_tbl IN maploc_rec_tbl_type,
3353 x_status IN OUT NOCOPY VARCHAR2
3354 ) IS
3355 i number;
3356 BEGIN
3357 -- If there is null component value found this API will return status "E'. If all components are not null
3358 -- Then success status will be returned. else it will return the status that came in.
3359 IF p_mdu_tbl.COUNT > 0 THEN
3360 i := p_mdu_tbl.FIRST;
3361 LOOP
3362 If p_mdu_tbl(i).LOC_COMPVAL IS NULL THEN
3363 x_status := FND_API.g_ret_sts_error;
3364 RETURN;
3365 END IF;
3366 EXIT WHEN i = p_mdu_tbl.LAST;
3367 i := p_mdu_tbl.NEXT(i);
3368 END LOOP;
3369 x_status := FND_API.g_ret_sts_success;
3370
3371 END IF;
3372 END getMinValStatus;
3373 --------------------------------------
3374 --------------------------------------
3375 FUNCTION fix_child(
3376 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type
3377 ) RETURN BOOLEAN IS
3378 i number;
3379 l_parent_geography_id number;
3380 l_parent_geography_type varchar2(30);
3381 BEGIN
3382 IF x_map_dtls_tbl.COUNT > 0 THEN
3383 i:= x_map_dtls_tbl.FIRST;
3384 LOOP
3385 IF (x_map_dtls_tbl(i).GEOGRAPHY_ID IS NULL AND x_map_dtls_tbl(i).LOC_COMPVAL IS NULL) THEN
3386 BEGIN
3387 SELECT hn.CHILD_ID
3388 INTO x_map_dtls_tbl(i).GEOGRAPHY_ID
3389 FROM HZ_HIERARCHY_NODES hn
3390 WHERE hn.CHILD_OBJECT_TYPE = x_map_dtls_tbl(i).GEOGRAPHY_TYPE
3391 AND hn.CHILD_TABLE_NAME = 'HZ_GEOGRAPHIES'
3392 AND hn.HIERARCHY_TYPE = 'MASTER_REF'
3393 AND hn.PARENT_TABLE_NAME = 'HZ_GEOGRAPHIES'
3394 AND hn.PARENT_ID = l_parent_geography_id
3395 AND hn.PARENT_OBJECT_TYPE = l_parent_geography_type
3396 AND SYSDATE BETWEEN hn.EFFECTIVE_START_DATE AND hn.EFFECTIVE_END_DATE;
3397 EXCEPTION WHEN OTHERS THEN
3398 RETURN FALSE;
3399 END;
3400 END IF;
3401
3402 l_parent_geography_id := x_map_dtls_tbl(i).GEOGRAPHY_ID;
3403 l_parent_geography_type := x_map_dtls_tbl(i).GEOGRAPHY_TYPE;
3404 EXIT WHEN i = x_map_dtls_tbl.LAST;
3405 i := x_map_dtls_tbl.NEXT(i);
3406 END LOOP;
3407 END IF;
3408 RETURN TRUE;
3409 END fix_child;
3410 --------------------------------------
3411 --------------------------------------
3412 FUNCTION getLocCompCount(
3413 p_map_dtls_tbl IN maploc_rec_tbl_type) RETURN NUMBER IS
3414 i number;
3415 j number;
3416 BEGIN
3417 j := 0;
3418 IF p_map_dtls_tbl.COUNT > 1 THEN
3419 i:= p_map_dtls_tbl.FIRST;
3420 i:= p_map_dtls_tbl.NEXT(i);
3421 LOOP
3422 IF p_map_dtls_tbl(i).LOC_COMPVAL IS NOT NULL THEN
3423 j := j + 1;
3424 END IF;
3425 EXIT WHEN i = p_map_dtls_tbl.LAST;
3426 i := p_map_dtls_tbl.NEXT(i);
3427 END LOOP;
3428 END IF;
3429 RETURN j;
3430 END getLocCompCount;
3431 --------------------------------------
3432 --------------------------------------
3433 PROCEDURE getLocCompValues(
3434 P_loc_table IN VARCHAR2,
3435 p_loc_components_rec IN loc_components_rec_type,
3436 x_map_dtls_tbl IN OUT NOCOPY maploc_rec_tbl_type,
3437 x_status OUT NOCOPY VARCHAR2
3438 ) IS
3439
3440 TYPE NameValueRecType IS RECORD
3441 (Name varchar2(30),
3442 Value varchar2(150));
3443 TYPE NameValueTblType IS TABLE OF NameValueRecType
3444 INDEX BY BINARY_INTEGER;
3445
3446 l_name_value NameValueTblType;
3447 i number :=0;
3448
3449 FUNCTION getValue(p_name IN VARCHAR2) RETURN VARCHAR2 IS
3450 i number :=0;
3451 BEGIN
3452 IF l_name_value.COUNT > 0 THEN
3453 i := l_name_value.FIRST;
3454 LOOP
3455 IF l_name_value(i).name = p_name THEN
3456 RETURN l_name_value(i).value;
3457 END IF;
3458 EXIT WHEN i = l_name_value.LAST;
3459 i := l_name_value.NEXT(i);
3460 END LOOP;
3461 END IF;
3462 RETURN NULL;
3463 END;
3464
3465 BEGIN
3466
3467 x_status := FND_API.g_ret_sts_success;
3468 l_name_value(2).name := 'ADDRESS_STYLE';
3469 l_name_value(2).value := p_loc_components_rec.ADDRESS_STYLE;
3470 l_name_value(3).name := 'COUNTRY';
3471 l_name_value(3).value := p_loc_components_rec.COUNTRY;
3472 l_name_value(4).name := 'CITY';
3473 l_name_value(4).value := p_loc_components_rec.CITY;
3474 l_name_value(5).name := 'POSTAL_CODE';
3475 l_name_value(5).value := p_loc_components_rec.POSTAL_CODE;
3476 l_name_value(6).name := 'STATE';
3477 l_name_value(6).value := p_loc_components_rec.STATE;
3478 l_name_value(7).name := 'PROVINCE';
3479 l_name_value(7).value := p_loc_components_rec.PROVINCE;
3480 l_name_value(8).name := 'COUNTY';
3481 l_name_value(8).value := p_loc_components_rec.COUNTY;
3482 l_name_value(9).name := 'VALIDATE_COUNTRY_AGAINST';
3483 l_name_value(9).value := p_loc_components_rec.VALIDATE_COUNTRY_AGAINST;
3484 l_name_value(10).name := 'VALIDATE_STATE_AGAINST';
3485 l_name_value(10).value := p_loc_components_rec.VALIDATE_STATE_AGAINST;
3486 l_name_value(11).name := 'VALIDATE_PROVINCE_AGAINST';
3487 l_name_value(11).value := p_loc_components_rec.VALIDATE_PROVINCE_AGAINST;
3488 l_name_value(12).name := 'POSTAL_PLUS4_CODE';
3489 l_name_value(12).value := p_loc_components_rec.POSTAL_PLUS4_CODE;
3490 l_name_value(13).name := 'ATTRIBUTE1';
3491 l_name_value(13).value := p_loc_components_rec.ATTRIBUTE1;
3492 l_name_value(14).name := 'ATTRIBUTE2';
3493 l_name_value(14).value := p_loc_components_rec.ATTRIBUTE2;
3494 l_name_value(15).name := 'ATTRIBUTE3';
3495 l_name_value(15).value := p_loc_components_rec.ATTRIBUTE3;
3496 l_name_value(16).name := 'ATTRIBUTE4';
3497 l_name_value(16).value := p_loc_components_rec.ATTRIBUTE4;
3498 l_name_value(17).name := 'ATTRIBUTE5';
3499 l_name_value(17).value := p_loc_components_rec.ATTRIBUTE5;
3500 l_name_value(18).name := 'ATTRIBUTE6';
3501 l_name_value(18).value := p_loc_components_rec.ATTRIBUTE6;
3502 l_name_value(19).name := 'ATTRIBUTE7';
3503 l_name_value(19).value := p_loc_components_rec.ATTRIBUTE7;
3504 l_name_value(20).name := 'ATTRIBUTE8';
3505 l_name_value(20).value := p_loc_components_rec.ATTRIBUTE8;
3506 l_name_value(21).name := 'ATTRIBUTE9';
3507 l_name_value(21).value := p_loc_components_rec.ATTRIBUTE9;
3508 l_name_value(22).name := 'ATTRIBUTE10';
3509 l_name_value(22).value := p_loc_components_rec.ATTRIBUTE10;
3510
3511 IF x_map_dtls_tbl.COUNT > 0 THEN
3512 i := x_map_dtls_tbl.FIRST;
3513 LOOP
3514 x_map_dtls_tbl(i).LOC_COMPVAL := getValue(x_map_dtls_tbl(i).LOC_COMPONENT);
3515 EXIT WHEN i = x_map_dtls_tbl.LAST;
3516 i := x_map_dtls_tbl.NEXT(i);
3517 END LOOP;
3518 END IF;
3519 END;
3520
3521 --------------------------------------
3522 --------------------------------------
3523 --ER#7240974
3524 /**
3525 Function : postal_code_to_validate
3526
3527 DESCRIPTION :
3528 Based on profile(HZ_VAL_FIRST_5_DIGIT_US_ZIP) value,
3529 it will return the postal code that needs to be validated.
3530
3531 ARGUMENTS :
3532 IN p_country_code VARCHAR2
3533 IN p_postal_code VARCHAR2
3534
3535 RETURNS : VARCHAR2
3536 postal code that needs to be validated
3537
3538
3539 MODIFICATION HISTORY:
3540 17-DEC-2008 Sudhir Gokavarapu Created
3541
3542 **/
3543
3544 FUNCTION postal_code_to_validate(
3545 p_country_code IN VARCHAR2,
3546 p_postal_code IN VARCHAR2
3547 ) RETURN VARCHAR2 IS
3548 BEGIN
3549
3550 -- Debug info.
3551 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3552 hz_utility_v2pub.debug(p_message=>'In postal_code_to_validate Function ',
3553 p_prefix =>'INFO:',
3554 p_msg_level=>fnd_log.level_statement);
3555 END IF;
3556
3557 -- Debug info.
3558 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3559 hz_utility_v2pub.debug(p_message=>'Country Code : ' || p_country_code||' Postal Code : '||p_postal_code,
3560 p_prefix =>'INFO:',
3561 p_msg_level=>fnd_log.level_statement);
3562 END IF;
3563
3564 -- Debug info.
3565 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3566 hz_utility_v2pub.debug(p_message=>'Profile HZ_VAL_FIRST_5_DIGIT_US_ZIP Value : '||fnd_profile.value('HZ_VAL_FIRST_5_DIGIT_US_ZIP'),
3567 p_prefix =>'INFO:',
3568 p_msg_level=>fnd_log.level_statement);
3569 END IF;
3570
3571 IF p_postal_code IS NULL THEN
3572 RETURN NULL;
3573 END IF;
3574
3575 IF p_country_code = 'US' THEN
3576 IF fnd_profile.value('HZ_VAL_FIRST_5_DIGIT_US_ZIP') = 'N' THEN
3577 -- Debug info.
3578 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3579 hz_utility_v2pub.debug(p_message=>'Returned Postal Code : '||p_postal_code,
3580 p_prefix =>'INFO:',
3581 p_msg_level=>fnd_log.level_statement);
3582 END IF;
3583
3584 RETURN p_postal_code;
3585 ELSE
3586 -- Debug info.
3587 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3588 hz_utility_v2pub.debug(p_message=>'Returned Postal Code : '||SUBSTR(p_postal_code,1,5),
3589 p_prefix =>'INFO:',
3590 p_msg_level=>fnd_log.level_statement);
3591 END IF;
3592
3593 RETURN SUBSTR(p_postal_code,1,5);
3594 END IF;
3595 ELSE
3596 -- Debug info.
3597 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3598 hz_utility_v2pub.debug(p_message=>'Returned Postal Code : '||p_postal_code,
3599 p_prefix =>'INFO:',
3600 p_msg_level=>fnd_log.level_statement);
3601 END IF;
3602
3603 RETURN p_postal_code;
3604 END IF;
3605 END;
3606
3607 /**
3608 * PROCEDURE conc_gen_pkg
3609 *
3610 * DESCRIPTION
3611 * Concurrent program for generating
3612 * gnr packages for all the existing Map Ids
3613 *
3614 * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
3615 *
3616 * IN:
3617 * OUT:
3618 * errbuf Buffer for error message.
3619 * retcode Return code.
3620 *
3621 * MODIFICATION HISTORY
3622 *
3623 * 02-MAY-2011 Sudhir Gokavarapu o Created.
3624 */
3625
3626 PROCEDURE conc_gen_pkg (
3627 errbuf OUT NOCOPY VARCHAR2,
3628 retcode OUT NOCOPY VARCHAR2
3629 ) IS
3630 CURSOR c_map IS
3631 SELECT map_id
3632 FROM hz_geo_struct_map;
3633
3634 CURSOR c_usage(l_map_id IN NUMBER) IS
3635 SELECT count(*)
3636 FROM Hz_address_usages usg, Hz_address_usage_dtls dtl
3637 WHERE usg.map_id = l_map_id
3638 AND usg.status_flag = 'A'
3639 AND dtl.usage_id = usg.usage_id;
3640
3641 l_count number;
3642 l_pkgname varchar2(30);
3643 l_status varchar2(30);
3644 l_debug_prefix VARCHAR2(30) := '';
3645
3646 BEGIN
3647
3648 -- Debug info.
3649 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3650 hz_utility_v2pub.debug(p_message=>'conc_gen_pkg (+)',
3651 p_prefix =>l_debug_prefix,
3652 p_msg_level=>fnd_log.level_statement);
3653 END IF;
3654 -- standard start of API savepoint
3655 SAVEPOINT conc_gen_pkg;
3656
3657 FOR l_c_map IN c_map LOOP
3658 l_count := 0;
3659 OPEN c_usage(l_c_map.map_id);
3660 FETCH c_usage INTO l_count;
3661 CLOSE c_usage;
3662 -- Debug info.
3663 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3664 hz_utility_v2pub.debug(p_message=>'Usage Count : '||l_count||' for map Id : '||l_c_map.map_id,
3665 p_prefix =>l_debug_prefix,
3666 p_msg_level=>fnd_log.level_statement);
3667 END IF;
3668 if l_count > 0 then
3669 l_pkgname := NULL;
3670 hz_gnr_gen_pkg.genpkg(l_c_map.map_id,l_pkgname,l_status);
3671 end if;
3672 END LOOP;
3673 retcode := 0;
3674 -- Debug info.
3675 IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3676 hz_utility_v2pub.debug(p_message=>'conc_gen_pkg (-)',
3677 p_prefix =>l_debug_prefix,
3678 p_msg_level=>fnd_log.level_statement);
3679 END IF;
3680 exception when others then
3681 ROLLBACK to conc_gen_pkg;
3682 retcode := 2;
3683 errbuf := SQLERRM;
3684 END conc_gen_pkg;
3685
3686
3687 END hz_gnr_util_pkg;