[Home] [Help]
PACKAGE BODY: APPS.XLA_AMB_AAD_PKG
Source
1 PACKAGE BODY xla_amb_aad_pkg AS
2 /* $Header: xlaamaad.pkb 120.27 2006/05/09 21:42:05 wychan ship $ */
3 /*======================================================================+
4 | Copyright (c) 1995-2002 Oracle Corporation |
5 | Redwood Shores, CA, USA |
6 | All rights reserved. |
7 +=======================================================================+
8 | PACKAGE NAME |
9 | xla_amb_aad_pkg |
10 | |
11 | DESCRIPTION |
12 | XLA Application Accounting Definition Validations Package |
13 | |
14 | HISTORY |
15 | 01-May-01 Dimple Shah Created |
16 | |
17 +======================================================================*/
18
19 --=============================================================================
20 -- **************** declaraions ********************
21 --=============================================================================
22 -------------------------------------------------------------------------------
23 -- declaring private package variables
24 -------------------------------------------------------------------------------
25 g_creation_date DATE;
26 g_last_update_date DATE;
27 g_created_by INTEGER;
28 g_last_update_login INTEGER;
29 g_last_updated_by INTEGER;
30
31 -------------------------------------------------------------------------------
32 -- declaring private package arrays
33 -------------------------------------------------------------------------------
34 TYPE t_array_codes IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
35 TYPE t_array_type_codes IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
36
37 --=============================================================================
38 -- *********** Local Trace Routine **********
39 --=============================================================================
40 C_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
41 C_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
42 C_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
43 C_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
44 C_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
45 C_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
46
47 C_LEVEL_LOG_DISABLED CONSTANT NUMBER := 99;
48 C_DEFAULT_MODULE CONSTANT VARCHAR2(240) := 'xla.plsql.xla_amb_aad_pkg';
49
50 g_log_level NUMBER;
51 g_log_enabled BOOLEAN;
52
53 PROCEDURE trace
54 (p_msg IN VARCHAR2
55 ,p_module IN VARCHAR2
56 ,p_level IN NUMBER) IS
57 BEGIN
58 ----------------------------------------------------------------------------
59 -- Following is for FND log.
60 ----------------------------------------------------------------------------
61 IF (p_msg IS NULL AND p_level >= g_log_level) THEN
62 fnd_log.message(p_level, p_module);
63 ELSIF p_level >= g_log_level THEN
64 fnd_log.string(p_level, p_module, p_msg);
65 END IF;
66
67 EXCEPTION
68 WHEN xla_exceptions_pkg.application_exception THEN
69 RAISE;
70
71 WHEN OTHERS THEN
72 xla_exceptions_pkg.raise_message
73 (p_location => 'xla_amb_aad_pkg.trace');
74 END trace;
75
76 --=============================================================================
77 --
78 --
79 --
80 --
81 -- *********** private procedures and functions **********
82 --
83 --
84 --
85 --
86 --=============================================================================
87
88 /*======================================================================+
89 | |
90 | Private Function |
91 | |
92 | is_reversal |
93 | |
94 | Returns true if accounting reversal or transaction reversal sources |
95 | are assigned to the event class |
96 | |
97 +======================================================================*/
98
99 FUNCTION is_reversal
100 (p_application_id IN NUMBER
101 ,p_entity_code IN VARCHAR2
102 ,p_event_class_code IN VARCHAR2)
103 RETURN BOOLEAN
104 IS
105
106 l_return BOOLEAN := TRUE;
107 l_exist VARCHAR2(1);
108
109 -- Check if the accounting reversal option is set for the event class
110 CURSOR c_event_sources
111 IS
112 SELECT 'x'
113 FROM xla_evt_class_acct_attrs e
114 WHERE e.application_id = p_application_id
115 AND e.event_class_code = p_event_class_code
116 AND e.accounting_attribute_code IN ('ACCOUNTING_REVERSAL_OPTION','TRX_ACCT_REVERSAL_OPTION');
117
118 l_log_module VARCHAR2(240);
119 BEGIN
120 IF g_log_enabled THEN
121 l_log_module := C_DEFAULT_MODULE||'.is_reversal';
122 END IF;
123
124 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
125 trace(p_msg => 'BEGIN of procedure is_reversal'
126 ,p_module => l_log_module
127 ,p_level => C_LEVEL_PROCEDURE);
128 END IF;
129
130 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
131 trace(p_msg => 'application_id = '||p_application_id||
132 ',entity_code = '||p_entity_code||
133 ',event_class_code = '||p_event_class_code
134 ,p_module => l_log_module
135 ,p_level => C_LEVEL_STATEMENT);
136 END IF;
137
138 -- Check if the accounting reversal option is set for the event class
139 OPEN c_event_sources;
140 FETCH c_event_sources INTO l_exist;
141 IF c_event_sources%found then
142 l_return := TRUE;
143 ELSE
144 l_return := FALSE;
145 END IF;
146 CLOSE c_event_sources;
147
148 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
149 trace(p_msg => 'END of procedure - return: '
150 ||case when l_return then 'TRUE' else 'FALSE' end
151 ,p_module => l_log_module
152 ,p_level => C_LEVEL_PROCEDURE);
153 END IF;
154
155 RETURN l_return;
156
157 EXCEPTION
158 WHEN xla_exceptions_pkg.application_exception THEN
159 RAISE;
160
161 WHEN OTHERS THEN
162
163 xla_exceptions_pkg.raise_message
164 (p_location => 'xla_amb_aad_pkg.is_reversal');
165
166 END is_reversal;
167
168 /*======================================================================+
169 | |
170 | Private Function |
171 | |
172 | chk_hdr_accting_sources |
173 | |
174 | Returns false if header accounting sources are invalid |
175 | |
176 +======================================================================*/
177
178 FUNCTION chk_hdr_accting_sources
179 (p_application_id IN NUMBER
180 ,p_amb_context_code IN VARCHAR2
181 ,p_product_rule_type_code IN VARCHAR2
182 ,p_product_rule_code IN VARCHAR2
183 ,p_entity_code IN VARCHAR2
184 ,p_event_class_code IN VARCHAR2
185 ,p_event_type_code IN VARCHAR2)
186 RETURN BOOLEAN
187 IS
188 l_return BOOLEAN;
189 l_exist VARCHAR2(1);
190 l_accounting_attribute_code VARCHAR2(30);
191
192 -- Get all required accounting attributes that are not mapped to the event class
193
194 CURSOR c_reqd_acct_attr
195 IS
196 SELECT a.accounting_attribute_code
197 FROM xla_acct_attributes_b a
198 WHERE a.assignment_required_code = 'Y'
199 AND NOT EXISTS (SELECT 'x'
200 FROM xla_evt_class_acct_attrs e
201 WHERE e.application_id = p_application_id
202 AND e.event_class_code = p_event_class_code
203 AND e.accounting_attribute_code = a.accounting_attribute_code
204 AND e.default_flag = 'Y');
205
206 l_reqd_acct_attr c_reqd_acct_attr%rowtype;
207
208 -- Get all accounting groups that have accounting attributes
209 -- mapped for the event class
210 CURSOR c_mapping_group
211 IS
212 SELECT distinct a.assignment_group_code
213 FROM xla_acct_attributes_b a
214 WHERE assignment_group_code is NOT NULL
215 AND EXISTS (SELECT 'x'
216 FROM xla_evt_class_acct_attrs e
217 WHERE e.application_id = p_application_id
218 AND e.event_class_code = p_event_class_code
219 AND e.accounting_attribute_code = a.accounting_attribute_code
220 AND e.default_flag = 'Y');
221
222 --l_mapping_group c_mapping_group%rowtype;
223
224 -- Get all required accounting attributes for the above group
225 -- which have not been mapped to the event class
226 CURSOR c_accting_sources (p_assignment_group_code VARCHAR2)
227 IS
228 SELECT accounting_attribute_code
229 FROM xla_acct_attributes_b s
230 WHERE assignment_required_code = 'G'
231 AND assignment_group_code = p_assignment_group_code
232 AND not exists (SELECT 'x'
233 FROM xla_evt_class_acct_attrs e
234 WHERE e.application_id = p_application_id
235 AND e.event_class_code = p_event_class_code
236 AND e.accounting_attribute_code = s.accounting_attribute_code
237 AND e.default_flag = 'Y');
238
239 l_accting_sources c_accting_sources%rowtype;
240
241 -- Check if event class has budget or encumbrance enabled
242 CURSOR c_ec_attrs
243 IS
244 SELECT allow_budgets_flag, allow_encumbrance_flag
245 FROM xla_event_class_attrs e
246 WHERE e.application_id = p_application_id
247 AND e.entity_code = p_entity_code
248 AND e.event_class_code = p_event_class_code;
249
250 l_ec_attrs c_ec_attrs%rowtype;
251
252 -- Check if event class has budget version id accounting attribute mapped
253 CURSOR c_budget
254 IS
255 SELECT 'x'
256 FROM xla_evt_class_acct_attrs e
257 WHERE e.application_id = p_application_id
258 AND e.event_class_code = p_event_class_code
259 AND e.accounting_attribute_code = 'BUDGET_VERSION_ID'
260 AND e.default_flag = 'Y';
261
262 -- Check if event class has encumbrance type id accounting attribute mapped
263 /*4458381
264 CURSOR c_enc
265 IS
266 SELECT 'x'
267 FROM xla_evt_class_acct_attrs e
268 WHERE e.application_id = p_application_id
269 AND e.event_class_code = p_event_class_code
270 AND e.accounting_attribute_code = 'ENCUMBRANCE_TYPE_ID'
271 AND e.default_flag = 'Y';
272 */
273
274 -- Check if reversed distribution id 2 is mapped for the event class
275 CURSOR c_rev_dist_2
276 IS
277 SELECT a.accounting_attribute_code, a.assignment_group_code
278 FROM xla_evt_class_acct_attrs_fvl a
279 WHERE a.application_id = p_application_id
280 AND a.event_class_code = p_event_class_code
281 AND a.accounting_attribute_code = 'REVERSED_DISTRIBUTION_ID2'
282 AND default_flag = 'Y';
283
284 l_rev_dist_2 c_rev_dist_2%rowtype;
285
286 -- Check if distribution id 2 is mapped for the event class
287 CURSOR c_dist_2
288 IS
289 SELECT 'x'
290 FROM xla_evt_class_acct_attrs a
291 WHERE a.application_id = p_application_id
292 AND a.event_class_code = p_event_class_code
293 AND a.accounting_attribute_code = 'DISTRIBUTION_IDENTIFIER_2'
294 AND default_flag = 'Y';
295
296 -- Check if reversed distribution id 3 is mapped for the event class
297 CURSOR c_rev_dist_3
298 IS
299 SELECT a.accounting_attribute_code, a.assignment_group_code
300 FROM xla_evt_class_acct_attrs_fvl a
301 WHERE a.application_id = p_application_id
302 AND a.event_class_code = p_event_class_code
303 AND a.accounting_attribute_code = 'REVERSED_DISTRIBUTION_ID3'
304 AND default_flag = 'Y';
305
306 l_rev_dist_3 c_rev_dist_3%rowtype;
307
308 -- Check if distribution id 3 is mapped for the event class
309 CURSOR c_dist_3
310 IS
311 SELECT 'x'
312 FROM xla_evt_class_acct_attrs a
313 WHERE a.application_id = p_application_id
314 AND a.event_class_code = p_event_class_code
315 AND a.accounting_attribute_code = 'DISTRIBUTION_IDENTIFIER_3'
316 AND a.default_flag = 'Y';
317
318 -- Check if reversed distribution id 4 is mapped for the event class
319 CURSOR c_rev_dist_4
320 IS
321 SELECT a.accounting_attribute_code, a.assignment_group_code
322 FROM xla_evt_class_acct_attrs_fvl a
323 WHERE a.application_id = p_application_id
324 AND a.event_class_code = p_event_class_code
325 AND a.accounting_attribute_code = 'REVERSED_DISTRIBUTION_ID4'
326 AND default_flag = 'Y';
327
328 l_rev_dist_4 c_rev_dist_4%rowtype;
329
330 -- Check if distribution id 4 is mapped for the event class
331 CURSOR c_dist_4
332 IS
333 SELECT 'x'
334 FROM xla_evt_class_acct_attrs a
335 WHERE a.application_id = p_application_id
336 AND a.event_class_code = p_event_class_code
337 AND a.accounting_attribute_code = 'DISTRIBUTION_IDENTIFIER_4'
338 AND default_flag = 'Y';
339
340 -- Check if reversed distribution id 5 is mapped for the event class
341 CURSOR c_rev_dist_5
342 IS
343 SELECT a.accounting_attribute_code, a.assignment_group_code
344 FROM xla_evt_class_acct_attrs_fvl a
345 WHERE a.application_id = p_application_id
346 AND a.event_class_code = p_event_class_code
347 AND a.accounting_attribute_code = 'REVERSED_DISTRIBUTION_ID5'
348 AND a.default_flag = 'Y';
349
350 l_rev_dist_5 c_rev_dist_5%rowtype;
351
352 -- Check if distribution id 5 is mapped for the event class
353 CURSOR c_dist_5
354 IS
355 SELECT 'x'
356 FROM xla_evt_class_acct_attrs a
357 WHERE a.application_id = p_application_id
358 AND a.event_class_code = p_event_class_code
359 AND a.accounting_attribute_code = 'DISTRIBUTION_IDENTIFIER_5'
360 AND a.default_flag = 'Y';
361
362 -- Get all accounting attributes assignments that have sources that are
363 -- not mapped to the event class
364
365 CURSOR c_sources
366 IS
367 SELECT s.accounting_attribute_code, s.source_application_id,
368 s.source_type_code, s.source_code
369 FROM xla_evt_class_acct_attrs s
370 WHERE s.application_id = p_application_id
371 AND s.event_class_code = p_event_class_code
372 AND s.source_application_id = p_application_id
373 AND s.source_type_code = 'S'
374 AND NOT EXISTS (SELECT 'x'
375 FROM xla_event_sources e
376 WHERE e.application_id = s.application_id
377 AND e.event_class_code = s.event_class_code
378 AND e.source_application_id = s.source_application_id
379 AND e.source_type_code = s.source_type_code
380 AND e.source_code = s.source_code
381 AND e.active_flag = 'Y');
382
383 l_sources c_sources%rowtype;
384
388 CURSOR c_der_sources
385 -- Get all accounting attributes assignments that have derived sources that are
386 -- not mapped to the event class
387
389 IS
390 SELECT s.accounting_attribute_code, s.source_application_id,
391 s.source_type_code, s.source_code
392 FROM xla_evt_class_acct_attrs s
393 WHERE s.application_id = p_application_id
394 AND s.event_class_code = p_event_class_code
395 AND s.source_application_id = p_application_id
396 AND s.source_type_code = 'D';
397
398 l_der_sources c_der_sources%rowtype;
399
400 l_log_module VARCHAR2(240);
401 BEGIN
402 IF g_log_enabled THEN
403 l_log_module := C_DEFAULT_MODULE||'.chk_hdr_accting_sources';
404 END IF;
405
406 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
407 trace(p_msg => 'BEGIN of procedure chk_hdr_accting_sources'
408 ,p_module => l_log_module
409 ,p_level => C_LEVEL_PROCEDURE);
410 END IF;
411
412 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
413 trace(p_msg => 'application_id = '||p_application_id||
414 ',amb_context_code = '||p_amb_context_code||
415 ',entity_code = '||p_entity_code||
416 ',event_class_code = '||p_event_class_code||
417 ',event_type_code = '||p_event_type_code||
418 ',product_rule_type_code = '||p_product_rule_type_code||
419 ',product_rule_code = '||p_product_rule_code
420 ,p_module => l_log_module
421 ,p_level => C_LEVEL_STATEMENT);
422 END IF;
423
424 l_return := TRUE;
425 l_exist := NULL;
426
427 -- Check if every event class has all required accounting
428 -- attributes mapped to a default source
429 FOR l_reqd_acct_attr IN c_reqd_acct_attr LOOP
430 xla_amb_setup_err_pkg.stack_error
431 (p_message_name => 'XLA_AB_EC_REQUIRED_SOURCE'
432 ,p_message_type => 'E'
433 ,p_message_category => 'ACCOUNTING_SOURCE'
434 ,p_category_sequence => 5
435 ,p_application_id => p_application_id
436 ,p_amb_context_code => p_amb_context_code
437 ,p_product_rule_type_code => p_product_rule_type_code
438 ,p_product_rule_code => p_product_rule_code
439 ,p_entity_code => p_entity_code
440 ,p_event_class_code => p_event_class_code
441 ,p_accounting_source_code => l_reqd_acct_attr.accounting_attribute_code);
442
443 l_return := FALSE;
444 END LOOP;
445
446 -- Check if every event class has either all or none of the accounting
447 -- attributes that have a group code
448 FOR l_mapping_group IN c_mapping_group LOOP
449
450 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
451 trace(p_msg => 'Loop c_mapping_group: assignment_group_code = '||l_mapping_group.assignment_group_code
452 ,p_module => l_log_module
453 ,p_level => C_LEVEL_PROCEDURE);
454 END IF;
455
456 FOR l_accting_sources IN c_accting_sources (l_mapping_group.assignment_group_code) LOOP
457
458 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
459 trace(p_msg => 'Loop c_accting_sources: accounting_attribute_code = '||l_accting_sources.accounting_attribute_code
460 ,p_module => l_log_module
461 ,p_level => C_LEVEL_PROCEDURE);
462 END IF;
463
464 xla_amb_setup_err_pkg.stack_error
465 (p_message_name => 'XLA_AB_EC_GROUP_SOURCE'
466 ,p_message_type => 'E'
467 ,p_message_category => 'ACCOUNTING_SOURCE'
468 ,p_category_sequence => 5
469 ,p_application_id => p_application_id
470 ,p_amb_context_code => p_amb_context_code
471 ,p_product_rule_type_code => p_product_rule_type_code
472 ,p_product_rule_code => p_product_rule_code
473 ,p_entity_code => p_entity_code
474 ,p_event_class_code => p_event_class_code
475 ,p_accounting_group_code => l_mapping_group.assignment_group_code
476 ,p_accounting_source_code => l_accting_sources.accounting_attribute_code);
477
478 l_return := FALSE;
479 END LOOP;
480 END LOOP;
481
482 -- Get budget and encumbrance flag for the event class
483 OPEN c_ec_attrs;
484 FETCH c_ec_attrs
485 INTO l_ec_attrs;
486
487 IF l_ec_attrs.allow_budgets_flag = 'Y' THEN
488
489 -- Check if Budget Version Identifier is mapped for the
490 -- event class
491 OPEN c_budget;
492 FETCH c_budget
493 INTO l_exist;
494 IF c_budget%NOTFOUND THEN
495 Xla_amb_setup_err_pkg.stack_error
496 (p_message_name => 'XLA_AB_EC_BUDGET_ACCTG_SRC'
497 ,p_message_type => 'E'
498 ,p_message_category => 'ACCOUNTING_SOURCE'
499 ,p_category_sequence => 5
500 ,p_application_id => p_application_id
501 ,p_amb_context_code => p_amb_context_code
502 ,p_product_rule_type_code => p_product_rule_type_code
503 ,p_product_rule_code => p_product_rule_code
504 ,p_entity_code => p_entity_code
505 ,p_event_class_code => p_event_class_code
506 ,p_accounting_source_code => 'BUDGET_VERSION_ID');
507
508 l_return := FALSE;
509 END IF;
510 CLOSE c_budget;
511 END IF;
512
516 -- Check if Encumbrance Type Identifier is mapped for the
513 /* 4458381
514 IF l_ec_attrs.allow_encumbrance_flag = 'Y' THEN
515
517 -- event class
518 OPEN c_enc;
519 FETCH c_enc
520 INTO l_exist;
521 IF c_enc%NOTFOUND THEN
522 Xla_amb_setup_err_pkg.stack_error
523 (p_message_name => 'XLA_AB_EC_ENC_ACCTG_SRC'
524 ,p_message_type => 'E'
525 ,p_message_category => 'ACCOUNTING_SOURCE'
526 ,p_category_sequence => 5
527 ,p_application_id => p_application_id
528 ,p_amb_context_code => p_amb_context_code
529 ,p_product_rule_type_code => p_product_rule_type_code
530 ,p_product_rule_code => p_product_rule_code
531 ,p_entity_code => p_entity_code
532 ,p_event_class_code => p_event_class_code
533 ,p_accounting_source_code => 'ENCUMBRANCE_TYPE_ID');
534
535 l_return := FALSE;
536 END IF;
537 CLOSE c_enc;
538 END IF;
539 CLOSE c_ec_attrs;
540 */
541
542 --
543 -- Check if reversed distribution ids are mapped for a line type
544 -- then the corresponding distribution ids are also mapped
545 --
546 OPEN c_rev_dist_2;
547 FETCH c_rev_dist_2
548 INTO l_rev_dist_2;
549 IF c_rev_dist_2%found THEN
550
551 OPEN c_dist_2;
552 FETCH c_dist_2
553 INTO l_exist;
554 IF c_dist_2%notfound THEN
555
556 Xla_amb_setup_err_pkg.stack_error
557 (p_message_name => 'XLA_AB_LT_ACCT_REV_DIST_ID'
558 ,p_message_type => 'E'
559 ,p_message_category => 'ACCOUNTING_SOURCE'
560 ,p_category_sequence => 5
561 ,p_application_id => p_application_id
562 ,p_amb_context_code => p_amb_context_code
563 ,p_product_rule_type_code => p_product_rule_type_code
564 ,p_product_rule_code => p_product_rule_code
565 ,p_entity_code => p_entity_code
566 ,p_event_class_code => p_event_class_code
567 ,p_accounting_source_code => l_rev_dist_2.accounting_attribute_code
568 ,p_accounting_group_code => l_rev_dist_2.assignment_group_code);
569
570 l_return := FALSE;
571 END IF;
572 CLOSE c_dist_2;
573 END IF;
574 CLOSE c_rev_dist_2;
575
576 OPEN c_rev_dist_3;
577 FETCH c_rev_dist_3
578 INTO l_rev_dist_3;
579 IF c_rev_dist_3%found THEN
580
581 OPEN c_dist_3;
582 FETCH c_dist_3
583 INTO l_exist;
584 IF c_dist_3%notfound THEN
585
586 Xla_amb_setup_err_pkg.stack_error
587 (p_message_name => 'XLA_AB_LT_ACCT_REV_DIST_ID'
588 ,p_message_type => 'E'
589 ,p_message_category => 'ACCOUNTING_SOURCE'
590 ,p_category_sequence => 5
591 ,p_application_id => p_application_id
592 ,p_amb_context_code => p_amb_context_code
593 ,p_product_rule_type_code => p_product_rule_type_code
594 ,p_product_rule_code => p_product_rule_code
595 ,p_entity_code => p_entity_code
596 ,p_event_class_code => p_event_class_code
597 ,p_accounting_source_code => l_rev_dist_3.accounting_attribute_code
598 ,p_accounting_group_code => l_rev_dist_3.assignment_group_code);
599
600 l_return := FALSE;
601 END IF;
602 CLOSE c_dist_3;
603 END IF;
604 CLOSE c_rev_dist_3;
605
606 OPEN c_rev_dist_4;
607 FETCH c_rev_dist_4
608 INTO l_rev_dist_4;
609 IF c_rev_dist_4%found THEN
610
611 OPEN c_dist_4;
612 FETCH c_dist_4
613 INTO l_exist;
614 IF c_dist_4%notfound THEN
615
616 Xla_amb_setup_err_pkg.stack_error
617 (p_message_name => 'XLA_AB_LT_ACCT_REV_DIST_ID'
618 ,p_message_type => 'E'
619 ,p_message_category => 'ACCOUNTING_SOURCE'
620 ,p_category_sequence => 5
621 ,p_application_id => p_application_id
622 ,p_amb_context_code => p_amb_context_code
623 ,p_product_rule_type_code => p_product_rule_type_code
624 ,p_product_rule_code => p_product_rule_code
625 ,p_entity_code => p_entity_code
626 ,p_event_class_code => p_event_class_code
627 ,p_accounting_source_code => l_rev_dist_4.accounting_attribute_code
628 ,p_accounting_group_code => l_rev_dist_4.assignment_group_code);
629
630 l_return := FALSE;
631 END IF;
632 CLOSE c_dist_4;
633 END IF;
634 CLOSE c_rev_dist_4;
635
636 OPEN c_rev_dist_5;
637 FETCH c_rev_dist_5
638 INTO l_rev_dist_5;
639 IF c_rev_dist_5%found THEN
640
641 OPEN c_dist_5;
642 FETCH c_dist_5
643 INTO l_exist;
644 IF c_dist_5%notfound THEN
645
646 Xla_amb_setup_err_pkg.stack_error
647 (p_message_name => 'XLA_AB_LT_ACCT_REV_DIST_ID'
648 ,p_message_type => 'E'
649 ,p_message_category => 'ACCOUNTING_SOURCE'
653 ,p_product_rule_type_code => p_product_rule_type_code
650 ,p_category_sequence => 5
651 ,p_application_id => p_application_id
652 ,p_amb_context_code => p_amb_context_code
654 ,p_product_rule_code => p_product_rule_code
655 ,p_entity_code => p_entity_code
656 ,p_event_class_code => p_event_class_code
657 ,p_accounting_source_code => l_rev_dist_5.accounting_attribute_code
658 ,p_accounting_group_code => l_rev_dist_5.assignment_group_code);
659
660 l_return := FALSE;
661 END IF;
662 CLOSE c_dist_5;
663 END IF;
664 CLOSE c_rev_dist_5;
665
666 -- check accounting attribute assignments that have derived sources
667 -- that do not belong to the event class
668 OPEN c_sources;
669 LOOP
670 FETCH c_sources
671 INTO l_sources;
672 EXIT WHEN c_sources%notfound;
673
674 Xla_amb_setup_err_pkg.stack_error
675 (p_message_name => 'XLA_AB_INVALID_ACCT_ATTR_SRCE' -- new message?
676 ,p_message_type => 'E'
677 ,p_message_category => 'ACCOUNTING_SOURCE'
678 ,p_category_sequence => 5
679 ,p_application_id => p_application_id
680 ,p_amb_context_code => p_amb_context_code
681 ,p_product_rule_type_code => p_product_rule_type_code
682 ,p_product_rule_code => p_product_rule_code
683 ,p_entity_code => p_entity_code
684 ,p_event_class_code => p_event_class_code
685 ,p_accounting_source_code => l_sources.accounting_attribute_code
686 ,p_source_type_code => l_sources.source_type_code
687 ,p_source_code => l_sources.source_code);
688
689 l_return := FALSE;
690
691 END LOOP;
692 CLOSE c_sources;
693
694 -- check accounting attribute assignments that have derived sources
695 -- that do not belong to the event class
696 OPEN c_der_sources;
697 LOOP
698 FETCH c_der_sources
699 INTO l_der_sources;
700 EXIT WHEN c_der_sources%notfound;
701
702 IF xla_sources_pkg.derived_source_is_invalid
703 (p_application_id => p_application_id
704 ,p_derived_source_code => l_der_sources.source_code
705 ,p_derived_source_type_code => 'D'
706 ,p_entity_code => p_entity_code
707 ,p_event_class_code => p_event_class_code
708 ,p_level => 'L') = 'TRUE' THEN
709
710 Xla_amb_setup_err_pkg.stack_error
711 (p_message_name => 'XLA_AB_INVALID_ACCT_ATTR_SRCE'
712 ,p_message_type => 'E'
713 ,p_message_category => 'ACCOUNTING_SOURCE'
714 ,p_category_sequence => 5
715 ,p_application_id => p_application_id
716 ,p_amb_context_code => p_amb_context_code
717 ,p_product_rule_type_code => p_product_rule_type_code
718 ,p_product_rule_code => p_product_rule_code
719 ,p_entity_code => p_entity_code
720 ,p_event_class_code => p_event_class_code
721 ,p_accounting_source_code => l_der_sources.accounting_attribute_code
722 ,p_source_type_code => l_der_sources.source_type_code
723 ,p_source_code => l_der_sources.source_code);
724
725 l_return := FALSE;
726 END IF;
727 END LOOP;
728 CLOSE c_der_sources;
729
730 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
731 trace(p_msg => 'END of procedure - return: '
732 ||case when l_return then 'TRUE' else 'FALSE' end
733 ,p_module => l_log_module
734 ,p_level => C_LEVEL_PROCEDURE);
735 END IF;
736
737 RETURN l_return;
738
739 EXCEPTION
740 WHEN xla_exceptions_pkg.application_exception THEN
741 RAISE;
742
743 WHEN OTHERS THEN
744
745 xla_exceptions_pkg.raise_message
746 (p_location => 'xla_amb_aad_pkg.chk_hdr_accting_sources');
747
748 END chk_hdr_accting_sources;
749
750 /*======================================================================+
751 | |
752 | Private Function |
753 | |
754 | chk_descriptions_are_valid |
755 | |
756 | Returns false if header or line descriptions are invalid |
757 | |
758 +======================================================================*/
759 FUNCTION chk_descriptions_are_valid
760 (p_application_id IN NUMBER
761 ,p_amb_context_code IN VARCHAR2
762 ,p_product_rule_type_code IN VARCHAR2
763 ,p_product_rule_code IN VARCHAR2
764 ,p_err_count IN OUT NOCOPY INTEGER
765 ,p_inv_event_class_codes IN OUT NOCOPY t_array_codes)
766 RETURN BOOLEAN
767 IS
768
769 -- Get all disabled header descriptions for the AAD
770 CURSOR c_enabled_hdr_desc IS
771 SELECT distinct d.entity_code, d.event_class_code, d.event_type_code,
772 d.description_type_code, d.description_code
773 FROM xla_prod_acct_headers d
777 AND d.product_rule_code = p_product_rule_code
774 WHERE d.application_id = p_application_id
775 AND d.amb_context_code = p_amb_context_code
776 AND d.product_rule_type_code = p_product_rule_type_code
778 AND d.description_type_code IS NOT NULL
779 AND d.accounting_required_flag = 'Y'
780 AND d.validation_status_code = 'R'
781 AND NOT EXISTS (SELECT 'y'
782 FROM xla_descriptions_b s
783 WHERE s.application_id = d.application_id
784 AND s.amb_context_code = d.amb_context_code
785 AND s.description_type_code = d.description_type_code
786 AND s.description_code = d.description_code
787 AND s.enabled_flag = 'Y');
788
789 -- Get all header descriptions for the AAD that have seeded sources in their
790 -- details which do not belong to the event class
791 CURSOR c_hdr_desc_detail_sources IS
792 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
793 l.description_type_code, l.description_code, d.source_type_code, d.source_code
794 FROM xla_descript_details_b d, xla_desc_priorities p, xla_prod_acct_headers l
795 WHERE d.description_prio_id = p.description_prio_id
796 AND p.application_id = l.application_id
797 AND p.amb_context_code = l.amb_context_code
798 AND p.description_type_code = l.description_type_code
799 AND p.description_code = l.description_code
800 AND l.application_id = p_application_id
801 AND l.amb_context_code = p_amb_context_code
802 AND l.product_rule_type_code = p_product_rule_type_code
803 AND l.product_rule_code = p_product_rule_code
804 AND l.accounting_required_flag = 'Y'
805 AND l.validation_status_code = 'R'
806 AND d.source_type_code = 'S'
807 AND NOT EXISTS (SELECT 'y'
808 FROM xla_event_sources s
809 WHERE s.source_application_id = d.source_application_id
810 AND s.source_type_code = d.source_type_code
811 AND s.source_code = d.source_code
812 AND s.application_id = l.application_id
813 AND s.entity_code = l.entity_code
814 AND s.event_class_code = l.event_class_code
815 AND s.active_flag = 'Y'
816 AND s.level_code = 'H');
817
818 -- Get all header descriptions for the AAD that have seeded sources in their
819 -- conditions which do not belong to the event class
820 CURSOR c_hdr_desc_con_sources IS
821 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
822 l.description_type_code, l.description_code,
823 c.source_type_code source_type_code, c.source_code source_code
824 FROM xla_conditions c, xla_desc_priorities p, xla_prod_acct_headers l
825 WHERE c.description_prio_id = p.description_prio_id
826 AND p.application_id = l.application_id
827 AND p.amb_context_code = l.amb_context_code
828 AND p.description_type_code = l.description_type_code
829 AND p.description_code = l.description_code
830 AND l.application_id = p_application_id
831 AND l.amb_context_code = p_amb_context_code
832 AND l.product_rule_type_code= p_product_rule_type_code
833 AND l.product_rule_code = p_product_rule_code
834 AND l.accounting_required_flag = 'Y'
835 AND l.validation_status_code = 'R'
836 AND c.source_type_code = 'S'
837 AND NOT EXISTS (SELECT 'y'
838 FROM xla_event_sources s
839 WHERE s.source_application_id = c.source_application_id
840 AND s.source_type_code = c.source_type_code
841 AND s.source_code = c.source_code
842 AND s.application_id = l.application_id
843 AND s.entity_code = l.entity_code
844 AND s.event_class_code = l.event_class_code
845 AND s.active_flag = 'Y'
846 AND s.level_code = 'H')
847 UNION
848 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
849 l.description_type_code, l.description_code,
850 c.value_source_type_code source_type_code, c.value_source_code source_code
851 FROM xla_conditions c, xla_desc_priorities p, xla_prod_acct_headers l
852 WHERE c.description_prio_id = p.description_prio_id
853 AND p.application_id = l.application_id
854 AND p.amb_context_code = l.amb_context_code
855 AND p.description_type_code = l.description_type_code
856 AND p.description_code = l.description_code
857 AND l.application_id = p_application_id
858 AND l.amb_context_code = p_amb_context_code
859 AND l.product_rule_type_code= p_product_rule_type_code
860 AND l.product_rule_code = p_product_rule_code
861 AND l.accounting_required_flag = 'Y'
862 AND l.validation_status_code = 'R'
863 AND c.value_source_type_code = 'S'
864 AND NOT EXISTS (SELECT 'y'
865 FROM xla_event_sources s
866 WHERE s.source_application_id = c.value_source_application_id
867 AND s.source_type_code = c.value_source_type_code
868 AND s.source_code = c.value_source_code
869 AND s.application_id = l.application_id
870 AND s.entity_code = l.entity_code
871 AND s.event_class_code = l.event_class_code
875 -- Get all header descriptions for the AAD that have derived sources in their
872 AND s.active_flag = 'Y'
873 AND s.level_code = 'H');
874
876 -- details which do not belong to the event class
877 CURSOR c_hdr_desc_det_der_sources IS
878 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
879 l.description_type_code, l.description_code, d.source_type_code, d.source_code
880 FROM xla_descript_details_b d, xla_desc_priorities p, xla_prod_acct_headers l
881 WHERE d.description_prio_id = p.description_prio_id
882 AND p.application_id = l.application_id
883 AND p.amb_context_code = l.amb_context_code
884 AND p.description_type_code = l.description_type_code
885 AND p.description_code = l.description_code
886 AND l.application_id = p_application_id
887 AND l.amb_context_code = p_amb_context_code
888 AND l.product_rule_type_code= p_product_rule_type_code
889 AND l.product_rule_code = p_product_rule_code
890 AND l.accounting_required_flag = 'Y'
891 AND l.validation_status_code = 'R'
892 AND d.source_type_code = 'D';
893
894 -- Get all header descriptions for the AAD that have derived sources in their
895 -- conditions which do not belong to the event class
896 CURSOR c_hdr_desc_con_der_sources IS
897 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
898 l.description_type_code, l.description_code,
899 c.source_type_code source_type_code, c.source_code source_code
900 FROM xla_conditions c, xla_desc_priorities p, xla_prod_acct_headers l
901 WHERE c.description_prio_id = p.description_prio_id
902 AND p.application_id = l.application_id
903 AND p.amb_context_code = l.amb_context_code
904 AND p.description_type_code = l.description_type_code
905 AND p.description_code = l.description_code
906 AND l.application_id = p_application_id
907 AND l.amb_context_code = p_amb_context_code
908 AND l.product_rule_type_code= p_product_rule_type_code
909 AND l.product_rule_code = p_product_rule_code
910 AND l.accounting_required_flag = 'Y'
911 AND l.validation_status_code = 'R'
912 AND c.source_type_code = 'D'
913 UNION
914 SELECT distinct l.entity_code, l.event_class_code, l.event_type_code,
915 l.description_type_code, l.description_code,
916 c.value_source_type_code source_type_code, c.value_source_code source_code
917 FROM xla_conditions c, xla_desc_priorities p, xla_prod_acct_headers l
918 WHERE c.description_prio_id = p.description_prio_id
919 AND p.application_id = l.application_id
920 AND p.amb_context_code = l.amb_context_code
921 AND p.description_type_code = l.description_type_code
922 AND p.description_code = l.description_code
923 AND l.application_id = p_application_id
924 AND l.amb_context_code = p_amb_context_code
925 AND l.product_rule_type_code= p_product_rule_type_code
926 AND l.product_rule_code = p_product_rule_code
927 AND l.accounting_required_flag = 'Y'
928 AND l.validation_status_code = 'R'
929 AND c.value_source_type_code = 'D';
930
931 l_return BOOLEAN;
932 l_log_module VARCHAR2(240);
933 BEGIN
934 IF g_log_enabled THEN
935 l_log_module := C_DEFAULT_MODULE||'.chk_descriptions_are_valid';
936 END IF;
937
938 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
939 trace(p_msg => 'BEGIN of procedure chk_descriptions_are_valid'
940 ,p_module => l_log_module
941 ,p_level => C_LEVEL_PROCEDURE);
942 END IF;
943
944 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
945 trace(p_msg => 'application_id = '||p_application_id||
946 ',amb_context_code = '||p_amb_context_code||
947 ',product_rule_type_code = '||p_product_rule_type_code||
948 ',product_rule_code = '||p_product_rule_code
949 ,p_module => l_log_module
950 ,p_level => C_LEVEL_STATEMENT);
951 END IF;
952
953 l_return := TRUE;
954
955 -- Check if header descriptions are disabled
956 FOR l_enabled_hdr_desc IN c_enabled_hdr_desc LOOP
957 xla_amb_setup_err_pkg.stack_error
958 (p_message_name => 'XLA_AB_DISABLD_HDR_DESC'
959 ,p_message_type => 'E'
960 ,p_message_category => 'HDR_DESCRIPTION'
961 ,p_category_sequence => 7
962 ,p_application_id => p_application_id
963 ,p_amb_context_code => p_amb_context_code
964 ,p_product_rule_code => p_product_rule_code
965 ,p_product_rule_type_code => p_product_rule_type_code
966 ,p_entity_code => l_enabled_hdr_desc.entity_code
967 ,p_event_class_code => l_enabled_hdr_desc.event_class_code
968 ,p_event_type_code => l_enabled_hdr_desc.event_type_code
969 ,p_description_type_code => l_enabled_hdr_desc.description_type_code
970 ,p_description_code => l_enabled_hdr_desc.description_code);
971
972 p_err_count := p_err_count + 1;
973 p_inv_event_class_codes(p_err_count) := l_enabled_hdr_desc.event_class_code;
974 l_return := FALSE;
975 END LOOP;
976
977 -- check header description has seeded sources in details
978 -- that do not belong to the event class
979 FOR l_hdr_desc_detail_sources IN c_hdr_desc_detail_sources LOOP
980 xla_amb_setup_err_pkg.stack_error
981 (p_message_name => 'XLA_AB_HDR_DES_DET_SRC'
982 ,p_message_type => 'E'
983 ,p_message_category => 'HDR_DESCRIPTION'
987 ,p_product_rule_type_code => p_product_rule_type_code
984 ,p_category_sequence => 7
985 ,p_application_id => p_application_id
986 ,p_amb_context_code => p_amb_context_code
988 ,p_product_rule_code => p_product_rule_code
989 ,p_entity_code => l_hdr_desc_detail_sources.entity_code
990 ,p_event_class_code => l_hdr_desc_detail_sources.event_class_code
991 ,p_event_type_code => l_hdr_desc_detail_sources.event_type_code
992 ,p_description_type_code => l_hdr_desc_detail_sources.description_type_code
993 ,p_description_code => l_hdr_desc_detail_sources.description_code
994 ,p_source_type_code => l_hdr_desc_detail_sources.source_type_code
995 ,p_source_code => l_hdr_desc_detail_sources.source_code);
996
997 p_err_count := p_err_count + 1;
998 p_inv_event_class_codes(p_err_count) := l_hdr_desc_detail_sources.event_class_code;
999 l_return := FALSE;
1000 END LOOP;
1001
1002 -- check header description has seeded sources in conditions
1003 -- that do not belong to the event class
1004 FOR l_hdr_desc_con_sources IN c_hdr_desc_con_sources LOOP
1005 xla_amb_setup_err_pkg.stack_error
1006 (p_message_name => 'XLA_AB_HDR_DES_CON_SRC'
1007 ,p_message_type => 'E'
1008 ,p_message_category => 'HDR_DESCRIPTION'
1009 ,p_category_sequence => 7
1010 ,p_application_id => p_application_id
1011 ,p_amb_context_code => p_amb_context_code
1012 ,p_product_rule_type_code => p_product_rule_type_code
1013 ,p_product_rule_code => p_product_rule_code
1014 ,p_entity_code => l_hdr_desc_con_sources.entity_code
1015 ,p_event_class_code => l_hdr_desc_con_sources.event_class_code
1016 ,p_event_type_code => l_hdr_desc_con_sources.event_type_code
1017 ,p_description_type_code => l_hdr_desc_con_sources.description_type_code
1018 ,p_description_code => l_hdr_desc_con_sources.description_code
1019 ,p_source_type_code => l_hdr_desc_con_sources.source_type_code
1020 ,p_source_code => l_hdr_desc_con_sources.source_code);
1021
1022 p_err_count := p_err_count + 1;
1023 p_inv_event_class_codes(p_err_count) := l_hdr_desc_con_sources.event_class_code;
1024 l_return := FALSE;
1025 END LOOP;
1026
1027 -- check header description has derived sources in details
1028 -- that do not belong to the event class
1029 FOR l_hdr_desc_det_der_sources IN c_hdr_desc_det_der_sources LOOP
1030 IF xla_sources_pkg.derived_source_is_invalid
1031 (p_application_id => p_application_id
1032 ,p_derived_source_code => l_hdr_desc_det_der_sources.source_code
1033 ,p_derived_source_type_code => 'D'
1034 ,p_entity_code => l_hdr_desc_det_der_sources.entity_code
1035 ,p_event_class_code => l_hdr_desc_det_der_sources.event_class_code
1036 ,p_level => 'H') = 'TRUE' THEN
1037
1038 xla_amb_setup_err_pkg.stack_error
1039 (p_message_name => 'XLA_AB_HDR_DES_DET_SRC'
1040 ,p_message_type => 'E'
1041 ,p_message_category => 'HDR_DESCRIPTION'
1042 ,p_category_sequence => 7
1043 ,p_application_id => p_application_id
1044 ,p_amb_context_code => p_amb_context_code
1045 ,p_product_rule_type_code => p_product_rule_type_code
1046 ,p_product_rule_code => p_product_rule_code
1047 ,p_entity_code => l_hdr_desc_det_der_sources.entity_code
1048 ,p_event_class_code => l_hdr_desc_det_der_sources.event_class_code
1049 ,p_event_type_code => l_hdr_desc_det_der_sources.event_type_code
1050 ,p_description_type_code => l_hdr_desc_det_der_sources.description_type_code
1051 ,p_description_code => l_hdr_desc_det_der_sources.description_code
1052 ,p_source_type_code => l_hdr_desc_det_der_sources.source_type_code
1053 ,p_source_code => l_hdr_desc_det_der_sources.source_code);
1054
1055 p_err_count := p_err_count + 1;
1056 p_inv_event_class_codes(p_err_count) := l_hdr_desc_det_der_sources.event_class_code;
1057 l_return := FALSE;
1058 END IF;
1059 END LOOP;
1060
1061 -- check header description has derived sources in conditions
1062 -- that do not belong to the event class
1063 FOR l_hdr_desc_con_der_sources IN c_hdr_desc_con_der_sources LOOP
1064 IF xla_sources_pkg.derived_source_is_invalid
1065 (p_application_id => p_application_id
1066 ,p_derived_source_code => l_hdr_desc_con_der_sources.source_code
1067 ,p_derived_source_type_code => 'D'
1068 ,p_entity_code => l_hdr_desc_con_der_sources.entity_code
1069 ,p_event_class_code => l_hdr_desc_con_der_sources.event_class_code
1070 ,p_level => 'H') = 'TRUE' THEN
1071
1072 xla_amb_setup_err_pkg.stack_error
1073 (p_message_name => 'XLA_AB_HDR_DES_CON_SRC'
1074 ,p_message_type => 'E'
1075 ,p_message_category => 'HDR_DESCRIPTION'
1076 ,p_category_sequence => 7
1077 ,p_application_id => p_application_id
1078 ,p_amb_context_code => p_amb_context_code
1079 ,p_product_rule_type_code => p_product_rule_type_code
1080 ,p_product_rule_code => p_product_rule_code
1084 ,p_description_type_code => l_hdr_desc_con_der_sources.description_type_code
1081 ,p_entity_code => l_hdr_desc_con_der_sources.entity_code
1082 ,p_event_class_code => l_hdr_desc_con_der_sources.event_class_code
1083 ,p_event_type_code => l_hdr_desc_con_der_sources.event_type_code
1085 ,p_description_code => l_hdr_desc_con_der_sources.description_code
1086 ,p_source_type_code => l_hdr_desc_con_der_sources.source_type_code
1087 ,p_source_code => l_hdr_desc_con_der_sources.source_code);
1088
1089 p_err_count := p_err_count + 1;
1090 p_inv_event_class_codes(p_err_count) := l_hdr_desc_con_der_sources.event_class_code;
1091 l_return := FALSE;
1092 END IF;
1093 END LOOP;
1094
1095 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1096 trace(p_msg => 'END of procedure - return: '
1097 ||case when l_return then 'TRUE' else 'FALSE' end
1098 ,p_module => l_log_module
1099 ,p_level => C_LEVEL_PROCEDURE);
1100 END IF;
1101
1102 RETURN l_return;
1103
1104 EXCEPTION
1105 WHEN xla_exceptions_pkg.application_exception THEN
1106 RAISE;
1107
1108 WHEN OTHERS THEN
1109
1110 xla_exceptions_pkg.raise_message
1111 (p_location => 'xla_amb_aad_pkg.chk_descriptions_are_valid');
1112
1113 END chk_descriptions_are_valid;
1114
1115 /*======================================================================+
1116 | |
1117 | Private Function |
1118 | |
1119 | chk_ana_cri_are_valid |
1120 | |
1121 | Returns false if header or line analytical criteria are invalid |
1122 | |
1123 +======================================================================*/
1124 FUNCTION chk_ana_cri_are_valid
1125 (p_application_id IN NUMBER
1126 ,p_amb_context_code IN VARCHAR2
1127 ,p_product_rule_type_code IN VARCHAR2
1128 ,p_product_rule_code IN VARCHAR2
1129 ,p_err_count IN OUT NOCOPY INTEGER
1130 ,p_inv_event_class_codes IN OUT NOCOPY t_array_codes)
1131 RETURN BOOLEAN
1132 IS
1133
1134 -- Get all header analytical criteria for the AAD that are disabled
1135 CURSOR c_enabled_hdr_anal IS
1136 SELECT distinct s.event_class_code, s.event_type_code,
1137 s.analytical_criterion_type_code, s.analytical_criterion_code
1138 FROM xla_aad_header_ac_assgns s
1139 WHERE s.application_id = p_application_id
1140 AND s.amb_context_code = p_amb_context_code
1141 AND s.product_rule_type_code = p_product_rule_type_code
1142 AND s.product_rule_code = p_product_rule_code
1143 AND NOT EXISTS ( SELECT 'x'
1144 FROM xla_analytical_hdrs_b a
1145 WHERE a.amb_context_code = s.amb_context_code
1146 AND a.analytical_criterion_code = s.analytical_criterion_code
1147 AND a.analytical_criterion_type_code = s.analytical_criterion_type_code
1148 AND a.enabled_flag = 'Y');
1149
1150 -- Get all header analytical criteria for the AAD that have balancing flag set
1151 CURSOR c_hdr_anal IS
1152 SELECT distinct s.event_class_code, s.event_type_code,
1153 s.analytical_criterion_type_code, s.analytical_criterion_code
1154 FROM xla_aad_header_ac_assgns s
1155 WHERE s.application_id = p_application_id
1156 AND s.amb_context_code = p_amb_context_code
1157 AND s.product_rule_type_code = p_product_rule_type_code
1158 AND s.product_rule_code = p_product_rule_code
1159 AND EXISTS ( SELECT 'x'
1160 FROM xla_analytical_hdrs_b a
1161 WHERE a.amb_context_code = s.amb_context_code
1162 AND a.analytical_criterion_code = s.analytical_criterion_code
1163 AND a.analytical_criterion_type_code = s.analytical_criterion_type_code
1164 AND a.balancing_flag = 'Y');
1165
1166 -- Get all header analytical criteria for the AAD that have no details
1167 -- for the event class
1168 CURSOR c_hdr_event_sources IS
1169 SELECT distinct s.event_class_code, s.event_type_code,
1170 s.analytical_criterion_type_code, s.analytical_criterion_code
1171 FROM xla_aad_header_ac_assgns s
1172 WHERE s.application_id = p_application_id
1173 AND s.amb_context_code = p_amb_context_code
1174 AND s.product_rule_type_code = p_product_rule_type_code
1175 AND s.product_rule_code = p_product_rule_code
1176 AND NOT EXISTS (SELECT 'x'
1177 FROM xla_analytical_sources a
1178 WHERE a.application_id = s.application_id
1179 AND a.amb_context_code = s.amb_context_code
1180 AND a.event_class_code = s.event_class_code
1181 AND a.analytical_criterion_code = s.analytical_criterion_code
1182 AND a.analytical_criterion_type_code = s.analytical_criterion_type_code);
1183
1184 -- Get all header analytical criteria for the AAD that have sources assigned
1185 -- at line level to the event class
1186 CURSOR c_hdr_anal_sources IS
1187 SELECT distinct n.event_class_code, n.event_type_code,
1188 n.analytical_criterion_type_code, n.analytical_criterion_code,
1192 AND a.amb_context_code = n.amb_context_code
1189 a.source_code, a.source_type_code
1190 FROM xla_analytical_sources a, xla_aad_header_ac_assgns n
1191 WHERE a.application_id = n.application_id
1193 AND a.event_class_code = n.event_class_code
1194 AND a.analytical_criterion_code = n.analytical_criterion_code
1195 AND a.analytical_criterion_type_code = n.analytical_criterion_type_code
1196 AND a.source_type_code = 'S'
1197 AND n.application_id = p_application_id
1198 AND n.amb_context_code = p_amb_context_code
1199 AND n.product_rule_type_code = p_product_rule_type_code
1200 AND n.product_rule_code = p_product_rule_code
1201 AND not exists (SELECT 'y'
1202 FROM xla_event_sources s
1203 WHERE s.source_application_id = a.source_application_id
1204 AND s.source_type_code = a.source_type_code
1205 AND s.source_code = a.source_code
1206 AND s.application_id = a.application_id
1207 AND s.entity_code = a.entity_code
1208 AND s.event_class_code = a.event_class_code
1209 AND s.active_flag = 'Y'
1210 AND s.level_code = 'H');
1211
1212 -- Get all header analytical criteria for the AAD that have derived sources assigned
1213 -- at line level to the event class or do not belong to the event class
1214 CURSOR c_hdr_anal_der_sources IS
1215 SELECT distinct n.event_class_code, n.event_type_code,
1216 n.analytical_criterion_type_code, n.analytical_criterion_code,
1217 a.source_code, a.source_type_code
1218 FROM xla_analytical_sources a, xla_aad_header_ac_assgns n
1219 WHERE a.application_id = n.application_id
1220 AND a.amb_context_code = n.amb_context_code
1221 AND a.event_class_code = n.event_class_code
1222 AND a.analytical_criterion_code = n.analytical_criterion_code
1223 AND a.analytical_criterion_type_code = n.analytical_criterion_type_code
1224 AND a.source_type_code = 'D'
1225 AND n.application_id = p_application_id
1226 AND n.amb_context_code = p_amb_context_code
1227 AND n.product_rule_type_code = p_product_rule_type_code
1228 AND n.product_rule_code = p_product_rule_code;
1229
1230 l_return BOOLEAN;
1231 l_log_module VARCHAR2(240);
1232 BEGIN
1233 IF g_log_enabled THEN
1234 l_log_module := C_DEFAULT_MODULE||'.chk_ana_cri_are_valid';
1235 END IF;
1236
1237 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1238 trace(p_msg => 'BEGIN of procedure chk_ana_cri_are_valid'
1239 ,p_module => l_log_module
1240 ,p_level => C_LEVEL_PROCEDURE);
1241 END IF;
1242
1243 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1244 trace(p_msg => 'application_id = '||p_application_id||
1245 ',amb_context_code = '||p_amb_context_code||
1246 ',product_rule_type_code = '||p_product_rule_type_code||
1247 ',product_rule_code = '||p_product_rule_code
1248 ,p_module => l_log_module
1249 ,p_level => C_LEVEL_STATEMENT);
1250 END IF;
1251
1252 l_return := TRUE;
1253
1254 -- Error all header analytical criteria that are assigned to the AAD and disabled
1255 FOR l_enabled_hdr_anal IN c_enabled_hdr_anal LOOP
1256 xla_amb_setup_err_pkg.stack_error
1257 (p_message_name => 'XLA_AB_DISABLD_HDR_AC'
1258 ,p_message_type => 'E'
1259 ,p_message_category => 'HDR_AC'
1260 ,p_category_sequence => 8
1261 ,p_application_id => p_application_id
1262 ,p_amb_context_code => p_amb_context_code
1263 ,p_product_rule_type_code => p_product_rule_type_code
1264 ,p_product_rule_code => p_product_rule_code
1265 ,p_event_class_code => l_enabled_hdr_anal.event_class_code
1266 ,p_event_type_code => l_enabled_hdr_anal.event_type_code
1267 ,p_anal_criterion_type_code => l_enabled_hdr_anal.analytical_criterion_type_code
1268 ,p_anal_criterion_code => l_enabled_hdr_anal.analytical_criterion_code);
1269
1270 p_err_count := p_err_count + 1;
1271 p_inv_event_class_codes(p_err_count) := l_enabled_hdr_anal.event_class_code;
1272 l_return := FALSE;
1273 END LOOP;
1274
1275 -- Error all header analytical criteria that are assigned to the AAD
1276 -- and have balancing flag set
1277 FOR l_hdr_anal IN c_hdr_anal LOOP
1278 xla_amb_setup_err_pkg.stack_error
1279 (p_message_name => 'XLA_AB_ANC_MAINTAIN_BAL'
1280 ,p_message_type => 'E'
1281 ,p_message_category => 'HDR_AC'
1282 ,p_category_sequence => 8
1283 ,p_application_id => p_application_id
1284 ,p_amb_context_code => p_amb_context_code
1285 ,p_product_rule_type_code => p_product_rule_type_code
1286 ,p_product_rule_code => p_product_rule_code
1287 ,p_event_class_code => l_hdr_anal.event_class_code
1288 ,p_event_type_code => l_hdr_anal.event_type_code
1289 ,p_anal_criterion_type_code => l_hdr_anal.analytical_criterion_type_code
1290 ,p_anal_criterion_code => l_hdr_anal.analytical_criterion_code);
1291
1292 p_err_count := p_err_count + 1;
1293 p_inv_event_class_codes(p_err_count) := l_hdr_anal.event_class_code;
1294 l_return := FALSE;
1295 END LOOP;
1296
1300 (p_message_name => 'XLA_AB_HDR_ANC_NO_DETAIL'
1297 -- Error all header analytical criteria that have no details for the event class
1298 FOR l_hdr_event_sources IN c_hdr_event_sources LOOP
1299 xla_amb_setup_err_pkg.stack_error
1301 ,p_message_type => 'E'
1302 ,p_message_category => 'HDR_AC'
1303 ,p_category_sequence => 8
1304 ,p_application_id => p_application_id
1305 ,p_amb_context_code => p_amb_context_code
1306 ,p_product_rule_type_code => p_product_rule_type_code
1307 ,p_product_rule_code => p_product_rule_code
1308 ,p_event_class_code => l_hdr_event_sources.event_class_code
1309 ,p_event_type_code => l_hdr_event_sources.event_type_code
1310 ,p_anal_criterion_type_code => l_hdr_event_sources.analytical_criterion_type_code
1311 ,p_anal_criterion_code => l_hdr_event_sources.analytical_criterion_code);
1312
1313 p_err_count := p_err_count + 1;
1314 p_inv_event_class_codes(p_err_count) := l_hdr_event_sources.event_class_code;
1315 l_return := FALSE;
1316 END LOOP;
1317
1318 -- Error all header analytical criteria that have sources that
1319 -- do not belong to the event class
1320 FOR l_hdr_anal_sources IN c_hdr_anal_sources LOOP
1321 xla_amb_setup_err_pkg.stack_error
1322 (p_message_name => 'XLA_AB_HDR_ANC_SOURCE'
1323 ,p_message_type => 'E'
1324 ,p_message_category => 'HDR_AC'
1325 ,p_category_sequence => 8
1326 ,p_application_id => p_application_id
1327 ,p_amb_context_code => p_amb_context_code
1328 ,p_product_rule_type_code => p_product_rule_type_code
1329 ,p_product_rule_code => p_product_rule_code
1330 ,p_event_class_code => l_hdr_anal_sources.event_class_code
1331 ,p_event_type_code => l_hdr_anal_sources.event_type_code
1332 ,p_anal_criterion_type_code => l_hdr_anal_sources.analytical_criterion_type_code
1333 ,p_anal_criterion_code => l_hdr_anal_sources.analytical_criterion_code
1334 ,p_source_code => l_hdr_anal_sources.source_code
1335 ,p_source_type_code => l_hdr_anal_sources.source_type_code);
1336
1337 p_err_count := p_err_count + 1;
1338 p_inv_event_class_codes(p_err_count) := l_hdr_anal_sources.event_class_code;
1339 l_return := FALSE;
1340 END LOOP;
1341
1342 -- Error all header analytical criteria that have derived sources that
1343 -- do not belong to the event class
1344 FOR l_hdr_anal_der_sources IN c_hdr_anal_der_sources LOOP
1345 IF xla_sources_pkg.derived_source_is_invalid
1346 (p_application_id => p_application_id
1347 ,p_derived_source_code => l_hdr_anal_der_sources.source_code
1348 ,p_derived_source_type_code => 'D'
1349 ,p_event_class_code => l_hdr_anal_der_sources.event_class_code
1350 ,p_level => 'H') = 'TRUE' THEN
1351
1352 xla_amb_setup_err_pkg.stack_error
1353 (p_message_name => 'XLA_AB_HDR_ANC_SOURCE'
1354 ,p_message_type => 'E'
1355 ,p_message_category => 'HDR_AC'
1356 ,p_category_sequence => 8
1357 ,p_application_id => p_application_id
1358 ,p_amb_context_code => p_amb_context_code
1359 ,p_product_rule_type_code => p_product_rule_type_code
1360 ,p_product_rule_code => p_product_rule_code
1361 ,p_event_class_code => l_hdr_anal_der_sources.event_class_code
1362 ,p_event_type_code => l_hdr_anal_der_sources.event_type_code
1363 ,p_anal_criterion_type_code => l_hdr_anal_der_sources.analytical_criterion_type_code
1364 ,p_anal_criterion_code => l_hdr_anal_der_sources.analytical_criterion_code
1365 ,p_source_code => l_hdr_anal_der_sources.source_code
1366 ,p_source_type_code => l_hdr_anal_der_sources.source_type_code);
1367
1368 p_err_count := p_err_count + 1;
1369 p_inv_event_class_codes(p_err_count) := l_hdr_anal_der_sources.event_class_code;
1370 l_return := FALSE;
1371 END IF;
1372 END LOOP;
1373
1374 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1375 trace(p_msg => 'END of procedure - return: '
1376 ||case when l_return then 'TRUE' else 'FALSE' end
1377 ,p_module => l_log_module
1378 ,p_level => C_LEVEL_PROCEDURE);
1379 END IF;
1380
1381 RETURN l_return;
1382
1383 EXCEPTION
1384 WHEN xla_exceptions_pkg.application_exception THEN
1385 RAISE;
1386
1387 WHEN OTHERS THEN
1388 xla_exceptions_pkg.raise_message
1389 (p_location => 'xla_amb_aad_pkg.chk_ana_cri_are_valid');
1390
1391 END chk_ana_cri_are_valid;
1392
1393
1394 --======================================================================+
1395 --
1396 -- Name: validate_header_assignments
1397 -- Description: Validate the journal entry setups for an AAD
1398 --
1399 --======================================================================+
1400 FUNCTION validate_header_assignments
1401 (p_application_id IN NUMBER
1402 ,p_amb_context_code IN VARCHAR2
1403 ,p_product_rule_type_code IN VARCHAR2
1404 ,p_product_rule_code IN VARCHAR2
1405 ,p_err_count IN OUT NOCOPY INTEGER
1406 ,p_inv_event_class_codes IN OUT NOCOPY t_array_codes)
1407 RETURN BOOLEAN
1408 IS
1409
1413 SELECT entity_code, event_class_code
1410 -- Get all event classes that are assigned to the AAD and disabled
1411 CURSOR c_enabled_classes
1412 IS
1414 FROM xla_prod_acct_headers d
1415 WHERE d.application_id = p_application_id
1416 AND d.amb_context_code = p_amb_context_code
1417 AND d.product_rule_type_code = p_product_rule_type_code
1418 AND d.product_rule_code = p_product_rule_code
1419 AND EXISTS (SELECT 'y'
1420 FROM xla_event_classes_b s
1421 WHERE s.application_id = d.application_id
1422 AND s.entity_code = d.entity_code
1423 AND s.event_class_code = d.event_class_code
1424 AND s.enabled_flag = 'N');
1425
1426 -- Get all event classes that have circular references
1427 CURSOR c_ec_predecs
1428 IS
1429 SELECT entity_code, event_class_code
1430 FROM xla_prod_acct_headers d
1431 WHERE d.application_id = p_application_id
1432 AND d.amb_context_code = p_amb_context_code
1433 AND d.product_rule_type_code = p_product_rule_type_code
1434 AND d.product_rule_code = p_product_rule_code
1435 AND EXISTS (SELECT 'x'
1436 FROM xla_event_class_predecs p
1437 WHERE p.application_id = d.application_id
1438 AND p.event_class_code = d.event_class_code
1439 AND CONNECT_BY_ISCYCLE = 1
1440 CONNECT BY NOCYCLE prior event_class_code = prior_event_class_code);
1441
1442 -- Check if atleast one event type is being accounting for the AAD
1443 CURSOR c_accting_required
1444 IS
1445 SELECT 'x'
1446 FROM xla_prod_acct_headers d
1447 WHERE d.application_id = p_application_id
1448 AND d.amb_context_code = p_amb_context_code
1449 AND d.product_rule_type_code = p_product_rule_type_code
1450 AND d.product_rule_code = p_product_rule_code
1451 AND d.accounting_required_flag = 'Y';
1452
1453 -- Get all event classes that are assigned to the AAD and do not
1454 -- have atleast one enabled accounting event class
1455 CURSOR c_class_enabled_types
1456 IS
1457 SELECT entity_code, event_class_code
1458 FROM xla_prod_acct_headers d
1459 WHERE d.application_id = p_application_id
1460 AND d.amb_context_code = p_amb_context_code
1461 AND d.product_rule_type_code = p_product_rule_type_code
1462 AND d.product_rule_code = p_product_rule_code
1463 AND d.event_type_code = d.event_class_code||'_ALL'
1464 AND NOT EXISTS (SELECT 'y'
1465 FROM xla_event_types_b et
1466 WHERE et.application_id = d.application_id
1467 AND et.entity_code = d.entity_code
1468 AND et.event_class_code = d.event_class_code
1469 AND et.event_type_code <> d.event_class_code||'_ALL'
1470 AND et.enabled_flag = 'Y'
1471 AND et.accounting_flag = 'Y');
1472
1473 -- Get all event types that are assigned to the AAD and are not enabled accounting event types
1474 CURSOR c_enabled_types
1475 IS
1476 SELECT application_id, entity_code, event_class_code, event_type_code
1477 FROM xla_prod_acct_headers d
1478 WHERE d.application_id = p_application_id
1479 AND d.amb_context_code = p_amb_context_code
1480 AND d.product_rule_type_code = p_product_rule_type_code
1481 AND d.product_rule_code = p_product_rule_code
1482 AND d.event_type_code <> d.event_class_code||'_ALL'
1483 AND d.validation_status_code = 'R'
1484 AND NOT EXISTS (SELECT 'y'
1485 FROM xla_event_types_b s
1486 WHERE s.application_id = d.application_id
1487 AND s.entity_code = d.entity_code
1488 AND s.event_class_code = d.event_class_code
1489 AND s.event_type_code = d.event_type_code
1490 AND s.enabled_flag = 'Y'
1491 AND s.accounting_flag = 'Y');
1492
1493 -- Get all event types to be accounted for which do not have any lines assigned to them
1494 CURSOR c_acct_headers
1495 IS
1496 SELECT xpa.entity_code, xpa.event_class_code, xpa.event_type_code
1497 FROM xla_prod_acct_headers xpa
1498 WHERE xpa.application_id = p_application_id
1499 AND xpa.amb_context_code = p_amb_context_code
1500 AND xpa.product_rule_type_code = p_product_rule_type_code
1504 AND NOT EXISTS (SELECT 'x'
1501 AND xpa.product_rule_code = p_product_rule_code
1502 AND xpa.accounting_required_flag = 'Y'
1503 AND xpa.validation_status_code = 'R'
1505 FROM xla_aad_line_defn_assgns xal
1506 , xla_line_definitions_b xld
1507 WHERE xal.application_id = xpa.application_id
1508 AND xal.amb_context_code = xpa.amb_context_code
1509 AND xal.product_rule_type_code = xpa.product_rule_type_code
1510 AND xal.product_rule_code = xpa.product_rule_code
1511 AND xal.event_class_code = xpa.event_class_code
1512 AND xal.event_type_code = xpa.event_type_code
1513 AND xld.application_id = xal.application_id
1514 AND xld.amb_context_code = xal.amb_context_code
1515 AND xld.event_class_code = xal.event_class_code
1516 AND xld.event_type_code = xal.event_type_code
1517 AND xld.line_definition_owner_code = xal.line_definition_owner_code
1518 AND xld.line_definition_code = xal.line_definition_code
1519 AND xld.enabled_flag = 'Y');
1520
1521 -- Get all event classes to be accounted for the AAD
1522 CURSOR c_prod_acct_headers
1523 IS
1524 SELECT distinct entity_code, event_class_code, event_type_code
1525 FROM xla_prod_acct_headers d
1526 WHERE d.application_id = p_application_id
1527 AND d.amb_context_code = p_amb_context_code
1528 AND d.product_rule_type_code = p_product_rule_type_code
1529 AND d.product_rule_code = p_product_rule_code
1530 AND d.accounting_required_flag = 'Y'
1531 AND d.validation_status_code = 'R';
1532
1533 l_return BOOLEAN;
1534 l_exist VARCHAR2(1);
1535 l_log_module VARCHAR2(240);
1536 BEGIN
1537 IF g_log_enabled THEN
1538 l_log_module := C_DEFAULT_MODULE||'.validate_header_assignments';
1539 END IF;
1540
1541 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1542 trace(p_msg => 'BEGIN of procedure validate_header_assignments'
1543 ,p_module => l_log_module
1544 ,p_level => C_LEVEL_PROCEDURE);
1545 END IF;
1546
1547 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1548 trace(p_msg => 'application_id = '||p_application_id||
1549 ',amb_context_code = '||p_amb_context_code||
1550 ',product_rule_type_code = '||p_product_rule_type_code||
1551 ',product_rule_code = '||p_product_rule_code
1552 ,p_module => l_log_module
1553 ,p_level => C_LEVEL_STATEMENT);
1554 END IF;
1555
1556 l_return := TRUE;
1557
1558 -- Check if atleast one event class or event type assignment is being accounted for
1559 OPEN c_accting_required;
1560 FETCH c_accting_required INTO l_exist;
1561 IF c_accting_required%notfound THEN
1562
1563 Xla_amb_setup_err_pkg.stack_error
1564 (p_message_name => 'XLA_AB_NO_EVENT_TYPE_ACCTED'
1565 ,p_message_type => 'E'
1566 ,p_message_category => 'AAD'
1567 ,p_category_sequence => 1
1568 ,p_application_id => p_application_id
1569 ,p_amb_context_code => p_amb_context_code
1570 ,p_product_rule_type_code => p_product_rule_type_code
1571 ,p_product_rule_code => p_product_rule_code);
1572
1573 l_return := FALSE;
1574 END IF;
1575 CLOSE c_accting_required;
1576
1577 -- check if assigned event classes are disabled
1578 FOR l_enabled_classes IN c_enabled_classes LOOP
1579 xla_amb_setup_err_pkg.stack_error
1580 (p_message_name => 'XLA_AB_DISABLD_EVT_CLASS'
1581 ,p_message_type => 'E'
1582 ,p_message_category => 'EVENT_CLASS'
1583 ,p_category_sequence => 2
1584 ,p_application_id => p_application_id
1585 ,p_amb_context_code => p_amb_context_code
1586 ,p_product_rule_type_code => p_product_rule_type_code
1587 ,p_product_rule_code => p_product_rule_code
1588 ,p_entity_code => l_enabled_classes.entity_code
1589 ,p_event_class_code => l_enabled_classes.event_class_code);
1590
1591 p_err_count := p_err_count + 1;
1592 p_inv_event_class_codes(p_err_count) := l_enabled_classes.event_class_code;
1593 l_return := FALSE;
1594 END LOOP;
1595
1596 -- check if assigned event classes have circular references
1597 FOR l_ec_predecs IN c_ec_predecs LOOP
1598 xla_amb_setup_err_pkg.stack_error
1599 (p_message_name => 'XLA_AB_EC_PREDECS_LOOP'
1600 ,p_message_type => 'E'
1604 ,p_amb_context_code => p_amb_context_code
1601 ,p_message_category => 'EVENT_CLASS'
1602 ,p_category_sequence => 2
1603 ,p_application_id => p_application_id
1605 ,p_product_rule_type_code => p_product_rule_type_code
1606 ,p_product_rule_code => p_product_rule_code
1607 ,p_entity_code => l_ec_predecs.entity_code
1608 ,p_event_class_code => l_ec_predecs.event_class_code);
1609
1610 p_err_count := p_err_count + 1;
1611 p_inv_event_class_codes(p_err_count) := l_ec_predecs.event_class_code;
1612 l_return := FALSE;
1613 END LOOP;
1614
1615 -- check if assigned event classes have atleast one accounting event type that is enabled
1616 FOR l_class_enabled_types IN c_class_enabled_types LOOP
1617 xla_amb_setup_err_pkg.stack_error
1618 (p_message_name => 'XLA_AB_EC_DISABLED_ET'
1619 ,p_message_type => 'E'
1620 ,p_message_category => 'EVENT_CLASS'
1621 ,p_category_sequence => 2
1622 ,p_application_id => p_application_id
1623 ,p_amb_context_code => p_amb_context_code
1624 ,p_product_rule_type_code => p_product_rule_type_code
1625 ,p_product_rule_code => p_product_rule_code
1626 ,p_entity_code => l_class_enabled_types.entity_code
1627 ,p_event_class_code => l_class_enabled_types.event_class_code);
1628
1629 p_err_count := p_err_count + 1;
1630 p_inv_event_class_codes(p_err_count) := l_class_enabled_types.event_class_code;
1631 l_return := FALSE;
1632 END LOOP;
1633
1634 -- check if assigned event types are disabled
1635 FOR l_enabled_types IN c_enabled_types LOOP
1636 xla_amb_setup_err_pkg.stack_error
1637 (p_message_name => 'XLA_AB_DISABLD_EVENT_TYP'
1638 ,p_message_type => 'E'
1639 ,p_message_category => 'EVENT_TYPE'
1640 ,p_category_sequence => 6
1641 ,p_application_id => p_application_id
1642 ,p_amb_context_code => p_amb_context_code
1643 ,p_product_rule_type_code => p_product_rule_type_code
1644 ,p_product_rule_code => p_product_rule_code
1645 ,p_entity_code => l_enabled_types.entity_code
1646 ,p_event_class_code => l_enabled_types.event_class_code
1647 ,p_event_type_code => l_enabled_types.event_type_code);
1648
1649 p_err_count := p_err_count + 1;
1650 p_inv_event_class_codes(p_err_count) := l_enabled_types.event_class_code;
1651 l_return := FALSE;
1652 END LOOP;
1653
1654 -- Validate every event type to be accounted for has lines assigned to it
1655 -- or is an accounting reversal event class
1656 FOR l_acct_header IN c_acct_headers LOOP
1657 -- Check if event class is an accounting reversal event class
1658 IF not is_reversal
1659 (p_application_id => p_application_id
1660 ,p_entity_code => l_acct_header.entity_code
1661 ,p_event_class_code => l_acct_header.event_class_code) THEN
1662
1663 xla_amb_setup_err_pkg.stack_error
1664 (p_message_name => 'XLA_AB_LESS_LINE_TYPES'
1665 ,p_message_type => 'E'
1666 ,p_message_category => 'EVENT_TYPE'
1667 ,p_category_sequence => 6
1668 ,p_application_id => p_application_id
1669 ,p_amb_context_code => p_amb_context_code
1670 ,p_product_rule_type_code => p_product_rule_type_code
1671 ,p_product_rule_code => p_product_rule_code
1672 ,p_entity_code => l_acct_header.entity_code
1673 ,p_event_class_code => l_acct_header.event_class_code
1674 ,p_event_type_code => l_acct_header.event_type_code);
1675
1676 p_err_count := p_err_count + 1;
1677 p_inv_event_class_codes(p_err_count) := l_acct_header.event_class_code;
1678 l_return := FALSE;
1679 END IF;
1680 END LOOP;
1681
1682 -- Validate Header descriptions
1683 IF NOT chk_descriptions_are_valid
1684 (p_application_id => p_application_id
1685 ,p_amb_context_code => p_amb_context_code
1686 ,p_product_rule_type_code => p_product_rule_type_code
1687 ,p_product_rule_code => p_product_rule_code
1688 ,p_err_count => p_err_count
1689 ,p_inv_event_class_codes => p_inv_event_class_codes) THEN
1690 l_return := FALSE;
1691 END IF;
1692
1693 -- Validate Header Analytical Criteria
1694 IF NOT chk_ana_cri_are_valid
1695 (p_application_id => p_application_id
1696 ,p_amb_context_code => p_amb_context_code
1697 ,p_product_rule_type_code => p_product_rule_type_code
1698 ,p_product_rule_code => p_product_rule_code
1699 ,p_err_count => p_err_count
1700 ,p_inv_event_class_codes => p_inv_event_class_codes) THEN
1701 l_return := FALSE;
1702 END IF;
1703
1704 -- Get all event classes to be accounted for
1705 FOR l_prod_acct_header IN c_prod_acct_headers LOOP
1706 -- Validate header accounting sources
1707 IF NOT chk_hdr_accting_sources
1708 (p_application_id => p_application_id
1709 ,p_amb_context_code => p_amb_context_code
1710 ,p_product_rule_type_code => p_product_rule_type_code
1711 ,p_product_rule_code => p_product_rule_code
1712 ,p_entity_code => l_prod_acct_header.entity_code
1713 ,p_event_class_code => l_prod_acct_header.event_class_code
1717 p_inv_event_class_codes(p_err_count) := l_prod_acct_header.event_class_code;
1714 ,p_event_type_code => l_prod_acct_header.event_type_code) THEN
1715
1716 p_err_count := p_err_count + 1;
1718 l_return := FALSE;
1719 END IF;
1720 END LOOP;
1721
1722 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1723 trace(p_msg => 'END of procedure - return: '
1724 ||case when l_return then 'TRUE' else 'FALSE' end
1725 ,p_module => l_log_module
1726 ,p_level => C_LEVEL_PROCEDURE);
1727 END IF;
1728
1729 RETURN l_return;
1730
1731 EXCEPTION
1732 WHEN xla_exceptions_pkg.application_exception THEN
1733 RAISE;
1734
1735 WHEN OTHERS THEN
1736 xla_exceptions_pkg.raise_message
1737 (p_location => 'xla_amb_aad_pkg.validate_header_assignments');
1738
1739 END validate_header_assignments;
1740
1741 FUNCTION validate_jld
1742 (p_application_id IN NUMBER
1743 ,p_amb_context_code IN VARCHAR2
1744 ,p_event_class_code IN VARCHAR2
1745 ,p_event_type_code IN VARCHAR2
1746 ,p_line_definition_owner_code IN VARCHAR2
1747 ,p_line_definition_code IN VARCHAR2)
1748 RETURN BOOLEAN
1749 IS
1750 l_return BOOLEAN;
1751 l_log_module VARCHAR2(240);
1752 BEGIN
1753 IF g_log_enabled THEN
1754 l_log_module := C_DEFAULT_MODULE||'.validate_jld';
1755 END IF;
1756
1757 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1758 trace(p_msg => 'BEGIN of procedure validate_jld'
1759 ,p_module => l_log_module
1760 ,p_level => C_LEVEL_PROCEDURE);
1761 END IF;
1762
1763 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1764 trace(p_msg => 'application_id = '||p_application_id||
1765 ',amb_context_code = '||p_amb_context_code||
1766 ',event_class_code = '||p_event_class_code||
1767 ',event_type_code = '||p_event_type_code||
1768 ',line_definition_owner_code = '||p_line_definition_owner_code||
1769 ',line_definition_code = '||p_line_definition_code
1770 ,p_module => l_log_module
1771 ,p_level => C_LEVEL_STATEMENT);
1772 END IF;
1773
1774 l_return := xla_line_definitions_pvt.validate_line_definition
1775 (p_application_id => p_application_id
1776 ,p_amb_context_code => p_amb_context_code
1777 ,p_event_class_code => p_event_class_code
1778 ,p_event_type_code => p_event_type_code
1779 ,p_line_definition_owner_code => p_line_definition_owner_code
1780 ,p_line_definition_code => p_line_definition_code);
1781
1782 IF (l_return) THEN
1783 UPDATE xla_line_definitions_b
1784 SET validation_status_code = 'Y' -- Valid
1785 WHERE application_id = p_application_id
1786 AND amb_context_code = p_amb_context_code
1787 AND event_class_code = p_event_class_code
1788 AND event_type_code = p_event_type_code
1789 AND line_definition_owner_code = p_line_definition_owner_code
1790 AND line_definition_code = p_line_definition_code;
1791 ELSE
1792 UPDATE xla_line_definitions_b
1793 SET validation_status_code = 'E' -- Invalid
1794 WHERE application_id = p_application_id
1795 AND amb_context_code = p_amb_context_code
1796 AND event_class_code = p_event_class_code
1797 AND event_type_code = p_event_type_code
1798 AND line_definition_owner_code = p_line_definition_owner_code
1799 AND line_definition_code = p_line_definition_code;
1800 END IF;
1801
1802 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1803 trace(p_msg => 'END of procedure validate_jld: return - '||
1804 CASE WHEN l_return THEN 'TRUE' ELSE 'FALSE' END
1805 ,p_module => l_log_module
1806 ,p_level => C_LEVEL_PROCEDURE);
1807 END IF;
1808
1809 RETURN l_return;
1810 EXCEPTION
1811 WHEN xla_exceptions_pkg.application_exception THEN
1812 RAISE;
1813
1814 WHEN OTHERS THEN
1815 xla_exceptions_pkg.raise_message
1816 (p_location => 'xla_amb_aad_pkg.validate_jld');
1817
1818 END validate_jld;
1819
1820
1821 --======================================================================
1822 --
1823 -- Name: validate_aad
1824 -- Description: Validate an AAD. Only event class/type assignments that
1825 -- have status Validating are validated in this API
1826 --
1827 --======================================================================
1828 PROCEDURE validate_aad
1829 (p_application_id IN NUMBER
1830 ,p_amb_context_code IN VARCHAR2
1831 ,p_product_rule_type_code IN VARCHAR2
1832 ,p_product_rule_code IN VARCHAR2
1833 ,x_validation_status_code IN OUT NOCOPY VARCHAR2
1834 ,x_hash_id IN OUT NOCOPY INTEGER)
1835 IS
1836 --
1837 -- Retrieve all journal lines definitions of the AAD that are not validated
1838 --
1839 CURSOR c_line_definitions IS
1840 SELECT distinct xld.event_class_code, xld.event_type_code,
1841 xld.line_definition_owner_code, xld.line_definition_code
1842 FROM xla_aad_line_defn_assgns xal
1843 ,xla_line_definitions_b xld
1844 WHERE xld.application_id = xal.application_id
1845 AND xld.amb_context_code = xal.amb_context_code
1846 AND xld.event_class_code = xal.event_class_code
1847 AND xld.event_type_code = xal.event_type_code
1851 AND xal.application_id = p_application_id
1848 AND xld.line_definition_owner_code = xal.line_definition_owner_code
1849 AND xld.line_definition_code = xal.line_definition_code
1850 AND xld.validation_status_code <> 'Y'
1852 AND xal.amb_context_code = p_amb_context_code
1853 AND xal.product_rule_type_code = p_product_rule_type_code
1854 AND xal.product_rule_code = p_product_rule_code;
1855
1856 l_inv_event_class_codes t_array_codes;
1857 l_err_count INTEGER;
1858 l_return BOOLEAN;
1859 l_warning BOOLEAN;
1860
1861 j INTEGER;
1862
1863 l_log_module VARCHAR2(240);
1864 BEGIN
1865 IF g_log_enabled THEN
1866 l_log_module := C_DEFAULT_MODULE||'.validate_aad';
1867 END IF;
1868
1869 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1870 trace(p_msg => 'BEGIN of procedure validate_aad'
1871 ,p_module => l_log_module
1872 ,p_level => C_LEVEL_PROCEDURE);
1873 END IF;
1874
1875 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1876 trace(p_msg => 'application_id = '||p_application_id||
1877 ',amb_context_code = '||p_amb_context_code||
1878 ',product_rule_type_code = '||p_product_rule_type_code||
1879 ',product_rule_code = '||p_product_rule_code
1880 ,p_module => l_log_module
1881 ,p_level => C_LEVEL_STATEMENT);
1882 END IF;
1883
1884 l_return := TRUE;
1885 l_warning := TRUE;
1886
1887 -- Set environment settings
1888 xla_environment_pkg.refresh;
1889
1890 -- Delete the error table for the event class
1891 DELETE FROM xla_amb_setup_errors
1892 WHERE application_id = p_application_id
1893 AND amb_context_code = p_amb_context_code
1894 AND product_rule_type_code = p_product_rule_type_code
1895 AND product_rule_code = p_product_rule_code;
1896
1897 -- Initialize the error package
1898 Xla_amb_setup_err_pkg.initialize;
1899
1900 -- Get the extract object owner for all extract objects for AAD
1901 -- and store in GT table
1902 /*
1903 xla_extract_integrity_pkg.set_extract_object_owner
1904 (p_application_id => p_application_id
1905 ,p_amb_context_code => p_amb_context_code
1906 ,p_product_rule_type_code => p_product_rule_type_code
1907 ,p_product_rule_code => p_product_rule_code);
1908 */
1909
1910 -- Validate all extract objects for the AAD
1911 l_warning := xla_extract_integrity_pkg.validate_extract_objects
1912 (p_application_id => p_application_id
1913 ,p_amb_context_code => p_amb_context_code
1914 ,p_product_rule_type_code => p_product_rule_type_code
1915 ,p_product_rule_code => p_product_rule_code);
1916
1917 -- Validate journal line definitions for all event class/type assignments
1918 -- that are not validated
1919 l_err_count := 0;
1920 FOR l_line_definition IN c_line_definitions LOOP
1921 IF (NOT validate_jld
1922 (p_application_id => p_application_id
1923 ,p_amb_context_code => p_amb_context_code
1924 ,p_event_class_code => l_line_definition.event_class_code
1925 ,p_event_type_code => l_line_definition.event_type_code
1929 l_inv_event_class_codes(l_err_count) := l_line_definition.event_class_code;
1926 ,p_line_definition_owner_code => l_line_definition.line_definition_owner_code
1927 ,p_line_definition_code => l_line_definition.line_definition_code)) THEN
1928 l_err_count := l_err_count + 1;
1930 l_return := FALSE;
1931 END IF;
1932 END LOOP;
1933
1934 -- Validate header assignment
1935 l_return := validate_header_assignments
1936 (p_application_id => p_application_id
1937 ,p_amb_context_code => p_amb_context_code
1938 ,p_product_rule_type_code => p_product_rule_type_code
1939 ,p_product_rule_code => p_product_rule_code
1940 ,p_err_count => l_err_count
1941 ,p_inv_event_class_codes => l_inv_event_class_codes)
1942 AND l_return;
1943
1944 -- For all event class assignment of the invalid line definition or invalid
1945 -- header assignment of the eventclass, mark the event class assignment to Error
1946 IF (NOT l_return) THEN
1947 FORALL j IN 1..l_err_count
1948 UPDATE xla_prod_acct_headers xpa
1949 SET validation_status_code = 'E'
1950 WHERE application_id = p_application_id
1951 AND amb_context_code = p_amb_context_code
1952 AND product_rule_type_code = p_product_rule_type_code
1953 AND product_rule_code = p_product_rule_code
1954 AND event_class_code = l_inv_event_class_codes(j);
1955 END IF;
1956
1957 -- Get the hash id for the AAD
1958 x_hash_id := XLA_CMP_HASH_PKG.GetPadHashId
1959 (p_product_rule_code => p_product_rule_code
1960 ,p_amb_context_code => p_amb_context_code
1961 ,p_application_id => p_application_id
1962 ,p_product_rule_type_code => p_product_rule_type_code);
1963
1964 IF x_hash_id is null then
1965 xla_amb_setup_err_pkg.stack_error
1966 (p_message_name => 'XLA_AB_HASH_ID_NOT_CREATED'
1967 ,p_message_type => 'E'
1968 ,p_message_category => 'AAD'
1969 ,p_category_sequence => 1
1970 ,p_application_id => p_application_id
1971 ,p_amb_context_code => p_amb_context_code
1972 ,p_product_rule_type_code => p_product_rule_type_code
1973 ,p_product_rule_code => p_product_rule_code);
1974
1975 l_return := FALSE;
1976
1977 END IF;
1978
1979 -- Insert errors into the error table from the plsql array
1980 xla_amb_setup_err_pkg.insert_errors;
1981
1982 IF (l_return) THEN
1983 x_validation_status_code := 'Y';
1984 ELSE
1985 x_validation_status_code := 'E';
1986 END IF;
1987
1988 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1989 trace(p_msg => 'END of procedure - return: '
1990 ||case when l_return then 'TRUE' else 'FALSE' end
1991 ,p_module => l_log_module
1992 ,p_level => C_LEVEL_PROCEDURE);
1993 END IF;
1994
1995 EXCEPTION
1996 WHEN xla_exceptions_pkg.application_exception THEN
1997 RAISE;
1998
1999 WHEN OTHERS THEN
2000 xla_exceptions_pkg.raise_message
2001 (p_location => 'xla_amb_aad_pkg.validate_aad');
2002
2003 END validate_aad;
2004
2005
2006 --=============================================================================
2007 --
2008 --
2009 --
2010 --
2011 -- *********** public procedures and functions **********
2012 --
2013 --
2014 --
2015 --
2016 --=============================================================================
2017
2018 --======================================================================+
2019 --
2020 -- Name: validate_and_compile_aad
2021 -- Description: Validate and compile and AAD
2022 --
2023 --======================================================================+
2024
2025 PROCEDURE validate_and_compile_aad
2026 (p_application_id IN NUMBER
2027 ,p_amb_context_code IN VARCHAR2
2028 ,p_product_rule_type_code IN VARCHAR2
2029 ,p_product_rule_code IN VARCHAR2
2030 ,x_validation_status_code IN OUT NOCOPY VARCHAR2
2031 ,x_compilation_status_code IN OUT NOCOPY VARCHAR2
2032 ,x_hash_id IN OUT NOCOPY INTEGER)
2033 IS
2034 l_count INTEGER;
2035 l_log_module VARCHAR2(240);
2036 BEGIN
2037 IF g_log_enabled THEN
2038 l_log_module := C_DEFAULT_MODULE||'.validate_and_compile_aad';
2039 END IF;
2040
2041 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
2042 trace(p_msg => 'BEGIN of procedure validate_and_compile_aad'
2043 ,p_module => l_log_module
2044 ,p_level => C_LEVEL_PROCEDURE);
2045 END IF;
2046
2047 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2048 trace(p_msg => 'application_id = ' ||p_application_id||
2049 ',amb_context_code = ' ||p_amb_context_code||
2050 ',product_rule_type_code = '||p_product_rule_type_code||
2051 ',product_rule_code = ' ||p_product_rule_code
2052 ,p_module => l_log_module
2053 ,p_level => C_LEVEL_STATEMENT);
2054 END IF;
2055
2056 x_validation_status_code := 'N';
2057 x_compilation_status_code := 'N';
2058 x_hash_id := NULL;
2059
2060 -- Get the extract object owner for all extract objects for AAD
2061 -- and store in GT table
2062 xla_extract_integrity_pkg.set_extract_object_owner
2063 (p_application_id => p_application_id
2064 ,p_amb_context_code => p_amb_context_code
2068 -- All event class/type assignment that are not Valid are eligiable for
2065 ,p_product_rule_type_code => p_product_rule_type_code
2066 ,p_product_rule_code => p_product_rule_code);
2067
2069 -- validation
2070 UPDATE xla_prod_acct_headers
2071 SET validation_status_code = 'R'
2072 WHERE application_id = p_application_id
2073 AND amb_context_code = p_amb_context_code
2074 AND product_rule_type_code = p_product_rule_type_code
2075 AND product_rule_code = p_product_rule_code
2076 AND validation_status_code <> 'Y';
2077
2078 -- If no validation is necessary, return
2079 l_count := SQL%ROWCOUNT;
2080 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2081 trace(p_msg => '# rows updated to Validating = '||l_count
2082 ,p_module => l_log_module
2083 ,p_level => C_LEVEL_STATEMENT);
2084 END IF;
2085
2086 IF (l_count = 0) THEN
2087
2088 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2089 trace(p_msg => 'No validation for any event class/type assignment - RETURN'
2090 ,p_module => l_log_module
2091 ,p_level => C_LEVEL_STATEMENT);
2092 END IF;
2093
2094 x_validation_status_code := 'Y';
2095
2096 ELSE
2097 -- Validate journal entry setups
2098 validate_aad
2099 (p_application_id => p_application_id
2100 ,p_amb_context_code => p_amb_context_code
2101 ,p_product_rule_type_code => p_product_rule_type_code
2102 ,p_product_rule_code => p_product_rule_code
2103 ,x_validation_status_code => x_validation_status_code
2104 ,x_hash_id => x_hash_id);
2105 END IF;
2106
2107 -- For assignments that are valid (and does not marked for validation),
2108 -- change the validation status to R so they are eligiable for compilation.
2109 UPDATE xla_prod_acct_headers
2110 SET validation_status_code = 'R'
2111 WHERE application_id = p_application_id
2112 AND amb_context_code = p_amb_context_code
2113 AND product_rule_type_code = p_product_rule_type_code
2114 AND product_rule_code = p_product_rule_code
2115 AND validation_status_code = 'Y';
2116
2117 -- Check if the compilation succeeds
2118 IF xla_compile_pad_pkg.compile
2119 (p_application_id => p_application_id
2120 ,p_amb_context_code => p_amb_context_code
2121 ,p_product_rule_type_code => p_product_rule_type_code
2122 ,p_product_rule_code => p_product_rule_code) THEN
2123
2124 x_compilation_status_code := 'Y';
2125
2126 -- Call product API for dynamic extract.
2127 BEGIN
2128 IF p_application_id = 140 THEN
2129 xla_fa_extract_pkg.COMPILE
2130 (p_application_id => p_application_id
2131 ,p_amb_context_code => p_amb_context_code
2132 ,p_product_rule_type_code => p_product_rule_type_code
2133 ,p_product_rule_code => p_product_rule_code);
2134 END IF;
2135 EXCEPTION
2136 WHEN OTHERS THEN
2137 XLA_AMB_SETUP_ERR_PKG.stack_error
2138 (p_message_name => 'XLA_CMP_TECHNICAL_ERROR'
2139 ,p_message_type => 'E'
2140 ,p_message_category => 'AAD'
2141 ,p_category_sequence => 1
2142 ,p_application_id => p_application_id
2143 ,p_amb_context_code => p_amb_context_code
2144 ,p_product_rule_type_code => p_product_rule_type_code
2145 ,p_product_rule_code => p_product_rule_code);
2146
2147 -- Set AAD status to Invalid
2148 x_compilation_status_code := 'E';
2149 -- Insert errors into the error table from the plsql array
2150 xla_amb_setup_err_pkg.insert_errors;
2151 END;
2152 ELSE
2153 x_compilation_status_code := 'E';
2154 END IF;
2155
2156 UPDATE xla_prod_acct_headers
2157 SET validation_status_code = x_compilation_status_code
2158 , last_update_date = sysdate
2159 , last_updated_by = xla_environment_pkg.g_usr_id
2160 , last_update_login = xla_environment_pkg.g_login_id
2161 WHERE application_id = p_application_id
2162 AND amb_context_code = p_amb_context_code
2163 AND product_rule_type_code = p_product_rule_type_code
2164 AND product_rule_code = p_product_rule_code
2165 AND validation_status_code = 'R';
2166
2167 UPDATE xla_product_rules_b
2168 SET compile_status_code = x_compilation_status_code
2169 , product_rule_hash_id = NVL(x_hash_id,product_rule_hash_id)
2170 , last_update_date = sysdate
2171 , last_updated_by = xla_environment_pkg.g_usr_id
2172 , last_update_login = xla_environment_pkg.g_login_id
2173 WHERE application_id = p_application_id
2174 AND amb_context_code = p_amb_context_code
2175 AND product_rule_type_code = p_product_rule_type_code
2176 AND product_rule_code = p_product_rule_code
2177 RETURNING product_rule_hash_id INTO x_hash_id;
2178
2179 COMMIT;
2180
2181 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
2182 trace(p_msg => 'END of procedure : x_validation_status = '
2183 ||x_validation_status_code
2184 ||', x_compilation_status = '
2185 ||x_compilation_status_code
2186 ,p_module => l_log_module
2187 ,p_level => C_LEVEL_PROCEDURE);
2188 END IF;
2189
2190 EXCEPTION
2191 WHEN xla_exceptions_pkg.application_exception THEN
2192 RAISE;
2193
2194 WHEN OTHERS THEN
2195 xla_exceptions_pkg.raise_message
2199
2196 (p_location => 'xla_amb_aad_pkg.Validate_and_compile_aad');
2197
2198 END validate_and_compile_aad;
2200 --=============================================================================
2201 --
2202 -- Following code is executed when the package body is referenced for the first
2203 -- time
2204 --
2205 --=============================================================================
2206 BEGIN
2207 g_log_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2208 g_log_enabled := fnd_log.test
2209 (log_level => g_log_level
2210 ,module => C_DEFAULT_MODULE);
2211
2212 IF NOT g_log_enabled THEN
2213 g_log_level := C_LEVEL_LOG_DISABLED;
2214 END IF;
2215
2216 g_creation_date := sysdate;
2217 g_last_update_date := sysdate;
2218 g_created_by := xla_environment_pkg.g_usr_id;
2219 g_last_update_login := xla_environment_pkg.g_login_id;
2220 g_last_updated_by := xla_environment_pkg.g_usr_id;
2221
2222 END xla_amb_aad_pkg;