1 PACKAGE BODY HZ_ADDRESS_USAGES_PUB AS
2 /* $Header: ARHGNRSB.pls 120.4 2006/04/11 00:27:07 nsinghai noship $ */
3
4 PROCEDURE do_create_address_usages(
5 p_address_usages_rec IN address_usages_rec_type,
6 p_address_usage_dtls_tbl IN address_usage_dtls_tbl_type,
7 x_usage_id OUT NOCOPY NUMBER,
8 x_return_status OUT NOCOPY VARCHAR2) IS
9
10 l_map_id NUMBER;
11 l_usage_id NUMBER;
12 l_usage_dtl_id NUMBER;
13 l_usage_row_id VARCHAR2(50);
14 x_usage_dtl_row_id VARCHAR2(50);
15 l_usage_code VARCHAR2(30);
16 l_geotype VARCHAR2(360);
17
18 i BINARY_INTEGER;
19 l_error_code VARCHAR2(30);
20 x_status VARCHAR2(30);
21 l_temp VARCHAR2(100);
22 l_map_dtl_extsts VARCHAR2(1);
23 l_usg_country_found VARCHAR2(1);
24 p_index_name VARCHAR2(30);
25
26 BEGIN
27
28 x_return_status := FND_API.G_RET_STS_SUCCESS;
29 l_error_code := NULL;
30
31 -- Standard start of API savepoint
32 SAVEPOINT do_create_address_usages;
33
34 -- Map Id is mandatory
35
36 IF p_address_usages_rec.map_id IS NULL THEN
37 x_return_status := FND_API.G_RET_STS_ERROR;
38 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_MAP_ID');
39 -- The Map Id passed is NULL. Please use a valid Map Id to create a Address Usage.
40 FND_MSG_PUB.ADD;
41 RAISE FND_API.G_EXC_ERROR;
42 ELSE
43 BEGIN
44 SELECT map_id
45 INTO l_map_id
46 FROM hz_geo_struct_map
47 WHERE map_id = p_address_usages_rec.map_id;
48
49 EXCEPTION WHEN NO_DATA_FOUND THEN
50 x_return_status := FND_API.G_RET_STS_ERROR;
51 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_MAP_ID');
52 -- The mapping record that you are trying to create address usage does not exist.
53 FND_MSG_PUB.ADD;
54 RAISE FND_API.G_EXC_ERROR;
55
56 END;
57 END IF;
58
59 -- Usage code is mandatory
60
61 IF p_address_usages_rec.usage_code IS NULL THEN
62 x_return_status := FND_API.G_RET_STS_ERROR;
63 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_CODE');
64 -- Please enter a valid usage.
65 FND_MSG_PUB.ADD;
66 RAISE FND_API.G_EXC_ERROR;
67 ELSE
68 BEGIN
69 SELECT lookup_code
70 INTO l_usage_code
71 FROM ar_lookups
72 WHERE lookup_type = 'HZ_GEOGRAPHY_USAGE'
73 AND lookup_code = p_address_usages_rec.usage_code;
74 EXCEPTION WHEN NO_DATA_FOUND THEN
75 x_return_status := FND_API.G_RET_STS_ERROR;
76 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_CODE');
77 -- The Usage Code is invalid. Please pass a valid Usage Code
78 FND_MSG_PUB.ADD;
79 RAISE FND_API.G_EXC_ERROR;
80 END;
81 END IF;
82
83 IF p_address_usage_dtls_tbl.COUNT < 2 THEN
84 x_return_status := FND_API.G_RET_STS_ERROR;
85 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_2_USAGE_DTL_MAND');
86 -- Please enter two or more geography types for a usage.
87 FND_MSG_PUB.ADD;
88 RAISE FND_API.G_EXC_ERROR;
89 END IF;
90
91 -- Validate that one of the geography_type passed is COUNTRY
92 i := p_address_usage_dtls_tbl.first;
93 LOOP
94 IF p_address_usage_dtls_tbl(i).geography_type <> 'COUNTRY' THEN
95 l_usg_country_found := 'N';
96 ELSE
97 l_usg_country_found := 'Y';
98 EXIT;
99 END IF;
100 EXIT WHEN i = p_address_usage_dtls_tbl.LAST;
101 i := p_address_usage_dtls_tbl.NEXT(i);
102 END LOOP;
103
104 IF l_usg_country_found <> 'Y' then
105 x_return_status := FND_API.G_RET_STS_ERROR;
106 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GEO_TYPE_NOT_COUNTRY');
107 -- Please enter a geography type COUNTRY
108 FND_MSG_PUB.ADD;
109 RAISE FND_API.G_EXC_ERROR;
110 END IF;
111
112 -- Call table handler to insert row and make a
113 -- call to create map packages
114
115
116 BEGIN --insert row
117
118 SELECT HZ_ADDRESS_USAGES_S.nextval
119 INTO l_usage_id
120 FROM dual;
121
122 hz_address_usages_pkg.insert_row(
123 l_usage_row_id,
124 l_usage_id,
125 p_address_usages_rec.map_id,
126 p_address_usages_rec.usage_code,
127 p_address_usages_rec.status_flag,
128 1,
129 p_address_usages_rec.created_by_module,
130 p_address_usages_rec.application_id);
131 END;
132
133 --dbms_output.put_line(' message : Usage Created');
134
135 BEGIN
136 i := p_address_usage_dtls_tbl.first;
137 WHILE i IS NOT NULL LOOP
138
139 IF p_address_usage_dtls_tbl(i).geography_type IS NULL THEN
140 x_return_status := FND_API.G_RET_STS_ERROR;
141 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GEOGRAPHY_TYPE_MAND');
142 -- Please enter a valid geography type
143 FND_MSG_PUB.ADD;
144 RAISE FND_API.G_EXC_ERROR;
145 ELSE
146 BEGIN
147 SELECT 'X'
148 INTO l_map_dtl_extsts
149 FROM hz_geo_struct_map_dtl
150 WHERE map_id = p_address_usages_rec.map_id
151 AND geography_type = p_address_usage_dtls_tbl(i).geography_type;
152
153 EXCEPTION WHEN NO_DATA_FOUND THEN
154 x_return_status := FND_API.G_RET_STS_ERROR;
155 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GEOTYPE_INVALID');
156 -- Geography Type does not mapped with a location
157 FND_MSG_PUB.ADD;
158 RAISE FND_API.G_EXC_ERROR;
159
160 END;
161 END IF;
162
163 -- The below variable is to display the geography type in case of unique error from pkg API
164 l_geotype := p_address_usage_dtls_tbl(i).geography_type;
165
166 SELECT HZ_ADDRESS_USAGES_S.nextval
167 INTO l_usage_dtl_id
168 FROM dual;
169
170 hz_address_usage_dtls_pkg.insert_row(
171 x_usage_dtl_row_id,
172 l_usage_dtl_id,
173 l_usage_id,
174 p_address_usage_dtls_tbl(i).geography_type,
175 1,
176 p_address_usage_dtls_tbl(i).created_by_module,
177 p_address_usage_dtls_tbl(i).application_id);
178 i := p_address_usage_dtls_tbl.next(i);
179 END LOOP;
180 END; -- insert row
181
182 x_usage_id := l_usage_id;
183
184 EXCEPTION
185 WHEN DUP_VAL_ON_INDEX THEN
186 ROLLBACK TO do_create_address_usages;
187 x_return_status := FND_API.G_RET_STS_ERROR;
188 HZ_UTILITY_V2PUB.find_index_name(p_index_name);
189 IF p_index_name = 'HZ_ADDRESS_USAGES_U1' THEN
190 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_DUP_USAGE_ID');
191 FND_MESSAGE.SET_TOKEN('P_USAGE_ID',l_usage_id);
192 -- Usage ID already exists. Please use a unique ID
193 FND_MSG_PUB.ADD;
194
195 ELSIF p_index_name = 'HZ_ADDRESS_USAGES_U2' THEN
196 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_USAGE_ROW_EXISTS');
197 FND_MESSAGE.SET_TOKEN('P_USAGE',p_address_usages_rec.usage_code);
198 -- The mapping already exists for this usage. Please use another mapping.
199 FND_MSG_PUB.ADD;
200
201 ELSIF p_index_name = 'HZ_ADDRESS_USAGE_DTLS_U1' THEN
202 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_DUP_USAGE_DTL_ID');
203 FND_MESSAGE.SET_TOKEN('P_USAGE_DTL_ID',l_usage_dtl_id);
204 -- Usage detail ID already exists. Please use a unique ID.
205 FND_MSG_PUB.ADD;
206
207 ELSIF p_index_name = 'HZ_ADDRESS_USAGE_DTLS_U2' THEN
208 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_DUP_USAGE_GEOTYPE');
209 FND_MESSAGE.SET_TOKEN('P_GEOTYPE',l_geotype);
210 FND_MESSAGE.SET_TOKEN('P_USAGE',p_address_usages_rec.usage_code);
211 -- This geography type is already mapped for this usage.
212 FND_MSG_PUB.ADD;
213 END IF;
214
215 END do_create_address_usages;
216
217 PROCEDURE create_address_usages(
218 p_address_usages_rec IN address_usages_rec_type,
219 p_address_usage_dtls_tbl IN address_usage_dtls_tbl_type,
220 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
221 x_usage_id OUT NOCOPY NUMBER,
222 x_return_status OUT NOCOPY VARCHAR2,
223 x_msg_count OUT NOCOPY NUMBER,
224 x_msg_data OUT NOCOPY VARCHAR2) IS
225 p_index_name VARCHAR2(30);
226 l_temp VARCHAR2(1000);
227 l_pkgname VARCHAR2(50);
228 l_status VARCHAR2(30);
229
230 BEGIN
231
232 -- Standard start of API savepoint
233 SAVEPOINT create_address_usages;
234
235 -- Initialize message list if p_init_msg_list is set to TRUE.
236 IF FND_API.to_Boolean(p_init_msg_list) THEN
237 FND_MSG_PUB.initialize;
238 END IF;
239
240 -- Initialize API return status to success.
241 x_return_status := FND_API.G_RET_STS_SUCCESS;
242
243 -- Call to business logic.
244 do_create_address_usages(
245 p_address_usages_rec,
246 p_address_usage_dtls_tbl,
247 x_usage_id,
248 x_return_status
249 );
250
251
252 -- if validation failed at any point, then raise an exception to stop processing
253 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
254 RAISE FND_API.G_EXC_ERROR;
255 END IF;
256
257 IF p_address_usages_rec.status_flag = 'A' THEN
258 --dbms_output.put_line('Before Gen pkg Create usage : map id :'|| p_address_usages_rec.map_id);
259 BEGIN
260 hz_gnr_gen_pkg.genpkg(p_address_usages_rec.map_id,l_pkgname,l_status);
261 IF l_status = FND_API.G_RET_STS_ERROR THEN
262 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_PKG_ERR');
263 FND_MSG_PUB.ADD;
264 RAISE FND_API.G_EXC_ERROR;
265 END IF;
266 EXCEPTION WHEN OTHERS THEN
267 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_INTERNAL_ERROR');
268 FND_MSG_PUB.ADD;
269 RAISE FND_API.G_EXC_ERROR;
270 END;
271 --dbms_output.put_line('After Gen pkg Create usage : map id :'|| p_address_usages_rec.map_id);
272 END IF;
273
274 -- Standard call to get message count and if count is 1, get message info.
275 FND_MSG_PUB.Count_And_Get(
276 p_encoded => FND_API.G_FALSE,
277 p_count => x_msg_count,
278 p_data => x_msg_data);
279
280 EXCEPTION
281 WHEN FND_API.G_EXC_ERROR THEN
282 ROLLBACK TO create_address_usages;
283 x_return_status := FND_API.G_RET_STS_ERROR;
284 FND_MSG_PUB.Count_And_Get(
285 p_encoded => FND_API.G_FALSE,
286 p_count => x_msg_count,
287 p_data => x_msg_data);
288 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
289 ROLLBACK TO create_address_usages;
290 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
291 FND_MSG_PUB.Count_And_Get(
292 p_encoded => FND_API.G_FALSE,
293 p_count => x_msg_count,
294 p_data => x_msg_data);
295 WHEN OTHERS THEN
296 ROLLBACK TO create_address_usages;
297 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
298 FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
299 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
300 FND_MSG_PUB.ADD;
301 FND_MSG_PUB.Count_And_Get(
302 p_encoded => FND_API.G_FALSE,
303 p_count => x_msg_count,
304 p_data => x_msg_data);
305
306 END create_address_usages;
307
308 PROCEDURE update_address_usages
309 (p_usage_id IN NUMBER,
310 p_map_id IN NUMBER,
311 p_usage_code IN VARCHAR2,
312 p_status_flag IN VARCHAR2,
313 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
314 x_object_version_number IN OUT NOCOPY NUMBER,
315 x_return_status OUT NOCOPY VARCHAR2,
316 x_msg_count OUT NOCOPY NUMBER,
317 x_msg_data OUT NOCOPY VARCHAR2
318 ) IS
319
320 l_map_id NUMBER;
321 l_usage_id NUMBER;
322 l_usage_row_id VARCHAR2(50);
323 l_object_version_number NUMBER;
324 l_pkgname VARCHAR2(50);
325 l_status VARCHAR2(30);
326 l_count NUMBER;
327 pkg_name VARCHAR2(1000);
328 l_drp_sql VARCHAR2(1000);
329
330 db_object_version_number hz_address_usages.object_version_number%TYPE;
331 db_map_id hz_address_usages.map_id%TYPE;
332 db_usage_code hz_address_usages.usage_code%TYPE;
333 db_status_flag hz_address_usages.status_flag%TYPE;
334 db_created_by hz_address_usages.created_by%TYPE;
335 db_creation_date hz_address_usages.creation_date%TYPE;
336 db_last_updated_by hz_address_usages.last_updated_by%TYPE;
337 db_last_update_date hz_address_usages.last_update_date%TYPE;
338 db_last_update_login hz_address_usages.last_update_login%TYPE;
339 db_created_by_module hz_address_usages.created_by_module%TYPE;
340 db_application_id hz_address_usages.application_id%TYPE;
341
342 BEGIN
343
344 -- Standard start of API savepoint
345 SAVEPOINT update_address_usages;
346
347 -- Initialize message list if p_init_msg_list is set to TRUE.
348 IF FND_API.to_Boolean(p_init_msg_list) THEN
349 FND_MSG_PUB.initialize;
350 END IF;
351
352 -- Initialize API return status to success.
353 x_return_status := FND_API.G_RET_STS_SUCCESS;
354
355 IF p_usage_id IS NOT NULL THEN
356
357 -- Check the passed usage_id is valid or not
358 BEGIN
359 SELECT rowid, usage_id, object_version_number, map_id,
360 usage_code, status_flag, created_by, creation_date, last_updated_by,
361 last_update_date, last_update_login, created_by_module, application_id
362 INTO l_usage_row_id, l_usage_id, db_object_version_number, db_map_id,
363 db_usage_code, db_status_flag, db_created_by, db_creation_date, db_last_updated_by,
364 db_last_update_date, db_last_update_login, db_created_by_module, db_application_id
365 FROM hz_address_usages
366 WHERE usage_id = p_usage_id;
367 EXCEPTION WHEN NO_DATA_FOUND THEN
368 x_return_status := FND_API.G_RET_STS_ERROR;
369 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
370 -- Usage record does not exists for updation
371 FND_MSG_PUB.ADD;
372 RAISE FND_API.G_EXC_ERROR;
373 END;
374 ELSE
375
376 IF p_map_id IS NULL THEN
377 x_return_status := FND_API.G_RET_STS_ERROR;
378 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_MAP_ID');
379 -- The Map Id passed is NULL. Please use a valid Map Id to create an Address Usage.
380 FND_MSG_PUB.ADD;
381 RAISE FND_API.G_EXC_ERROR;
382 END IF;
383
384 IF p_usage_code IS NULL THEN
385 x_return_status := FND_API.G_RET_STS_ERROR;
386 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_CODE');
387 -- The usage code passed is NULL. Please use a valid usage code.
388 FND_MSG_PUB.ADD;
389 RAISE FND_API.G_EXC_ERROR;
390 END IF;
391
392 -- Check the valid combination for map_id and usage_code
393 BEGIN
394 SELECT rowid, usage_id, object_version_number, map_id,
395 usage_code, status_flag, created_by, creation_date, last_updated_by,
396 last_update_date, last_update_login, created_by_module, application_id
397 INTO l_usage_row_id, l_usage_id, db_object_version_number, db_map_id,
398 db_usage_code, db_status_flag, db_created_by, db_creation_date, db_last_updated_by,
399 db_last_update_date, db_last_update_login, db_created_by_module, db_application_id
400 FROM hz_address_usages
401 WHERE map_id = p_map_id
402 AND usage_code = p_usage_code;
403 EXCEPTION WHEN NO_DATA_FOUND THEN
404 x_return_status := FND_API.G_RET_STS_ERROR;
405 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
406 -- Usage record does not exists for updation
407 FND_MSG_PUB.ADD;
408 RAISE FND_API.G_EXC_ERROR;
409 END;
410
411 END IF;
412
413 IF db_object_version_number <> x_object_version_number THEN
414 FND_MESSAGE.SET_NAME('AR', 'HZ_API_RECORD_CHANGED');
415 FND_MESSAGE.SET_TOKEN('TABLE', 'HZ_ADDRESS_USAGES');
416 FND_MSG_PUB.ADD;
417 RAISE FND_API.G_EXC_ERROR;
418 END IF;
419
420 hz_address_usages_pkg.Lock_Row (
421 x_rowid => l_usage_row_id,
422 x_usage_id => l_usage_id,
423 x_map_id => db_map_id,
424 x_usage_code => db_usage_code,
425 x_status_flag => db_status_flag,
426 x_created_by => db_created_by,
427 x_creation_date => db_creation_date,
428 x_last_updated_by => db_last_updated_by,
429 x_last_update_date => db_last_update_date,
430 x_last_update_login => db_last_update_login,
431 x_object_version_number => x_object_version_number,
432 x_created_by_module => db_created_by_module,
433 x_application_id => db_application_id);
434
435 --dbms_output.put_line(' message update : l_usage_row_id '|| l_usage_row_id);
436 l_object_version_number := x_object_version_number +1;
437
438 hz_address_usages_pkg.Update_Row (
439 x_rowid => l_usage_row_id,
440 x_usage_id => l_usage_id,
441 x_map_id => db_map_id,
442 x_usage_code => db_usage_code,
443 x_status_flag => p_status_flag,
444 x_object_version_number => l_object_version_number,
445 x_created_by_module => db_created_by_module,
446 x_application_id => db_application_id);
447
448
449 --dbms_output.put_line(' message after update :');
450 x_object_version_number := l_object_version_number;
451
452 SELECT count(*)
453 INTO l_count
454 FROM Hz_address_usages usg, Hz_address_usage_dtls dtl
455 WHERE usg.map_id = db_map_id
456 AND usg.status_flag = 'A'
457 AND dtl.usage_id = usg.usage_id;
458
459 -- If count is 0, that means there is no active usage details for this map_id
460 IF l_count > 0 THEN
461 --dbms_output.put_line('Before Gen pkg Create usage : map id :'|| p_address_usages_rec.map_id);
462 BEGIN
463 hz_gnr_gen_pkg.genpkg(db_map_id,l_pkgname,l_status);
464 IF l_status = FND_API.G_RET_STS_ERROR THEN
465 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_PKG_ERR');
466 FND_MSG_PUB.ADD;
467 RAISE FND_API.G_EXC_ERROR;
468 END IF;
469 EXCEPTION WHEN OTHERS THEN
470 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_INTERNAL_ERROR');
471 FND_MSG_PUB.ADD;
472 RAISE FND_API.G_EXC_ERROR;
473 END;
474 --dbms_output.put_line('After Gen pkg Create usage : map id :'|| p_address_usages_rec.map_id);
475 ELSE
476 BEGIN
477 pkg_name := 'HZ_GNR_MAP' ||to_char(db_map_id);
478 l_drp_sql := 'Drop Package Body '|| pkg_name;
479 EXECUTE IMMEDIATE l_drp_sql;
480
481 l_drp_sql := 'Drop Package '|| pkg_name;
482
483 EXECUTE IMMEDIATE l_drp_sql;
484 EXCEPTION when OTHERS then
485 NULL;
486 END;
487 END IF;
488
489 -- Standard call to get message count and if count is 1, get message info.
490 FND_MSG_PUB.Count_And_Get(
491 p_encoded => FND_API.G_FALSE,
492 p_count => x_msg_count,
493 p_data => x_msg_data);
494
495 EXCEPTION
496 WHEN FND_API.G_EXC_ERROR THEN
497 ROLLBACK TO update_address_usages;
498 x_return_status := FND_API.G_RET_STS_ERROR;
499 FND_MSG_PUB.Count_And_Get(
500 p_encoded => FND_API.G_FALSE,
501 p_count => x_msg_count,
502 p_data => x_msg_data);
503 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
504 ROLLBACK TO update_address_usages;
505 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
506 FND_MSG_PUB.Count_And_Get(
507 p_encoded => FND_API.G_FALSE,
508 p_count => x_msg_count,
509 p_data => x_msg_data);
510 WHEN OTHERS THEN
511 ROLLBACK TO update_address_usages;
512 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
513 FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
514 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
515 FND_MSG_PUB.ADD;
516 FND_MSG_PUB.Count_And_Get(
517 p_encoded => FND_API.G_FALSE,
518 p_count => x_msg_count,
519 p_data => x_msg_data);
520
521 END update_address_usages;
522
523 PROCEDURE create_address_usage_dtls(
524 p_usage_id IN NUMBER,
525 p_address_usage_dtls_tbl IN address_usage_dtls_tbl_type,
526 x_usage_dtl_id OUT NOCOPY NUMBER,
527 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
528 x_return_status OUT NOCOPY VARCHAR2,
529 x_msg_count OUT NOCOPY NUMBER,
530 x_msg_data OUT NOCOPY VARCHAR2) IS
531
532 p_index_name VARCHAR2(30);
533 l_temp VARCHAR2(1000);
534
535 l_map_id NUMBER;
536 l_usage_dtl_id NUMBER;
537 x_usage_dtl_row_id VARCHAR2(50);
538 l_usage_code VARCHAR2(50);
539 l_geotype VARCHAR2(360);
540 l_status_flag VARCHAR2(1);
541
542 i BINARY_INTEGER;
543 l_error_code VARCHAR2(30);
544 x_status VARCHAR2(30);
545 l_map_dtl_extsts VARCHAR2(1);
546 l_usage_extsts VARCHAR2(1);
547 l_pkgname VARCHAR2(50);
548 l_status VARCHAR2(30);
549
550 BEGIN
551
552 -- Standard start of API savepoint
553 SAVEPOINT create_address_usage_dtls;
554
555 -- Initialize message list if p_init_msg_list is set to TRUE.
556 IF FND_API.to_Boolean(p_init_msg_list) THEN
557 FND_MSG_PUB.initialize;
558 END IF;
559
560 -- Initialize API return status to success.
561 x_return_status := FND_API.G_RET_STS_SUCCESS;
562
563 IF p_usage_id IS NULL THEN
564 x_return_status := FND_API.G_RET_STS_ERROR;
565 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
566 -- Usage Id cannot be null. Please enter a valid Usage Id
567 FND_MSG_PUB.ADD;
568 RAISE FND_API.G_EXC_ERROR;
569 ELSE
570 BEGIN
571 SELECT map_id, usage_code, status_flag
572 INTO l_map_id, l_usage_code, l_status_flag
573 FROM hz_address_usages
574 WHERE usage_id = p_usage_id;
575
576 EXCEPTION WHEN NO_DATA_FOUND THEN
577 x_return_status := FND_API.G_RET_STS_ERROR;
578 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
579 -- Usage Id passed is not valid. Please enter a valid Usage Id.
580 FND_MSG_PUB.ADD;
581 RAISE FND_API.G_EXC_ERROR;
582
583 END;
584 END IF;
585
586 -- Call to business logic.
587
588 --dbms_output.put_line(' message : Usage Created');
589
590 BEGIN
591 i := p_address_usage_dtls_tbl.first;
592 WHILE i IS NOT NULL LOOP
593
594 IF p_address_usage_dtls_tbl(i).geography_type IS NULL THEN
595 x_return_status := FND_API.G_RET_STS_ERROR;
596 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GEOGRAPHY_TYPE_MAND');
597 -- Please enter a valid geography type
598 FND_MSG_PUB.ADD;
599 RAISE FND_API.G_EXC_ERROR;
600 ELSE
601 BEGIN
602 SELECT 'X'
603 INTO l_map_dtl_extsts
604 FROM hz_geo_struct_map_dtl
605 WHERE map_id = l_map_id
606 AND geography_type = p_address_usage_dtls_tbl(i).geography_type;
607
608 EXCEPTION WHEN NO_DATA_FOUND THEN
609 x_return_status := FND_API.G_RET_STS_ERROR;
610 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GEOTYPE_INVALID');
611 -- Geography Type does not mapped with a location
612 FND_MSG_PUB.ADD;
613 RAISE FND_API.G_EXC_ERROR;
614
615 END;
616 END IF;
617
618 -- The below variable is to display the geography type in case of unique error from pkg API
619 l_geotype := p_address_usage_dtls_tbl(i).geography_type;
620
621 SELECT HZ_ADDRESS_USAGES_S.nextval
622 INTO l_usage_dtl_id
623 FROM dual;
624
625 hz_address_usage_dtls_pkg.insert_row(
626 x_usage_dtl_row_id,
627 l_usage_dtl_id,
628 p_usage_id,
629 p_address_usage_dtls_tbl(i).geography_type,
630 1,
631 p_address_usage_dtls_tbl(i).created_by_module,
632 p_address_usage_dtls_tbl(i).application_id);
633 i := p_address_usage_dtls_tbl.next(i);
634 END LOOP;
635 END; -- insert row
636
637 x_usage_dtl_id := l_usage_dtl_id;
638
639 -- if validation failed at any point, then raise an exception to stop processing
640 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
641 RAISE FND_API.G_EXC_ERROR;
642 END IF;
643
644 IF l_status_flag = 'A' THEN
645 --dbms_output.put_line('Before Gen pkg Create usage dtls : map id :'|| l_map_id);
646 BEGIN
647 hz_gnr_gen_pkg.genpkg(l_map_id,l_pkgname,l_status);
648 IF l_status = FND_API.G_RET_STS_ERROR THEN
649 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_PKG_ERR');
650 FND_MSG_PUB.ADD;
651 RAISE FND_API.G_EXC_ERROR;
652 END IF;
653 EXCEPTION WHEN OTHERS THEN
654 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_INTERNAL_ERROR');
655 FND_MSG_PUB.ADD;
656 RAISE FND_API.G_EXC_ERROR;
657 END;
658 --dbms_output.put_line('After Gen pkg Create usage dtls : map id :'|| l_map_id);
659 END IF;
660
661 -- Standard call to get message count and if count is 1, get message info.
662 FND_MSG_PUB.Count_And_Get(
663 p_encoded => FND_API.G_FALSE,
664 p_count => x_msg_count,
665 p_data => x_msg_data);
666
667 EXCEPTION
668 WHEN FND_API.G_EXC_ERROR THEN
669 ROLLBACK TO create_address_usage_dtls;
670 x_return_status := FND_API.G_RET_STS_ERROR;
671 FND_MSG_PUB.Count_And_Get(
672 p_encoded => FND_API.G_FALSE,
673 p_count => x_msg_count,
674 p_data => x_msg_data);
675 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
676 ROLLBACK TO create_address_usage_dtls;
677 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
678 FND_MSG_PUB.Count_And_Get(
679 p_encoded => FND_API.G_FALSE,
680 p_count => x_msg_count,
681 p_data => x_msg_data);
682
683 WHEN DUP_VAL_ON_INDEX THEN
684 ROLLBACK TO create_address_usage_dtls;
685 x_return_status := FND_API.G_RET_STS_ERROR;
686 HZ_UTILITY_V2PUB.find_index_name(p_index_name);
687 IF p_index_name = 'HZ_ADDRESS_USAGE_DTLS_U1' THEN
688 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_DUP_USAGE_DTL_ID');
689 -- Usage detail ID already exists. Please use a unique ID.
690 FND_MESSAGE.SET_TOKEN('P_USAGE_DTL_ID',l_usage_dtl_id);
691 FND_MSG_PUB.ADD;
692 ELSIF p_index_name = 'HZ_ADDRESS_USAGE_DTLS_U2' THEN
693 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_DUP_USAGE_GEOTYPE');
694 FND_MESSAGE.SET_TOKEN('P_GEOTYPE',l_geotype);
695 FND_MESSAGE.SET_TOKEN('P_USAGE',l_usage_code);
696 -- This geography type is already mapped for this usage.
697 FND_MSG_PUB.ADD;
698 END IF;
699
700 FND_MSG_PUB.Count_And_Get(
701 p_encoded => FND_API.G_FALSE,
702 p_count => x_msg_count,
703 p_data => x_msg_data);
704 WHEN OTHERS THEN
705 ROLLBACK TO create_address_usage_dtls;
706 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
707 FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
708 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
709 FND_MSG_PUB.ADD;
710 FND_MSG_PUB.Count_And_Get(
711 p_encoded => FND_API.G_FALSE,
712 p_count => x_msg_count,
713 p_data => x_msg_data);
714
715 END create_address_usage_dtls;
716
717 PROCEDURE delete_address_usages(
718 p_usage_id IN NUMBER,
719 p_address_usage_dtls_tbl IN address_usage_dtls_tbl_type,
720 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
721 x_return_status OUT NOCOPY VARCHAR2,
722 x_msg_count OUT NOCOPY NUMBER,
723 x_msg_data OUT NOCOPY VARCHAR2
724 ) IS
725
726 l_map_id NUMBER;
727 l_usage_dtl_id NUMBER;
728 l_usage_code VARCHAR2(50);
729 l_count NUMBER;
730 l_pkgname VARCHAR2(50);
731 l_status VARCHAR2(30);
732 i NUMBER;
733 l_status_flag VARCHAR2(1);
734 pkg_name VARCHAR2(1000);
735 l_drp_sql VARCHAR2(1000);
736 l_last_usg_dtl_id NUMBER;
737
738 CURSOR c_address_usage_dtls IS
739 SELECT usage_dtl_id
740 FROM hz_address_usage_dtls
741 WHERE usage_id = p_usage_id;
742
743 BEGIN
744
745 -- Standard start of API savepoint
746 SAVEPOINT delete_address_usages;
747
748 -- Initialize message list if p_init_msg_list is set to TRUE.
749 IF FND_API.to_Boolean(p_init_msg_list) THEN
750 FND_MSG_PUB.initialize;
751 END IF;
752
753 -- Initialize API return status to success.
754 x_return_status := FND_API.G_RET_STS_SUCCESS;
755
756 IF p_usage_id IS NULL THEN
757
758 x_return_status := FND_API.G_RET_STS_ERROR;
759 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
760 -- Usage Id cannot be null. Please enter a valid Usage Id
761 FND_MSG_PUB.ADD;
762 RAISE FND_API.G_EXC_ERROR;
763
764 ELSE
765
766 BEGIN
767 SELECT map_id, usage_code, status_flag
768 INTO l_map_id, l_usage_code, l_status_flag
769 FROM hz_address_usages
770 WHERE usage_id = p_usage_id;
771
772 EXCEPTION WHEN NO_DATA_FOUND THEN
773 x_return_status := FND_API.G_RET_STS_ERROR;
774 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_INVALID_USAGE_ID');
775 -- Usage Id passed is not valid. Please enter a valid Usage Id.
776 FND_MSG_PUB.ADD;
777 RAISE FND_API.G_EXC_ERROR;
778 END;
779
780 IF p_address_usage_dtls_tbl.COUNT > 0 THEN
781
782 i:= p_address_usage_dtls_tbl.FIRST;
783 LOOP
784 IF p_address_usage_dtls_tbl(i).geography_type IS NOT NULL then
785 BEGIN
786 SELECT usage_dtl_id
787 INTO l_usage_dtl_id
788 FROM hz_address_usage_dtls
789 WHERE usage_id = p_usage_id
790 AND geography_type = p_address_usage_dtls_tbl(i).geography_type;
791
792 EXCEPTION WHEN NO_DATA_FOUND THEN
793 x_return_status := FND_API.G_RET_STS_ERROR;
794 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_USAGE_GEOTYPE_INVALID');
795 FND_MESSAGE.SET_TOKEN('P_GEOTYPE',p_address_usage_dtls_tbl(i).geography_type);
796 FND_MESSAGE.SET_TOKEN('P_USAGE',l_usage_code);
797 -- Geography type does not exists for the given usage
798 FND_MSG_PUB.ADD;
799 RAISE FND_API.G_EXC_ERROR;
800 END;
801
802 BEGIN
803 SELECT count(*)
804 INTO l_count
805 FROM hz_address_usage_dtls
806 WHERE usage_id = p_usage_id;
807
808 IF l_count < 3 then
809
810 BEGIN
811 SELECT usage_dtl_id
812 INTO l_last_usg_dtl_id
813 FROM hz_address_usage_dtls
814 WHERE usage_id = p_usage_id
815 AND usage_dtl_id <> l_usage_dtl_id;
816
817 -- delete the other usage detail also because it is only
818 -- one left can can not exist without any other usage detail
819 -- Bug 5096570 (Nishant 10-Apr-2006)
820 hz_address_usage_dtls_pkg.delete_row(l_last_usg_dtl_id);
821 hz_address_usages_pkg.delete_row(p_usage_id);
822 -- Set i to LAST, so that it does not check any other geo type
823 -- as there is no use (all are deleted)
824 i := p_address_usage_dtls_tbl.LAST;
825 EXCEPTION WHEN NO_DATA_FOUND THEN
826 -- it means only 1 usage detail was there. Delete the usage only
827 -- usage detail will be deleted below
828 /*
829 x_return_status := FND_API.G_RET_STS_ERROR;
830 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_2_USAGE_DTL_MAND');
831 -- At least two geography types are required for a usage
832 FND_MSG_PUB.ADD;
833 RAISE FND_API.G_EXC_ERROR;
834 */
835 hz_address_usages_pkg.delete_row(p_usage_id);
836 i := p_address_usage_dtls_tbl.LAST;
837 END;
838
839 END IF;
840 END;
841
842 hz_address_usage_dtls_pkg.delete_row(l_usage_dtl_id);
843 END IF;
844 EXIT WHEN i = p_address_usage_dtls_tbl.LAST;
845 i := p_address_usage_dtls_tbl.NEXT(i);
846 END LOOP;
847 ELSE
848 FOR i IN c_address_usage_dtls
849 LOOP
850 hz_address_usage_dtls_pkg.delete_row(i.usage_dtl_id);
851 EXIT WHEN c_address_usage_dtls%NOTFOUND;
852 END LOOP;
853 hz_address_usages_pkg.delete_row(p_usage_id);
854 END IF;
855
856 SELECT count(*)
857 INTO l_count
858 FROM Hz_address_usages usg, Hz_address_usage_dtls dtl
859 WHERE usg.map_id = l_map_id
860 AND usg.status_flag = 'A'
861 AND dtl.usage_id = usg.usage_id;
862
863 -- If count is 0, that means there is no active usage details for this map_id
864 -- In this case we can drop the package
865 IF l_count < 1 THEN
866 BEGIN
867 pkg_name := 'HZ_GNR_MAP' ||to_char(l_map_id);
868 l_drp_sql := 'Drop Package Body '|| pkg_name;
869 EXECUTE IMMEDIATE l_drp_sql;
870
871 l_drp_sql := 'Drop Package '|| pkg_name;
872
873 EXECUTE IMMEDIATE l_drp_sql;
874 EXCEPTION when OTHERS then
875 NULL;
876 END;
877 ELSE
878 -- Checking whether the usage is active or not.
879 IF l_status_flag = 'A' THEN
880 --dbms_output.put_line('Before Gen pkg Delete usage : map id :'|| l_map_id);
881 BEGIN
882 hz_gnr_gen_pkg.genpkg(l_map_id,l_pkgname,l_status);
883 IF l_status = FND_API.G_RET_STS_ERROR THEN
884 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_PKG_ERR');
885 FND_MSG_PUB.ADD;
886 RAISE FND_API.G_EXC_ERROR;
887 END IF;
888 EXCEPTION WHEN OTHERS THEN
889 FND_MESSAGE.SET_NAME('AR', 'HZ_GEO_GNR_INTERNAL_ERROR');
890 FND_MSG_PUB.ADD;
891 RAISE FND_API.G_EXC_ERROR;
892 END;
893 --dbms_output.put_line('After Gen pkg Delete usage : map id :'|| l_map_id);
894 END IF;
895 END IF;
896 END IF;
897
898 -- Standard call to get message count and if count is 1, get message info.
899 FND_MSG_PUB.Count_And_Get(
900 p_encoded => FND_API.G_FALSE,
901 p_count => x_msg_count,
902 p_data => x_msg_data);
903
904 EXCEPTION
905 WHEN FND_API.G_EXC_ERROR THEN
906 ROLLBACK TO delete_address_usages;
907 x_return_status := FND_API.G_RET_STS_ERROR;
908 FND_MSG_PUB.Count_And_Get(
909 p_encoded => FND_API.G_FALSE,
910 p_count => x_msg_count,
911 p_data => x_msg_data);
912 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
913 ROLLBACK TO delete_address_usages;
914 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
915 FND_MSG_PUB.Count_And_Get(
916 p_encoded => FND_API.G_FALSE,
917 p_count => x_msg_count,
918 p_data => x_msg_data);
919 WHEN OTHERS THEN
920 ROLLBACK TO delete_address_usages;
921 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
922 FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
923 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
924 FND_MSG_PUB.ADD;
925 FND_MSG_PUB.Count_And_Get(
926 p_encoded => FND_API.G_FALSE,
927 p_count => x_msg_count,
928 p_data => x_msg_data);
929
930 END delete_address_usages;
931
932 END HZ_ADDRESS_USAGES_PUB;