DBA Data[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;
31 -------------------------------------------------------------------------------
28 g_last_update_login               INTEGER;
29 g_last_updated_by                 INTEGER;
30 
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 
166 END is_reversal;
163       xla_exceptions_pkg.raise_message
164         (p_location   => 'xla_amb_aad_pkg.is_reversal');
165 
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
291     WHERE a.application_id            = p_application_id
288    IS
289    SELECT 'x'
290      FROM xla_evt_class_acct_attrs a
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 
385    -- Get all accounting attributes assignments that have derived sources that are
386    -- not mapped to the event class
387 
388    CURSOR c_der_sources
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||
421          ,p_level  => C_LEVEL_STATEMENT);
418                       ',product_rule_type_code = '||p_product_rule_type_code||
419                       ',product_rule_code = '||p_product_rule_code
420          ,p_module => l_log_module
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 
513 /* 4458381
514        IF l_ec_attrs.allow_encumbrance_flag = 'Y' THEN
515 
516           -- Check if Encumbrance Type Identifier is mapped for the
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    --
546    OPEN c_rev_dist_2;
543    -- Check if reversed distribution ids are mapped for a line type
544    -- then the corresponding distribution ids are also mapped
545    --
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'
650               ,p_category_sequence         => 5
651               ,p_application_id            => p_application_id
652               ,p_amb_context_code          => p_amb_context_code
653               ,p_product_rule_type_code    => p_product_rule_type_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?
679               ,p_application_id            => p_application_id
676               ,p_message_type              => 'E'
677               ,p_message_category          => 'ACCOUNTING_SOURCE'
678               ,p_category_sequence         => 5
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
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
777       AND d.product_rule_code         = p_product_rule_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
795     WHERE d.description_prio_id       = p.description_prio_id
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
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
872                          AND s.active_flag          = 'Y'
873                          AND s.level_code            = 'H');
874 
875   -- Get all header descriptions for the AAD that have derived sources in their
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'
963               ,p_amb_context_code          => p_amb_context_code
960               ,p_message_category          => 'HDR_DESCRIPTION'
961               ,p_category_sequence         => 7
962               ,p_application_id            => p_application_id
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'
984               ,p_category_sequence         => 7
985               ,p_application_id            => p_application_id
986               ,p_amb_context_code          => p_amb_context_code
987               ,p_product_rule_type_code    => p_product_rule_type_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 
1058     END IF;
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;
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
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
1084               ,p_description_type_code     => l_hdr_desc_con_der_sources.description_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
1166   -- Get all header analytical criteria for the AAD that have no details
1163                           AND a.analytical_criterion_type_code = s.analytical_criterion_type_code
1164                           AND a.balancing_flag                 = 'Y');
1165 
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,
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
1192       AND a.amb_context_code               = n.amb_context_code
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
1269 
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);
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 
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
1300               (p_message_name              => 'XLA_AB_HDR_ANC_NO_DETAIL'
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
1369        p_inv_event_class_codes(p_err_count) := l_hdr_anal_der_sources.event_class_code;
1366               ,p_source_type_code          => l_hdr_anal_der_sources.source_type_code);
1367 
1368        p_err_count := p_err_count + 1;
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 
1410    -- Get all event classes that are assigned to the AAD and disabled
1411    CURSOR c_enabled_classes
1412    IS
1413    SELECT entity_code, event_class_code
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
1490                         AND s.enabled_flag           = 'Y'
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
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
1501       AND xpa.product_rule_code         = p_product_rule_code
1502       AND xpa.accounting_required_flag  = 'Y'
1503       AND xpa.validation_status_code    = 'R'
1504       AND NOT EXISTS (SELECT 'x'
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
1600               ,p_message_type              => 'E'
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'
1601               ,p_message_category          => 'EVENT_CLASS'
1602               ,p_category_sequence         => 2
1603               ,p_application_id            => p_application_id
1604               ,p_amb_context_code          => p_amb_context_code
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
1712               ,p_entity_code            => l_prod_acct_header.entity_code
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
1713               ,p_event_class_code       => 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;
1717       p_inv_event_class_codes(p_err_count) := l_prod_acct_header.event_class_code;
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,
1844     WHERE xld.application_id             = xal.application_id
1841           xld.line_definition_owner_code, xld.line_definition_code
1842      FROM xla_aad_line_defn_assgns xal
1843          ,xla_line_definitions_b   xld
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
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'
1851       AND xal.application_id             = p_application_id
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
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;
1929       l_inv_event_class_codes(l_err_count) := l_line_definition.event_class_code;
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
1965     xla_amb_setup_err_pkg.stack_error
1962                      ,p_product_rule_type_code => p_product_rule_type_code);
1963 
1964   IF x_hash_id is null then
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
2065       ,p_product_rule_type_code => p_product_rule_type_code
2066       ,p_product_rule_code      => p_product_rule_code);
2067 
2068   -- All event class/type assignment that are not Valid are eligiable for
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 
2110      SET validation_status_code = 'R'
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
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
2196         (p_location   => 'xla_amb_aad_pkg.Validate_and_compile_aad');
2197 
2198 END validate_and_compile_aad;
2199 
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;