DBA Data[Home] [Help]

PACKAGE BODY: APPS.XLA_JE_VALIDATION_PKG

Source


1 PACKAGE BODY xla_je_validation_pkg AS
2 /* $Header: xlajebal.pkb 120.194 2011/11/28 23:57:26 pshukla ship $ */
3 
4 --=============================================================================
5 --           ****************  declaraions  ********************
6 --=============================================================================
7 -------------------------------------------------------------------------------
8 -- declaring global types
9 -------------------------------------------------------------------------------
10 
11 TYPE t_array_varchar30 IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
12 TYPE t_array_varchar80 IS TABLE OF VARCHAR2(80) INDEX BY BINARY_INTEGER;
13 TYPE t_array_date      IS TABLE OF DATE         INDEX BY BINARY_INTEGER;
14 TYPE t_array_number    IS TABLE OF NUMBER       INDEX BY BINARY_INTEGER;
15 
16 -------------------------------------------------------------------------------
17 -- declaring global constants
18 -------------------------------------------------------------------------------
19 
20 C_BALANCING_ACCT_LINE_NAME      CONSTANT VARCHAR2(30) := 'BALANCING';
21 
22 /*
23  * These are the types of lines exists in the validation lines table:
24  * C_LINE_TYPE_PROCESS          : Original lines to be processed
25  * C_LINE_TYPE_COMPLETE         : Original lines that has completed processing
26  * C_LINE_TYPE_LC_BALANCING     : Balancing lines created by balanced by ledger currency
27  * C_LINE_TYPE_IC_BAL_INTRA     : Balancing lines created by balanced by Intercompany balancing
28  * C_LINE_TYPE_IC_BAL_INTER     : Balancing lines created by balanced by Intracompany balancing
29  * C_LINE_TYPE_XLA_BALANCING    : Balancing lines created by balanced by entered currency and
30  * C_LINE_TYPE_RD_BALANCING     : Balancing lines created by balanced by journal rounding
31  *                                balancing segments
32  */
33 C_LINE_TYPE_PROCESS             CONSTANT VARCHAR2(1) := 'P';
34 C_LINE_TYPE_COMPLETE            CONSTANT VARCHAR2(1) := 'C';
35 C_LINE_TYPE_LC_BALANCING        CONSTANT VARCHAR2(1) := 'L';
36 C_LINE_TYPE_IC_BAL_INTRA        CONSTANT VARCHAR2(1) := 'R';
37 C_LINE_TYPE_IC_BAL_INTER        CONSTANT VARCHAR2(1) := 'E';
38 C_LINE_TYPE_XLA_BALANCING       CONSTANT VARCHAR2(1) := 'X';
39 C_LINE_TYPE_RD_BALANCING        CONSTANT VARCHAR2(1) := 'J';
40 C_LINE_TYPE_ENC_BALANCING       CONSTANT VARCHAR2(1) := 'N';
41 C_LINE_TYPE_ENC_BAL_ERROR       CONSTANT VARCHAR2(1) := 'O';
42 
43 -- The segment type code
44 C_BAL_SEGMENT                   CONSTANT VARCHAR2(1) := 'B';
45 C_MGT_SEGMENT                   CONSTANT VARCHAR2(1) := 'M';
46 C_CC_SEGMENT                    CONSTANT VARCHAR2(1) := 'C';
47 C_NA_SEGMENT                    CONSTANT VARCHAR2(1) := 'N';
48 
49 -- Data type constant for comparison
50 C_NUM                           CONSTANT NUMBER      := 9E125;
51 C_CHAR                          CONSTANT VARCHAR2(1) := fnd_global.local_chr(12);
52 C_DATE                          CONSTANT DATE        := TO_DATE('1','j');
53 
54 -- Application id for GL
55 C_GL_APPLICATION_ID             CONSTANT INTEGER := 101;
56 
57 -- Accounting entry status codes
58 C_AE_STATUS_INVALID             CONSTANT VARCHAR2(30) := 'I';
59 C_AE_STATUS_RELATED             CONSTANT VARCHAR2(30) := 'R';
60 
61 -- Line type returned by Intercompany balance API
62 C_FUN_INTRA                     CONSTANT VARCHAR2(1) := 'R';
63 C_FUN_INTER                     CONSTANT VARCHAR2(1) := 'E';
64 
65 -- Accounting class for the balance lines
66 C_ACCT_CLASS_INTRA              CONSTANT VARCHAR2(30) := 'INTRA';
67 C_ACCT_CLASS_INTER              CONSTANT VARCHAR2(30) := 'INTER';
68 C_ACCT_CLASS_BALANCE            CONSTANT VARCHAR2(30) := 'BALANCE';
69 C_ACCT_CLASS_ROUNDING           CONSTANT VARCHAR2(30) := 'ROUNDING';
70 C_ACCT_CLASS_RFE                CONSTANT VARCHAR2(30) := 'RFE';
71 
72 -- The code for the full privilege access set
73 C_ACCESS_SET_FULL_PRIVILEGE     CONSTANT VARCHAR2(1) := 'B';
74 
75 -- If the API called by accounting program, manaul journal entry, or
76 -- complete multiperiod/accrual program.
77 C_CALLER_ACCT_PROGRAM           CONSTANT VARCHAR2(1) := 'A';
78 C_CALLER_MANUAL                 CONSTANT VARCHAR2(1) := 'M';
79 C_CALLER_MPA_PROGRAM            CONSTANT VARCHAR2(1) := 'P';  -- 4262811
80 C_CALLER_THIRD_PARTY_MERGE      CONSTANT VARCHAR2(1) := 'T';  -- 4262811
81 
82 -- Internal error code used for validation
83 C_VALID                         CONSTANT VARCHAR2(1) := 'Y';
84 C_INVALID                       CONSTANT VARCHAR2(1) := 'N';
85 C_INVALID_DATE                  CONSTANT VARCHAR2(1) := 'D';
86 
87 
88 ------------------------------------------------------------------------------
89 -- declaring global variables
90 -------------------------------------------------------------------------------
91 
92 g_amb_context_code              VARCHAR2(30);
93 g_caller                        VARCHAR2(1);  -- Call by acct program or manual
94 g_application_id                INTEGER;
95 g_ae_header_id                  INTEGER;
96 g_balance_flag                  BOOLEAN;
97 g_end_date                      DATE;         -- 4262811 MPA
98 --g_mode                        VARCHAR2(80); -- 4262811a MPA
99 g_accounting_mode               VARCHAR2(30);
100 g_message_name                  VARCHAR2(30); -- 4262811 MPA
101 g_app_je_source_name            VARCHAR2(30);
102 g_app_ctl_acct_source_code      VARCHAR2(30);
103 
104 -- Globals to store error information
105 g_err_event_ids                 t_array_int;
106 g_err_hdr_ids                   t_array_int;
107 g_err_count                     INTEGER := 0;
108 g_prev_err_count                INTEGER := 0;
109 
110 -- Globals to store ledger information
111 g_trx_ledger_id                 INTEGER;      -- ledger of the transaction
112 g_ledger_id                     INTEGER;      -- current processing ledger (PRI, SEC, ALC)
113 g_target_ledger_id              INTEGER;      -- primary/secondary ledger if the g_ledger_id is ALC
114 
115 -- Globals to store the ledger information of the curreny processing ledger
116 g_ledger_name                   VARCHAR2(30);
117 g_ledger_currency_code          VARCHAR2(30);
118 g_ledger_category_code          VARCHAR2(30);
119 g_ledger_coa_id                 INTEGER;
120 g_bal_seg_column_name           VARCHAR2(30);
121 g_mgt_seg_column_name           VARCHAR2(30);
122 g_cc_seg_column_name            VARCHAR2(30);
123 g_na_seg_column_name            VARCHAR2(30);
124 g_allow_intercompany_post_flag  VARCHAR2(30);
125 g_bal_seg_value_option_code     VARCHAR2(30);
126 g_mgt_seg_value_option_code     VARCHAR2(30);
127 g_sla_bal_by_ledger_curr_flag   VARCHAR2(30);
128 g_sla_ledger_cur_bal_sus_ccid   INTEGER;
129 g_sla_entered_cur_bal_sus_ccid  INTEGER;
130 g_sla_rounding_ccid             INTEGER;
131 g_latest_encumbrance_year       INTEGER;
132 g_transaction_calendar_id       INTEGER;
133 g_enable_average_balances_flag  VARCHAR2(1);
134 g_res_encumb_ccid               INTEGER;
135 g_suspense_allowed_flag         VARCHAR2(1);
136 
137 -- Globals used for ledger security validation
138 g_use_ledger_security         VARCHAR2(1);
139 g_pri_access_set_id           INTEGER;
140 g_sec_access_set_id           INTEGER;
141 g_tmp_access_set_id           INTEGER;  -- 5109176
142 g_pri_access_set_name         fnd_profile_options_vl.user_profile_option_name%TYPE;  -- 5109176
143 g_sec_access_set_name         fnd_profile_options_vl.user_profile_option_name%TYPE;  -- 5109176
144 g_tmp_access_set_name         fnd_profile_options_vl.user_profile_option_name%TYPE;  -- 5109176
145 g_pri_coa_id                  INTEGER;
146 g_sec_coa_id                  INTEGER;
147 g_tmp_coa_id                  INTEGER;
148 g_pri_security_seg_code       VARCHAR2(1);
149 g_sec_security_seg_code       VARCHAR2(1);
150 g_tmp_security_seg_code       VARCHAR2(1);
151 g_user_name                   VARCHAR2(80);
152 g_access_set_name             VARCHAR2(80);
153 
154 g_new_line_count              INTEGER;
155 
156 --=============================================================================
157 --               *********** Local Trace Routine **********
158 --=============================================================================
159 C_LEVEL_STATEMENT     CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
160 C_LEVEL_PROCEDURE     CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
161 C_LEVEL_EVENT         CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
162 C_LEVEL_EXCEPTION     CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
163 C_LEVEL_ERROR         CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
164 C_LEVEL_UNEXPECTED    CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
165 
166 C_LEVEL_LOG_DISABLED  CONSTANT NUMBER := 99;
167 C_DEFAULT_MODULE      CONSTANT VARCHAR2(240) := 'xla.plsql.xla_je_validation_pkg';
168 
169 g_log_level           NUMBER;
170 g_log_enabled         BOOLEAN;
171 
172 PROCEDURE trace
173   (p_msg                        IN VARCHAR2
174   ,p_module                     IN VARCHAR2
175   ,p_level                      IN NUMBER) IS
176 BEGIN
177   ----------------------------------------------------------------------------
178   -- Following is for FND log.
179   ----------------------------------------------------------------------------
180   IF (p_msg IS NULL AND p_level >= g_log_level) THEN
181     fnd_log.message(p_level, p_module);
182   ELSIF p_level >= g_log_level THEN
183     fnd_log.string(p_level, p_module, p_msg);
184   END IF;
185 
186 EXCEPTION
187   WHEN xla_exceptions_pkg.application_exception THEN
188     RAISE;
189 
190   WHEN OTHERS THEN
191     xla_exceptions_pkg.raise_message
192       (p_location   => 'xla_je_validation_pkg.trace');
193 END trace;
194 
195 
196 --=============================================================================
197 --          *********** private procedures and functions **********
198 --=============================================================================
199 
200 --=============================================================================
201 --
202 -- Name: populate_bsv_suspense_ccid
203 -- Description: This function will call FND routine to create CCID for
204 --              suspense account entries by trying to over ride the Balancing
205 --              segment of Suspense Account with the Source CCID.
206 -- Bug Number : 10047740
207 --=============================================================================
208 PROCEDURE populate_bsv_suspense_ccid
209 IS
210   l_seg                         FND_FLEX_EXT.SegmentArray;
211   l_result                      INTEGER;
212   l_old_ccids                   t_array_int;
213   l_new_ccids                   t_array_int;
214   l_num_segments                INTEGER;
215   i                             INTEGER := 1;
216   k                             INTEGER;
217   l_account                     VARCHAR2(2000) := NULL;
218   l_account_ccid                INTEGER := 0;
219   l_bal_seg_values              t_array_varchar30;
220   l_bal_seg_number              INTEGER;
221 
222   l_log_module                  VARCHAR2(240);
223 
224   CURSOR c_ccid IS
225     SELECT t.bal_seg_value
226           ,t.code_combination_id
227           ,min(t.accounting_Date) accounting_date
228       FROM xla_validation_lines_gt t
229      WHERE substituted_by_suspense_flag = 'Y'
230      GROUP BY t.bal_seg_value
231           ,t.code_combination_id
232    ;
233 
234   CURSOR c_account(p_coa_id INTEGER, p_code_combination_id INTEGER) IS
235     SELECT fnd_flex_ext.get_segs('SQLGL', 'GL#', p_coa_id, p_code_combination_id)
236     FROM   dual;
237 
238   CURSOR c_errors IS
239     SELECT entity_id
240           ,event_id
241           ,ae_header_id
242           ,bal_seg_value
243           ,SUSPENSE_CODE_COMBINATION_ID
244       FROM xla_validation_lines_gt
245      WHERE substituted_by_suspense_flag = 'Y'
246        AND code_combination_id < 0
247      GROUP BY entity_id, event_id, ae_header_id ,bal_seg_value,SUSPENSE_CODE_COMBINATION_ID ;
248 
249   CURSOR c_seg_number (p_seg_col_name VARCHAR2, p_coa_id INTEGER) IS
250     SELECT      display_order
251     FROM        (SELECT ROWNUM display_order, application_column_name
252                  FROM ( SELECT application_column_name
253                         FROM   FND_ID_FLEX_SEGMENTS_VL
254                         WHERE  ID_FLEX_NUM    = p_coa_id
255                         AND    ID_FLEX_CODE   = 'GL#'
256                         AND    APPLICATION_ID = 101
257                         order by decode(enabled_flag, 'Y', 1, 'N', 2), segment_num))
258     WHERE       application_column_name = p_seg_col_name;
259 
260 
261 BEGIN
262   IF g_log_enabled THEN
263     l_log_module := C_DEFAULT_MODULE||'.populate_bsv_suspense_ccid';
264   END IF;
265 
266   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
267     trace(p_msg    => 'BEGIN of function populate_bsv_suspense_ccid',
268           p_module => l_log_module,
269           p_level  => C_LEVEL_PROCEDURE);
270   END IF;
271 
272   l_result := 0;
273 
274   IF (C_LEVEL_EVENT >= g_log_level) THEN
275     trace(p_msg    => 'BEGIN LOOP - populate bsv overridden Suspense Account ccid',
276           p_module => l_log_module,
277           p_level  => C_LEVEL_EVENT);
278   END IF;
279 
280   FOR l_ccid IN c_ccid LOOP
281 
282     IF (C_LEVEL_EVENT >= g_log_level) THEN
283       trace(p_msg    => 'LOOP - populate bsv overridden Suspense Account ccid: g_ledger_coa_id = '||g_ledger_coa_id
284                         || ', bal_seg_value = '||l_ccid.bal_seg_value||
285                         ', ccid = '||l_ccid.code_combination_id,
286             p_module => l_log_module,
287             p_level  => C_LEVEL_EVENT);
288     END IF;
289 
290     l_old_ccids(i) := l_ccid.code_combination_id;
291     l_bal_seg_values(i) := l_ccid.bal_seg_value;
292 
293     IF ( FND_FLEX_EXT.get_segments(
294                 application_short_name  => 'SQLGL',
295                 key_flex_code           => 'GL#',
296                 structure_number        => g_ledger_coa_id,
297                 combination_id          => l_ccid.code_combination_id ,
298                 n_segments              => l_num_segments,
299                 segments                => l_seg) = FALSE ) THEN
300       IF (C_LEVEL_ERROR >= g_log_level) THEN
301         trace(p_msg    => 'FND_FLEX_EXT.get_segments failed',
302               p_module => l_log_module,
303               p_level  => C_LEVEL_ERROR);
304       END IF;
305 
306       l_new_ccids(i)      := -1;
307       l_result            := 1;
308     ELSE
309       OPEN c_seg_number(g_bal_seg_column_name, g_ledger_coa_id);
310       FETCH c_seg_number INTO l_bal_seg_number;
311       CLOSE c_seg_number;
312 
313       l_seg(l_bal_seg_number) := l_ccid.bal_seg_value;
314       IF (FND_FLEX_EXT.get_combination_id(
315                         application_short_name       => 'SQLGL',
316                         key_flex_code                => 'GL#',
317                         structure_number             => g_ledger_coa_id,
318                         validation_date              => l_ccid.accounting_date,
319                         n_segments                   => l_num_segments,
320                         segments                     => l_seg,
321                         combination_id               => l_new_ccids(i)) = FALSE) THEN
322 
323         l_new_ccids(i)      := -1;
324         l_result            := 1;
325 
326         IF (C_LEVEL_ERROR >= g_log_level) THEN
327           trace(p_msg    => 'XLA_INTERNAL_ERROR : Cannot get valid Code Combination ID',
328                 p_module => l_log_module,
329                 p_level  => C_LEVEL_ERROR);
330           trace(p_msg    => 'Error: '||fnd_message.get,
331                 p_module => l_log_module,
332                 p_level  => C_LEVEL_ERROR);
333           trace(p_msg    => 'accounting_date = '||l_ccid.accounting_date,
334                 p_module => l_log_module,
335                 p_level  => C_LEVEL_ERROR);
336           trace(p_msg    => 'num_segs = '||l_num_segments,
337                 p_module => l_log_module,
338                 p_level  => C_LEVEL_ERROR);
339           FOR i IN 1..l_num_segments LOOP
340             trace(p_msg    => 'seg('||i||') = '||l_seg(i),
341                   p_module => l_log_module,
342                   p_level  => C_LEVEL_ERROR);
343           END LOOP;
344         END IF;
345 
346       END IF;
347     END IF;
348 
349     i := i+1;
350   END LOOP;
351 
352   IF (C_LEVEL_EVENT >= g_log_level) THEN
353     trace(p_msg    => 'END LOOP - populate bsv overridden Suspense Account ccid: i = '||i,
354           p_module => l_log_module,
355           p_level  => C_LEVEL_EVENT);
356   END IF;
357 
358   k := i-1 ;
359 
360   FORALL j IN 1..k
361     UPDATE   xla_validation_lines_gt t
362        SET   code_combination_id     = l_new_ccids(j)
363       WHERE  t.substituted_by_suspense_flag = 'Y'
364        AND   t.code_combination_id = l_old_ccids(j)
365        AND   t.bal_seg_value = l_bal_seg_values(j);
366 
367   IF (C_LEVEL_EVENT >= g_log_level) THEN
368     trace(p_msg    => '# rows updated for populate bsv overridden Suspense Account  ccid = '||SQL%ROWCOUNT,
369           p_module => l_log_module,
370           p_level  => C_LEVEL_EVENT);
371   END IF;
372 
373   IF (l_result = 1) THEN
374 
375     IF (C_LEVEL_EVENT >= g_log_level) THEN
376       trace(p_msg    => 'BEGIN LOOP - fill in populate bsv overridden Suspense Account error',
377             p_module => l_log_module,
378             p_level  => C_LEVEL_EVENT);
379     END IF;
380 
381     FOR l_err IN c_errors LOOP
382 
383       IF (C_LEVEL_ERROR >= g_log_level) THEN
384         trace(p_msg    => 'LOOP - fill in populate bsv overridden Suspense Account error: l_ae_header_id = '||l_err.ae_header_id,
385               p_module => l_log_module,
386               p_level  => C_LEVEL_ERROR);
387       END IF;
388 
389       g_err_count := g_err_count + 1;
390       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
391       g_err_event_ids(g_err_count) := l_err.event_id;
392 
393       IF l_account_ccid <> l_err.SUSPENSE_CODE_COMBINATION_ID
394       THEN
395          OPEN c_account(g_ledger_coa_id, l_err.SUSPENSE_CODE_COMBINATION_ID );
396          FETCH c_account INTO l_account;
397          CLOSE c_account;
398 
399          l_account_ccid := l_err.SUSPENSE_CODE_COMBINATION_ID ;
400       END IF;
401 
402       xla_accounting_err_pkg.build_message(
403                  p_appli_s_name         => 'XLA'
404                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
405                 ,p_token_1              => 'MESSAGE'
406                 ,p_value_1              => 'Unable to derive valid GL Account for Suspense Account :'||
407                                             l_account||' with Balance Segment Value ' || l_err.bal_seg_value
408                 ,p_token_2              => 'LOCATION'
409                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.populate_bsv_suspense_ccid'
410                 ,p_entity_id            => l_err.entity_id
411                 ,p_event_id             => l_err.event_id
412                 ,p_ledger_id            => g_ledger_id
413                 ,p_ae_header_id         => l_err.ae_header_id
414                 ,p_ae_line_num          => NULL
415                 ,p_accounting_batch_id  => NULL);
416     END LOOP;
417 
418     IF (C_LEVEL_EVENT >= g_log_level) THEN
419       trace(p_msg    => 'END LOOP - fill in populate_bsv_suspense_ccid error',
420             p_module => l_log_module,
421             p_level  => C_LEVEL_EVENT);
422     END IF;
423 
424   END IF;
425 
426   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
427     trace(p_msg    => 'End of function populate_bsv_suspense_ccid',
428           p_module => l_log_module,
429           p_level  => C_LEVEL_PROCEDURE);
430   END IF;
431 
432 EXCEPTION
433 WHEN xla_exceptions_pkg.application_exception THEN
434   IF (c_ccid%ISOPEN) THEN
435     CLOSE c_ccid;
436   END IF;
437   IF (c_seg_number%ISOPEN) THEN
438     CLOSE c_seg_number;
439   END IF;
440   IF (c_errors%ISOPEN) THEN
441     CLOSE c_errors;
442   END IF;
443   IF (c_account%ISOPEN) THEN
444     CLOSE c_account;
445   END IF;
446   RAISE;
447 
448 WHEN OTHERS THEN
449   IF (c_ccid%ISOPEN) THEN
450     CLOSE c_ccid;
451   END IF;
452   IF (c_seg_number%ISOPEN) THEN
453     CLOSE c_seg_number;
454   END IF;
455   IF (c_errors%ISOPEN) THEN
456     CLOSE c_errors;
457   END IF;
458   IF (c_account%ISOPEN) THEN
459     CLOSE c_account;
460   END IF;
461   xla_exceptions_pkg.raise_message
462       (p_location => 'xla_je_validation_pkg.populate_bsv_suspense_ccid');
463 END populate_bsv_suspense_ccid;
464 
465 --=============================================================================
466 --
467 --
468 --
469 --=============================================================================
470 FUNCTION get_period_name
471   (p_ledger_id          IN  INTEGER
472   ,p_accounting_date    IN  DATE
473   ,p_closing_status     OUT NOCOPY VARCHAR2
474   ,p_period_type        OUT NOCOPY VARCHAR2)
475 RETURN VARCHAR2
476 IS
477   CURSOR c IS
478     SELECT      closing_status, period_name, period_type
479     FROM        gl_period_statuses
480     WHERE       application_id          = C_GL_APPLICATION_ID
481       AND       ledger_id               = p_ledger_id
482       AND       adjustment_period_flag  = 'N'
483       AND       p_accounting_date       BETWEEN start_date AND end_date;
484   l_period_name         VARCHAR2(25);
485   l_log_module          VARCHAR2(240);
486 BEGIN
487   IF g_log_enabled THEN
488     l_log_module := C_DEFAULT_MODULE||'.get_period_name';
489   END IF;
490 
491   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
492     trace(p_msg    => 'BEGIN of function get_period_name',
493           p_module => l_log_module,
494           p_level  => C_LEVEL_PROCEDURE);
495     trace(p_msg    => 'p_ledger_id = '||p_ledger_id,
496           p_module => l_log_module,
497           p_level  => C_LEVEL_PROCEDURE);
498     trace(p_msg    => 'p_accounting_date = '||p_accounting_date,
499           p_module => l_log_module,
500           p_level  => C_LEVEL_PROCEDURE);
501   END IF;
502 
503   OPEN c;
504   FETCH c INTO p_closing_status, l_period_name, p_period_type;
505   CLOSE c;
506 
507   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
508     trace(p_msg    => 'END of function get_period_name',
509           p_module => l_log_module,
510           p_level  => C_LEVEL_PROCEDURE);
511   END IF;
512 
513   RETURN l_period_name;
514 EXCEPTION
515 WHEN xla_exceptions_pkg.application_exception THEN
516   IF (c%ISOPEN) THEN
517     CLOSE c;
518   END IF;
519   RAISE;
520 
521 WHEN OTHERS THEN
522   IF (c%ISOPEN) THEN
523     CLOSE c;
524   END IF;
525   xla_exceptions_pkg.raise_message
526       (p_location => 'xla_je_validation_pkg.get_period_name');
527 END get_period_name;
528 
529 
530 --=============================================================================
531 --
532 -- Name: validate_period
533 -- Description: Determine if the accounting date is in an open period.
534 -- Result code:
535 --      0 - the accounting date is in an open or a future open period
536 --      1 - the accounting date is not in an open or a future open period
537 --      2 - no valid period is found for the accounting date
538 --
539 --=============================================================================
540 FUNCTION validate_period
541   (p_ledger_id                  IN  INTEGER
542   ,p_accounting_date            IN  DATE
543   ,p_period_name                OUT NOCOPY VARCHAR2)
544 RETURN INTEGER
545 IS
546   l_status      VARCHAR2(30);
547   l_result      INTEGER := 0;
548   l_period_type VARCHAR2(30);
549   l_log_module  VARCHAR2(240);
550 BEGIN
551   IF g_log_enabled THEN
552     l_log_module := C_DEFAULT_MODULE||'.validate_period';
553   END IF;
554 
555   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
556     trace(p_msg    => 'BEGIN of function validate_period',
557           p_module => l_log_module,
558           p_level  => C_LEVEL_PROCEDURE);
559     trace(p_msg    => 'p_ledger_id = '||p_ledger_id,
560           p_module => l_log_module,
561           p_level  => C_LEVEL_PROCEDURE);
562     trace(p_msg    => 'p_accounting_date = '||p_accounting_date,
563           p_module => l_log_module,
564           p_level  => C_LEVEL_PROCEDURE);
565   END IF;
566 
567   p_period_name := get_period_name
568         (p_ledger_id            => p_ledger_id
569         ,p_accounting_date      => p_accounting_date
570         ,p_closing_status       => l_status
571         ,p_period_type          => l_period_type);
572 
573   IF (p_period_name = '') THEN
574     l_result := 2;
575   ELSIF l_status NOT IN ('F', 'O') THEN
576     l_result := 1;
577   END IF;
578 
579   IF (C_LEVEL_EVENT >= g_log_level) THEN
580     trace(p_msg    => 'p_period_name = '||p_period_name,
581           p_module => l_log_module,
582           p_level  => C_LEVEL_EVENT);
583     trace(p_msg    => 'l_status = '||l_status,
584           p_module => l_log_module,
585           p_level  => C_LEVEL_EVENT);
586     trace(p_msg    => 'l_result(validate_period) = '||l_result,
587           p_module => l_log_module,
588           p_level  => C_LEVEL_EVENT);
589   END IF;
590 
591   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
592     trace(p_msg    => 'END of function validate_period',
593           p_module => l_log_module,
594           p_level  => C_LEVEL_PROCEDURE);
595   END IF;
596 
597   RETURN l_result;
598 EXCEPTION
599 WHEN xla_exceptions_pkg.application_exception THEN
600   RAISE;
601 
602 WHEN OTHERS THEN
603   xla_exceptions_pkg.raise_message
604       (p_location => 'xla_je_validation_pkg.validate_period');
605 
606 END validate_period;
607 
608 
609 --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
610 --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
611 --
612 --
613 --
614 --
615 --
616 -- Followings are the balancing routines and the related validation routines
617 --
618 --
619 --
620 --
621 --
622 --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
623 --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
624 
625 --=============================================================================
626 --
627 -- Name: initialize
628 -- Description: This procedure initialize the global variables required for
629 --              the validation routine.
630 --
631 --=============================================================================
632 PROCEDURE initialize
633   (p_application_id             IN  INTEGER
634   ,p_ledger_id                  IN  INTEGER
635   ,p_ae_header_id               IN  INTEGER
636   ,p_end_date                   IN  DATE                  -- 4262811
637   ,p_mode                       IN  VARCHAR2              -- 4262811
638   ,p_balance_flag               IN  BOOLEAN
639   ,p_accounting_mode            IN  VARCHAR2)
640 IS
641   l_log_module  VARCHAR2(240);
642 
643   cursor c_profile_user_name (l_profile_name VARCHAR2) IS
644   select user_profile_option_name
645   from   fnd_profile_options_vl
646   where  profile_option_name = l_profile_name;
647 
648 BEGIN
649   IF g_log_enabled THEN
650     l_log_module := C_DEFAULT_MODULE||'.initialize';
651   END IF;
652 
653   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
654     trace(p_msg    => 'BEGIN of procedure initialize',
655           p_module => l_log_module,
656           p_level  => C_LEVEL_PROCEDURE);
657   END IF;
658 
659   --
660   -- Initialize application level information
661   --
662   g_application_id := p_application_id;
663   g_trx_ledger_id  := p_ledger_id;
664   g_balance_flag   := p_balance_flag;
665   g_accounting_mode:= p_accounting_mode;
666   g_err_count      := 0;
667   g_new_line_count := 0;
668   -- 4262811 ------------------------------------------------
669   g_end_date       := p_end_date;
670   --g_mode         := p_mode;   -- 4262811a
671   IF (p_mode = 'CREATE_ACCOUNTING') THEN
672      g_caller := C_CALLER_ACCT_PROGRAM;
673   ELSIF (p_mode = 'COMPLETE_MPA') THEN
674      g_caller := C_CALLER_MPA_PROGRAM;
675   ELSIF (p_mode = 'THIRD_PARTY_MERGE') THEN
676      g_caller := C_CALLER_THIRD_PARTY_MERGE;
677   ELSE
678      g_caller := C_CALLER_MANUAL;
679   END IF;
680   -----------------------------------------------------------
681 
682   SELECT nvl(control_account_type_code, 'N')
683 --        ,control_account_enabled_flag
684         ,je_source_name
685   INTO   g_app_ctl_acct_source_code
686 --        ,g_app_ctl_acct_enabled_flag
687         ,g_app_je_source_name
688   FROM   xla_subledgers
689   WHERE  application_id = g_application_id;
690 
691   IF (p_ae_header_id IS NULL) THEN
692   --  g_caller := C_CALLER_ACCT_PROGRAM;    -- 4262811
693 
694     UPDATE xla_ae_headers_gt h
695        SET (period_year,period_closing_status) =
696            (SELECT period_year,closing_status
697               FROM gl_period_statuses gl
698              WHERE gl.period_name    = h.period_name
699                AND gl.ledger_id      = h.ledger_id
700                AND gl.application_id = 101);
701 
702   ELSE
703      g_ae_header_id := p_ae_header_id;
704   -- g_caller := C_CALLER_MANUAL;    -- 4262811
705   END IF;
706 
707   --
708   -- Initialize ledger security information
709   --
710   g_use_ledger_security := NVL(fnd_profile.value('XLA_USE_LEDGER_SECURITY'), 'N');
711 
712   IF (g_use_ledger_security = 'Y') THEN
713     g_pri_access_set_id := fnd_profile.value('GL_ACCESS_SET_ID');
714     g_sec_access_set_id := fnd_profile.value('XLA_GL_SECONDARY_ACCESS_SET_ID');
715 
716     ----------------------------------------------------------------------------------------
717     -- 5109176 find the user profile name for the error message XLA_AP_ACCESS_SET_VIOLATION
718     ----------------------------------------------------------------------------------------
719     open  c_profile_user_name('GL_ACCESS_SET_ID');
720     fetch c_profile_user_name into g_pri_access_set_name;
721     close c_profile_user_name;
722     open  c_profile_user_name('XLA_GL_SECONDARY_ACCESS_SET_ID');
723     fetch c_profile_user_name into g_sec_access_set_name;
724     close c_profile_user_name;
725     ------------------------------------------------------------
726 
727     IF (g_pri_access_set_id IS NULL AND g_sec_access_set_id IS NULL) THEN
728 
729       g_use_ledger_security := 'N';
730 
731     ELSE
732       g_pri_security_seg_code := 'N';
733       g_sec_security_seg_code := 'N';
734 
735       IF (g_pri_access_set_id IS NOT NULL) THEN
736         SELECT    security_segment_code, chart_of_accounts_id
737         INTO      g_pri_security_seg_code, g_pri_coa_id
738         FROM      gl_access_sets
739         WHERE     access_set_id   = g_pri_access_set_id;
740       END IF;
741 
742       IF (g_sec_access_set_id IS NOT NULL) THEN
743         SELECT    security_segment_code, chart_of_accounts_id
744         INTO      g_sec_security_seg_code, g_sec_coa_id
745         FROM      gl_access_sets
746         WHERE     access_set_id   = g_sec_access_set_id;
747       END IF;
748 
749       IF (g_sec_security_seg_code = 'F' AND g_pri_security_seg_code <> 'F') OR
750          (g_pri_security_seg_code = 'N' AND g_sec_security_seg_code <> 'N') OR
751          (g_pri_security_seg_code = 'M' AND g_sec_security_seg_code = 'B') THEN
752         g_tmp_coa_id := g_pri_coa_id;
753         g_pri_coa_id := g_sec_coa_id;
754         g_sec_coa_id := g_tmp_coa_id;
755         g_tmp_security_seg_code := g_pri_security_seg_code;
756         g_pri_security_seg_code := g_sec_security_seg_code;
757         g_sec_security_seg_code := g_tmp_security_seg_code;
758 
759         --------------------------------------------------------------------------------------------------
760         -- 5109176  To handle setting Primary Access set to Secondary Access set when Primary is null
761         --------------------------------------------------------------------------------------------------
762         g_tmp_access_set_id   := g_pri_access_set_id;
763         g_pri_access_set_id   := g_sec_access_set_id;
764         g_sec_access_set_id   := g_tmp_access_set_id;
765         g_tmp_access_set_name := g_pri_access_set_name;
766         g_pri_access_set_name := g_sec_access_set_name;
767         g_sec_access_set_name := g_tmp_access_set_name;
768 
769       END IF;
770 
771       IF (C_LEVEL_EVENT >= g_log_level) THEN
772         trace(p_msg    => 'g_pri_access_set_id = '||g_pri_access_set_id,
773               p_module => l_log_module,
774               p_level  => C_LEVEL_EVENT);
775         trace(p_msg    => 'g_pri_security_seg_code = '||g_pri_security_seg_code,
776               p_module => l_log_module,
777               p_level  => C_LEVEL_EVENT);
778         trace(p_msg    => 'g_pri_coa_id = '||g_pri_coa_id,
779               p_module => l_log_module,
780               p_level  => C_LEVEL_EVENT);
781         trace(p_msg    => 'g_sec_access_set_id = '||g_sec_access_set_id,
782               p_module => l_log_module,
783               p_level  => C_LEVEL_EVENT);
784         trace(p_msg    => 'g_sec_security_seg_code = '||g_sec_security_seg_code,
785               p_module => l_log_module,
786               p_level  => C_LEVEL_EVENT);
787         trace(p_msg    => 'g_sec_coa_id = '||g_sec_coa_id,
788               p_module => l_log_module,
789               p_level  => C_LEVEL_EVENT);
790       END IF;
791     END IF;
792   END IF;
793 
794   IF (C_LEVEL_EVENT >= g_log_level) THEN
795     trace(p_msg    => 'g_use_ledger_security = '||g_use_ledger_security,
796           p_module => l_log_module,
797           p_level  => C_LEVEL_EVENT);
798   END IF;
799 
800   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
801     trace(p_msg    => 'END of procedure initialize',
802           p_module => l_log_module,
803           p_level  => C_LEVEL_PROCEDURE);
804   END IF;
805 
806 EXCEPTION
807 WHEN xla_exceptions_pkg.application_exception THEN
808   RAISE;
809 
810 WHEN OTHERS THEN
811   xla_exceptions_pkg.raise_message
812       (p_location => 'xla_je_validation_pkg.initialize');
813 
814 END initialize;
815 
816 --=============================================================================
817 --
818 -- Name: validate_ledger_security
819 -- Description: This procedure will validate the line againist the
820 --              access set ledger security.
821 --
822 --=============================================================================
823 PROCEDURE validate_ledger_security
824 IS
825   CURSOR c_full_none IS
826     SELECT asa.ledger_id
827       FROM gl_access_set_assignments asa
828      WHERE asa.ledger_id             = g_ledger_id
829        AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
830        AND asa.access_set_id         = g_pri_access_set_id;
831 
832   CURSOR c_full_full IS
833     SELECT asa.ledger_id
834       FROM gl_access_set_assignments asa
835      WHERE asa.ledger_id             = g_ledger_id
836        AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
837        AND asa.access_set_id         in (g_pri_access_set_id, g_sec_access_set_id);
838 
839   CURSOR c_err IS
840     SELECT  entity_id, event_id, ae_header_id
841       FROM  xla_validation_lines_gt;
842 
843   l_err              c_err%ROWTYPE;
844   l_ledger_id        INTEGER;
845   l_log_module       VARCHAR2(240);
846 BEGIN
847   IF g_log_enabled THEN
848     l_log_module := C_DEFAULT_MODULE||'.validate_ledger_security';
849   END IF;
850 
851   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
852     trace(p_msg    => 'BEGIN of procedure validate_ledger_security',
853           p_module => l_log_module,
854           p_level  => C_LEVEL_PROCEDURE);
855   END IF;
856 
857   IF (g_sec_security_seg_code = 'N') THEN
858     OPEN c_full_none;
859     FETCH c_full_none INTO l_ledger_id;
860     CLOSE c_full_none;
861   ELSIF (g_sec_security_seg_code = 'F') THEN
862     OPEN c_full_full;
863     FETCH c_full_full INTO l_ledger_id;
864     CLOSE c_full_full;
865   END IF;
866 
867   IF (l_ledger_id IS NULL) THEN
868     IF (g_access_set_name IS NULL) THEN
869       SELECT  u.user_name, a.name
870       INTO    g_user_name, g_access_set_name
871       FROM    fnd_user u, gl_access_sets a
872       WHERE   u.user_id       = xla_environment_pkg.g_usr_id
873       AND     a.access_set_id = g_pri_access_set_id;
874     END IF;
875 
876     IF (C_LEVEL_EVENT >= g_log_level) THEN
877       trace(p_msg    => 'BEGIN LOOP - invalid access set ledger security',
878             p_module => l_log_module,
879             p_level  => C_LEVEL_EVENT);
880     END IF;
881 
882     FOR l_err IN c_err LOOP
883       IF (C_LEVEL_ERROR >= g_log_level) THEN
884         trace(p_msg    => 'LOOP invalid access set ledger security: ae_header_id = '||l_err.ae_header_id,
885               p_module => l_log_module,
886               p_level  => C_LEVEL_ERROR);
887       END IF;
888 
889       g_err_count := g_err_count+1;
890       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
891       g_err_event_ids(g_err_count) := l_err.event_id;
892 
893       xla_accounting_err_pkg.build_message(
894               p_appli_s_name          => 'XLA'
895               ,p_msg_name             => 'XLA_AP_ACCESS_SET_VIOLATION'
896               ,p_token_1              => 'ACCESS_SET'
897               ,p_value_1              => g_access_set_name
898               ,p_token_2              => 'LEDGER_NAME'
899               ,p_value_2              => g_ledger_name
900               ,p_token_3              => 'PRI_DATA_ACCESS_SET'  -- 5109176
901               ,p_value_3              => g_pri_access_set_name
902               ,p_entity_id            => l_err.entity_id
903               ,p_event_id             => l_err.event_id
904               ,p_ledger_id            => g_ledger_id
905               ,p_ae_header_id         => l_err.ae_header_id
906               ,p_ae_line_num          => NULL
907               ,p_accounting_batch_id  => NULL);
908     END LOOP;
909 
910     IF (C_LEVEL_EVENT >= g_log_level) THEN
911       trace(p_msg    => 'END LOOP - invalid access set ledger security',
912             p_module => l_log_module,
913             p_level  => C_LEVEL_EVENT);
914     END IF;
915   END IF;
916 
917   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
918     trace(p_msg    => 'BEGIN of procedure validate_ledger_security',
919           p_module => l_log_module,
920           p_level  => C_LEVEL_PROCEDURE);
921   END IF;
922 
923 EXCEPTION
924 WHEN xla_exceptions_pkg.application_exception THEN
925   IF c_full_full%ISOPEN THEN
926     CLOSE c_full_full;
927   END IF;
928   IF c_full_none%ISOPEN THEN
929     CLOSE c_full_none;
930   END IF;
931   RAISE;
932 
933 WHEN OTHERS THEN
934   IF c_full_full%ISOPEN THEN
935     CLOSE c_full_full;
936   END IF;
937   IF c_full_none%ISOPEN THEN
938     CLOSE c_full_none;
939   END IF;
940   xla_exceptions_pkg.raise_message
941       (p_location => 'xla_je_validation_pkg.validate_ledger_security');
942 
943 END validate_ledger_security;
944 
945 --=============================================================================
946 --
947 -- Name: validate_segment_security
948 -- Description: This procedure will validate the line againist the
949 --              access set segment security.
950 --
951 --=============================================================================
952 PROCEDURE validate_segment_security
953 IS
954   CURSOR c_full_bal IS
955     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
956            ,NULL segment_value
957       FROM  xla_validation_lines_gt t
958             LEFT OUTER JOIN gl_access_set_assignments asa
959             on  asa.ledger_id             = g_ledger_id
960             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
961             AND asa.access_set_id         = g_pri_access_set_id
962             LEFT OUTER JOIN gl_access_set_assignments asa2
963             on  asa2.segment_value         = t.bal_seg_value
964             AND asa2.ledger_id             = g_ledger_id
965             AND asa2.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
966             AND asa2.access_set_id         = g_sec_access_set_id
967      WHERE  asa.access_set_id IS NULL
968        AND  asa2.access_set_id IS NULL;
969 
970   CURSOR c_full_mgt IS
971     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
972            ,NULL segment_value
973       FROM  xla_validation_lines_gt t
974             LEFT OUTER JOIN gl_access_set_assignments asa
975             on  asa.ledger_id             = g_ledger_id
976             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
977             AND asa.access_set_id         = g_pri_access_set_id
978             LEFT OUTER JOIN gl_access_set_assignments asa2
979             on  asa2.segment_value         = t.mgt_seg_value
980             AND asa2.ledger_id             = g_ledger_id
981             AND asa2.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
982             AND asa2.access_set_id         = g_sec_access_set_id
983      WHERE  asa.access_set_id IS NULL
984        AND  asa2.access_set_id IS NULL;
985 
986   CURSOR c_bal_none IS
987     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
988            ,t.bal_seg_value segment_value
989       FROM  xla_validation_lines_gt t
990             LEFT OUTER JOIN gl_access_set_assignments asa
991             ON  asa.segment_value         = t.bal_seg_value
992             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
993             AND asa.ledger_id             = g_ledger_id
994             AND asa.access_set_id         = g_pri_access_set_id
995      WHERE  asa.access_set_id IS NULL;
996 
997   CURSOR c_bal_bal IS
998     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
999            ,t.bal_seg_value segment_value
1000       FROM  xla_validation_lines_gt t
1001             LEFT OUTER JOIN gl_access_set_assignments asa
1002             ON  asa.segment_value         = t.bal_seg_value
1003             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
1004             AND asa.ledger_id             = g_ledger_id
1005             AND asa.access_set_id         in (g_pri_access_set_id, g_sec_access_set_id)
1006      WHERE  asa.access_set_id IS NULL;
1007 
1008   CURSOR c_bal_mgt IS
1009     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
1010            ,t.bal_seg_value segment_value
1011       FROM  xla_validation_lines_gt t
1012             LEFT OUTER JOIN gl_access_set_assignments asa
1013             on  asa.segment_value         = t.bal_seg_value
1014             AND asa.ledger_id             = g_ledger_id
1015             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
1016             AND asa.access_set_id         = g_pri_access_set_id
1017             LEFT OUTER JOIN gl_access_set_assignments asa2
1018             on  asa2.segment_value         = t.mgt_seg_value
1019             AND asa2.ledger_id             = g_ledger_id
1020             AND asa2.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
1021             AND asa2.access_set_id         = g_sec_access_set_id
1022      WHERE  asa.access_set_id IS NULL
1023        AND  asa2.access_set_id IS NULL;
1024 
1025   CURSOR c_mgt_none IS
1026     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
1027            ,t.mgt_seg_value segment_value
1028       FROM  xla_validation_lines_gt t
1029             LEFT OUTER JOIN gl_access_set_assignments asa
1030             ON  asa.segment_value         = t.mgt_seg_value
1031             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
1032             AND asa.ledger_id             = g_ledger_id
1033             AND asa.access_set_id         = g_pri_access_set_id
1034      WHERE  asa.access_set_id IS NULL;
1035 
1036   CURSOR c_mgt_mgt IS
1037     SELECT  t.entity_id, t.event_id, t.ae_header_id, t.ae_line_num
1038            ,t.mgt_seg_value segment_value
1039       FROM  xla_validation_lines_gt t
1040             LEFT OUTER JOIN gl_access_set_assignments asa
1041             ON  asa.segment_value         = t.mgt_seg_value
1042             AND asa.access_privilege_code = C_ACCESS_SET_FULL_PRIVILEGE
1043             AND asa.ledger_id             = g_ledger_id
1044             AND asa.access_set_id         in (g_pri_access_set_id, g_sec_access_set_id)
1045      WHERE  asa.access_set_id IS NULL;
1046 
1047   l_pri_security_seg_code     VARCHAR2(1);
1048   l_sec_security_seg_code     VARCHAR2(1);
1049   l_err                       c_mgt_mgt%ROWTYPE;
1050   l_log_module                VARCHAR2(240);
1051 BEGIN
1052   IF g_log_enabled THEN
1053     l_log_module := C_DEFAULT_MODULE||'.validate_segment_security';
1054   END IF;
1055 
1056   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1057     trace(p_msg    => 'BEGIN of procedure validate_segment_security',
1058           p_module => l_log_module,
1059           p_level  => C_LEVEL_PROCEDURE);
1060   END IF;
1061 
1062   -- If the management column name is NULL, discard it from validation
1063   l_pri_security_seg_code := g_pri_security_seg_code;
1064   l_sec_security_seg_code := g_sec_security_seg_code;
1065 
1066   IF (g_mgt_seg_column_name IS NULL) THEN
1067     IF (g_sec_security_seg_code = 'M') THEN
1068       l_sec_security_seg_code := 'N';
1069     END IF;
1070     IF (g_pri_security_seg_code = 'M') THEN
1071       l_pri_security_seg_code := l_sec_security_seg_code;
1072       l_sec_security_seg_code := 'N';
1073     END IF;
1074     -- If management column name is NULL and only management segment validation
1075     -- was specified to start with, no further validation is necessary.
1076     IF (l_pri_security_seg_code = 'N' AND
1077         l_sec_security_seg_code = 'N') THEN
1078       RETURN;
1079     END IF;
1080   END IF;
1081 
1082   IF (l_pri_security_seg_code = 'F') THEN
1083     IF (l_sec_security_seg_code = 'B') THEN
1084       OPEN c_full_bal;
1085     ELSIF(l_sec_security_seg_code = 'M') THEN
1086       OPEN c_full_mgt;
1087     END IF;
1088   ELSIF (l_pri_security_seg_code = 'B') THEN
1089     IF (l_sec_security_seg_code = 'N') THEN
1090       OPEN c_bal_none;
1091     ELSIF (l_sec_security_seg_code = 'B') THEN
1092       OPEN c_bal_bal;
1093     ELSIF(l_sec_security_seg_code = 'M') THEN
1094       OPEN c_bal_mgt;
1095     END IF;
1096   ELSIF (l_pri_security_seg_code = 'M') THEN
1097     IF (l_sec_security_seg_code = 'N') THEN
1098       OPEN c_mgt_none;
1099     ELSIF(l_sec_security_seg_code = 'M') THEN
1100       OPEN c_mgt_mgt;
1101     END IF;
1102   END IF;
1103 
1104   IF (C_LEVEL_EVENT >= g_log_level) THEN
1105     trace(p_msg    => 'BEGIN LOOP - invalid access set segments',
1106           p_module => l_log_module,
1107           p_level  => C_LEVEL_EVENT);
1108   END IF;
1109 
1110   LOOP
1111     IF (l_pri_security_seg_code = 'F') THEN
1112       IF (l_sec_security_seg_code = 'B') THEN
1113         FETCH c_full_bal INTO l_err;
1114         EXIT WHEN c_full_bal%NOTFOUND;
1115       ELSIF(l_sec_security_seg_code = 'M') THEN
1116         FETCH c_full_mgt INTO l_err;
1117         EXIT WHEN c_full_mgt%NOTFOUND;
1118       END IF;
1119     ELSIF (l_pri_security_seg_code = 'B') THEN
1120       IF (l_sec_security_seg_code = 'N') THEN
1121         FETCH c_bal_none INTO l_err;
1122         EXIT WHEN c_bal_none%NOTFOUND;
1123       ELSIF (l_sec_security_seg_code = 'B') THEN
1124         FETCH c_bal_bal INTO l_err;
1125         EXIT WHEN c_bal_bal%NOTFOUND;
1126       ELSIF(l_sec_security_seg_code = 'M') THEN
1127         FETCH c_bal_mgt INTO l_err;
1128         EXIT WHEN c_bal_mgt%NOTFOUND;
1129       END IF;
1130     ELSIF (l_pri_security_seg_code = 'M') THEN
1131       IF (l_sec_security_seg_code = 'N') THEN
1132         FETCH c_mgt_none INTO l_err;
1133         EXIT WHEN c_mgt_none%NOTFOUND;
1134       ELSIF(l_sec_security_seg_code = 'M') THEN
1135         FETCH c_mgt_mgt INTO l_err;
1136         EXIT WHEN c_mgt_mgt%NOTFOUND;
1137       END IF;
1138     END IF;
1139 
1140     IF (C_LEVEL_ERROR >= g_log_level) THEN
1141       trace(p_msg    => 'LOOP invalid access set segments: ae_header_id = '||l_err.ae_header_id||
1142                         ', ae_line_num = '||l_err.ae_line_num,
1143             p_module => l_log_module,
1144             p_level  => C_LEVEL_ERROR);
1145     END IF;
1146 
1147     IF (l_pri_security_seg_code = 'F') THEN
1148       IF (g_access_set_name IS NULL) THEN
1149         SELECT  u.user_name, a.name
1150         INTO    g_user_name, g_access_set_name
1151         FROM    fnd_user u, gl_access_sets a
1152         WHERE   u.user_id       = xla_environment_pkg.g_usr_id
1153         AND     a.access_set_id = g_pri_access_set_id;
1154       END IF;
1155 
1156       g_err_count := g_err_count+1;
1157       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
1158       g_err_event_ids(g_err_count) := l_err.event_id;
1159 
1160       xla_accounting_err_pkg.build_message(
1161               p_appli_s_name          => 'XLA'
1162               ,p_msg_name             => 'XLA_AP_ACCESS_SET_VIOLATION'
1163               ,p_token_1              => 'ACCESS_SET'
1164               ,p_value_1              => g_access_set_name
1165               ,p_token_2              => 'LEDGER_NAME'
1166               ,p_value_2              => g_ledger_name
1167               ,p_token_3              => 'PRI_DATA_ACCESS_SET'  -- 5109176
1168               ,p_value_3              => g_pri_access_set_name
1169               ,p_entity_id            => l_err.entity_id
1170               ,p_event_id             => l_err.event_id
1171               ,p_ledger_id            => g_ledger_id
1172               ,p_ae_header_id         => l_err.ae_header_id
1173               ,p_ae_line_num          => l_err.ae_line_num
1174               ,p_accounting_batch_id  => NULL);
1175     ELSIF (l_pri_security_seg_code = 'B') THEN
1176       g_err_count := g_err_count+1;
1177       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
1178       g_err_event_ids(g_err_count) := l_err.event_id;
1179 
1180       xla_accounting_err_pkg.build_message(
1181               p_appli_s_name          => 'XLA'
1182               ,p_msg_name             => 'XLA_AP_BSV_SECURITY_VIOLATION'
1183               ,p_token_1              => 'BALANCING_SEGMENT_VALUE'
1184               ,p_value_1              => l_err.segment_value
1185               ,p_token_2              => 'LINE_NUM'
1186               ,p_value_2              => l_err.ae_line_num
1187               ,p_entity_id            => l_err.entity_id
1188               ,p_event_id             => l_err.event_id
1189               ,p_ledger_id            => g_ledger_id
1190               ,p_ae_header_id         => l_err.ae_header_id
1191               ,p_ae_line_num          => l_err.ae_line_num
1192               ,p_accounting_batch_id  => NULL);
1193     ELSE
1194       g_err_count := g_err_count+1;
1195       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
1196       g_err_event_ids(g_err_count) := l_err.event_id;
1197 
1198       xla_accounting_err_pkg.build_message(
1199               p_appli_s_name          => 'XLA'
1200               ,p_msg_name             => 'XLA_AP_MSV_SECURITY_VIOLATION'
1201               ,p_token_1              => 'MANAGEMENT_SEGMENT_VALUE'
1202               ,p_value_1              => l_err.segment_value
1203               ,p_token_2              => 'LINE_NUM'
1204               ,p_value_2              => l_err.ae_line_num
1205               ,p_entity_id            => l_err.entity_id
1206               ,p_event_id             => l_err.event_id
1207               ,p_ledger_id            => g_ledger_id
1208               ,p_ae_header_id         => l_err.ae_header_id
1209               ,p_ae_line_num          => l_err.ae_line_num
1210               ,p_accounting_batch_id  => NULL);
1211     END IF;
1212   END LOOP;
1213 
1214   IF (C_LEVEL_EVENT >= g_log_level) THEN
1215     trace(p_msg    => 'END LOOP - invalid access set segments',
1216           p_module => l_log_module,
1217           p_level  => C_LEVEL_EVENT);
1218   END IF;
1219 
1220   IF (l_pri_security_seg_code = 'F') THEN
1221     IF (l_sec_security_seg_code = 'B') THEN
1222       CLOSE c_full_bal;
1223     ELSIF(l_sec_security_seg_code = 'M') THEN
1224       CLOSE c_full_mgt;
1225     END IF;
1226   ELSIF (l_pri_security_seg_code = 'B') THEN
1227     IF (l_sec_security_seg_code = 'N') THEN
1228       CLOSE c_bal_none;
1229     ELSIF (l_sec_security_seg_code = 'B') THEN
1230       CLOSE c_bal_bal;
1231     ELSIF(l_sec_security_seg_code = 'M') THEN
1232       CLOSE c_bal_mgt;
1233     END IF;
1234   ELSIF (l_pri_security_seg_code = 'M') THEN
1235     IF (l_sec_security_seg_code = 'N') THEN
1236       CLOSE c_mgt_none;
1237     ELSIF(l_sec_security_seg_code = 'M') THEN
1238       CLOSE c_mgt_mgt;
1239     END IF;
1240   END IF;
1241 
1242   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1243     trace(p_msg    => 'End of procedure validate_segment_security',
1244           p_module => l_log_module,
1245           p_level  => C_LEVEL_PROCEDURE);
1246   END IF;
1247 
1248 EXCEPTION
1249 WHEN xla_exceptions_pkg.application_exception THEN
1250   IF c_full_bal%ISOPEN THEN
1251     CLOSE c_full_bal;
1252   END IF;
1253   IF c_full_mgt%ISOPEN THEN
1254     CLOSE c_full_mgt;
1255   END IF;
1256   IF c_bal_none%ISOPEN THEN
1257     CLOSE c_bal_none;
1258   END IF;
1259   IF c_bal_bal%ISOPEN THEN
1260     CLOSE c_bal_bal;
1261   END IF;
1262   IF c_bal_mgt%ISOPEN THEN
1263     CLOSE c_bal_mgt;
1264   END IF;
1265   IF c_mgt_none%ISOPEN THEN
1266     CLOSE c_mgt_none;
1267   END IF;
1268   IF c_mgt_mgt%ISOPEN THEN
1269     CLOSE c_mgt_mgt;
1270   END IF;
1271   RAISE;
1272 
1273 WHEN OTHERS THEN
1274   IF c_full_bal%ISOPEN THEN
1275     CLOSE c_full_bal;
1276   END IF;
1277   IF c_full_mgt%ISOPEN THEN
1278     CLOSE c_full_mgt;
1279   END IF;
1280   IF c_bal_none%ISOPEN THEN
1281     CLOSE c_bal_none;
1282   END IF;
1283   IF c_bal_bal%ISOPEN THEN
1284     CLOSE c_bal_bal;
1285   END IF;
1286   IF c_bal_mgt%ISOPEN THEN
1287     CLOSE c_bal_mgt;
1288   END IF;
1289   IF c_mgt_none%ISOPEN THEN
1290     CLOSE c_mgt_none;
1291   END IF;
1292   IF c_mgt_mgt%ISOPEN THEN
1293     CLOSE c_mgt_mgt;
1294   END IF;
1295   xla_exceptions_pkg.raise_message
1296       (p_location => 'xla_je_validation_pkg.validate_segment_security');
1297 END validate_segment_security;
1298 
1299 
1300 --=============================================================================
1301 --
1302 -- Name: validate_access_set_security
1303 -- Description: This procedure will validate the line againist the
1304 --              access set security.
1305 --
1306 --=============================================================================
1307 PROCEDURE validate_access_set_security
1308 IS
1309   l_log_module          VARCHAR2(240);
1310 BEGIN
1311   IF g_log_enabled THEN
1312     l_log_module := C_DEFAULT_MODULE||'.validate_access_set_security';
1313   END IF;
1314 
1315   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1316     trace(p_msg    => 'BEGIN of procedure validate_access_set_security',
1317           p_module => l_log_module,
1318           p_level  => C_LEVEL_PROCEDURE);
1319   END IF;
1320 
1321   IF (g_use_ledger_security = 'Y') THEN
1322     IF (g_pri_security_seg_code = 'F' AND
1323         g_sec_security_seg_code IN ('F', 'N')) THEN
1324       -- Fix bug 3534929
1325       -- Only perform ledger security if the current ledger is not the transaction
1326       -- ledger.  Otherwise, it is already validated in the LOV during submission.
1327       IF (g_ledger_id <> g_trx_ledger_id) THEN
1328         validate_ledger_security;
1329       END IF;
1330     ELSE
1331       validate_segment_security;
1332     END IF;
1333   END IF;
1334 
1335   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1336     trace(p_msg    => 'END of procedure validate_access_set_security',
1337           p_module => l_log_module,
1338           p_level  => C_LEVEL_PROCEDURE);
1339   END IF;
1340 
1341 EXCEPTION
1342 WHEN xla_exceptions_pkg.application_exception THEN
1343   RAISE;
1344 
1345 WHEN OTHERS THEN
1346   xla_exceptions_pkg.raise_message
1347       (p_location => 'xla_je_validation_pkg.validate_access_set_security');
1348 END validate_access_set_security;
1349 
1350 
1351 --=============================================================================
1352 --
1353 -- Name: load_lines
1354 -- Description: This function will retrieve all necessary line information
1355 --              and put them into the temporary table, which is the working
1356 --              table for this package.
1357 --
1358 --=============================================================================
1359 PROCEDURE load_lines
1360 (p_budgetary_control_mode VARCHAR2)
1361 IS
1362   i                     INTEGER;
1363   l_stmt                VARCHAR2(25000);
1364   l_log_module          VARCHAR2(240);
1365 BEGIN
1366 
1367   IF g_log_enabled THEN
1368     l_log_module := C_DEFAULT_MODULE||'.load_lines';
1369   END IF;
1370 
1371   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1372     trace(p_msg    => 'BEGIN of procedure load_lines',
1373           p_module => l_log_module,
1374           p_level  => C_LEVEL_PROCEDURE);
1375   END IF;
1376 
1377   --
1378   -- Retrieve all working data into the temporary table
1379   --
1380   -- Added in C_CALLER_MPA_PROGRAM for 4262811.
1381   IF (g_caller in (C_CALLER_ACCT_PROGRAM, C_CALLER_MPA_PROGRAM, C_CALLER_THIRD_PARTY_MERGE)) THEN
1382 
1383     IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1384       trace(p_msg    => 'g_suspense_allowed_flag = '||g_suspense_allowed_flag,
1385             p_module => l_log_module,
1386             p_level  => C_LEVEL_PROCEDURE);
1387     END IF;
1388 
1389     IF (p_budgetary_control_mode <> 'NONE') THEN
1390       --
1391       -- If running in BC mode, do not use suspense account nor substitute accounts.
1392       --
1393       l_stmt := '
1394       INSERT INTO xla_validation_lines_gt
1395         (ae_header_id
1396         ,ae_line_num
1397         ,ledger_id
1398         ,displayed_line_number
1399         ,max_ae_line_num
1400         ,max_displayed_line_number
1401         ,entity_id
1402         ,event_id
1403         ,balance_type_code
1404         ,budget_version_id
1405         ,encumbrance_type_id
1406         ,accounting_date
1407         ,je_category_name
1408         ,party_type_code
1409         ,party_id
1410         ,party_site_id
1411         ,entered_currency_code
1412         ,unrounded_entered_cr
1413         ,unrounded_entered_dr
1414         ,entered_cr
1415         ,entered_dr
1416         ,entered_currency_mau
1417         ,unrounded_accounted_cr
1418         ,unrounded_accounted_dr
1419         ,accounted_cr
1420         ,accounted_dr
1421         ,currency_conversion_type
1422         ,currency_conversion_date
1423         ,currency_conversion_rate
1424         ,code_combination_id
1425         ,accounting_class_code
1426         ,bal_seg_value
1427         ,mgt_seg_value
1428         ,cost_center_seg_value
1429         ,natural_account_seg_value
1430         ,ccid_coa_id
1431         ,ccid_enabled_flag
1432         ,ccid_summary_flag
1433         ,detail_posting_allowed_flag
1434         ,detail_budgeting_allowed_flag
1435         ,control_account_enabled_flag
1436         ,product_rule_type_code
1437         ,product_rule_code
1438         ,balancing_line_type
1439         ,error_flag
1440         ,substituted_ccid
1441         ,accounting_entry_status_code
1442         ,period_name
1443         ,gain_or_loss_flag
1444         )
1445       SELECT     /*+  cardinality(h,1) index(l, XLA_AE_LINES_U1) use_nl(l) use_nl(ccid) */
1446                  h.ae_header_id
1447                 ,l.ae_line_num
1448                 ,h.ledger_id
1449                 ,l.displayed_line_number
1450                 ,max(l.ae_line_num) over (partition by l.ae_header_id)
1451                 ,max(l.displayed_line_number) over (partition by l.ae_header_id)
1452                 ,h.entity_id
1453                 ,h.event_id
1454                 ,h.balance_type_code
1455                 ,h.budget_version_id
1456                 ,l.encumbrance_type_id
1457                 ,h.accounting_date
1458                 ,h.je_category_name
1459                 ,l.party_type_code
1460                 ,l.party_id
1461                 ,l.party_site_id
1462                 ,l.currency_code
1463                 ,l.unrounded_entered_cr
1464                 ,l.unrounded_entered_dr
1465                 ,l.entered_cr
1466                 ,l.entered_dr
1467                 ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
1468                 ,l.unrounded_accounted_cr
1469                 ,l.unrounded_accounted_dr
1470                 ,l.accounted_cr
1471                 ,l.accounted_dr
1472                 ,l.currency_conversion_type
1473                 ,l.currency_conversion_date
1474                 ,l.currency_conversion_rate
1475                 ,l.code_combination_id
1476                 ,l.accounting_class_code
1477                 ,ccid.'||g_bal_seg_column_name||'
1478                 ,'||CASE WHEN g_mgt_seg_column_name is NULL THEN 'NULL' ELSE 'ccid.'||g_mgt_seg_column_name END||'
1479                 ,'||CASE WHEN g_cc_seg_column_name  is NULL THEN 'NULL' ELSE 'ccid.'||g_cc_seg_column_name  END||'
1480                 ,'||CASE WHEN g_na_seg_column_name  is NULL THEN 'NULL' ELSE 'ccid.'||g_na_seg_column_name  END||'
1481                 ,ccid.chart_of_accounts_id
1482                 -- ccid_enabled_flag
1483                 ,CASE WHEN ccid.enabled_flag IS NULL THEN NULL
1484                       WHEN ccid.enabled_flag = ''N'' THEN ''N''
1485                       WHEN h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) THEN ''D''
1486                       WHEN h.accounting_date > nvl(ccid.end_date_active, h.accounting_date) THEN ''D''
1487                       ELSE ''Y''
1488                       END
1489                 ,CASE WHEN ccid.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
1490                 ,ccid.detail_posting_allowed_flag
1491                 ,ccid.detail_budgeting_allowed_flag
1492                 ,nvl(ccid.reference3,''N'')
1493                 ,h.product_rule_type_code
1494                 ,h.product_rule_code
1495                 ,'''||C_LINE_TYPE_PROCESS||'''
1496                 ,CASE WHEN ccid.enabled_flag IS NULL
1497                       or (ccid.code_combination_id = -1 and nvl(l.gain_or_loss_flag, ''N'')=''Y'')
1498                       or l.accounting_class_code IS NULL
1499                       or ccid.enabled_flag = ''N''
1500                       or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1501                       or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
1502                       or (ccid.summary_flag = ''Y'')
1503                       or (h.balance_type_code <> ''B'' AND ccid.detail_posting_allowed_flag = ''N'')
1504                       or (h.balance_type_code = ''B'' AND ccid.detail_budgeting_allowed_flag = ''N'')
1505                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
1506                           (nvl(ccid.reference3,''N'') NOT IN (''Y'', ''N'', ''R'', '''||g_app_ctl_acct_source_code||''')))
1507                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid.reference3,''N'') NOT IN  (''N'',''R''))
1508                       or (nvl(ccid.reference3,''N'') NOT IN  (''N'', ''R'' ) AND
1509                           (l.party_type_code IS NULL OR l.party_id IS NULL))
1510                       or (nvl(ccid.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
1511                       or (nvl(ccid.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
1512                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
1513                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
1514                     --  or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
1515                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
1516                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
1517                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
1518                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
1519                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
1520                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
1521                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
1522                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
1523                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
1524                       or (:1 = l.currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
1525                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
1526                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
1527                      /* or (:2 = l.currency_code AND
1528                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
1529                       or (:3 <> l.currency_code AND
1530                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
1531                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
1532                       or (:4 <> ccid.chart_of_accounts_id)
1533                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
1534                       THEN ''Y''
1535                       ELSE NULL
1536                       END
1537                 ,NULL -- substituted_ccid
1538                 ,h.accounting_entry_status_code
1539                 ,h.period_name
1540                 ,l.gain_or_loss_flag
1541       FROM       xla_ae_headers_gt      h
1542                 ,xla_ae_lines           l
1543                 ,gl_code_combinations   ccid
1544                 ,fnd_currencies fcu
1545       WHERE     ccid.code_combination_id(+) = l.code_combination_id
1546         AND     l.ae_header_id          = h.ae_header_id
1547         AND       h.ledger_id             = :5
1548         AND       l.currency_code = fcu.currency_code(+)
1549         AND     l.application_id        = '||g_application_id;
1550 
1551 
1552       -- added (+) on fcu.currency_code in all insert statements bug9590326
1553 
1554       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1555         trace(p_msg    => substr(l_stmt, 1, 4000),
1556             p_module => l_log_module,
1557             p_level  => C_LEVEL_STATEMENT);
1558         trace(p_msg    => substr(l_stmt, 4001, 4000),
1559           p_module => l_log_module,
1560           p_level  => C_LEVEL_STATEMENT);
1561         trace(p_msg    => substr(l_stmt, 8001, 4000),
1562           p_module => l_log_module,
1563           p_level  => C_LEVEL_STATEMENT);
1564         trace(p_msg    => substr(l_stmt, 12001, 4000),
1565           p_module => l_log_module,
1566           p_level  => C_LEVEL_STATEMENT);
1567         trace(p_msg    => substr(l_stmt, 16001, 4000),
1568           p_module => l_log_module,
1569           p_level  => C_LEVEL_STATEMENT);
1570         trace(p_msg    => substr(l_stmt, 20001, 4000),
1571           p_module => l_log_module,
1572           p_level  => C_LEVEL_STATEMENT);
1573       END IF;
1574 
1575       EXECUTE IMMEDIATE l_stmt using
1576           g_ledger_currency_code
1577        --  ,g_ledger_currency_code -- commented for bug:8417965
1578          ,g_ledger_currency_code
1579          ,g_ledger_coa_id
1580          ,g_ledger_id
1581          ;
1582 
1583       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
1584         trace(p_msg    => '# of rows inserted:'||to_char(SQL%ROWCOUNT),
1585               p_module => l_log_module,
1586               p_level  => C_LEVEL_STATEMENT);
1587       END IF;
1588 
1589     ELSIF(g_suspense_allowed_flag = 'Y') THEN
1590       l_stmt := '
1591       INSERT INTO xla_validation_lines_gt
1592         (ae_header_id
1593         ,ae_line_num
1594         ,ledger_id
1595         ,displayed_line_number
1596         ,max_ae_line_num
1597         ,max_displayed_line_number
1598         ,entity_id
1599         ,event_id
1600         ,balance_type_code
1601         ,budget_version_id
1602         ,encumbrance_type_id
1603         ,accounting_date
1604         ,je_category_name
1605         ,party_type_code
1606         ,party_id
1607         ,party_site_id
1608         ,entered_currency_code
1609         ,unrounded_entered_cr
1610         ,unrounded_entered_dr
1611         ,entered_cr
1612         ,entered_dr
1613         ,entered_currency_mau
1614         ,unrounded_accounted_cr
1615         ,unrounded_accounted_dr
1616         ,accounted_cr
1617         ,accounted_dr
1618         ,currency_conversion_type
1619         ,currency_conversion_date
1620         ,currency_conversion_rate
1621         ,code_combination_id
1622         ,accounting_class_code
1623         ,bal_seg_value
1624         ,mgt_seg_value
1625         ,cost_center_seg_value
1626         ,natural_account_seg_value
1627         ,ccid_coa_id
1628         ,ccid_enabled_flag
1629         ,ccid_summary_flag
1630         ,detail_posting_allowed_flag
1631         ,detail_budgeting_allowed_flag
1632         ,control_account_enabled_flag
1633         ,product_rule_type_code
1634         ,product_rule_code
1635         ,balancing_line_type
1636         ,error_flag
1637         ,gain_or_loss_flag
1638         ,substituted_by_suspense_flag
1639         ,substituted_ccid
1640         ,suspense_code_combination_id
1641         ,accounting_entry_status_code
1642         ,period_name
1643         )
1644       SELECT     /*+ leading(h) cardinality(h,1) index(l, XLA_AE_LINES_U1) use_nl(l) use_nl(ccid) */
1645                  h.ae_header_id
1646                 ,l.ae_line_num
1647                 ,h.ledger_id
1648                 ,l.displayed_line_number
1649                 ,max(l.ae_line_num) over (partition by l.ae_header_id)
1650                 ,max(l.displayed_line_number) over (partition by l.ae_header_id)
1651                 ,h.entity_id
1652                 ,h.event_id
1653                 ,h.balance_type_code
1654                 ,h.budget_version_id
1655                 ,l.encumbrance_type_id
1656                 ,h.accounting_date
1657                 ,h.je_category_name
1658                 ,l.party_type_code
1659                 ,l.party_id
1660                 ,l.party_site_id
1661                 ,l.currency_code
1662                 ,l.unrounded_entered_cr
1663                 ,l.unrounded_entered_dr
1664                 ,l.entered_cr
1665                 ,l.entered_dr
1666                 ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
1667                 ,l.unrounded_accounted_cr
1668                 ,l.unrounded_accounted_dr
1669                 ,l.accounted_cr
1670                 ,l.accounted_dr
1671                 ,l.currency_conversion_type
1672                 ,l.currency_conversion_date
1673                 ,l.currency_conversion_rate
1674                 -- code_combination_id
1675                 ,CASE
1676                  WHEN l.code_combination_id <> -1
1677                       and (ccid.enabled_flag = ''N''
1678                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1679                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1680                       and ccid.alternate_code_combination_id is not NULL
1681                  THEN  -- ccid disabled or outdated, ccid1 defined
1682                      CASE
1683                      WHEN nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id))) is not NULL
1684                           and (--ccid1.enabled_flag is NULL
1685                                ccid1.enabled_flag = ''N''
1686                                or h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date)
1687                                or h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date)
1688                                --or ccid1.summary_flag = ''Y''
1689                                --or (ccid1.detail_posting_allowed_flag = ''N'' and h.balance_type_code <>''B'')
1690                                --or (ccid1.detail_budgeting_allowed_flag = ''N'' and h.balance_type_code = ''B'')
1691                                )
1692                      THEN nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id)))
1693                      ELSE ccid.alternate_code_combination_id
1694                      END
1695                  WHEN l.code_combination_id <> -1
1696                       and nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id))) is not NULL
1697                       and (--ccid.enabled_flag is NULL
1698                            ccid.enabled_flag = ''N''
1699                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1700                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
1701                            --or ccid.summary_flag = ''Y''
1702                            --or (ccid.detail_posting_allowed_flag = ''N'' and h.balance_type_code <> ''B'')
1703                            --or (ccid.detail_budgeting_allowed_flag =''N'' and h.balance_type_code = ''B'')
1704                            )
1705                  THEN nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id)))
1706                  ELSE l.code_combination_id
1707                  END
1708                 ,l.accounting_class_code
1709                 ,CASE WHEN l.code_combination_id <> -1
1710                            and (ccid.enabled_flag = ''N''
1711                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1712                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1713                            and ccid.alternate_code_combination_id is not NULL
1714                       THEN ccid1.'||g_bal_seg_column_name||'
1715                       ELSE ccid.'||g_bal_seg_column_name||'
1716                       END';
1717 
1718        IF (g_mgt_seg_column_name is NULL) THEN
1719          l_stmt := l_stmt || '
1720                 ,NULL';
1721        ELSE
1722          l_stmt := l_stmt || '
1723                 ,CASE WHEN l.code_combination_id <> -1
1724                            and (ccid.enabled_flag = ''N''
1725                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1726                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1727                            and ccid.alternate_code_combination_id is not NULL
1728                       THEN ccid1.'||g_mgt_seg_column_name||'
1729                       ELSE ccid.'||g_mgt_seg_column_name||'
1730                       END';
1731        END IF;
1732 
1733        IF (g_cc_seg_column_name is NULL) THEN
1734          l_stmt := l_stmt || '
1735                 ,NULL';
1736        ELSE
1737          l_stmt := l_stmt || '
1738                 ,CASE WHEN l.code_combination_id <> -1
1739                            and (ccid.enabled_flag = ''N''
1740                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1741                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1742                            and ccid.alternate_code_combination_id is not NULL
1743                       THEN ccid1.'||g_cc_seg_column_name||'
1744                       ELSE ccid.'||g_cc_seg_column_name||'
1745                       END';
1746        END IF;
1747 
1748        IF (g_na_seg_column_name is NULL) THEN
1749          l_stmt := l_stmt || '
1750                 ,NULL';
1751        ELSE
1752          l_stmt := l_stmt || '
1753                 ,CASE WHEN l.code_combination_id <> -1
1754                            and (ccid.enabled_flag = ''N''
1755                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1756                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1757                            and ccid.alternate_code_combination_id is not NULL
1758                       THEN ccid1.'||g_na_seg_column_name||'
1759                       ELSE ccid.'||g_na_seg_column_name||'
1760                       END ';
1761        END IF;
1762 
1763 
1764        l_stmt := l_stmt || '
1765                 ,ccid.chart_of_accounts_id
1766                 -- ccid_enabled_flag
1767                 ,CASE WHEN l.code_combination_id = -1 THEN ''Y''
1768                       WHEN (ccid.enabled_flag = ''N''
1769                              or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1770                              or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1771                             and ccid.alternate_code_combination_id is not NULL
1772                       THEN
1773                           CASE
1774                           WHEN ccid1.enabled_flag IS NULL THEN NULL
1775                           WHEN ccid1.enabled_flag = ''N'' THEN ''N''
1776                           WHEN h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date) THEN ''D''
1777                           WHEN h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date) THEN ''D''
1778                           ELSE ''Y''
1779                           END
1780                       ELSE
1781                           CASE
1782                           WHEN ccid.enabled_flag IS NULL THEN NULL
1783                           WHEN ccid.enabled_flag = ''N'' THEN ''N''
1784                           WHEN h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) THEN ''D''
1785                           WHEN h.accounting_date > nvl(ccid.end_date_active, h.accounting_date) THEN ''D''
1786                           ELSE ''Y''
1787                           END
1788                       END
1789                 -- ccid_summary_flag
1790                 ,CASE WHEN l.code_combination_id <> -1
1791                            and (ccid.enabled_flag = ''N''
1792                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1793                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1794                            and ccid.alternate_code_combination_id is not NULL
1795                       THEN CASE WHEN ccid1.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
1796                       ELSE CASE WHEN ccid.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
1797                       END
1798                  -- detail_posting_allowed_flag
1799                 ,CASE WHEN l.code_combination_id <> -1
1800                            and (ccid.enabled_flag = ''N''
1801                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1802                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1803                            and ccid.alternate_code_combination_id is not NULL
1804                       THEN ccid1.detail_posting_allowed_flag
1805                       ELSE ccid.detail_posting_allowed_flag
1806                       END
1807                  -- detail_budgeting_allowed_flag
1808                 ,CASE WHEN l.code_combination_id <> -1
1809                            and (ccid.enabled_flag = ''N''
1810                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1811                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1812                            and ccid.alternate_code_combination_id is not NULL
1813                       THEN ccid1.detail_budgeting_allowed_flag
1814                       ELSE ccid.detail_budgeting_allowed_flag
1815                       END
1816                  -- control_account_enabled_flag
1817                 ,CASE WHEN l.code_combination_id <> -1
1818                            and (ccid.enabled_flag = ''N''
1819                                 or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1820                                 or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1821                            and ccid.alternate_code_combination_id is not NULL
1822                       THEN nvl(ccid1.reference3,''N'')
1823                       ELSE nvl(ccid.reference3,''N'')
1824                       END
1825                 ,h.product_rule_type_code
1826                 ,h.product_rule_code
1827                 ,'''||C_LINE_TYPE_PROCESS||'''
1828                 -- error_flag
1829                 ,CASE
1830                  WHEN l.code_combination_id <> -1
1831                       and (ccid.enabled_flag = ''N''
1832                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1833                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1834                       and ccid.alternate_code_combination_id is not NULL
1835                  THEN
1836                     CASE WHEN ccid1.enabled_flag IS NULL
1837                       or (ccid1.code_combination_id = -1 and nvl(l.gain_or_loss_flag, ''N'')=''Y'')
1838                       or l.accounting_class_code IS NULL
1839                       or ccid1.enabled_flag = ''N''
1840                       or h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date)
1841                       or h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date)
1842                       or (ccid1.summary_flag = ''Y'')
1843                       or (h.balance_type_code <> ''B'' AND ccid1.detail_posting_allowed_flag = ''N'')
1844                       or (h.balance_type_code = ''B'' AND ccid1.detail_budgeting_allowed_flag = ''N'')
1845                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
1846                           (nvl(ccid1.reference3,''N'') NOT IN (''Y'', ''N'', ''R'', '''||g_app_ctl_acct_source_code||''')))
1847                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid1.reference3,''N'') NOT IN ( ''N'', ''R''))
1848                       or (nvl(ccid1.reference3,''N'') NOT IN (''N'', ''R'') AND
1849                           (l.party_type_code IS NULL OR l.party_id IS NULL))
1850                       or (nvl(ccid1.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
1851                       or (nvl(ccid1.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
1852                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
1853                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
1854                    --   or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
1855                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
1856                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
1857                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
1858                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
1859                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
1860                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
1861                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
1862                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
1863                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
1864                       or (:1 = l.currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
1865                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
1866                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
1867                      /* or (:2 = l.currency_code AND
1868                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1))*/ -- commented for bug:8417965
1869                       or (:3 <> l.currency_code AND
1870                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
1871                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
1872                       or (:4 <> ccid1.chart_of_accounts_id)
1873                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
1874                       THEN ''Y''
1875                       ELSE NULL
1876                       END
1877                  ELSE
1878                     CASE WHEN ccid.enabled_flag IS NULL
1879                       or (ccid.code_combination_id = -1 and nvl(l.gain_or_loss_flag, ''N'')=''Y'')
1880                       or l.accounting_class_code IS NULL
1881                       or ccid.enabled_flag = ''N''
1882                       or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1883                       or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
1884                       or (ccid.summary_flag = ''Y'')
1885                       or (h.balance_type_code <> ''B'' AND ccid.detail_posting_allowed_flag = ''N'')
1886                       or (h.balance_type_code = ''B'' AND ccid.detail_budgeting_allowed_flag = ''N'')
1887                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
1888                            (nvl(ccid.reference3,''N'') NOT IN (''Y'', ''N'', ''R'', '''||g_app_ctl_acct_source_code||''')))
1889                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid.reference3,''N'') NOT IN (''N'',''R''))
1890                       or (nvl(ccid.reference3,''N'') NOT IN (''N'', ''R'') AND
1891                           (l.party_type_code IS NULL OR l.party_id IS NULL))
1892                       or (nvl(ccid.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
1893                       or (nvl(ccid.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
1894                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
1895                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
1896                   --    or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
1897                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
1898                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
1899                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
1900                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
1901                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
1902                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
1903                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
1904                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
1905                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
1906                       or (:5 = l.currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
1907                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
1908                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
1909                     /*  or (:6 = l.currency_code AND
1910                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
1911                       or (:7 <> l.currency_code AND
1912                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
1913                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
1914                       or (:8 <> ccid.chart_of_accounts_id)
1915                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
1916                       THEN ''Y''
1917                       ELSE NULL
1918                       END
1919                  END
1920                 ,gain_or_loss_flag
1921                 -- substituted_by_suspense_flag
1922                 ,CASE
1923                  WHEN l.code_combination_id <> -1
1924                       and (ccid.enabled_flag = ''N''
1925                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1926                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
1927                       and ccid.alternate_code_combination_id is not NULL
1928                  THEN
1929                      CASE
1930                      WHEN nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id))) is not NULL
1931                           and (--ccid1.enabled_flag is NULL
1932                                 ccid1.enabled_flag = ''N''
1933                                or h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date)
1934                                or h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date)
1935                                --or ccid1.summary_flag = ''Y''
1936                                --or (ccid1.detail_posting_allowed_flag = ''N'' and h.balance_type_code <>''B'')
1937                                --or (ccid1.detail_budgeting_allowed_flag = ''N'' and h.balance_type_code = ''B'')
1938                                )
1939                      THEN ''Y''
1940                      ELSE ''N''
1941                      END
1942                  WHEN l.code_combination_id <> -1
1943                       and nvl(gsa.code_combination_id, nvl(gsa1.code_combination_id, nvl(gsa2.code_combination_id, gsa3.code_combination_id))) is not NULL
1944                       and (--ccid.enabled_flag is NULL
1945                            ccid.enabled_flag = ''N''
1946                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
1947                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
1948                            --or ccid.summary_flag = ''Y''
1949                            --or (ccid.detail_posting_allowed_flag = ''N'' and h.balance_type_code <> ''B'')
1950                            --or (ccid.detail_budgeting_allowed_flag =''N'' and h.balance_type_code = ''B'')
1951                            )
1952                  THEN ''Y''
1953                  ELSE ''N''
1954                  END
1955                  -- substituted_ccid
1956                 ,CASE WHEN l.code_combination_id <> -1 AND
1957                            (ccid.enabled_flag = ''N'' OR
1958                             h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) OR
1959                             h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)) AND
1960                            ccid.alternate_code_combination_id is not NULL
1961                       THEN l.code_combination_id
1962                       WHEN l.code_combination_id <> -1 AND
1963                            nvl(gsa.code_combination_id,
1964                                nvl(gsa1.code_combination_id,
1965                                    nvl(gsa2.code_combination_id, gsa3.code_combination_id))) IS NOT NULL AND
1966                            (--ccid.enabled_flag IS NULL OR
1967                             ccid.enabled_flag = ''N'' OR
1968                             h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) OR
1969                             h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
1970                             --ccid.summary_flag = ''Y'' OR
1971                             --(ccid.detail_posting_allowed_flag = ''N'' AND h.balance_type_code <> ''B'') OR
1972                             --(ccid.detail_budgeting_allowed_flag =''N'' AND h.balance_type_code = ''B'')
1973                            )
1974                       THEN l.code_combination_id
1975                       ELSE NULL END
1976                 -- suspense_code_combination_id
1977                 ,NVL(gsa.code_combination_id,
1978                       NVL(gsa1.code_combination_id,
1979                           NVL(gsa2.code_combination_id, gsa3.code_combination_id)))
1980                 ,h.accounting_entry_status_code
1981                 ,h.period_name
1982       FROM       xla_ae_headers_gt      h
1983                 ,xla_ae_lines           l
1984                 ,gl_code_combinations   ccid
1985                 ,gl_code_combinations   ccid1
1986                 ,gl_suspense_accounts gsa
1987                 ,gl_suspense_accounts gsa1
1988                 ,gl_suspense_accounts gsa2
1989                 ,gl_suspense_accounts gsa3
1990                 ,fnd_currencies fcu
1991       WHERE     ccid.code_combination_id(+) = l.code_combination_id
1992         AND     l.ae_header_id          = h.ae_header_id
1993         AND       h.ledger_id             = :9
1994         AND       ccid1.code_combination_id(+) = ccid.alternate_code_combination_id
1995         and       gsa.ledger_id (+) = :10
1996         and       gsa.je_source_name (+) = :11
1997         and       gsa.je_category_name (+) = h.je_category_name
1998         and       gsa1.ledger_id (+) = NVL(:12, h.ledger_id)
1999         and       gsa1.je_source_name (+) = :13
2000         and       gsa1.je_category_name (+) = ''Other''
2001         and       gsa2.ledger_id (+) = :14
2002         and       gsa2.je_source_name (+) = ''Other''
2003         and       gsa2.je_category_name (+) = h.je_category_name
2004         and       gsa3.ledger_id (+) = NVL(:15, h.ledger_id)
2005         and       gsa3.je_source_name (+) = ''Other''
2006         and       gsa3.je_category_name (+) = ''Other''
2007         and       l.currency_code = fcu.currency_code(+)
2008         AND       h.accounting_date      <= NVL(:16,h.accounting_date)   -- 4262811
2009         AND       l.application_id      = '||g_application_id;
2010 
2011       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2012         trace(p_msg    => substr(l_stmt, 1, 4000),
2013             p_module => l_log_module,
2014             p_level  => C_LEVEL_STATEMENT);
2015         trace(p_msg    => substr(l_stmt, 4001, 4000),
2016           p_module => l_log_module,
2017           p_level  => C_LEVEL_STATEMENT);
2018         trace(p_msg    => substr(l_stmt, 8001, 4000),
2019           p_module => l_log_module,
2020           p_level  => C_LEVEL_STATEMENT);
2021         trace(p_msg    => substr(l_stmt, 12001, 4000),
2022           p_module => l_log_module,
2023           p_level  => C_LEVEL_STATEMENT);
2024         trace(p_msg    => substr(l_stmt, 16001, 4000),
2025           p_module => l_log_module,
2026           p_level  => C_LEVEL_STATEMENT);
2027         trace(p_msg    => substr(l_stmt, 20001, 4000),
2028           p_module => l_log_module,
2029           p_level  => C_LEVEL_STATEMENT);
2030       END IF;
2031 
2032       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2033         trace(p_msg    => 'g_ledger_currency_code = '||g_ledger_currency_code,
2034               p_module => l_log_module,
2035               p_level  => C_LEVEL_STATEMENT);
2036         trace(p_msg    => 'g_ledger_coa_id = '||g_ledger_coa_id,
2037               p_module => l_log_module,
2038               p_level  => C_LEVEL_STATEMENT);
2039         trace(p_msg    => 'g_ledger_id = '||g_ledger_id,
2040               p_module => l_log_module,
2041               p_level  => C_LEVEL_STATEMENT);
2042         trace(p_msg    => 'g_target_ledger_id = '||g_target_ledger_id,
2043               p_module => l_log_module,
2044               p_level  => C_LEVEL_STATEMENT);
2045         trace(p_msg    => 'g_app_je_source_name = '||g_app_je_source_name,
2046               p_module => l_log_module,
2047               p_level  => C_LEVEL_STATEMENT);
2048         trace(p_msg    => 'g_end_date = '||g_end_date,
2049               p_module => l_log_module,
2050               p_level  => C_LEVEL_STATEMENT);
2051       END IF;
2052 
2053       EXECUTE IMMEDIATE l_stmt using
2054           g_ledger_currency_code
2055         -- ,g_ledger_currency_code -- commented for bug:8417965
2056          ,g_ledger_currency_code
2057          ,g_ledger_coa_id
2058          ,g_ledger_currency_code -- 5
2059         -- ,g_ledger_currency_code -- commented for bug:8417965
2060          ,g_ledger_currency_code
2061          ,g_ledger_coa_id
2062          ,g_ledger_id
2063          ,g_target_ledger_id    -- 10
2064          ,g_app_je_source_name
2065          ,g_target_ledger_id
2066          ,g_app_je_source_name
2067          ,g_target_ledger_id
2068          ,g_target_ledger_id    -- 15
2069          ,g_end_date                  -- 4262811
2070          ;
2071 
2072       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2073         trace(p_msg    => '# of rows inserted:'||to_char(SQL%ROWCOUNT),
2074               p_module => l_log_module,
2075               p_level  => C_LEVEL_STATEMENT);
2076       END IF;
2077        --bug#10047740 Suspense Account BSV to be overridden with Original CCID BSV
2078       populate_bsv_suspense_ccid;
2079 
2080       --bug#10047740 Suspense BSV should be the Original CCID BSV
2081       -- hence commented out the update of BAL_SEG_VALUE
2082       l_stmt:=
2083        'UPDATE xla_validation_lines_gt l
2084        SET
2085         ( -- l.bal_seg_value,
2086          l.mgt_seg_value
2087         ,l.cost_center_seg_value
2088         ,l.natural_account_seg_value
2089         ,l.ccid_enabled_flag
2090         ,l.ccid_summary_flag
2091         ,l.detail_posting_allowed_flag
2092         ,l.detail_budgeting_allowed_flag
2093         ,l.control_account_enabled_flag
2094         ,l.error_flag) =
2095        ( SELECT ';
2096           -- ccid.' || g_bal_seg_column_name;
2097 
2098       IF (g_mgt_seg_column_name is NULL) THEN
2099         l_stmt := l_stmt || '
2100            NULL';
2101       ELSE
2102         l_stmt := l_stmt || '
2103            ccid.'||g_mgt_seg_column_name;
2104       END IF;
2105 
2106       IF (g_cc_seg_column_name is NULL) THEN
2107         l_stmt := l_stmt || '
2108            ,NULL';
2109       ELSE
2110         l_stmt := l_stmt || '
2111            ,ccid.'||g_cc_seg_column_name;
2112       END IF;
2113 
2114       IF (g_na_seg_column_name is NULL) THEN
2115         l_stmt := l_stmt || '
2116            ,NULL';
2117       ELSE
2118         l_stmt := l_stmt || '
2119            ,ccid.'||g_na_seg_column_name;
2120       END IF;
2121 
2122       l_stmt := l_stmt || '
2123            ,CASE
2124                WHEN ccid.enabled_flag IS NULL THEN NULL
2125                WHEN ccid.enabled_flag = ''N'' THEN ''N''
2126                WHEN l.accounting_date < nvl(ccid.start_date_active, l.accounting_date) THEN ''D''
2127                WHEN l.accounting_date > nvl(ccid.end_date_active, l.accounting_date) THEN ''D''
2128                ELSE ''Y''
2129             END
2130             ,CASE WHEN ccid.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
2131             ,ccid.detail_posting_allowed_flag
2132             ,ccid.detail_budgeting_allowed_flag
2133             ,nvl(ccid.reference3,''N'')
2134             ,CASE WHEN ccid.enabled_flag IS NULL
2135                       or l.accounting_class_code IS NULL
2136                       or ccid.enabled_flag = ''N''
2137                       or l.accounting_date < nvl(ccid.start_date_active, l.accounting_date)
2138                       or l.accounting_date > nvl(ccid.end_date_active, l.accounting_date)
2139                       or (ccid.summary_flag = ''Y'')
2140                       or (l.balance_type_code <> ''B'' AND ccid.detail_posting_allowed_flag = ''N'')
2141                       or (l.balance_type_code = ''B'' AND ccid.detail_budgeting_allowed_flag = ''N'')
2142                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
2143                            (nvl(ccid.reference3,''N'') NOT IN (''Y'', ''N'', ''R'','''||g_app_ctl_acct_source_code||''')))
2144                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid.reference3,''N'') NOT IN (''N'',''R''))
2145                       or (nvl(ccid.reference3,''N'') NOT IN (''N'',''R'') AND
2146                           (l.party_type_code IS NULL OR l.party_id IS NULL))
2147                       or (nvl(ccid.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
2148                       or (nvl(ccid.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
2149                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
2150                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
2151                      -- or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
2152                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
2153                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
2154                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
2155                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
2156                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
2157                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
2158                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
2159                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
2160                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
2161                       or (:1 = l.entered_currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
2162                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
2163                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
2164                      /* or (:2 = l.entered_currency_code AND
2165                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
2166                       or (:3 <> l.entered_currency_code AND
2167                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
2168                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
2169                       or (:4 <> ccid.chart_of_accounts_id)
2170                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
2171                       THEN ''Y''
2172                       ELSE NULL
2173             END
2174          FROM gl_code_combinations ccid
2175          WHERE ccid.code_combination_id = l.code_combination_id )
2176       WHERE l.substituted_by_suspense_flag= ''Y''
2177       AND   l.code_combination_id > 0 ';
2178       --bug#10047740 added CCID condition not to update if unable to derive Suspense Account with BSV Overridden
2179 
2180       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2181         trace(p_msg    => 'UPDATE sql:',
2182           p_module => l_log_module,
2183           p_level  => C_LEVEL_STATEMENT);
2184         trace(p_msg    => substr(l_stmt, 1, 4000),
2185           p_module => l_log_module,
2186           p_level  => C_LEVEL_STATEMENT);
2187         trace(p_msg    => substr(l_stmt, 4001, 4000),
2188           p_module => l_log_module,
2189           p_level  => C_LEVEL_STATEMENT);
2190       END IF;
2191 
2192       EXECUTE IMMEDIATE l_stmt using
2193          g_ledger_currency_code
2194         -- ,g_ledger_currency_code -- commented for bug:8417965
2195          ,g_ledger_currency_code
2196          ,g_ledger_coa_id
2197          ;
2198       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2199         trace(p_msg    => '# of rows updated:'||to_char(SQL%ROWCOUNT),
2200           p_module => l_log_module,
2201           p_level  => C_LEVEL_STATEMENT);
2202       END IF;
2203 
2204     ELSE  -- (g_sla_bal_by_ledger_curr_flag <> 'Y')
2205       l_stmt := '
2206       INSERT INTO xla_validation_lines_gt
2207         (ae_header_id
2208         ,ae_line_num
2209         ,ledger_id
2210         ,displayed_line_number
2211         ,max_ae_line_num
2212         ,max_displayed_line_number
2213         ,entity_id
2214         ,event_id
2215         ,balance_type_code
2216         ,budget_version_id
2217         ,encumbrance_type_id
2218         ,accounting_date
2219         ,je_category_name
2220         ,party_type_code
2221         ,party_id
2222         ,party_site_id
2223         ,entered_currency_code
2224         ,unrounded_entered_cr
2225         ,unrounded_entered_dr
2226         ,entered_cr
2227         ,entered_dr
2228         ,entered_currency_mau
2229         ,unrounded_accounted_cr
2230         ,unrounded_accounted_dr
2231         ,accounted_cr
2232         ,accounted_dr
2233         ,currency_conversion_type
2234         ,currency_conversion_date
2235         ,currency_conversion_rate
2236         ,code_combination_id
2237         ,accounting_class_code
2238         ,bal_seg_value
2239         ,mgt_seg_value
2240         ,cost_center_seg_value
2241         ,natural_account_seg_value
2242         ,ccid_coa_id
2243         ,ccid_enabled_flag
2244         ,ccid_summary_flag
2245         ,detail_posting_allowed_flag
2246         ,detail_budgeting_allowed_flag
2247         ,control_account_enabled_flag
2248         ,product_rule_type_code
2249         ,product_rule_code
2250         ,balancing_line_type
2251         ,error_flag
2252         ,substituted_ccid
2253         ,accounting_entry_status_code
2254         ,period_name
2255         ,gain_or_loss_flag
2256         )
2257       SELECT     /*+  cardinality(h,1) index(l, XLA_AE_LINES_U1) use_nl(l) use_nl(ccid) */
2258                  h.ae_header_id
2259                 ,l.ae_line_num
2260                 ,h.ledger_id
2261                 ,l.displayed_line_number
2262                 ,max(l.ae_line_num) over (partition by l.ae_header_id)
2263                 ,max(l.displayed_line_number) over (partition by l.ae_header_id)
2264                 ,h.entity_id
2265                 ,h.event_id
2266                 ,h.balance_type_code
2267                 ,h.budget_version_id
2268                 ,l.encumbrance_type_id
2269                 ,h.accounting_date
2270                 ,h.je_category_name
2271                 ,l.party_type_code
2272                 ,l.party_id
2273                 ,l.party_site_id
2274                 ,l.currency_code
2275                 ,l.unrounded_entered_cr
2276                 ,l.unrounded_entered_dr
2277                 ,l.entered_cr
2278                 ,l.entered_dr
2279                 ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
2280                 ,l.unrounded_accounted_cr
2281                 ,l.unrounded_accounted_dr
2282                 ,l.accounted_cr
2283                 ,l.accounted_dr
2284                 ,l.currency_conversion_type
2285                 ,l.currency_conversion_date
2286                 ,l.currency_conversion_rate
2287                 ,CASE
2288                  WHEN l.code_combination_id <> -1
2289                       and (ccid.enabled_flag = ''N''
2290                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2291                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2292                       and ccid.alternate_code_combination_id is not NULL
2293                  THEN
2294                      ccid1.code_combination_id
2295                  ELSE l.code_combination_id
2296                  END
2297                 ,l.accounting_class_code
2298                 ,CASE
2299                  WHEN l.code_combination_id <> -1
2300                       and (ccid.enabled_flag = ''N''
2301                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2302                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2303                       and ccid.alternate_code_combination_id is not NULL
2304                  THEN
2305                      ccid1.'||g_bal_seg_column_name||'
2306                  ELSE ccid.'||g_bal_seg_column_name||'
2307                  END';
2308        IF (g_mgt_seg_column_name is NULL) THEN
2309          l_stmt := l_stmt || '
2310                 ,NULL';
2311        ELSE
2312          l_stmt := l_stmt || '
2313                 ,CASE
2314                  WHEN l.code_combination_id <> -1
2315                       and (ccid.enabled_flag = ''N''
2316                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2317                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2318                       and ccid.alternate_code_combination_id is not NULL
2319                  THEN
2320                      ccid1.'||g_mgt_seg_column_name||'
2321                  ELSE ccid.'||g_mgt_seg_column_name||'
2322                  END';
2323        END IF;
2324 
2325        IF (g_cc_seg_column_name is NULL) THEN
2326          l_stmt := l_stmt || '
2327                 ,NULL';
2328        ELSE
2329          l_stmt := l_stmt || '
2330                 ,CASE
2331                  WHEN l.code_combination_id <> -1
2332                       and (ccid.enabled_flag = ''N''
2333                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2334                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2335                       and ccid.alternate_code_combination_id is not NULL
2336                  THEN
2337                      ccid1.'||g_cc_seg_column_name||'
2338                  ELSE ccid.'||g_cc_seg_column_name||'
2339                  END';
2340        END IF;
2341 
2342        IF (g_na_seg_column_name is NULL) THEN
2343          l_stmt := l_stmt || '
2344                 ,NULL';
2345        ELSE
2346          l_stmt := l_stmt || '
2347                 ,CASE
2348                  WHEN l.code_combination_id <> -1
2349                       and (ccid.enabled_flag = ''N''
2350                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2351                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2352                       and ccid.alternate_code_combination_id is not NULL
2353                  THEN
2354                      ccid1.'||g_na_seg_column_name||'
2355                  ELSE ccid.'||g_na_seg_column_name||'
2356                  END';
2357        END IF;
2358 
2359        l_stmt := l_stmt || '
2360                 ,ccid.chart_of_accounts_id
2361                 ,CASE WHEN l.code_combination_id = -1 THEN ''Y''
2362                       WHEN (ccid.enabled_flag = ''N''
2363                              or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2364                              or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2365                             and ccid.alternate_code_combination_id is not NULL
2366                       THEN
2367                           CASE
2368                           WHEN ccid1.enabled_flag IS NULL THEN NULL
2369                           WHEN ccid1.enabled_flag = ''N'' THEN ''N''
2370                           WHEN h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date) THEN ''D''
2371                           WHEN h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date) THEN ''D''
2372                           ELSE ''Y''
2373                           END
2374                       ELSE
2375                           CASE
2376                           WHEN ccid.enabled_flag IS NULL THEN NULL
2377                           WHEN ccid.enabled_flag = ''N'' THEN ''N''
2378                           WHEN h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) THEN ''D''
2379                           WHEN h.accounting_date > nvl(ccid.end_date_active, h.accounting_date) THEN ''D''
2380                           ELSE ''Y''
2381                           END
2382                       END
2383                 ,CASE
2384                  WHEN l.code_combination_id <> -1
2385                       and (ccid.enabled_flag = ''N''
2386                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2387                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2388                       and ccid.alternate_code_combination_id is not NULL
2389                  THEN
2390                      CASE WHEN ccid1.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
2391                  ELSE
2392                      CASE WHEN ccid.summary_flag = ''Y'' THEN ''Y'' ELSE ''N'' END
2393                  END
2394                 ,CASE
2395                  WHEN l.code_combination_id <> -1
2396                       and (ccid.enabled_flag = ''N''
2397                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2398                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2399                       and ccid.alternate_code_combination_id is not NULL
2400                  THEN ccid1.detail_posting_allowed_flag
2401                  ELSE ccid.detail_posting_allowed_flag
2402                  END
2403                 ,CASE
2404                  WHEN l.code_combination_id <> -1
2405                       and (ccid.enabled_flag = ''N''
2406                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2407                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2408                       and ccid.alternate_code_combination_id is not NULL
2409                  THEN ccid1.detail_budgeting_allowed_flag
2410                  ELSE ccid.detail_budgeting_allowed_flag
2411                  END
2412                 ,CASE
2413                  WHEN l.code_combination_id <> -1
2414                       and (ccid.enabled_flag = ''N''
2415                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2416                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2417                       and ccid.alternate_code_combination_id is not NULL
2418                  THEN nvl(ccid1.reference3,''N'')
2419                  ELSE nvl(ccid.reference3,''N'')
2420                  END
2421                 ,h.product_rule_type_code
2422                 ,h.product_rule_code
2423                 ,'''||C_LINE_TYPE_PROCESS||'''
2424                 ,CASE
2425                  WHEN l.code_combination_id <> -1
2426                       and (ccid.enabled_flag = ''N''
2427                            or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2428                            or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date))
2429                       and ccid.alternate_code_combination_id is not NULL
2430                  THEN
2431                     CASE WHEN ccid1.enabled_flag IS NULL
2432                       or (ccid1.code_combination_id = -1 and nvl(l.gain_or_loss_flag, ''N'')=''Y'')
2433                       or l.accounting_class_code IS NULL
2434                       or ccid1.enabled_flag = ''N''
2435                       or h.accounting_date < nvl(ccid1.start_date_active, h.accounting_date)
2436                       or h.accounting_date > nvl(ccid1.end_date_active, h.accounting_date)
2437                       or (ccid1.summary_flag = ''Y'')
2438                       or (h.balance_type_code <> ''B'' AND ccid1.detail_posting_allowed_flag = ''N'')
2439                       or (h.balance_type_code = ''B'' AND ccid1.detail_budgeting_allowed_flag = ''N'')
2440                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
2441                           (nvl(ccid1.reference3,''N'') NOT IN (''Y'', ''N'', ''R'', '''||g_app_ctl_acct_source_code||''')))
2442                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid1.reference3,''N'') NOT IN (''N'',''R''))
2443                       or (nvl(ccid1.reference3,''N'') NOT IN (''N'',''R'') AND
2444                           (l.party_type_code IS NULL OR l.party_id IS NULL))
2445                       or (nvl(ccid1.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
2446                       or (nvl(ccid1.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
2447                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
2448                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
2449                      -- or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
2450                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
2451                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
2452                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
2453                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
2454                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
2455                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
2456                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
2457                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
2458                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
2459                       or (:1 = l.currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
2460                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
2461                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
2462                     /*  or (:2 = l.currency_code AND
2463                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
2464                       or (:3 <> l.currency_code AND
2465                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
2466                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
2467                       or (:4 <> ccid1.chart_of_accounts_id)
2468                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
2469                       THEN ''Y''
2470                       ELSE NULL
2471                       END
2472                  ELSE
2473                     CASE WHEN ccid.enabled_flag IS NULL
2474                       or (ccid.code_combination_id = -1 and nvl(l.gain_or_loss_flag, ''N'')=''Y'')
2475                       or l.accounting_class_code IS NULL
2476                       or ccid.enabled_flag = ''N''
2477                       or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2478                       or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
2479                       or (ccid.summary_flag = ''Y'')
2480                       or (h.balance_type_code <> ''B'' AND ccid.detail_posting_allowed_flag = ''N'')
2481                       or (h.balance_type_code = ''B'' AND ccid.detail_budgeting_allowed_flag = ''N'')
2482                       or ('''||g_app_ctl_acct_source_code||''' <> ''Y'' AND
2483                           (nvl(ccid.reference3,''N'') NOT IN (''Y'', ''N'',''R'', '''||g_app_ctl_acct_source_code||''')))
2484                       or ('''||g_app_ctl_acct_source_code||''' = ''N'' AND nvl(ccid.reference3,''N'') NOT IN (''N'',''R''))
2485                       or (nvl(ccid.reference3,''N'') NOT IN (''N'',''R'') AND
2486                           (l.party_type_code IS NULL OR l.party_id IS NULL))
2487                       or (nvl(ccid.reference3,''N'') = ''CUSTOMER'' AND l.party_type_code <> ''C'')
2488                       or (nvl(ccid.reference3,''N'') = ''SUPPLIER'' AND l.party_type_code <> ''S'')
2489                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN (''C'', ''S''))
2490                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
2491                      -- or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
2492                       or (nvl(l.gain_or_loss_flag,''N'') = ''N'' AND l.entered_dr IS NULL AND l.entered_cr IS NULL)
2493                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
2494                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
2495                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
2496                       or (nvl(l.gain_or_loss_flag, ''N'') = ''N'' and l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
2497                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
2498                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
2499                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
2500                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
2501                       or (:5 = l.currency_code AND nvl(l.gain_or_loss_flag, ''N'') = ''N'' AND
2502                           (nvl(l.unrounded_entered_dr,9E125) <> nvl(l.unrounded_accounted_dr,9E125) or
2503                            nvl(l.unrounded_entered_cr,9E125) <> nvl(l.unrounded_accounted_cr,9E125)))
2504                     /*  or (:6 = l.currency_code AND
2505                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
2506                       or (:7 <> l.currency_code AND
2507                           ((l.currency_conversion_type = ''User'' AND l.currency_conversion_rate IS NULL) or
2508                            (nvl(l.currency_conversion_type,''User'') <> ''User'' AND l.currency_conversion_date IS NULL)))
2509                       or (:8 <> ccid.chart_of_accounts_id)
2510                       or (l.accounted_cr is NULL and l.accounted_dr is NULL and l.currency_conversion_rate is NULL)
2511                       THEN ''Y''
2512                       ELSE NULL
2513                       END
2514                  END
2515                 ,CASE WHEN l.code_combination_id <> -1 AND  -- substituted_ccid
2516                            (ccid.enabled_flag = ''N'' OR
2517                             h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) OR
2518                             h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)) AND
2519                            ccid.alternate_code_combination_id IS NOT NULL
2520                       THEN l.code_combination_id
2521                       ELSE NULL END
2522                 ,h.accounting_entry_status_code
2523                 ,h.period_name
2524                 ,l.gain_or_loss_flag
2525       FROM       xla_ae_headers_gt      h
2526                 ,xla_ae_lines           l
2527                 ,gl_code_combinations   ccid
2528                 ,gl_code_combinations   ccid1
2529                 ,fnd_currencies fcu
2530       WHERE     ccid.code_combination_id(+) = l.code_combination_id
2531         AND     l.ae_header_id          = h.ae_header_id
2532         AND       h.ledger_id             = :9
2533         AND       ccid1.code_combination_id(+) = ccid.alternate_code_combination_id
2534         AND       l.currency_code = fcu.currency_code(+)
2535         AND     l.application_id        = '||g_application_id;
2536 
2537       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2538         trace(p_msg    => substr(l_stmt, 1, 4000),
2539             p_module => l_log_module,
2540             p_level  => C_LEVEL_STATEMENT);
2541         trace(p_msg    => substr(l_stmt, 4001, 4000),
2542           p_module => l_log_module,
2543           p_level  => C_LEVEL_STATEMENT);
2544         trace(p_msg    => substr(l_stmt, 8001, 4000),
2545           p_module => l_log_module,
2546           p_level  => C_LEVEL_STATEMENT);
2547         trace(p_msg    => substr(l_stmt, 12001, 4000),
2548           p_module => l_log_module,
2549           p_level  => C_LEVEL_STATEMENT);
2550         trace(p_msg    => substr(l_stmt, 16001, 4000),
2551           p_module => l_log_module,
2552           p_level  => C_LEVEL_STATEMENT);
2553         trace(p_msg    => substr(l_stmt, 20001, 4000),
2554           p_module => l_log_module,
2555           p_level  => C_LEVEL_STATEMENT);
2556       END IF;
2557 
2558       EXECUTE IMMEDIATE l_stmt using
2559           g_ledger_currency_code
2560        --  ,g_ledger_currency_code -- commented for bug:8417965
2561          ,g_ledger_currency_code
2562          ,g_ledger_coa_id
2563          ,g_ledger_currency_code
2564        --  ,g_ledger_currency_code -- commented for bug:8417965
2565          ,g_ledger_currency_code
2566          ,g_ledger_coa_id
2567          ,g_ledger_id;
2568 
2569       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2570         trace(p_msg    => '# of rows inserted:'||to_char(SQL%ROWCOUNT),
2571               p_module => l_log_module,
2572               p_level  => C_LEVEL_STATEMENT);
2573       END IF;
2574     END IF;
2575 
2576     UPDATE xla_ae_headers
2577        SET zero_amount_flag = 'Y'
2578      WHERE application_id = g_application_id and
2579            ae_header_id in
2580            (select /*+ cardinality(XLA_VALIDATION_LINES_GT, 1) */  ae_header_id  --bug9174950
2581               from xla_validation_lines_gt
2582              group by ae_header_id
2583              having sum(abs(accounted_cr)) = 0 and sum(abs(accounted_dr))=0);
2584 
2585     IF (p_budgetary_control_mode = 'NONE') THEN
2586       UPDATE /*+ index(XAL,XLA_AE_LINES_U1)*/ xla_ae_lines xal -- 4769388
2587          SET (code_combination_id, substituted_ccid)=
2588                (SELECT code_combination_id, substituted_ccid
2589                   FROM xla_validation_lines_gt xvlg
2590                  WHERE xvlg.ae_header_id = xal.ae_header_id
2591                    AND xvlg.ae_line_num = xal.ae_line_num)
2592        WHERE xal.application_id = g_application_id
2593          AND (xal.ae_header_id, xal.ae_line_num) in
2594              (select /*+ unnest cardinality(GT,10)*/        -- 4769388
2595                      ae_header_id, ae_line_num
2596                 from xla_validation_lines_gt  GT            -- 4769388
2597                where substituted_ccid is not NULL);
2598 
2599       IF (C_LEVEL_STATEMENT>= g_log_level) THEN
2600         trace(p_msg    => '# of rows updated to xla_ae_lines:'||to_char(SQL%ROWCOUNT),
2601               p_module => l_log_module,
2602               p_level  => C_LEVEL_STATEMENT);
2603       END IF;
2604     END IF;
2605 
2606 
2607   ELSE   -- (g_caller <> mpa or acct program or third party merge)
2608 
2609     INSERT INTO xla_validation_lines_gt
2610         (ae_header_id
2611         ,ae_line_num
2612         ,ledger_id
2613         ,displayed_line_number
2614         ,max_ae_line_num
2615         ,max_displayed_line_number
2616         ,entity_id
2617         ,event_id
2618         ,balance_type_code
2619         ,budget_version_id
2620         ,encumbrance_type_id
2621         ,accounting_date
2622         ,je_category_name
2623         ,party_type_code
2624         ,party_id
2625         ,party_site_id
2626         ,entered_currency_code
2627         ,unrounded_entered_cr
2628         ,unrounded_entered_dr
2629         ,entered_cr
2630         ,entered_dr
2631         ,entered_currency_mau
2632         ,unrounded_accounted_cr
2633         ,unrounded_accounted_dr
2634         ,accounted_cr
2635         ,accounted_dr
2636         ,currency_conversion_type
2637         ,currency_conversion_date
2638         ,currency_conversion_rate
2639         ,code_combination_id
2640         ,accounting_class_code
2641         ,bal_seg_value
2642         ,mgt_seg_value
2643         ,cost_center_seg_value
2644         ,natural_account_seg_value
2645         ,ccid_coa_id
2646         ,ccid_enabled_flag
2647         ,ccid_summary_flag
2648         ,detail_posting_allowed_flag
2649         ,detail_budgeting_allowed_flag
2650         ,control_account_enabled_flag
2651         ,accounting_entry_status_code
2652         ,period_name
2653         ,balancing_line_type
2654         ,error_flag)
2655     SELECT       h.ae_header_id
2656                 ,l.ae_line_num
2657                 ,h.ledger_id
2658                 ,l.displayed_line_number
2659                 ,max(l.ae_line_num) over (partition by l.ae_header_id)
2660                 ,max(l.displayed_line_number) over (partition by l.ae_header_id)
2661                 ,h.entity_id
2662                 ,h.event_id
2663                 ,h.balance_type_code
2664                 ,h.budget_version_id
2665                 ,l.encumbrance_type_id
2666                 ,h.accounting_date
2667                 ,h.je_category_name
2668                 ,l.party_type_code
2669                 ,l.party_id
2670                 ,l.party_site_id
2671                 ,l.currency_code
2672                 ,l.unrounded_entered_cr
2673                 ,l.unrounded_entered_dr
2674                 ,l.entered_cr
2675                 ,l.entered_dr
2676                 ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
2677                 ,l.unrounded_accounted_cr
2678                 ,l.unrounded_accounted_dr
2679                 ,l.accounted_cr
2680                 ,l.accounted_dr
2681                 ,l.currency_conversion_type
2682                 ,l.currency_conversion_date
2683                 ,l.currency_conversion_rate
2684                 ,l.code_combination_id
2685                 ,l.accounting_class_code
2686                 ,decode(g_bal_seg_column_name,
2687                                         'SEGMENT1', ccid.segment1,
2688                                         'SEGMENT2', ccid.segment2,
2689                                         'SEGMENT3', ccid.segment3,
2690                                         'SEGMENT4', ccid.segment4,
2691                                         'SEGMENT5', ccid.segment5,
2692                                         'SEGMENT6', ccid.segment6,
2693                                         'SEGMENT7', ccid.segment7,
2694                                         'SEGMENT8', ccid.segment8,
2695                                         'SEGMENT9', ccid.segment9,
2696                                         'SEGMENT10', ccid.segment10,
2697                                         'SEGMENT11', ccid.segment11,
2698                                         'SEGMENT12', ccid.segment12,
2699                                         'SEGMENT13', ccid.segment13,
2700                                         'SEGMENT14', ccid.segment14,
2701                                         'SEGMENT15', ccid.segment15,
2702                                         'SEGMENT16', ccid.segment16,
2703                                         'SEGMENT17', ccid.segment17,
2704                                         'SEGMENT18', ccid.segment18,
2705                                         'SEGMENT19', ccid.segment19,
2706                                         'SEGMENT20', ccid.segment20,
2707                                         'SEGMENT21', ccid.segment21,
2708                                         'SEGMENT22', ccid.segment22,
2709                                         'SEGMENT23', ccid.segment23,
2710                                         'SEGMENT24', ccid.segment24,
2711                                         'SEGMENT25', ccid.segment25,
2712                                         'SEGMENT26', ccid.segment26,
2713                                         'SEGMENT27', ccid.segment27,
2714                                         'SEGMENT28', ccid.segment28,
2715                                         'SEGMENT29', ccid.segment29,
2716                                         'SEGMENT30', ccid.segment30,
2717                                         NULL)
2718                 ,decode(g_mgt_seg_column_name,
2719                                         'SEGMENT1', ccid.segment1,
2720                                         'SEGMENT2', ccid.segment2,
2721                                         'SEGMENT3', ccid.segment3,
2722                                         'SEGMENT4', ccid.segment4,
2723                                         'SEGMENT5', ccid.segment5,
2724                                         'SEGMENT6', ccid.segment6,
2725                                         'SEGMENT7', ccid.segment7,
2726                                         'SEGMENT8', ccid.segment8,
2727                                         'SEGMENT9', ccid.segment9,
2728                                         'SEGMENT10', ccid.segment10,
2729                                         'SEGMENT11', ccid.segment11,
2730                                         'SEGMENT12', ccid.segment12,
2731                                         'SEGMENT13', ccid.segment13,
2732                                         'SEGMENT14', ccid.segment14,
2733                                         'SEGMENT15', ccid.segment15,
2734                                         'SEGMENT16', ccid.segment16,
2735                                         'SEGMENT17', ccid.segment17,
2736                                         'SEGMENT18', ccid.segment18,
2737                                         'SEGMENT19', ccid.segment19,
2738                                         'SEGMENT20', ccid.segment20,
2739                                         'SEGMENT21', ccid.segment21,
2740                                         'SEGMENT22', ccid.segment22,
2741                                         'SEGMENT23', ccid.segment23,
2742                                         'SEGMENT24', ccid.segment24,
2743                                         'SEGMENT25', ccid.segment25,
2744                                         'SEGMENT26', ccid.segment26,
2745                                         'SEGMENT27', ccid.segment27,
2746                                         'SEGMENT28', ccid.segment28,
2747                                         'SEGMENT29', ccid.segment29,
2748                                         'SEGMENT30', ccid.segment30,
2749                                         NULL)
2750                 ,decode(g_cc_seg_column_name,
2751                                         'SEGMENT1', ccid.segment1,
2752                                         'SEGMENT2', ccid.segment2,
2753                                         'SEGMENT3', ccid.segment3,
2754                                         'SEGMENT4', ccid.segment4,
2755                                         'SEGMENT5', ccid.segment5,
2756                                         'SEGMENT6', ccid.segment6,
2757                                         'SEGMENT7', ccid.segment7,
2758                                         'SEGMENT8', ccid.segment8,
2759                                         'SEGMENT9', ccid.segment9,
2760                                         'SEGMENT10', ccid.segment10,
2761                                         'SEGMENT11', ccid.segment11,
2762                                         'SEGMENT12', ccid.segment12,
2763                                         'SEGMENT13', ccid.segment13,
2764                                         'SEGMENT14', ccid.segment14,
2765                                         'SEGMENT15', ccid.segment15,
2766                                         'SEGMENT16', ccid.segment16,
2767                                         'SEGMENT17', ccid.segment17,
2768                                         'SEGMENT18', ccid.segment18,
2769                                         'SEGMENT19', ccid.segment19,
2770                                         'SEGMENT20', ccid.segment20,
2771                                         'SEGMENT21', ccid.segment21,
2772                                         'SEGMENT22', ccid.segment22,
2773                                         'SEGMENT23', ccid.segment23,
2774                                         'SEGMENT24', ccid.segment24,
2775                                         'SEGMENT25', ccid.segment25,
2776                                         'SEGMENT26', ccid.segment26,
2777                                         'SEGMENT27', ccid.segment27,
2778                                         'SEGMENT28', ccid.segment28,
2779                                         'SEGMENT29', ccid.segment29,
2780                                         'SEGMENT30', ccid.segment30,
2781                                         NULL)
2782                 ,decode(g_na_seg_column_name,
2783                                         'SEGMENT1', ccid.segment1,
2784                                         'SEGMENT2', ccid.segment2,
2785                                         'SEGMENT3', ccid.segment3,
2786                                         'SEGMENT4', ccid.segment4,
2787                                         'SEGMENT5', ccid.segment5,
2788                                         'SEGMENT6', ccid.segment6,
2789                                         'SEGMENT7', ccid.segment7,
2790                                         'SEGMENT8', ccid.segment8,
2791                                         'SEGMENT9', ccid.segment9,
2792                                         'SEGMENT10', ccid.segment10,
2793                                         'SEGMENT11', ccid.segment11,
2794                                         'SEGMENT12', ccid.segment12,
2795                                         'SEGMENT13', ccid.segment13,
2796                                         'SEGMENT14', ccid.segment14,
2797                                         'SEGMENT15', ccid.segment15,
2798                                         'SEGMENT16', ccid.segment16,
2799                                         'SEGMENT17', ccid.segment17,
2800                                         'SEGMENT18', ccid.segment18,
2801                                         'SEGMENT19', ccid.segment19,
2802                                         'SEGMENT20', ccid.segment20,
2803                                         'SEGMENT21', ccid.segment21,
2804                                         'SEGMENT22', ccid.segment22,
2805                                         'SEGMENT23', ccid.segment23,
2806                                         'SEGMENT24', ccid.segment24,
2807                                         'SEGMENT25', ccid.segment25,
2808                                         'SEGMENT26', ccid.segment26,
2809                                         'SEGMENT27', ccid.segment27,
2810                                         'SEGMENT28', ccid.segment28,
2811                                         'SEGMENT29', ccid.segment29,
2812                                         'SEGMENT30', ccid.segment30,
2813                                         NULL)
2814                 ,ccid.chart_of_accounts_id
2815                 ,CASE WHEN g_caller = C_CALLER_ACCT_PROGRAM AND l.code_combination_id = -1 THEN 'Y'
2816                       WHEN ccid.enabled_flag IS NULL THEN NULL
2817                       WHEN ccid.enabled_flag = 'N' THEN 'N'
2818                       WHEN h.accounting_date < nvl(ccid.start_date_active, h.accounting_date) THEN 'D'
2819                       WHEN h.accounting_date > nvl(ccid.end_date_active, h.accounting_date) THEN 'D'
2820                       ELSE 'Y' END
2821                 ,CASE WHEN ccid.summary_flag = 'Y' THEN 'Y' ELSE 'N' END
2822                 ,ccid.detail_posting_allowed_flag
2823                 ,ccid.detail_budgeting_allowed_flag
2824                 ,nvl(ccid.reference3,'N')
2825                 ,h.accounting_entry_status_code
2826                 ,h.period_name
2827                 ,C_LINE_TYPE_PROCESS
2828                 ,CASE WHEN ccid.enabled_flag IS NULL
2829                       or ccid.enabled_flag = 'N'
2830                       or l.accounting_class_code IS NULL
2831                       or h.accounting_date < nvl(ccid.start_date_active, h.accounting_date)
2832                       or h.accounting_date > nvl(ccid.end_date_active, h.accounting_date)
2833                       or (ccid.summary_flag = 'Y')
2834                       or (h.balance_type_code <> 'B' AND ccid.detail_posting_allowed_flag = 'N')
2835                       or (h.balance_type_code = 'B' AND ccid.detail_budgeting_allowed_flag = 'N')
2836                       or (g_app_ctl_acct_source_code <> 'Y'
2837                             AND (nvl(ccid.reference3,'N') NOT IN ('Y', 'N', 'R', g_app_ctl_acct_source_code)))
2838                       or (g_app_ctl_acct_source_code= 'N' AND nvl(ccid.reference3,'N') NOT IN  ('N','R'))
2839                       or (nvl(ccid.reference3,'N') NOT IN ('N','R') AND
2840                           (l.party_type_code IS NULL OR l.party_id IS NULL OR
2841 			   (l.party_type_code = 'S' AND l.party_site_id IS NULL)))
2842                       or (nvl(ccid.reference3,'N') = 'CUSTOMER' AND l.party_type_code <> 'C')
2843                       or (nvl(ccid.reference3,'N') = 'SUPPLIER' AND l.party_type_code <> 'S')
2844                       or (l.party_type_code IS NOT NULL AND l.party_type_code NOT IN ('C', 'S'))
2845                       or ((l.party_id IS NOT NULL OR l.party_site_id IS NOT NULL) AND l.party_type_code IS NULL)
2846                      -- or ((l.party_site_id IS NOT NULL OR l.party_type_code IS NOT NULL) AND l.party_id IS NULL)
2847                       or (l.entered_dr IS NULL AND l.entered_cr IS NULL)
2848                       or (l.entered_dr IS NOT NULL AND l.accounted_dr IS NULL)
2849                       or (l.entered_cr IS NOT NULL AND l.accounted_cr IS NULL)
2850                       or (l.entered_dr IS NULL AND l.accounted_dr IS NOT NULL)
2851                       or (l.entered_cr IS NULL AND l.accounted_cr IS NOT NULL)
2852                       or (NVL(l.entered_cr,0) > 0 AND NVL(l.accounted_cr,0) < 0)
2853                       or (NVL(l.entered_dr,0) > 0 AND NVL(l.accounted_dr,0) < 0)
2854                       or (NVL(l.entered_cr,0) < 0 AND NVL(l.accounted_cr,0) > 0)
2855                       or (NVL(l.entered_dr,0) < 0 AND NVL(l.accounted_dr,0) > 0)
2856                       or (g_ledger_currency_code = l.currency_code AND
2857                           (nvl(l.unrounded_entered_dr,C_NUM) <> nvl(l.unrounded_accounted_dr,C_NUM) or
2858                            nvl(l.unrounded_entered_cr,C_NUM) <> nvl(l.unrounded_accounted_cr,C_NUM)))
2859                     /*  or (g_ledger_currency_code = l.currency_code AND
2860                           (l.currency_conversion_type IS NOT NULL or nvl(l.currency_conversion_rate,1) <> 1)) */ -- commented for bug:8417965
2861                       or (g_ledger_currency_code <> l.currency_code AND
2862                           ((l.currency_conversion_type = 'User' AND l.currency_conversion_rate IS NULL) or
2863                            (nvl(l.currency_conversion_type,'User') <> 'User' AND l.currency_conversion_date IS NULL)))
2864                       or (g_ledger_coa_id <> ccid.chart_of_accounts_id)
2865                       THEN 'Y'
2866                       ELSE NULL
2867                       END
2868     FROM         xla_ae_headers         h
2869                 ,xla_ae_lines           l
2870                 ,gl_code_combinations   ccid
2871                 ,fnd_currencies fcu
2872     WHERE       ccid.code_combination_id(+) = l.code_combination_id
2873       AND       l.ae_header_id              = h.ae_header_id
2874       AND       l.application_id            = h.application_id
2875       AND       l.currency_code = fcu.currency_code(+)
2876       AND       h.ledger_id                 = g_ledger_id
2877       AND       h.ae_header_id              = g_ae_header_id
2878       AND       h.application_id            = g_application_id;
2879 
2880   END IF;
2881 
2882   IF (C_LEVEL_STATEMENT >= g_log_level) THEN
2883     trace(p_msg    => '# lines inserted = '||SQL%ROWCOUNT,
2884           p_module => l_log_module,
2885           p_level  => C_LEVEL_STATEMENT);
2886   END IF;
2887 
2888   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
2889     trace(p_msg    => 'End of procedure load_lines',
2890           p_module => l_log_module,
2891           p_level  => C_LEVEL_PROCEDURE);
2892   END IF;
2893 
2894 EXCEPTION
2895 WHEN xla_exceptions_pkg.application_exception THEN
2896   RAISE;
2897 
2898 WHEN OTHERS THEN
2899   xla_exceptions_pkg.raise_message
2900       (p_location => 'xla_je_validation_pkg.load_lines');
2901 END load_lines;
2902 
2903 --=============================================================================
2904 --
2905 -- Name: validate_doc_sequence
2906 -- Description: This function will perform validation on the document sequence
2907 --              for the journal entry. If any validation failed, the error will
2908 --              be loaded into the xla_accounting_errors table for future referal.
2909 --
2910 --=============================================================================
2911 PROCEDURE validate_doc_sequence
2912 IS
2913   CURSOR c_manual IS
2914     SELECT h.ae_header_id
2915           ,h.entity_id
2916           ,h.event_id
2917           ,h.doc_sequence_id
2918           ,h.doc_category_code
2919           ,CASE WHEN h.doc_category_code IS NOT NULL AND cat.code IS NULL
2920                 THEN 'N'
2921                 ELSE 'Y'
2922                 END doc_category_code_valid_flag
2923           ,CASE WHEN h.doc_sequence_id IS NOT NULL AND doc.doc_sequence_id IS NULL
2924                 THEN 'N'
2925                 ELSE 'Y'
2926                 END doc_sequence_id_valid_flag
2927     FROM   xla_ae_headers h
2928            LEFT OUTER JOIN fnd_doc_sequence_categories cat
2929            ON   cat.code                     = h.doc_category_code
2930            LEFT OUTER JOIN fnd_document_sequences doc
2931            ON   doc.doc_sequence_id          = h.doc_sequence_id
2932     WHERE  h.ae_header_id             = g_ae_header_id
2933     AND    h.application_id           = g_application_id
2934     AND    ((h.doc_category_code IS NOT NULL AND cat.code IS NULL) OR
2935             (h.doc_sequence_id IS NOT NULL AND doc.doc_sequence_id IS NULL));
2936 
2937   CURSOR c_standard IS
2938     SELECT h.ae_header_id
2939           ,h.entity_id
2940           ,h.event_id
2941           ,h.doc_sequence_id
2942           ,h.doc_category_code
2943           ,CASE WHEN h.doc_category_code IS NOT NULL AND cat.code IS NULL
2944                 THEN 'N'
2945                 ELSE 'Y'
2946                 END doc_category_code_valid_flag
2947           ,CASE WHEN h.doc_sequence_id IS NOT NULL AND doc.doc_sequence_id IS NULL
2948                 THEN 'N'
2949                 ELSE 'Y'
2950                 END doc_sequence_id_valid_flag
2951     FROM   xla_ae_headers_gt h
2952            LEFT OUTER JOIN fnd_doc_sequence_categories cat
2953            ON   cat.code                     = h.doc_category_code
2954            LEFT OUTER JOIN fnd_document_sequences doc
2955            ON   doc.doc_sequence_id          = h.doc_sequence_id
2956     WHERE  h.ledger_id = g_ledger_id
2957       AND  h.accounting_date <= NVL(g_end_date, h.accounting_date)    -- 4262811
2958       AND  ((h.doc_category_code IS NOT NULL AND cat.code IS NULL) OR
2959             (h.doc_sequence_id IS NOT NULL AND doc.doc_sequence_id IS NULL));
2960 
2961   l_app_name         VARCHAR2(240);
2962   l_err              c_standard%ROWTYPE;
2963 
2964   l_log_module                  VARCHAR2(240);
2965 BEGIN
2966   IF g_log_enabled THEN
2967     l_log_module := C_DEFAULT_MODULE||'.validate_doc_sequence';
2968   END IF;
2969 
2970   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
2971     trace(p_msg    => 'BEGIN of function validate_doc_sequence',
2972           p_module => l_log_module,
2973           p_level  => C_LEVEL_PROCEDURE);
2974   END IF;
2975 
2976   IF (g_caller = C_CALLER_MANUAL) THEN
2977     OPEN c_manual;
2978   ELSE
2979     OPEN c_standard;
2980   END IF;
2981 
2982   IF (C_LEVEL_EVENT >= g_log_level) THEN
2983     trace(p_msg    => 'BEGIN LOOP - invalid doc sequence',
2984           p_module => l_log_module,
2985           p_level  => C_LEVEL_EVENT);
2986   END IF;
2987 
2988   LOOP
2989     IF (g_caller = C_CALLER_MANUAL) THEN
2990       FETCH c_manual INTO l_err;
2991       EXIT WHEN c_manual%NOTFOUND;
2992     ELSE
2993       FETCH c_standard INTO l_err;
2994       EXIT WHEN c_standard%NOTFOUND;
2995     END IF;
2996 
2997     IF (C_LEVEL_ERROR >= g_log_level) THEN
2998       trace(p_msg    => 'LOOP invalid headers: ae_header_id = '||l_err.ae_header_id,
2999             p_module => l_log_module,
3000             p_level  => C_LEVEL_ERROR);
3001     END IF;
3002 
3003     g_err_count := g_err_count + 1;
3004     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3005     g_err_event_ids(g_err_count) := l_err.event_id;
3006 
3007     IF (l_err.doc_category_code_valid_flag = 'N') THEN
3008 
3009       SELECT    application_name INTO l_app_name
3010       FROM      fnd_application_vl
3011       WHERE     application_id = g_application_id;
3012 
3013       xla_accounting_err_pkg.build_message(
3014          p_appli_s_name         => 'XLA'
3015         ,p_msg_name             => 'XLA_AP_INVALID_DOC_SEQ_CAT'
3016         ,p_token_1              => 'CATEGORY_NAME'
3017         ,p_value_1              => l_err.doc_category_code
3018         ,p_token_2              => 'APPLICATION_NAME'
3019         ,p_value_2              => l_app_name
3020         ,p_entity_id            => l_err.entity_id
3021         ,p_event_id             => l_err.event_id
3022         ,p_ledger_id            => g_ledger_id
3023         ,p_ae_header_id         => l_err.ae_header_id
3024         ,p_ae_line_num          => NULL
3025         ,p_accounting_batch_id  => NULL);
3026     END IF;
3027 
3028     IF (l_err.doc_sequence_id_valid_flag = 'N') THEN
3029 
3030       SELECT    application_name INTO l_app_name
3031       FROM      fnd_application_vl
3032       WHERE     application_id = g_application_id;
3033 
3034       xla_accounting_err_pkg.build_message(
3035          p_appli_s_name         => 'XLA'
3036         ,p_msg_name             => 'XLA_AP_INVALID_DOC_SEQ_ID'
3037         ,p_token_1              => 'SEQUENCE_ID'
3038         ,p_value_1              => l_err.doc_sequence_id
3039         ,p_token_2              => 'APPLICATION_NAME'
3040         ,p_value_2              => l_app_name
3041         ,p_entity_id            => l_err.entity_id
3042         ,p_event_id             => l_err.event_id
3043         ,p_ledger_id            => g_ledger_id
3044         ,p_ae_header_id         => l_err.ae_header_id
3045         ,p_ae_line_num          => NULL
3046         ,p_accounting_batch_id  => NULL);
3047     END IF;
3048   END LOOP;
3049 
3050   IF (C_LEVEL_EVENT >= g_log_level) THEN
3051     trace(p_msg    => 'END LOOP - invalid doc sequence',
3052           p_module => l_log_module,
3053           p_level  => C_LEVEL_EVENT);
3054   END IF;
3055 
3056   IF (g_caller = C_CALLER_MANUAL) THEN
3057     CLOSE c_manual;
3058   ELSE
3059     CLOSE c_standard;
3060   END IF;
3061 
3062   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3063     trace(p_msg    => 'End of function validate_doc_sequence',
3064           p_module => l_log_module,
3065           p_level  => C_LEVEL_PROCEDURE);
3066   END IF;
3067 EXCEPTION
3068 WHEN xla_exceptions_pkg.application_exception THEN
3069   IF (c_manual%ISOPEN) THEN
3070     CLOSE c_manual;
3071   END IF;
3072   IF (c_standard%ISOPEN) THEN
3073     CLOSE c_standard;
3074   END IF;
3075   RAISE;
3076 
3077 WHEN OTHERS THEN
3078   IF (c_manual%ISOPEN) THEN
3079     CLOSE c_manual;
3080   END IF;
3081   IF (c_standard%ISOPEN) THEN
3082     CLOSE c_standard;
3083   END IF;
3084   xla_exceptions_pkg.raise_message
3085       (p_location => 'xla_je_validation_pkg.validate_doc_sequence');
3086 END validate_doc_sequence;
3087 
3088 --=============================================================================
3089 --
3090 -- Name: validate_encumbrances
3091 -- Description: This function will perform validation on the encumbrance type id
3092 --              for the journal entry. If any validation failed, the error will
3093 --              be loaded into the xla_accounting_errors table for future referal.
3094 --
3095 --=============================================================================
3096 PROCEDURE validate_encumbrances
3097 IS
3098   CURSOR c_err IS
3099     SELECT h.ae_header_id
3100           ,h.ae_line_num       -- 5522973
3101           ,h.entity_id
3102           ,h.event_id
3103           ,h.encumbrance_type_id
3104           ,e.encumbrance_type  -- 5522973
3105           ,e.enabled_flag encum_type_enabled_flag
3106     FROM  xla_validation_lines_gt h
3107           LEFT OUTER JOIN gl_encumbrance_types e
3108           ON   e.encumbrance_type_id        = h.encumbrance_type_id
3109     WHERE h.ledger_id             = g_ledger_id
3110     AND   h.balance_type_code     = 'E'
3111 --  AND   h.encumbrance_type_id   IS NOT NULL  -- 5522973 removed
3112     AND   nvl(e.enabled_flag,'N') = 'N';
3113 
3114   l_log_module       VARCHAR2(240);
3115 BEGIN
3116   IF g_log_enabled THEN
3117     l_log_module := C_DEFAULT_MODULE||'.validate_encumbrances';
3118   END IF;
3119 
3120   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3121     trace(p_msg    => 'BEGIN of function validate_encumbrances',
3122           p_module => l_log_module,
3123           p_level  => C_LEVEL_PROCEDURE);
3124   END IF;
3125 
3126   IF (C_LEVEL_EVENT >= g_log_level) THEN
3127     trace(p_msg    => 'BEGIN LOOP - invalid encumbrances',
3128           p_module => l_log_module,
3129           p_level  => C_LEVEL_EVENT);
3130   END IF;
3131 
3132   FOR l_err IN c_err LOOP
3133     IF (C_LEVEL_ERROR >= g_log_level) THEN
3134       trace(p_msg    => 'LOOP invalid encumbrances: ae_header_id = '||l_err.ae_header_id,
3135             p_module => l_log_module,
3136             p_level  => C_LEVEL_ERROR);
3137       trace(p_msg    => 'ae_line = '||l_err.ae_line_num||  -- 5522973
3138                         ' enc_id = '||l_err.encumbrance_type_id||
3139                         ' enc_enabled = '||l_err.encum_type_enabled_flag,
3140             p_module => l_log_module,
3141             p_level  => C_LEVEL_ERROR);
3142     END IF;
3143 
3144     g_err_count := g_err_count + 1;
3145     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3146     g_err_event_ids(g_err_count) := l_err.event_id;
3147 
3148     IF (l_err.encum_type_enabled_flag IS NULL) THEN
3149        IF l_err.encumbrance_type_id IS NULL THEN  -- 5522973
3150           xla_accounting_err_pkg.build_message(
3151              p_appli_s_name           => 'XLA'
3152             ,p_msg_name               => 'XLA_AP_NO_ENCUM_TYPE'
3153             ,p_entity_id              => l_err.entity_id
3154             ,p_event_id               => l_err.event_id
3155             ,p_ledger_id              => g_ledger_id
3156             ,p_ae_header_id           => l_err.ae_header_id
3157             ,p_ae_line_num            => l_err.ae_line_num
3158             ,p_accounting_batch_id    => NULL);
3159        ELSE
3160           xla_accounting_err_pkg.build_message(
3161              p_appli_s_name         => 'XLA'
3162             ,p_msg_name             => 'XLA_AP_INVALID_ENCU_TYPE'
3163             ,p_token_1              => 'ENCUMBRANCE_TYPE_ID'
3164             ,p_value_1              => l_err.encumbrance_type_id
3165             ,p_entity_id            => l_err.entity_id
3166             ,p_event_id             => l_err.event_id
3167             ,p_ledger_id            => g_ledger_id
3168             ,p_ae_header_id         => l_err.ae_header_id
3169             ,p_ae_line_num          => l_err.ae_line_num  -- 5522973
3170             ,p_accounting_batch_id  => NULL);
3171        END IF;
3172     ELSIF l_err.encum_type_enabled_flag <> 'Y'  THEN
3173       xla_accounting_err_pkg.build_message(
3174          p_appli_s_name         => 'XLA'
3175         ,p_msg_name             => 'XLA_AP_INACTIVE_ENCUM_TYPE'
3176         ,p_token_1              => 'ENCUMBRANCE_TYPE_ID'
3177         ,p_value_1              => l_err.encumbrance_type  -- 5520736 instead of l_err.encumbrance_type_id
3178         ,p_entity_id            => l_err.entity_id
3179         ,p_event_id             => l_err.event_id
3180         ,p_ledger_id            => g_ledger_id
3181         ,p_ae_header_id         => l_err.ae_header_id
3182         ,p_ae_line_num          => l_err.ae_line_num  -- 5522973
3183         ,p_accounting_batch_id  => NULL);
3184     END IF;
3185   END LOOP;
3186 
3187   IF (C_LEVEL_EVENT >= g_log_level) THEN
3188     trace(p_msg    => 'END LOOP - invalid encumbrances',
3189           p_module => l_log_module,
3190           p_level  => C_LEVEL_EVENT);
3191   END IF;
3192 
3193   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3194     trace(p_msg    => 'End of function validate_encumbrances',
3195           p_module => l_log_module,
3196           p_level  => C_LEVEL_PROCEDURE);
3197   END IF;
3198 EXCEPTION
3199 WHEN xla_exceptions_pkg.application_exception THEN
3200   IF (c_err%ISOPEN) THEN
3201     CLOSE c_err;
3202   END IF;
3203   RAISE;
3204 
3205 WHEN OTHERS THEN
3206   IF (c_err%ISOPEN) THEN
3207     CLOSE c_err;
3208   END IF;
3209   xla_exceptions_pkg.raise_message
3210       (p_location => 'xla_je_validation_pkg.validate_encumbrances');
3211 END validate_encumbrances;
3212 
3213 --=============================================================================
3214 --
3215 -- Name: validate_budgets
3216 -- Description: This function will perform validation on the budget version id
3217 --              and the budget period for the journal entry. If any validation
3218 --              failed, the error will be loaded into the xla_accounting_errors
3219 --              table for future referal.
3220 --
3221 --=============================================================================
3222 PROCEDURE validate_budgets
3223 IS
3224   CURSOR c_manual IS
3225     SELECT h.ae_header_id
3226           ,h.entity_id
3227           ,h.event_id
3228           ,h.budget_version_id
3229           ,h.accounting_date
3230           ,bv.budget_name                                                                           -- 5592776
3231           ,bv.status budget_version_status
3232           ,CASE WHEN h.balance_type_code = 'B' AND
3233                      gp.period_year > b.latest_opened_year
3234                 THEN 'N'
3235                 ELSE 'Y' END budget_period_valid_flag
3236     FROM  xla_ae_headers h
3237           JOIN gl_period_statuses gp
3238           ON   gp.period_name               = h.period_name
3239           AND  gp.ledger_id                 = g_ledger_id
3240           AND  gp.application_id            = C_GL_APPLICATION_ID
3241           LEFT OUTER JOIN gl_budget_versions bv
3242           ON   bv.budget_version_id     = h.budget_version_id
3243           LEFT OUTER JOIN gl_budgets b
3244           ON   b.budget_name             = bv.budget_name
3245           AND  b.budget_type             = bv.budget_type
3246     WHERE h.ae_header_id        = g_ae_header_id
3247       AND h.application_id      = g_application_id
3248       AND h.balance_type_code   = 'B'
3249       AND h.budget_version_id   IS NOT NULL
3250       AND (bv.status IS NULL OR
3251            nvl(bv.status,'I') in ('I', 'F') OR
3252            gp.period_year > b.latest_opened_year);
3253 
3254   CURSOR c_standard IS
3255     SELECT h.ae_header_id
3256           ,h.entity_id
3257           ,h.event_id
3258           ,h.budget_version_id
3259           ,h.accounting_date
3260           ,bv.budget_name                                                                           -- 5592776
3261           ,decode(nvl(b.ledger_id,h.ledger_id), h.ledger_id, bv.status , 'X') budget_version_status -- 5592776
3262           ,CASE WHEN h.balance_type_code = 'B' AND
3263                      h.period_year > b.latest_opened_year
3264                 THEN 'N'
3265                 ELSE 'Y' END budget_period_valid_flag
3266     FROM  xla_ae_headers_gt h
3267           LEFT OUTER JOIN gl_budget_versions bv
3268           ON   bv.budget_version_id     = h.budget_version_id
3269           LEFT OUTER JOIN gl_budgets b
3270           ON   b.budget_name             = bv.budget_name
3271           AND  b.budget_type             = bv.budget_type
3272     WHERE h.ledger_id           = g_ledger_id
3273       AND h.balance_type_code   = 'B'
3274       AND h.budget_version_id   IS NOT NULL
3275       AND (bv.status IS NULL OR
3276            nvl(bv.status,'I') in ('I', 'F') OR
3277            b.ledger_id <> h.ledger_id OR                                                            -- 5592776
3278            h.period_year > b.latest_opened_year);
3279 
3280   l_budget_name      VARCHAR2(30);
3281   l_err              c_standard%ROWTYPE;
3282   l_log_module       VARCHAR2(240);
3283 BEGIN
3284   IF g_log_enabled THEN
3285     l_log_module := C_DEFAULT_MODULE||'.validate_budgets';
3286   END IF;
3287 
3288   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3289     trace(p_msg    => 'BEGIN of function validate_budgets',
3290           p_module => l_log_module,
3291           p_level  => C_LEVEL_PROCEDURE);
3292   END IF;
3293 
3294   IF (g_caller = C_CALLER_MANUAL) THEN
3295     OPEN c_manual;
3296   ELSE
3297     OPEN c_standard;
3298   END IF;
3299 
3300   IF (C_LEVEL_EVENT >= g_log_level) THEN
3301     trace(p_msg    => 'BEGIN LOOP - invalid budgets',
3302           p_module => l_log_module,
3303           p_level  => C_LEVEL_EVENT);
3304   END IF;
3305 
3306   LOOP
3307     IF (g_caller = C_CALLER_MANUAL) THEN
3308       FETCH c_manual INTO l_err;
3309       EXIT WHEN c_manual%NOTFOUND;
3310     ELSE
3311       FETCH c_standard INTO l_err;
3312       EXIT WHEN c_standard%NOTFOUND;
3313     END IF;
3314 
3315     IF (C_LEVEL_ERROR >= g_log_level) THEN
3316       trace(p_msg    => 'LOOP invalid budgets: ae_header_id = '||l_err.ae_header_id,
3317             p_module => l_log_module,
3318             p_level  => C_LEVEL_ERROR);
3319     END IF;
3320 
3321     g_err_count := g_err_count + 1;
3322     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3323     g_err_event_ids(g_err_count) := l_err.event_id;
3324 
3325     IF (l_err.budget_version_status IS NULL) THEN
3326         xla_accounting_err_pkg.build_message(
3327          p_appli_s_name         => 'XLA'
3328         ,p_msg_name             => 'XLA_AP_INVALID_BUD_VER'
3329         ,p_token_1              => 'BUDGET_VERSION_ID'
3330         ,p_value_1              => l_err.budget_version_id
3331         ,p_entity_id            => l_err.entity_id
3332         ,p_event_id             => l_err.event_id
3333         ,p_ledger_id            => g_ledger_id
3334         ,p_ae_header_id         => l_err.ae_header_id
3335         ,p_ae_line_num          => NULL
3336         ,p_accounting_batch_id  => NULL);
3337 
3338     ELSIF l_err.budget_version_status in ('X') THEN  -- 5592776
3339         xla_accounting_err_pkg.build_message(
3340          p_appli_s_name         => 'XLA'
3341         ,p_msg_name             => 'XLA_AP_INVALID_BUDGET_LEDGER'
3342         ,p_token_1              => 'BUDGET_NAME'
3343         ,p_value_1              => l_err.budget_name
3344         ,p_token_2              => 'LEDGER_NAME'
3345         ,p_value_2              => g_ledger_name
3346         ,p_entity_id            => l_err.entity_id
3347         ,p_event_id             => l_err.event_id
3348         ,p_ledger_id            => g_ledger_id
3349         ,p_ae_header_id         => l_err.ae_header_id
3350         ,p_ae_line_num          => NULL
3351         ,p_accounting_batch_id  => NULL);
3352 
3353     ELSIF l_err.budget_version_status in ('I', 'F') THEN
3354         xla_accounting_err_pkg.build_message(
3355          p_appli_s_name         => 'XLA'
3356         ,p_msg_name             => 'XLA_AP_INACTIVE_BUDGET_VER'
3357         ,p_token_1              => 'BUDGET_VERSION_ID'
3358         ,p_value_1              => l_err.budget_version_id
3359         ,p_entity_id            => l_err.entity_id
3360         ,p_event_id             => l_err.event_id
3361         ,p_ledger_id            => g_ledger_id
3362         ,p_ae_header_id         => l_err.ae_header_id
3363         ,p_ae_line_num          => NULL
3364         ,p_accounting_batch_id  => NULL);
3365 
3366     ELSIF (l_err.budget_period_valid_flag = 'N') THEN
3367       SELECT    budget_name
3368       INTO      l_budget_name
3369       FROM      gl_budget_versions
3370       WHERE     budget_version_id = l_err.budget_version_id;
3371 
3372       xla_accounting_err_pkg.build_message(
3373          p_appli_s_name         => 'XLA'
3374         ,p_msg_name             => 'XLA_AP_INVALID_BUDGET_DATE'
3375         ,p_token_1              => 'BUDGET_NAME'
3376         ,p_value_1              => l_budget_name
3377         ,p_token_2              => 'GL_DATE'
3378         ,p_value_2              => l_err.accounting_date
3379         ,p_entity_id            => l_err.entity_id
3380         ,p_event_id             => l_err.event_id
3381         ,p_ledger_id            => g_ledger_id
3382         ,p_ae_header_id         => l_err.ae_header_id
3383         ,p_ae_line_num          => NULL
3384         ,p_accounting_batch_id  => NULL);
3385     END IF;
3386 
3387   END LOOP;
3388 
3389   IF (C_LEVEL_EVENT >= g_log_level) THEN
3390     trace(p_msg    => 'END LOOP - invalid budgets',
3391           p_module => l_log_module,
3392           p_level  => C_LEVEL_EVENT);
3393   END IF;
3394 
3395   IF (g_caller = C_CALLER_MANUAL) THEN
3396     CLOSE c_manual;
3397   ELSE
3398     CLOSE c_standard;
3399   END IF;
3400 
3401   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3402     trace(p_msg    => 'End of function validate_budgets',
3403           p_module => l_log_module,
3404           p_level  => C_LEVEL_PROCEDURE);
3405   END IF;
3406 EXCEPTION
3407 WHEN xla_exceptions_pkg.application_exception THEN
3408   IF (c_manual%ISOPEN) THEN
3409     CLOSE c_manual;
3410   END IF;
3411   IF (c_standard%ISOPEN) THEN
3412     CLOSE c_standard;
3413   END IF;
3414   RAISE;
3415 
3416 WHEN OTHERS THEN
3417   IF (c_manual%ISOPEN) THEN
3418     CLOSE c_manual;
3419   END IF;
3420   IF (c_standard%ISOPEN) THEN
3421     CLOSE c_standard;
3422   END IF;
3423   xla_exceptions_pkg.raise_message
3424       (p_location => 'xla_je_validation_pkg.validate_budgets');
3425 END validate_budgets;
3426 
3427 
3428 --=============================================================================
3429 --
3430 -- Name: validate_business_date
3431 -- Description: This procedure will validate the business date
3432 --
3433 --=============================================================================
3434 PROCEDURE validate_business_date
3435 IS
3436   CURSOR c_eff_date_rule IS
3437     SELECT effective_date_rule_code
3438       FROM gl_je_sources  gjs
3439          , xla_subledgers xs
3440      WHERE gjs.je_source_name = xs.je_source_name
3441        AND xs.application_id  = g_application_id;
3442 
3443   CURSOR c_invalid_business_date IS
3444     SELECT xah.ae_header_id
3445           ,xah.event_id
3446           ,xah.entity_id
3447           ,xah.accounting_date
3448       FROM xla_ae_headers         xah
3449          , gl_transaction_dates   gtd
3450      WHERE xah.accounting_date         = gtd.transaction_date
3451        AND gtd.transaction_calendar_id = g_transaction_calendar_id
3452        AND gtd.business_day_flag          = 'N'
3453        --added for bug 9839027
3454        and xah.ae_header_id in
3455        		(select lgt.ae_header_id from xla_validation_lines_gt lgt)
3456        and xah.application_id = g_application_id;
3457 
3458   l_eff_date_rule_code          VARCHAR2(1);
3459   l_log_module                  VARCHAR2(240);
3460 BEGIN
3461   IF g_log_enabled THEN
3462     l_log_module := C_DEFAULT_MODULE||'.validate_business_date';
3463   END IF;
3464 
3465   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3466     trace(p_msg    => 'BEGIN of function validate_business_date'||
3467                       ': enable_average_balances_flag = '||g_enable_average_balances_flag||
3468                       ', transaction_calendar_id = '||g_transaction_calendar_id,
3469           p_module => l_log_module,
3470           p_level  => C_LEVEL_PROCEDURE);
3471   END IF;
3472 
3473   IF (g_enable_average_balances_flag = 'Y' AND
3474       g_transaction_calendar_id     IS NOT NULL) THEN
3475 
3476     OPEN c_eff_date_rule;
3477     FETCH c_eff_date_rule INTO l_eff_date_rule_code;
3478     CLOSE c_eff_date_rule;
3479 
3480     IF (C_LEVEL_EVENT >= g_log_level) THEN
3481       trace(p_msg    => 'effective_date_rule_code = '||l_eff_date_rule_code,
3482             p_module => l_log_module,
3483             p_level  => C_LEVEL_EVENT);
3484     END IF;
3485 
3486     IF (l_eff_date_rule_code = 'F') THEN
3487 
3488       IF (C_LEVEL_EVENT >= g_log_level) THEN
3489         trace(p_msg    => 'BEGIN LOOP - invalid business date',
3490               p_module => l_log_module,
3491               p_level  => C_LEVEL_EVENT);
3492       END IF;
3493 
3494       FOR l_err IN c_invalid_business_date LOOP
3495 
3496         IF (C_LEVEL_ERROR >= g_log_level) THEN
3497           trace(p_msg    => 'LOOP - invalid business date: ae_header_id = '|| l_err.ae_header_id||
3498                            ', accounting_date = '|| l_err.accounting_date,
3499                 p_module => l_log_module,
3500                 p_level  => C_LEVEL_ERROR);
3501         END IF;
3502 
3503         g_err_count := g_err_count+1;
3504         g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3505         g_err_event_ids(g_err_count) := l_err.event_id;
3506 
3507         xla_accounting_err_pkg.build_message(
3508                     p_appli_s_name              => 'XLA'
3509                     ,p_msg_name         => 'XLA_AP_INVALID_TRX_DATE'
3510                     ,p_entity_id                => l_err.entity_id
3511                     ,p_event_id         => l_err.event_id
3512                     ,p_ledger_id                => g_ledger_id
3513                     ,p_ae_header_id             => l_err.ae_header_id
3514                     ,p_ae_line_num              => NULL
3515                     ,p_accounting_batch_id      => NULL);
3516       END LOOP;
3517 
3518       IF (C_LEVEL_EVENT >= g_log_level) THEN
3519         trace(p_msg    => 'END LOOP - invalid business date',
3520               p_module => l_log_module,
3521               p_level  => C_LEVEL_EVENT);
3522       END IF;
3523 
3524     END IF;
3525   END IF;
3526 
3527   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3528     trace(p_msg    => 'END of function validate_business_date',
3529           p_module => l_log_module,
3530           p_level  => C_LEVEL_PROCEDURE);
3531   END IF;
3532 
3533 EXCEPTION
3534 WHEN xla_exceptions_pkg.application_exception THEN
3535   IF (c_eff_date_rule%ISOPEN) THEN
3536     CLOSE c_eff_date_rule;
3537   END IF;
3538   IF (c_invalid_business_date%ISOPEN) THEN
3539     CLOSE c_invalid_business_date;
3540   END IF;
3541   RAISE;
3542 
3543 WHEN OTHERS THEN
3544   IF (c_eff_date_rule%ISOPEN) THEN
3545     CLOSE c_eff_date_rule;
3546   END IF;
3547   IF (c_invalid_business_date%ISOPEN) THEN
3548     CLOSE c_invalid_business_date;
3549   END IF;
3550   xla_exceptions_pkg.raise_message
3551       (p_location => 'xla_je_validation_pkg.validate_business_date');
3552 END validate_business_date;
3553 
3554 
3555 
3556 --=============================================================================
3557 --
3558 -- Name: validate_headers
3559 -- Description: This function will perform validation for the journal entry.
3560 --              If any validation failed, the error will be loaded into the
3561 --              xla_accounting_errors table for future referal.
3562 --
3563 --=============================================================================
3564 PROCEDURE validate_headers
3565 IS
3566   CURSOR c_manual IS
3567       SELECT h.ae_header_id
3568             ,h.entity_id
3569             ,h.event_id
3570             ,h.accounting_date
3571             ,h.reference_date
3572             ,h.balance_type_code
3573             ,h.budget_version_id
3574             ,CASE WHEN h.balance_type_code = 'E' AND
3575                            gp.period_year > g.latest_encumbrance_year
3576                   THEN 'N'
3577                   ELSE 'Y' END encum_period_valid_flag
3578             ,CASE WHEN h.balance_type_code = 'A' AND
3579                            gp.closing_status not in ('O', 'F')
3580                   THEN 'N'
3581                   ELSE 'Y' END gl_date_valid_flag
3582             ,CASE WHEN h.reference_date IS NULL THEN 'Y'
3583                   WHEN nvl(rp.closing_status,'C') in ('O', 'F') THEN 'Y'
3584                   ELSE 'N' END reference_date_valid_flag
3585             ,NULL                            header_num            -- 4262811
3586             ,NULL                            period_closing_status -- 4262811
3587             ,h.period_name                   period_name           -- 5136994
3588 	    ,h.gl_transfer_status_code
3589       FROM   xla_ae_headers     h
3590              JOIN gl_ledgers g
3591              ON   g.ledger_id                  = h.ledger_id
3592              JOIN gl_period_statuses gp
3593              ON   gp.period_name               = h.period_name
3594              AND  gp.ledger_id                 = h.ledger_id
3595              AND  gp.application_id            = C_GL_APPLICATION_ID
3596              LEFT OUTER JOIN gl_period_statuses rp
3597              ON   rp.adjustment_period_flag    = 'N'
3598              AND  h.reference_date BETWEEN rp.start_date AND rp.end_date
3599              AND  rp.ledger_id                 = h.ledger_id
3600              AND  rp.application_id            = C_GL_APPLICATION_ID
3601       WHERE  h.ae_header_id        = g_ae_header_id
3602       AND    h.application_id      = g_application_id
3603       AND    ((h.balance_type_code = 'B' AND h.budget_version_id IS NULL) OR
3604               (h.balance_type_code <> 'B' AND h.budget_version_id IS NOT NULL) OR
3605               (h.balance_type_code NOT IN ('A', 'B', 'E')) OR
3606               (h.balance_type_code = 'E' AND gp.period_year > g.latest_encumbrance_year) OR
3607               (h.balance_type_code = 'A' AND gp.closing_status NOT IN ('O', 'F')) OR
3608               (h.reference_date IS NOT NULL AND nvl(rp.closing_status,'C') NOT IN ('O', 'F')));
3609 
3610   CURSOR c_standard IS
3611       SELECT     /*+ index(gp, GL_PERIOD_STATUSES_U3) */
3612                  h.ae_header_id
3613                 ,h.entity_id
3614                 ,h.event_id
3615                 ,h.accounting_date
3616                 ,NULL reference_date
3617                 ,h.balance_type_code
3618                 ,h.budget_version_id
3619                 ,CASE WHEN h.balance_type_code = 'E' AND
3620                          --h.period_year > g_latest_encumbrance_year                                   -- 5136994
3621                            NVL(h.period_year,g_latest_encumbrance_year+1) > g_latest_encumbrance_year  -- 5136994
3622                       THEN 'N'
3623                       ELSE 'Y' END encum_period_valid_flag
3624                 ,CASE WHEN h.balance_type_code = 'A' AND
3625                          --h.period_closing_status not in ('O', 'F')
3626                            NVL(h.period_closing_status,'X') not in ('O', 'F') -- 5136994
3627                       THEN 'N'
3628                       ELSE 'Y' END gl_date_valid_flag
3629                 ,'Y' reference_date_valid_flag
3630                 ,NVL(h.header_num,0)             header_num            -- 4262811
3631                 ,h.period_closing_status         period_closing_status -- 4262811
3632                 ,h.period_name                   period_name           -- 5136994
3633 		,h.gl_transfer_status_code
3634       FROM       xla_ae_headers_gt h
3635       WHERE      h.ledger_id = g_ledger_id
3636         AND     (h.accounting_date <= g_end_date OR h.period_closing_status IN ('P','C')    -- 4262811
3637                    OR h.period_name IS NULL)  -- 5136994
3638         AND      ((h.balance_type_code =  'B' AND h.budget_version_id IS NULL) OR
3639                   (h.balance_type_code <> 'B' AND h.budget_version_id IS NOT NULL) OR
3640                   (h.balance_type_code NOT IN ('A', 'B', 'E')) OR
3641                 -- 5136994
3642                   (h.balance_type_code =  'E' AND NVL(h.period_year,g_latest_encumbrance_year+1) > g_latest_encumbrance_year) OR
3643                   (h.balance_type_code =  'A' AND NVL(h.period_closing_status,'X') NOT IN ('O', 'F')));
3644                 --(h.balance_type_code =  'E' AND h.period_year > g_latest_encumbrance_year) OR
3645                 --(h.balance_type_code =  'A' AND h.period_closing_status NOT IN ('O', 'F')));
3646 
3647   l_err                c_standard%ROWTYPE;
3648   l_log_module         VARCHAR2(240);
3649 BEGIN
3650   IF g_log_enabled THEN
3651     l_log_module := C_DEFAULT_MODULE||'.validate_headers';
3652   END IF;
3653 
3654   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3655     trace(p_msg    => 'BEGIN of function validate_headers',
3656           p_module => l_log_module,
3657           p_level  => C_LEVEL_PROCEDURE);
3658   END IF;
3659 
3660   IF (g_caller = C_CALLER_MANUAL) THEN
3661     OPEN c_manual;
3662   ELSE
3663     OPEN c_standard;
3664   END IF;
3665 
3666   IF (C_LEVEL_EVENT >= g_log_level) THEN
3667     trace(p_msg    => 'BEGIN LOOP - invalid header',
3668           p_module => l_log_module,
3669           p_level  => C_LEVEL_EVENT);
3670   END IF;
3671 
3672 
3673 LOOP
3674     IF (g_caller = C_CALLER_MANUAL) THEN
3675       FETCH c_manual INTO l_err;
3676       EXIT WHEN c_manual%NOTFOUND;
3677     ELSE
3678       FETCH c_standard INTO l_err;
3679       EXIT WHEN c_standard%NOTFOUND;
3680     END IF;
3681 
3682 
3683 IF (l_err.balance_type_code = 'A' AND l_err.gl_date_valid_flag = 'N' AND l_err.gl_transfer_status_code = 'NT') THEN
3684     IF (l_err.reference_date_valid_flag = 'N') THEN
3685       -- 4262811-----------------------------
3686       IF g_caller = C_CALLER_MPA_PROGRAM THEN
3687          g_message_name := 'XLA_MA_INVALID_REF_DATE';
3688       ELSE
3689          g_message_name := 'XLA_AP_INVALID_REF_DATE';
3690       END IF;
3691       ---------------------------------------
3692       xla_accounting_err_pkg.build_message(
3693          p_appli_s_name         => 'XLA'
3694         ,p_msg_name             => g_message_name      -- 4262811 'XLA_AP_INVALID_REF_DATE'
3695         ,p_entity_id            => l_err.entity_id
3696         ,p_event_id             => l_err.event_id
3697         ,p_ledger_id            => g_ledger_id
3698         ,p_ae_header_id         => l_err.ae_header_id
3699         ,p_ae_line_num          => NULL
3700         ,p_accounting_batch_id  => NULL);
3701 
3702 	g_err_count := g_err_count + 1;
3703 	g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3704 	g_err_event_ids(g_err_count) := l_err.event_id;
3705     END IF;
3706 
3707 ELSE
3708 
3709     IF (C_LEVEL_ERROR >= g_log_level) THEN
3710       trace(p_msg    => 'LOOP invalid headers: ae_header_id = '||l_err.ae_header_id||
3711                         ' status='||l_err.period_closing_status||
3712                         ' period_name='||l_err.period_name||
3713                         ' gl_date_valid='||l_err.gl_date_valid_flag||
3714                         ' encum_period_valid='||l_err.encum_period_valid_flag||
3715                         ' g_latest_encumbrance_year='||g_latest_encumbrance_year
3716            ,p_module => l_log_module,
3717             p_level  => C_LEVEL_ERROR);
3718     END IF;
3719 
3720     g_err_count := g_err_count + 1;
3721     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3722     g_err_event_ids(g_err_count) := l_err.event_id;
3723 
3724     IF (l_err.balance_type_code NOT IN ('A', 'B', 'E')) THEN
3725       xla_accounting_err_pkg.build_message(
3726          p_appli_s_name         => 'XLA'
3727         ,p_msg_name             => 'XLA_AP_INVALID_BAL_TYPE'
3728         ,p_token_1              => 'BALANCE_TYPE'
3729         ,p_value_1              => l_err.balance_type_code
3730         ,p_entity_id            => l_err.entity_id
3731         ,p_event_id             => l_err.event_id
3732         ,p_ledger_id            => g_ledger_id
3733         ,p_ae_header_id         => l_err.ae_header_id
3734         ,p_ae_line_num          => NULL
3735         ,p_accounting_batch_id  => NULL);
3736     ELSE
3737       IF l_err.balance_type_code = 'B' THEN
3738         IF l_err.budget_version_id IS NULL THEN
3739           xla_accounting_err_pkg.build_message(
3740                p_appli_s_name           => 'XLA'
3741               ,p_msg_name               => 'XLA_AP_NO_BUDGET_VER'
3742               ,p_entity_id              => l_err.entity_id
3743               ,p_event_id               => l_err.event_id
3744               ,p_ledger_id              => g_ledger_id
3745               ,p_ae_header_id           => l_err.ae_header_id
3746               ,p_ae_line_num            => NULL
3747               ,p_accounting_batch_id    => NULL);
3748         END IF;
3749       ELSIF l_err.budget_version_id IS NOT NULL THEN
3750         xla_accounting_err_pkg.build_message(
3751                p_appli_s_name           => 'XLA'
3752               ,p_msg_name               => 'XLA_AP_BUD_VER_REJECT'
3753               ,p_entity_id              => l_err.entity_id
3754               ,p_event_id               => l_err.event_id
3755               ,p_ledger_id              => g_ledger_id
3756               ,p_ae_header_id           => l_err.ae_header_id
3757               ,p_ae_line_num            => NULL
3758               ,p_accounting_batch_id    => NULL);
3759       END IF;
3760 
3761       IF l_err.balance_type_code = 'E' THEN
3762         IF (l_err.encum_period_valid_flag = 'N') THEN
3763           xla_accounting_err_pkg.build_message(
3764                p_appli_s_name           => 'XLA'
3765               ,p_msg_name               => 'XLA_AP_INVALID_ENCUM_DATE'
3766               ,p_token_1                => 'GL_DATE'
3767               ,p_value_1                => l_err.accounting_date
3768               ,p_entity_id              => l_err.entity_id
3769               ,p_event_id               => l_err.event_id
3770               ,p_ledger_id              => g_ledger_id
3771               ,p_ae_header_id           => l_err.ae_header_id
3772               ,p_ae_line_num            => NULL
3773               ,p_accounting_batch_id    => NULL);
3774         END IF;
3775       END IF;
3776 
3777       IF l_err.balance_type_code = 'A' THEN
3778         IF (NVL(l_err.header_num,0) > 0) THEN                            -- 4262811
3779           xla_accounting_err_pkg.build_message(
3780                p_appli_s_name         => 'XLA'
3781               ,p_msg_name             => 'XLA_MA_NO_OPEN_PERIOD'
3782               ,p_token_1              => 'LEDGER'
3783               ,p_value_1              => g_ledger_name
3784               ,p_entity_id            => l_err.entity_id
3785               ,p_event_id             => l_err.event_id
3786               ,p_ledger_id            => g_ledger_id
3787               ,p_ae_header_id         => l_err.ae_header_id
3788               ,p_ae_line_num          => NULL
3789               ,p_accounting_batch_id  => NULL);
3790         ELSIF (l_err.gl_date_valid_flag = 'N' AND l_err.gl_transfer_status_code <> 'NT') THEN
3791           xla_accounting_err_pkg.build_message(
3792                p_appli_s_name         => 'XLA'
3793               ,p_msg_name             => 'XLA_AP_INVALID_GL_DATE'
3794               ,p_token_1              => 'GL_DATE'
3795               ,p_value_1              => to_char(l_err.accounting_date,'DD-MON-YYYY')
3796               ,p_entity_id            => l_err.entity_id
3797               ,p_event_id             => l_err.event_id
3798               ,p_ledger_id            => g_ledger_id
3799               ,p_ae_header_id         => l_err.ae_header_id
3800               ,p_ae_line_num          => NULL
3801               ,p_accounting_batch_id  => NULL);
3802 
3803         END IF;
3804       END IF;
3805     END IF;
3806 
3807     IF (l_err.reference_date_valid_flag = 'N') THEN
3808       -- 4262811-----------------------------
3809       IF g_caller = C_CALLER_MPA_PROGRAM THEN
3810          g_message_name := 'XLA_MA_INVALID_REF_DATE';
3811       ELSE
3812          g_message_name := 'XLA_AP_INVALID_REF_DATE';
3813       END IF;
3814       ---------------------------------------
3815       xla_accounting_err_pkg.build_message(
3816          p_appli_s_name         => 'XLA'
3817         ,p_msg_name             => g_message_name      -- 4262811 'XLA_AP_INVALID_REF_DATE'
3818         ,p_entity_id            => l_err.entity_id
3819         ,p_event_id             => l_err.event_id
3820         ,p_ledger_id            => g_ledger_id
3821         ,p_ae_header_id         => l_err.ae_header_id
3822         ,p_ae_line_num          => NULL
3823         ,p_accounting_batch_id  => NULL);
3824     END IF;
3825 
3826 END IF;
3827 END LOOP;
3828 
3829   IF (C_LEVEL_EVENT >= g_log_level) THEN
3830     trace(p_msg    => 'END LOOP - invalid headers',
3831           p_module => l_log_module,
3832           p_level  => C_LEVEL_EVENT);
3833   END IF;
3834 
3835   IF (g_caller = C_CALLER_MANUAL) THEN
3836     CLOSE c_manual;
3837   ELSE
3838     CLOSE c_standard;
3839   END IF;
3840 
3841   IF g_caller <> C_CALLER_MPA_PROGRAM THEN    -- 4262811
3842      --validate_encumbrances; -- 4458381
3843      validate_budgets;
3844   END IF;
3845   validate_doc_sequence;
3846   validate_business_date;
3847 
3848   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3849     trace(p_msg    => 'End of function validate_headers',
3850           p_module => l_log_module,
3851           p_level  => C_LEVEL_PROCEDURE);
3852   END IF;
3853 EXCEPTION
3854 WHEN xla_exceptions_pkg.application_exception THEN
3855   IF (c_manual%ISOPEN) THEN
3856     CLOSE c_manual;
3857   END IF;
3858   IF (c_standard%ISOPEN) THEN
3859     CLOSE c_standard;
3860   END IF;
3861   RAISE;
3862 
3863 WHEN OTHERS THEN
3864   IF (c_manual%ISOPEN) THEN
3865     CLOSE c_manual;
3866   END IF;
3867   IF (c_standard%ISOPEN) THEN
3868     CLOSE c_standard;
3869   END IF;
3870   xla_exceptions_pkg.raise_message
3871       (p_location => 'xla_je_validation_pkg.validate_headers');
3872 END validate_headers;
3873 
3874 --=============================================================================
3875 --
3876 -- Name: validate_bal_segments
3877 -- Description: This procedure will validate the balancing segments for the
3878 --              LBM security.
3879 --
3880 --=============================================================================
3881 PROCEDURE validate_bal_segments
3882 (p_seg_ledger_id INTEGER)
3883 IS
3884   CURSOR c_invalid_bal_segment IS
3885     SELECT t.*
3886       FROM xla_validation_lines_gt t
3887            LEFT OUTER JOIN gl_ledger_segment_values s
3888            ON  s.segment_value     = t.bal_seg_value
3889            AND s.segment_type_code = C_BAL_SEGMENT
3890            AND s.ledger_id         = p_seg_ledger_id
3891            AND t.accounting_date   BETWEEN NVL(s.start_date, t.accounting_date)
3892                                    AND NVL(s.end_date, t.accounting_date)
3893      WHERE t.ccid_enabled_flag IS NOT NULL
3894        AND s.ledger_id IS NULL
3895        AND t.code_combination_id <> -1;
3896 
3897   l_account             VARCHAR2(2000) := NULL;
3898   l_log_module          VARCHAR2(240);
3899 
3900   l_segment_name VARCHAR2(30);   --  4262811c
3901 
3902 BEGIN
3903   IF g_log_enabled THEN
3904     l_log_module := C_DEFAULT_MODULE||'.validate_bal_segments';
3905   END IF;
3906 
3907   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3908     trace(p_msg    => 'BEGIN of procedure validate_bal_segments',
3909           p_module => l_log_module,
3910           p_level  => C_LEVEL_PROCEDURE);
3911   END IF;
3912 
3913   IF (C_LEVEL_EVENT >= g_log_level) THEN
3914     trace(p_msg    => 'BEGIN LOOP - invalid balancing segment',
3915           p_module => l_log_module,
3916           p_level  => C_LEVEL_EVENT);
3917   END IF;
3918 
3919   FOR l_err IN c_invalid_bal_segment LOOP
3920 
3921     IF (C_LEVEL_ERROR >= g_log_level) THEN
3922       trace(p_msg    => 'LOOP - invalid balancing segment: ae_header_id = '|| l_err.ae_header_id||
3923                        ', ae_line_num = '|| l_err.ae_line_num,
3924             p_module => l_log_module,
3925             p_level  => C_LEVEL_ERROR);
3926     END IF;
3927 
3928     g_err_count := g_err_count+1;
3929     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
3930     g_err_event_ids(g_err_count) := l_err.event_id;
3931 
3932     -- Check if the balancing segment value is valid for the ledger
3933     SELECT fnd_flex_ext.get_segs('SQLGL', 'GL#', l_err.ccid_coa_id, l_err.code_combination_id)
3934     INTO   l_account
3935     FROM   dual;
3936 
3937     -- 4262811---------------------------------------------------------------------------------
3938     IF g_caller = C_CALLER_MPA_PROGRAM THEN
3939        g_message_name := 'XLA_MA_INVALID_BAL_SEG';
3940     ELSE
3941        g_message_name := 'XLA_AP_INVALD_BAL_SEG';
3942     END IF;
3943     l_segment_name := xla_flex_pkg.get_flexfield_segment_name       -- 4262811c
3944                                           (p_application_id         => 101
3945                                           ,p_flex_code              => 'GL#'
3946                                           ,p_chart_of_accounts_id   => l_err.ccid_coa_id
3947                                           ,p_flexfield_segment_code => g_bal_seg_column_name);
3948     -------------------------------------------------------------------------------------------
3949 
3950     xla_accounting_err_pkg.build_message(
3951                 p_appli_s_name          => 'XLA'
3952                 ,p_msg_name             => g_message_name   -- 4262811 'XLA_AP_INVALD_BAL_SEG'
3953                 ,p_token_1              => 'ACCOUNT_VALUE'
3954                 ,p_value_1              => l_account
3955                 ,p_token_2              => 'LINE_NUM'
3956                 ,p_value_2              => l_err.ae_line_num
3957                 ,p_token_3              => 'LEDGER_NAME'
3958                 ,p_value_3              => g_ledger_name
3959                 ,p_token_4              => 'SEGMENT_NAME'     -- 4262811c
3960                 ,p_value_4              => l_segment_name
3961                 ,p_entity_id            => l_err.entity_id
3962                 ,p_event_id             => l_err.event_id
3963                 ,p_ledger_id            => g_ledger_id
3964                 ,p_ae_header_id         => l_err.ae_header_id
3965                 ,p_ae_line_num          => l_err.ae_line_num
3966                 ,p_accounting_batch_id  => NULL);
3967   END LOOP;
3968 
3969   IF (C_LEVEL_EVENT >= g_log_level) THEN
3970     trace(p_msg    => 'END LOOP - invalid balancing segment',
3971           p_module => l_log_module,
3972           p_level  => C_LEVEL_EVENT);
3973   END IF;
3974 
3975   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
3976     trace(p_msg    => 'END of function validate_bal_segments',
3977           p_module => l_log_module,
3978           p_level  => C_LEVEL_PROCEDURE);
3979   END IF;
3980 
3981 EXCEPTION
3982 WHEN xla_exceptions_pkg.application_exception THEN
3983   IF (c_invalid_bal_segment%ISOPEN) THEN
3984     CLOSE c_invalid_bal_segment;
3985   END IF;
3986   RAISE;
3987 
3988 WHEN OTHERS THEN
3989   IF (c_invalid_bal_segment%ISOPEN) THEN
3990     CLOSE c_invalid_bal_segment;
3991   END IF;
3992   xla_exceptions_pkg.raise_message
3993       (p_location => 'xla_je_validation_pkg.validate_bal_segments');
3994 END;
3995 
3996 --=============================================================================
3997 --
3998 -- Name: validate_mgt_segments
3999 -- Description: This procedure will validate the management segments for the
4000 --              LBM security.
4001 --
4002 --=============================================================================
4003 PROCEDURE validate_mgt_segments
4004 (p_seg_ledger_id INTEGER)
4005 IS
4006   CURSOR c_invalid_mgt_segment IS
4007     SELECT t.*
4008       FROM xla_validation_lines_gt t
4009            LEFT OUTER JOIN gl_ledger_segment_values s
4010            ON  s.segment_value     = t.mgt_seg_value
4011            AND s.segment_type_code = C_MGT_SEGMENT
4012            AND s.ledger_id         = p_seg_ledger_id
4013            AND t.accounting_date   BETWEEN NVL(s.start_date, t.accounting_date)
4014                                    AND NVL(s.end_date, t.accounting_date)
4015      WHERE t.ccid_enabled_flag IS NOT NULL
4016        AND s.ledger_id IS NULL;
4017 
4018   CURSOR c_coa_structure_name (p_coa_id INTEGER) IS
4019     SELECT  id_flex_structure_name
4020     FROM    fnd_id_flex_structures_vl
4021     WHERE   application_id = 101
4022     AND     id_flex_num = p_coa_id;
4023 
4024   l_account                VARCHAR2(2000) := NULL;
4025   l_coa_structure_name     VARCHAR2(80);
4026   l_log_module             VARCHAR2(240);
4027   l_segment_name VARCHAR2(30);   --  4262811c
4028 BEGIN
4029   IF g_log_enabled THEN
4030     l_log_module := C_DEFAULT_MODULE||'.validate_mgt_segments';
4031   END IF;
4032 
4033   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4034     trace(p_msg    => 'BEGIN of procedure validate_mgt_segments',
4035           p_module => l_log_module,
4036           p_level  => C_LEVEL_PROCEDURE);
4037   END IF;
4038 
4039   IF (C_LEVEL_EVENT >= g_log_level) THEN
4040     trace(p_msg    => 'BEGIN LOOP - invalid management segment',
4041           p_module => l_log_module,
4042           p_level  => C_LEVEL_EVENT);
4043   END IF;
4044 
4045   FOR l_err IN c_invalid_mgt_segment LOOP
4046 
4047     IF (C_LEVEL_ERROR >= g_log_level) THEN
4048       trace(p_msg    => 'LOOP - invalid management segment: ae_header_id = '|| l_err.ae_header_id||
4049                        ', ae_line_num = '|| l_err.ae_line_num,
4050             p_module => l_log_module,
4051             p_level  => C_LEVEL_ERROR);
4052     END IF;
4053 
4054     g_err_count := g_err_count+1;
4055     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
4056     g_err_event_ids(g_err_count) := l_err.event_id;
4057 
4058     -- Check if the management segment value is valid for the ledger
4059     SELECT fnd_flex_ext.get_segs('SQLGL', 'GL#', l_err.ccid_coa_id, l_err.code_combination_id)
4060     INTO   l_account
4061     FROM   dual;
4062 
4063     OPEN c_coa_structure_name(l_err.ccid_coa_id);
4064     FETCH c_coa_structure_name INTO l_coa_structure_name;
4065     CLOSE c_coa_structure_name;
4066 
4067     -- 4262811---------------------------------------------------------------------------------
4068     IF g_caller = C_CALLER_MPA_PROGRAM THEN
4069        g_message_name := 'XLA_MA_INVALID_MGT_SEG';
4070     ELSE
4071        g_message_name := 'XLA_AP_INVALD_MGT_SEG';
4072     END IF;
4073     l_segment_name := xla_flex_pkg.get_flexfield_segment_name       -- 4262811c
4074                                           (p_application_id         => 101
4075                                           ,p_flex_code              => 'GL#'
4076                                           ,p_chart_of_accounts_id   => l_err.ccid_coa_id
4077                                           ,p_flexfield_segment_code => g_mgt_seg_column_name);
4078     -------------------------------------------------------------------------------------------
4079 
4080     xla_accounting_err_pkg.build_message(
4081                 p_appli_s_name          => 'XLA'
4082                 ,p_msg_name             => g_message_name     -- 4262811 'XLA_AP_INVALD_MGT_SEG'
4083                 ,p_token_1              => 'ACCOUNT_VALUE'
4084                 ,p_value_1              => l_account
4085                 ,p_token_2              => 'LINE_NUM'
4086                 ,p_value_2              => l_err.ae_line_num
4087                 ,p_token_3              => 'LEDGER_NAME'
4088                 ,p_value_3              => g_ledger_name
4089                 ,p_token_4              => 'STRUCTURE_NAME'
4090                 ,p_value_4              => l_coa_structure_name
4091                 ,p_token_5              => 'SEGMENT_NAME'     -- 4262811c
4092                 ,p_value_5              => l_segment_name
4093                 ,p_entity_id            => l_err.entity_id
4094                 ,p_event_id             => l_err.event_id
4095                 ,p_ledger_id            => g_ledger_id
4096                 ,p_ae_header_id         => l_err.ae_header_id
4097                 ,p_ae_line_num          => l_err.ae_line_num
4098                 ,p_accounting_batch_id  => NULL);
4099   END LOOP;
4100 
4101   IF (C_LEVEL_EVENT >= g_log_level) THEN
4102     trace(p_msg    => 'END LOOP - invalid management segment',
4103           p_module => l_log_module,
4104           p_level  => C_LEVEL_EVENT);
4105   END IF;
4106 
4107   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4108     trace(p_msg    => 'END of function validate_mgt_segments',
4109           p_module => l_log_module,
4110           p_level  => C_LEVEL_PROCEDURE);
4111   END IF;
4112 
4113 EXCEPTION
4114 WHEN xla_exceptions_pkg.application_exception THEN
4115   IF (c_coa_structure_name%ISOPEN) THEN
4116     CLOSE c_coa_structure_name;
4117   END IF;
4118   IF (c_invalid_mgt_segment%ISOPEN) THEN
4119     CLOSE c_invalid_mgt_segment;
4120   END IF;
4121   RAISE;
4122 
4123 WHEN OTHERS THEN
4124   IF (c_coa_structure_name%ISOPEN) THEN
4125     CLOSE c_coa_structure_name;
4126   END IF;
4127   IF (c_invalid_mgt_segment%ISOPEN) THEN
4128     CLOSE c_invalid_mgt_segment;
4129   END IF;
4130   xla_exceptions_pkg.raise_message
4131       (p_location => 'xla_je_validation_pkg.validate_mgt_segments');
4132 END;
4133 
4134 --=============================================================================
4135 --
4136 -- Name: validate_third_parties
4137 -- Description: This procedure will validate the third party information.
4138 --
4139 --=============================================================================
4140 PROCEDURE validate_third_parties
4141 IS
4142   CURSOR c_invalid_party IS
4143     SELECT t.ae_header_id, t.ae_line_num, t.event_id, t.displayed_line_number,
4144            t.entity_id,
4145            t.party_type_code, t.party_id, t.party_site_id,
4146            c.cust_account_id customer_id, ps.site_use_id customer_site_id,
4147            s.vendor_id, ss.vendor_site_id
4148       FROM xla_validation_lines_gt t
4149            LEFT OUTER JOIN hz_cust_accounts_all c
4150            ON   c.cust_account_id       = t.party_id
4151            LEFT OUTER JOIN hz_cust_site_uses_all ps
4152            ON   ps.site_use_id          = t.party_site_id
4153            LEFT OUTER JOIN ap_supplier_sites_all ss
4154            ON   ss.vendor_site_id   = t.party_site_id
4155            LEFT OUTER JOIN ap_suppliers s
4156            ON   s.vendor_id             = t.party_id
4157       WHERE  (t.party_type_code IS NULL
4158         AND ((c.cust_account_id IS NOT NULL )OR (t.party_site_id IS NOT NULL AND ps.site_use_id IS NULL ))
4159 	     )
4160         OR  (t.party_type_code = 'S'
4161        AND ((s.vendor_id IS NULL) OR
4162             (t.party_site_id IS NOT NULL AND ss.vendor_site_id IS NULL)))  ;
4163 
4164 
4165   l_party_mesg_name       VARCHAR2(30);
4166   l_party_site_mesg_name  VARCHAR2(30);
4167 
4168   l_log_module            VARCHAR2(240);
4169 BEGIN
4170   IF g_log_enabled THEN
4171     l_log_module := C_DEFAULT_MODULE||'.validate_third_parties';
4172   END IF;
4173 
4174     IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4175     trace(p_msg    => 'BEGIN of procedure validate_third_parties',
4176           p_module => l_log_module,
4177           p_level  => C_LEVEL_PROCEDURE);
4178   END IF;
4179 
4180 
4181 
4182   IF (C_LEVEL_EVENT >= g_log_level) THEN
4183     trace(p_msg    => 'BEGIN LOOP - invalid party',
4184           p_module => l_log_module,
4185           p_level  => C_LEVEL_EVENT);
4186   END IF;
4187 
4188   FOR l_inv_party IN c_invalid_party LOOP
4189 
4190     IF (C_LEVEL_ERROR >= g_log_level) THEN
4191       trace(p_msg    => 'LOOP - invalid party: ae_header_id = '|| l_inv_party.ae_header_id||
4192                        ', ae_line_num = '|| l_inv_party.ae_line_num||
4193                        ', party_type_code = ' ||l_inv_party.party_type_code,
4194             p_module => l_log_module,
4195             p_level  => C_LEVEL_ERROR);
4196     END IF;
4197 
4198     g_err_count := g_err_count+1;
4199     g_err_hdr_ids(g_err_count) := l_inv_party.ae_header_id;
4200     g_err_event_ids(g_err_count) := l_inv_party.event_id;
4201 
4202     --
4203     -- Message names are shared across party related errors.
4204     -- Store message names in local variables for the first offending row.
4205     --
4206     IF c_invalid_party%ROWCOUNT = 1 THEN
4207 
4208        --
4209        -- Set message names
4210        --
4211        IF g_caller = C_CALLER_ACCT_PROGRAM THEN
4212 
4213           l_party_mesg_name      := 'XLA_AP_INVALID_PARTY_ID';
4214           l_party_site_mesg_name := 'XLA_AP_INVALID_PARTY_SITE';
4215 
4216        ELSE
4217 
4218           IF g_caller = C_CALLER_MPA_PROGRAM THEN
4219 
4220              l_party_mesg_name      := 'XLA_MA_INVALID_PARTY_ID';
4221              l_party_site_mesg_name := 'XLA_MA_INVALID_PARTY_SITE';
4222 
4223           ELSE
4224 
4225              l_party_mesg_name      := 'XLA_MJE_INVALID_PARTY_ID';
4226              l_party_site_mesg_name := 'XLA_MJE_INVALID_PARTY_SITE';
4227 
4228           END IF;
4229 
4230        END IF;
4231 
4232     END IF;
4233 
4234     --  If party type code is populated, party id must be valid and populated
4235     IF (l_inv_party.customer_id IS NULL) OR
4236        (l_inv_party.vendor_id IS NULL)
4237     THEN
4238 
4239        xla_accounting_err_pkg.build_message(
4240                 p_appli_s_name          => 'XLA'
4241                 ,p_msg_name             => l_party_mesg_name
4242                 ,p_token_1              => 'PARTY_ID'
4243                 ,p_value_1              => l_inv_party.party_id
4244                 ,p_token_2              => 'LINE_NUM'
4245                 ,p_value_2              => l_inv_party.ae_line_num
4246                 ,p_entity_id            => l_inv_party.entity_id
4247                 ,p_event_id             => l_inv_party.event_id
4248                 ,p_ledger_id            => g_ledger_id
4249                 ,p_ae_header_id         => l_inv_party.ae_header_id
4250                 ,p_ae_line_num          => l_inv_party.ae_line_num
4251                 ,p_accounting_batch_id  => NULL);
4252 
4253     END IF;
4254 
4255     --  If party site id is populated, it must be valid
4256     IF (l_inv_party.party_site_id IS NOT NULL) AND
4257        (l_inv_party.customer_site_id IS NULL   OR
4258         l_inv_party.vendor_site_id IS NULL)
4259     THEN
4260 
4261         xla_accounting_err_pkg.build_message(
4262                  p_appli_s_name         => 'XLA'
4263                 ,p_msg_name             => l_party_site_mesg_name
4264                 ,p_token_1              => 'PARTY_SITE'
4265                 ,p_value_1              => l_inv_party.party_site_id
4266                 ,p_token_2              => 'LINE_NUM'
4267                 ,p_value_2              => l_inv_party.ae_line_num
4268                 ,p_entity_id            => l_inv_party.entity_id
4269                 ,p_event_id             => l_inv_party.event_id
4270                 ,p_ledger_id            => g_ledger_id
4271                 ,p_ae_header_id         => l_inv_party.ae_header_id
4272                 ,p_ae_line_num          => l_inv_party.ae_line_num
4273                 ,p_accounting_batch_id  => NULL);
4274 
4275     END IF;
4276 
4277     IF (C_LEVEL_EVENT >= g_log_level) THEN
4278        trace(p_msg    => 'END Validation - invalid party',
4279              p_module => l_log_module,
4280              p_level  => C_LEVEL_EVENT);
4281     END IF;
4282 
4283   END LOOP;
4284 
4285   IF (C_LEVEL_EVENT >= g_log_level) THEN
4286     trace(p_msg    => 'END LOOP - invalid party',
4287           p_module => l_log_module,
4288           p_level  => C_LEVEL_EVENT);
4289   END IF;
4290 
4291   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4292     trace(p_msg    => 'END of procedure validate_third_parties',
4293           p_module => l_log_module,
4294           p_level  => C_LEVEL_PROCEDURE);
4295   END IF;
4296 
4297 EXCEPTION
4298 WHEN xla_exceptions_pkg.application_exception THEN
4299   IF (c_invalid_party%ISOPEN) THEN
4300     CLOSE c_invalid_party;
4301   END IF;
4302   RAISE;
4303 
4304 WHEN OTHERS THEN
4305   IF (c_invalid_party%ISOPEN) THEN
4306     CLOSE c_invalid_party;
4307   END IF;
4308 
4309   xla_exceptions_pkg.raise_message
4310       (p_location => 'xla_je_validation_pkg.validate_third_parties');
4311 END validate_third_parties;
4312 
4313 --=============================================================================
4314 --
4315 -- Name: validate_currencies
4316 -- Description: This procedure will validate the currency and conversion information.
4317 --
4318 --=============================================================================
4319 PROCEDURE validate_currencies
4320 IS
4321   CURSOR c_invalid_curr IS
4322     SELECT t.ae_header_id
4323           ,t.ae_line_num
4324           ,t.event_id
4325           ,t.displayed_line_number
4326           ,t.entity_id
4327           ,t.accounting_date
4328           ,t.entered_currency_code
4329           ,curr.enabled_flag           curr_enabled_flag
4330           ,curr.start_date_active      curr_start_date_active
4331           ,curr.end_date_active        curr_end_date_active
4332     FROM   xla_validation_lines_gt t
4333            LEFT OUTER JOIN fnd_currencies curr
4334            ON   curr.currency_code          = t.entered_currency_code
4335     WHERE  (curr.enabled_flag IS NULL) OR
4336            (curr.enabled_flag = 'N') OR
4337            (t.accounting_date < nvl(curr.start_date_active,t.accounting_date)) OR
4338            (t.accounting_date > nvl(curr.end_date_active,t.accounting_date));
4339 
4340   l_log_module      VARCHAR2(240);
4341 BEGIN
4342   IF g_log_enabled THEN
4343     l_log_module := C_DEFAULT_MODULE||'.validate_currencies';
4344   END IF;
4345 
4346   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4347     trace(p_msg    => 'BEGIN of function validate_currencies',
4348           p_module => l_log_module,
4349           p_level  => C_LEVEL_PROCEDURE);
4350   END IF;
4351 
4352   IF (C_LEVEL_EVENT >= g_log_level) THEN
4353     trace(p_msg    => 'BEGIN LOOP - invalid currency',
4354           p_module => l_log_module,
4355           p_level  => C_LEVEL_EVENT);
4356   END IF;
4357 
4358   FOR l_inv_curr IN c_invalid_curr LOOP
4359 
4360     IF (C_LEVEL_ERROR >= g_log_level) THEN
4361       trace(p_msg    => 'LOOP - invalid line: ae_header_id = '|| l_inv_curr.ae_header_id||
4362                        ', ae_line_num = '|| l_inv_curr.ae_line_num,
4363             p_module => l_log_module,
4364             p_level  => C_LEVEL_ERROR);
4365     END IF;
4366 
4367     g_err_count := g_err_count+1;
4368     g_err_hdr_ids(g_err_count) := l_inv_curr.ae_header_id;
4369     g_err_event_ids(g_err_count) := l_inv_curr.event_id;
4370 
4371     IF (l_inv_curr.curr_enabled_flag IS NULL) THEN
4372       -- 4262811-----------------------------
4373       IF g_caller = C_CALLER_MPA_PROGRAM THEN
4374          g_message_name := 'XLA_MA_INVALID_CURR_CODE';
4375       ELSE
4376          g_message_name := 'XLA_AP_INVALID_CURR_CODE';
4377       END IF;
4378       ---------------------------------------
4379       xla_accounting_err_pkg.build_message(
4380                 p_appli_s_name          => 'XLA'
4381                 ,p_msg_name             => g_message_name   -- 4262811 'XLA_AP_INVALID_CURR_CODE'
4382                 ,p_token_1              => 'CURR_CODE'
4383                 ,p_value_1              => l_inv_curr.entered_currency_code
4384                 ,p_token_2              => 'LINE_NUM'
4385                 ,p_value_2              => l_inv_curr.ae_line_num
4386                 ,p_entity_id            => l_inv_curr.entity_id
4387                 ,p_event_id             => l_inv_curr.event_id
4388                 ,p_ledger_id            => g_ledger_id
4389                 ,p_ae_header_id         => l_inv_curr.ae_header_id
4390                 ,p_ae_line_num          => l_inv_curr.ae_line_num
4391                 ,p_accounting_batch_id  => NULL);
4392     ELSIF (l_inv_curr.curr_enabled_flag = C_INVALID) THEN
4393       xla_accounting_err_pkg.build_message(
4394                  p_appli_s_name         => 'XLA'
4395                 ,p_msg_name             => 'XLA_AP_INACTIVE_CURR_CODE'
4396                 ,p_token_1              => 'CURRENCY_NAME'
4397                 ,p_value_1              => l_inv_curr.entered_currency_code
4398                 ,p_token_2              => 'LINE_NUM'
4399                 ,p_value_2              => l_inv_curr.ae_line_num
4400                 ,p_entity_id            => l_inv_curr.entity_id
4401                 ,p_event_id             => l_inv_curr.event_id
4402                 ,p_ledger_id            => g_ledger_id
4403                 ,p_ae_header_id         => l_inv_curr.ae_header_id
4404                 ,p_ae_line_num          => l_inv_curr.ae_line_num
4405                 ,p_accounting_batch_id  => NULL);
4406     ELSIF (l_inv_curr.accounting_date < l_inv_curr.curr_start_date_active OR
4407            l_inv_curr.accounting_date > l_inv_curr.curr_end_date_active) THEN
4408       -- 4262811-----------------------------
4409       IF g_caller = C_CALLER_MPA_PROGRAM THEN
4410          g_message_name := 'XLA_MA_CURRENCY_INVALID_DATE';
4411       ELSE
4412          g_message_name := 'XLA_AP_CURRENCY_INVALID_DATE';
4413       END IF;
4414       ---------------------------------------
4415       xla_accounting_err_pkg.build_message(
4416                  p_appli_s_name         => 'XLA'
4417                 ,p_msg_name             => g_message_name   -- 4262811 'XLA_AP_CURRENCY_INVALID_DATE'
4418                 ,p_token_1              => 'GL_DATE'
4419                 ,p_value_1              => l_inv_curr.accounting_date
4420                 ,p_token_2              => 'CURRENCY_CODE'
4421                 ,p_value_2              => l_inv_curr.entered_currency_code
4422                 ,p_token_3              => 'LINE_NUM'
4423                 ,p_value_3              => l_inv_curr.ae_line_num
4424                 ,p_entity_id            => l_inv_curr.entity_id
4425                 ,p_event_id             => l_inv_curr.event_id
4426                 ,p_ledger_id            => g_ledger_id
4427                 ,p_ae_header_id         => l_inv_curr.ae_header_id
4428                 ,p_ae_line_num          => l_inv_curr.ae_line_num
4429                 ,p_accounting_batch_id  => NULL);
4430     END IF;
4431 
4432   END LOOP;
4433 
4434   IF (C_LEVEL_EVENT >= g_log_level) THEN
4435     trace(p_msg    => 'END LOOP - invalid currency',
4436           p_module => l_log_module,
4437           p_level  => C_LEVEL_EVENT);
4438   END IF;
4439 
4440   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4441     trace(p_msg    => 'End of function validate_currencies',
4442           p_module => l_log_module,
4443           p_level  => C_LEVEL_PROCEDURE);
4444   END IF;
4445 EXCEPTION
4446 WHEN xla_exceptions_pkg.application_exception THEN
4447   IF (c_invalid_curr%ISOPEN) THEN
4448     CLOSE c_invalid_curr;
4449   END IF;
4450   RAISE;
4451 
4452 WHEN OTHERS THEN
4453   IF (c_invalid_curr%ISOPEN) THEN
4454     CLOSE c_invalid_curr;
4455   END IF;
4456   xla_exceptions_pkg.raise_message
4457       (p_location => 'xla_je_validation_pkg.validate_currencies');
4458 END validate_currencies;
4459 
4460 
4461 --=============================================================================
4462 --
4463 -- Name: validate_budget_ccids
4464 -- Description: This procedure will validate the ccid for the budget entry.
4465 --
4466 --=============================================================================
4467 PROCEDURE validate_budget_ccids
4468 IS
4469   CURSOR c_invalid_budget_ccids IS
4470     SELECT t.ae_header_id
4471           ,t.ae_line_num
4472           ,t.event_id
4473           ,t.displayed_line_number
4474           ,t.entity_id
4475           ,bud.budget_name
4476           ,fnd_flex_ext.get_segs('SQLGL', 'GL#', t.ccid_coa_id, t.code_combination_id) account
4477       FROM xla_validation_lines_gt t
4478            JOIN gl_budget_versions bud
4479            ON  bud.budget_version_id           = t.budget_version_id
4480            LEFT OUTER JOIN gl_budget_assignments b
4481            ON  b.currency_code                 = t.entered_currency_code
4482            AND b.code_combination_id           = t.code_combination_id
4483            AND b.ledger_id                     = g_ledger_id
4484            LEFT OUTER JOIN gl_budorg_bc_options bc
4485            ON  bc.range_id = b.range_id
4486            AND t.budget_version_id = bc.funding_budget_version_id
4487      WHERE t.balance_type_code = 'B'
4488        AND t.budget_version_id IS NOT NULL
4489        AND bc.funding_budget_version_id IS NULL;
4490 
4491   l_log_module                  VARCHAR2(240);
4492 BEGIN
4493   IF g_log_enabled THEN
4494     l_log_module := C_DEFAULT_MODULE||'.validate_budget_ccids';
4495   END IF;
4496 
4497   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4498     trace(p_msg    => 'BEGIN of function validate_budget_ccids',
4499           p_module => l_log_module,
4500           p_level  => C_LEVEL_PROCEDURE);
4501   END IF;
4502 
4503   IF (C_LEVEL_EVENT >= g_log_level) THEN
4504     trace(p_msg    => 'BEGIN LOOP - invalid budget ccids',
4505           p_module => l_log_module,
4506           p_level  => C_LEVEL_EVENT);
4507   END IF;
4508 
4509   FOR l_invalid_budget_ccid IN c_invalid_budget_ccids LOOP
4510 
4511     IF (C_LEVEL_ERROR >= g_log_level) THEN
4512       trace(p_msg    => 'LOOP - invalid budget ccid: ae_header_id = '|| l_invalid_budget_ccid.ae_header_id||
4513                        ', ae_line_num = '|| l_invalid_budget_ccid.ae_line_num,
4514             p_module => l_log_module,
4515             p_level  => C_LEVEL_ERROR);
4516     END IF;
4517 
4518     g_err_count := g_err_count+1;
4519     g_err_hdr_ids(g_err_count) := l_invalid_budget_ccid.ae_header_id;
4520     g_err_event_ids(g_err_count) := l_invalid_budget_ccid.event_id;
4521 
4522     xla_accounting_err_pkg.build_message(
4523                 p_appli_s_name          => 'XLA'
4524                 ,p_msg_name             => 'XLA_AP_INVALID_CCID_FOR_BUDGET'
4525                 ,p_token_1              => 'ACCOUNT_VALUE'
4526                 ,p_value_1              => l_invalid_budget_ccid.account
4527                 ,p_token_2              => 'LINE_NUM'
4528                 ,p_value_2              => l_invalid_budget_ccid.ae_line_num
4529                 ,p_token_3              => 'BUDGET_NAME'
4530                 ,p_value_3              => l_invalid_budget_ccid.budget_name
4531                 ,p_entity_id            => l_invalid_budget_ccid.entity_id
4532                 ,p_event_id             => l_invalid_budget_ccid.event_id
4533                 ,p_ledger_id            => g_ledger_id
4534                 ,p_ae_header_id         => l_invalid_budget_ccid.ae_header_id
4535                 ,p_ae_line_num          => l_invalid_budget_ccid.ae_line_num
4536                 ,p_accounting_batch_id  => NULL);
4537   END LOOP;
4538 
4539   IF (C_LEVEL_EVENT >= g_log_level) THEN
4540     trace(p_msg    => 'END LOOP - invalid budget ccids',
4541           p_module => l_log_module,
4542           p_level  => C_LEVEL_EVENT);
4543   END IF;
4544 
4545   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4546     trace(p_msg    => 'End of function validate_budget_ccids',
4547           p_module => l_log_module,
4548           p_level  => C_LEVEL_PROCEDURE);
4549   END IF;
4550 EXCEPTION
4551 WHEN xla_exceptions_pkg.application_exception THEN
4552   IF (c_invalid_budget_ccids%ISOPEN) THEN
4553     CLOSE c_invalid_budget_ccids;
4554   END IF;
4555   RAISE;
4556 
4557 WHEN OTHERS THEN
4558   IF (c_invalid_budget_ccids%ISOPEN) THEN
4559     CLOSE c_invalid_budget_ccids;
4560   END IF;
4561   xla_exceptions_pkg.raise_message
4562       (p_location => 'xla_je_validation_pkg.validate_budget_ccids');
4563 END validate_budget_ccids;
4564 
4565 
4566 --=============================================================================
4567 --
4568 -- Name: validate_accounting_classes
4569 -- Description: This procedure will validate the accounting class
4570 --
4571 --=============================================================================
4572 PROCEDURE validate_accounting_classes
4573 IS
4574   CURSOR c_invalid_accounting_classes IS
4575     SELECT t.ae_header_id
4576           ,t.ae_line_num
4577           ,t.event_id
4578           ,t.displayed_line_number
4579           ,t.entity_id
4580           ,t.accounting_class_code
4581       FROM xla_validation_lines_gt t
4582            LEFT OUTER JOIN xla_lookups lk
4583            ON  lk.lookup_type        = 'XLA_ACCOUNTING_CLASS'
4584            AND lk.lookup_code        = t.accounting_class_code
4585      WHERE lk.lookup_code            IS NULL
4586        AND t.accounting_class_code   IS NOT NULL;
4587 
4588   l_log_module                  VARCHAR2(240);
4589 BEGIN
4590   IF g_log_enabled THEN
4591     l_log_module := C_DEFAULT_MODULE||'.validate_accounting_classes';
4592   END IF;
4593 
4594   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4595     trace(p_msg    => 'BEGIN of function validate_accounting_classes',
4596           p_module => l_log_module,
4597           p_level  => C_LEVEL_PROCEDURE);
4598   END IF;
4599 
4600   IF (C_LEVEL_EVENT >= g_log_level) THEN
4601     trace(p_msg    => 'BEGIN LOOP - invalid accounting classes',
4602           p_module => l_log_module,
4603           p_level  => C_LEVEL_EVENT);
4604   END IF;
4605 
4606   FOR l_inv_acct_class IN c_invalid_accounting_classes LOOP
4607 
4608     IF (C_LEVEL_ERROR >= g_log_level) THEN
4609       trace(p_msg    => 'LOOP - invalid accounting class: ae_header_id = '|| l_inv_acct_class.ae_header_id||
4610                        ', ae_line_num = '|| l_inv_acct_class.ae_line_num ||
4611                        ', accounting_class_code = '|| l_inv_acct_class.accounting_class_code,
4612             p_module => l_log_module,
4613             p_level  => C_LEVEL_ERROR);
4614     END IF;
4615 
4616     g_err_count := g_err_count+1;
4617     g_err_hdr_ids(g_err_count) := l_inv_acct_class.ae_header_id;
4618     g_err_event_ids(g_err_count) := l_inv_acct_class.event_id;
4619 
4620     -- 4262811-----------------------------
4621     IF g_caller = C_CALLER_MPA_PROGRAM THEN
4622        g_message_name := 'XLA_MA_INVALID_ACCT_CLASS';
4623     ELSE
4624        g_message_name := 'XLA_AP_INVALID_ACCT_CLASS';
4625     END IF;
4626     ---------------------------------------
4627     xla_accounting_err_pkg.build_message(
4628                 p_appli_s_name          => 'XLA'
4629                 ,p_msg_name             => g_message_name   -- 4262811 'XLA_AP_INVALID_ACCT_CLASS'
4630                 ,p_token_1              => 'LINE_NUM'
4631                 ,p_value_1              => l_inv_acct_class.ae_line_num
4632                 ,p_entity_id            => l_inv_acct_class.entity_id
4633                 ,p_event_id             => l_inv_acct_class.event_id
4634                 ,p_ledger_id            => g_ledger_id
4635                 ,p_ae_header_id         => l_inv_acct_class.ae_header_id
4636                 ,p_ae_line_num          => l_inv_acct_class.ae_line_num
4637                 ,p_accounting_batch_id  => NULL);
4638   END LOOP;
4639 
4640   IF (C_LEVEL_EVENT >= g_log_level) THEN
4641     trace(p_msg    => 'END LOOP - invalid accounting classes',
4642           p_module => l_log_module,
4643           p_level  => C_LEVEL_EVENT);
4644   END IF;
4645 
4646   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4647     trace(p_msg    => 'END of function validate_accounting_classes',
4648           p_module => l_log_module,
4649           p_level  => C_LEVEL_PROCEDURE);
4650   END IF;
4651 
4652 EXCEPTION
4653 WHEN xla_exceptions_pkg.application_exception THEN
4654   IF (c_invalid_accounting_classes%ISOPEN) THEN
4655     CLOSE c_invalid_accounting_classes;
4656   END IF;
4657   RAISE;
4658 
4659 WHEN OTHERS THEN
4660   IF (c_invalid_accounting_classes%ISOPEN) THEN
4661     CLOSE c_invalid_accounting_classes;
4662   END IF;
4663   xla_exceptions_pkg.raise_message
4664       (p_location => 'xla_je_validation_pkg.validate_accounting_classes');
4665 END validate_accounting_classes;
4666 
4667 
4668 --=============================================================================
4669 --
4670 -- Name: validate_lines
4671 -- Description: This API performs line level validations
4672 --
4673 --=============================================================================
4674 PROCEDURE validate_lines
4675 IS
4676   l_app_name                    VARCHAR2(240);
4677   l_user_name                   VARCHAR2(80);
4678   l_coa_structure_name          VARCHAR2(80);
4679   l_access_set_name             VARCHAR2(80);
4680   l_account                     VARCHAR2(2000) := NULL;
4681   l_budget_name                 VARCHAR2(80);
4682   l_je_source_name              VARCHAR2(80);
4683   l_prod_rule_name              VARCHAR2(80);
4684   l_user_conv_type              VARCHAR2(240);
4685   l_gain_or_loss_flag           VARCHAR2(1);
4686   l_seg_ledger_id               INTEGER;
4687   l_ccid_substituted_flag       VARCHAR2(1); --bug#10047740
4688   l_ccid                        INTEGER;
4689 
4690   CURSOR c_line_error IS
4691     SELECT      *
4692     FROM        xla_validation_lines_gt
4693     WHERE       error_flag = 'Y';
4694 
4695   CURSOR c_account(p_coa_id INTEGER, p_code_combination_id INTEGER) IS
4696     SELECT fnd_flex_ext.get_segs('SQLGL', 'GL#', p_coa_id, p_code_combination_id)
4697     FROM   dual;
4698 
4699   CURSOR c_je_source_name(l_lookup_code VARCHAR2) IS
4700     SELECT meaning
4701     FROM   fnd_lookups
4702     WHERE  lookup_type = 'GL_CONTROL_ACCOUNT_SOURCES'
4703     AND    lookup_code = l_lookup_code;
4704 
4705   CURSOR c_prod_rule_name(p_prod_rule_type_code VARCHAR2, p_prod_rule_code VARCHAR2) IS
4706     SELECT name
4707     FROM   xla_product_rules_vl
4708     WHERE  product_rule_type_code = p_prod_rule_type_code
4709     AND    product_rule_code      = p_prod_rule_code
4710     AND    application_id         = g_application_id
4711     AND    amb_context_code       = g_amb_context_code;
4712 
4713   CURSOR c_budget_name(p_budget_version_id INTEGER) IS
4714     SELECT budget_name
4715     FROM   gl_budget_versions
4716     WHERE  budget_version_id = p_budget_version_id;
4717 
4718   CURSOR c_user_conv_type(p_conv_type VARCHAR2) IS
4719     SELECT gdct.user_conversion_type
4720     FROM   gl_daily_conversion_types gdct
4721     WHERE  gdct.conversion_type   =  p_conv_type;
4722 
4723   l_log_module                  VARCHAR2(240);
4724 BEGIN
4725 
4726   IF g_log_enabled THEN
4727     l_log_module := C_DEFAULT_MODULE||'.validate_lines';
4728   END IF;
4729 
4730   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
4731     trace(p_msg    => 'BEGIN of function validate_lines',
4732           p_module => l_log_module,
4733           p_level  => C_LEVEL_PROCEDURE);
4734   END IF;
4735 
4736   IF (C_LEVEL_EVENT >= g_log_level) THEN
4737     trace(p_msg    => 'BEGIN LOOP - invalid line',
4738           p_module => l_log_module,
4739           p_level  => C_LEVEL_EVENT);
4740   END IF;
4741 
4742 
4743   IF xla_ae_code_combination_pkg.g_error_exists THEN
4744     xla_ae_code_combination_pkg.get_ccid_errors;
4745   END IF;
4746 
4747 
4748   FOR l_err IN c_line_error LOOP
4749 
4750     IF (C_LEVEL_ERROR >= g_log_level) THEN
4751       trace(p_msg    => 'LOOP - invalid line: ae_header_id = '|| l_err.ae_header_id||
4752                        ', ae_line_num = '|| l_err.ae_line_num,
4753             p_module => l_log_module,
4754             p_level  => C_LEVEL_ERROR);
4755     END IF;
4756 
4757     g_err_count := g_err_count+1;
4758     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
4759     g_err_event_ids(g_err_count) := l_err.event_id;
4760 
4761     l_account := NULL;
4762     -- changes for bug#10047740
4763     l_ccid_substituted_flag := 'N';
4764 
4765     IF ( l_err.substituted_by_suspense_flag= 'Y' AND l_err.code_combination_id = -1 )
4766     THEN
4767         l_ccid_substituted_flag := 'Y';
4768     END IF;
4769 
4770     SELECT DECODE(l_ccid_substituted_flag,'Y',l_err.SUBSTITUTED_CCID,l_err.code_combination_id)
4771     INTO  l_ccid
4772     FROM DUAL ;
4773 
4774     -- Bug 7541615 - Removed the validation on currency conversion information
4775     IF (g_ledger_currency_code <> l_err.entered_currency_code) THEN
4776       IF (l_err.currency_conversion_type = 'User' AND
4777           l_err.currency_conversion_rate IS NULL) THEN
4778         xla_accounting_err_pkg.build_message(
4779                 p_appli_s_name          => 'XLA'
4780                 ,p_msg_name             => 'XLA_AP_NO_USER_CONV_RATE'
4781                 ,p_token_1              => 'LINE_NUM'
4782                 ,p_value_1              => l_err.ae_line_num
4783                 ,p_entity_id            => l_err.entity_id
4784                 ,p_event_id             => l_err.event_id
4785                 ,p_ledger_id            => g_ledger_id
4786                 ,p_ae_header_id         => l_err.ae_header_id
4787                 ,p_ae_line_num          => l_err.ae_line_num
4788                 ,p_accounting_batch_id  => NULL);
4789       END IF;
4790 
4791       IF (nvl(l_err.currency_conversion_type,'User') <> 'User' AND
4792           l_err.currency_conversion_date IS NULL) THEN
4793         xla_accounting_err_pkg.build_message(
4794                 p_appli_s_name          => 'XLA'
4795                 ,p_msg_name             => 'XLA_AP_NO_CONV_DATE'
4796                 ,p_token_1              => 'LINE_NUM'
4797                 ,p_value_1              => l_err.ae_line_num
4798                 ,p_entity_id            => l_err.entity_id
4799                 ,p_event_id             => l_err.event_id
4800                 ,p_ledger_id            => g_ledger_id
4801                 ,p_ae_header_id         => l_err.ae_header_id
4802                 ,p_ae_line_num          => l_err.ae_line_num
4803                 ,p_accounting_batch_id  => NULL);
4804       END IF;
4805     END IF;
4806 
4807     -- Validate CCID
4808     IF (l_err.code_combination_id = -1 and l_err.gain_or_loss_flag = 'Y') THEN
4809       xla_accounting_err_pkg.build_message(
4810          p_appli_s_name         => 'XLA'
4811         ,p_msg_name             => 'XLA_AP_GAIN_LOSS_INVALID_CCID'
4812         ,p_entity_id            => l_err.entity_id
4813         ,p_event_id             => l_err.event_id
4814         ,p_ledger_id            => g_ledger_id
4815         ,p_ae_header_id         => l_err.ae_header_id
4816         ,p_ae_line_num          => l_err.ae_line_num
4817         ,p_accounting_batch_id  => NULL);
4818     ELSIF (l_err.ccid_enabled_flag is NULL) THEN
4819 
4820       -- 4262811-----------------------------
4821       IF g_caller = C_CALLER_MPA_PROGRAM THEN
4822          g_message_name := 'XLA_MA_INVALID_CCID';
4823       ELSE
4824          g_message_name := 'XLA_AP_INVALID_CCID';
4825       END IF;
4826       ---------------------------------------
4827 
4828       xla_accounting_err_pkg.build_message(
4829          p_appli_s_name         => 'XLA'
4830         ,p_msg_name             => g_message_name   -- 4262811 'XLA_AP_INVALID_CCID'
4831         ,p_token_1              => 'CCID'
4832         ,p_value_1              =>  l_ccid -- l_err.code_combination_id
4833         ,p_token_2              => 'LINE_NUM'
4834         ,p_value_2              => l_err.ae_line_num
4835         ,p_entity_id            => l_err.entity_id
4836         ,p_event_id             => l_err.event_id
4837         ,p_ledger_id            => g_ledger_id
4838         ,p_ae_header_id         => l_err.ae_header_id
4839         ,p_ae_line_num          => l_err.ae_line_num
4840         ,p_accounting_batch_id  => NULL);
4841     ELSE
4842       -- CCID is disabled
4843       IF (l_err.ccid_enabled_flag = 'N') THEN
4844         IF (l_account IS NULL) THEN
4845           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
4846           FETCH c_account INTO l_account;
4847           CLOSE c_account;
4848         END IF;
4849 
4850         xla_accounting_err_pkg.build_message(
4851                 p_appli_s_name          => 'XLA'
4852                 ,p_msg_name             => 'XLA_AP_INACTIVE_CCID'
4853                 ,p_token_1              => 'ACCOUNT_VALUE'
4854                 ,p_value_1              => l_account
4855                 ,p_token_2              => 'LINE_NUM'
4856                 ,p_value_2              => l_err.ae_line_num
4857                 ,p_entity_id            => l_err.entity_id
4858                 ,p_event_id             => l_err.event_id
4859                 ,p_ledger_id            => g_ledger_id
4860                 ,p_ae_header_id         => l_err.ae_header_id
4861                 ,p_ae_line_num          => l_err.ae_line_num
4862                 ,p_accounting_batch_id  => NULL);
4863       END IF;
4864 
4865       -- CCID is not within the effective date
4866       IF (l_err.ccid_enabled_flag = 'D') THEN
4867         IF (l_account IS NULL) THEN
4868           OPEN c_account(l_err.ccid_coa_id, l_ccid);--l_err.code_combination_id);
4869           FETCH c_account INTO l_account;
4870           CLOSE c_account;
4871         END IF;
4872 
4873         xla_accounting_err_pkg.build_message(
4874                 p_appli_s_name          => 'XLA'
4875                 ,p_msg_name             => 'XLA_AP_CCID_INACTIVE_DATE'
4876                 ,p_token_1              => 'ACCOUNT_VALUE'
4877                 ,p_value_1              => l_account
4878                 ,p_token_2              => 'LINE_NUM'
4879                 ,p_value_2              => l_err.ae_line_num
4880                 ,p_entity_id            => l_err.entity_id
4881                 ,p_event_id             => l_err.event_id
4882                 ,p_ledger_id            => g_ledger_id
4883                 ,p_ae_header_id         => l_err.ae_header_id
4884                 ,p_ae_line_num          => l_err.ae_line_num
4885                 ,p_accounting_batch_id  => NULL);
4886       END IF;
4887 
4888       -- CCID is not a summary account
4889       IF (l_err.ccid_summary_flag = 'Y') THEN
4890         IF (l_account IS NULL) THEN
4891           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
4892           FETCH c_account INTO l_account;
4893           CLOSE c_account;
4894         END IF;
4895 
4896         IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
4897           xla_accounting_err_pkg.build_message(
4898                 p_appli_s_name          => 'XLA'
4899                 ,p_msg_name             => 'XLA_AP_SUMMARY_CCID'
4900                 ,p_token_1              => 'ACCOUNT_VALUE'
4901                 ,p_value_1              => l_account
4902                 ,p_token_2              => 'LINE_NUM'
4903                 ,p_value_2              => l_err.ae_line_num
4904                 ,p_entity_id            => l_err.entity_id
4905                 ,p_event_id             => l_err.event_id
4906                 ,p_ledger_id            => g_ledger_id
4907                 ,p_ae_header_id         => l_err.ae_header_id
4908                 ,p_ae_line_num          => l_err.ae_line_num
4909                 ,p_accounting_batch_id  => NULL);
4910         ELSE
4911           -- 4262811-----------------------------
4912           IF g_caller = C_CALLER_MPA_PROGRAM THEN
4913              g_message_name := 'XLA_MA_SUMMARY_CCID';
4914           ELSE
4915              g_message_name := 'XLA_MJE_SUMMARY_CCID';
4916           END IF;
4917           ---------------------------------------
4918           xla_accounting_err_pkg.build_message(
4919                 p_appli_s_name          => 'XLA'
4920                 ,p_msg_name             => g_message_name   -- 4262811 'XLA_MJE_SUMMARY_CCID'
4921                 ,p_token_1              => 'ACCOUNT_VALUE'
4922                 ,p_value_1              => l_account
4923                 ,p_token_2              => 'LINE_NUM'
4924                 ,p_value_2              => l_err.ae_line_num
4925                 ,p_entity_id            => l_err.entity_id
4926                 ,p_event_id             => l_err.event_id
4927                 ,p_ledger_id            => g_ledger_id
4928                 ,p_ae_header_id         => l_err.ae_header_id
4929                 ,p_ae_line_num          => l_err.ae_line_num
4930                 ,p_accounting_batch_id  => NULL);
4931         END IF;
4932       END IF;
4933 
4934       -- For actual and encumbrance entries, detail posting must be allowed
4935       -- for the ledger
4936       IF (l_err.balance_type_code <> 'B' AND
4937           l_err.detail_posting_allowed_flag = 'N') THEN
4938         IF (l_account IS NULL) THEN
4939           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
4940           FETCH c_account INTO l_account;
4941           CLOSE c_account;
4942         END IF;
4943 
4944         IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
4945           IF (l_prod_rule_name IS NULL) THEN
4946             OPEN c_prod_rule_name(l_err.product_rule_type_code, l_err.product_rule_code);
4947             FETCH c_prod_rule_name INTO l_prod_rule_name;
4948             CLOSE c_prod_rule_name;
4949           END IF;
4950 
4951           xla_accounting_err_pkg.build_message(
4952                 p_appli_s_name          => 'XLA'
4953                 ,p_msg_name             => 'XLA_AP_CCID_NOT_DET_POST'
4954                 ,p_token_1              => 'ACCOUNT_VALUE'
4955                 ,p_value_1              => l_account
4956                 ,p_token_2              => 'LINE_NUM'
4957                 ,p_value_2              => l_err.ae_line_num
4958                 ,p_token_3              => 'PROD_RULE_NAME'
4959                 ,p_value_3              => l_prod_rule_name
4960                 ,p_entity_id            => l_err.entity_id
4961                 ,p_event_id             => l_err.event_id
4962                 ,p_ledger_id            => g_ledger_id
4963                 ,p_ae_header_id         => l_err.ae_header_id
4964                 ,p_ae_line_num          => l_err.ae_line_num
4965                 ,p_accounting_batch_id  => NULL);
4966         ELSE
4967           xla_accounting_err_pkg.build_message(
4968                 p_appli_s_name          => 'XLA'
4969                 ,p_msg_name             => 'XLA_MJE_CCID_NOT_DET_POST'
4970                 ,p_token_1              => 'ACCOUNT_VALUE'
4971                 ,p_value_1              => l_account
4972                 ,p_token_2              => 'LINE_NUM'
4973                 ,p_value_2              => l_err.ae_line_num
4974                 ,p_entity_id            => l_err.entity_id
4975                 ,p_event_id             => l_err.event_id
4976                 ,p_ledger_id            => g_ledger_id
4977                 ,p_ae_header_id         => l_err.ae_header_id
4978                 ,p_ae_line_num          => l_err.ae_line_num
4979                 ,p_accounting_batch_id  => NULL);
4980         END IF;
4981       END IF;
4982 
4983       -- For budget entries, detail budgeting must be allowed for the ledger
4984       IF (l_err.balance_type_code = 'B' AND
4985           l_err.detail_budgeting_allowed_flag = 'N') THEN
4986         IF (l_account IS NULL) THEN
4987           OPEN c_account(l_err.ccid_coa_id, l_ccid);--l_err.code_combination_id);
4988           FETCH c_account INTO l_account;
4989           CLOSE c_account;
4990         END IF;
4991 
4992         xla_accounting_err_pkg.build_message(
4993                 p_appli_s_name          => 'XLA'
4994                 ,p_msg_name             => 'XLA_AP_CCID_NOT_DET_BUD'
4995                 ,p_token_1              => 'ACCOUNT_VALUE'
4996                 ,p_value_1              => l_account
4997                 ,p_token_2              => 'LINE_NUM'
4998                 ,p_value_2              => l_err.ae_line_num
4999                 ,p_entity_id            => l_err.entity_id
5000                 ,p_event_id             => l_err.event_id
5001                 ,p_ledger_id            => g_ledger_id
5002                 ,p_ae_header_id         => l_err.ae_header_id
5003                 ,p_ae_line_num          => l_err.ae_line_num
5004                 ,p_accounting_batch_id  => NULL);
5005       END IF;
5006 
5007       -- The journal source assigned to the CCID does not match that for the application
5008       IF (g_app_ctl_acct_source_code <> 'Y' AND
5009           l_err.control_account_enabled_flag NOT IN ('Y', 'N', g_app_ctl_acct_source_code)) THEN
5010         IF (l_je_source_name IS NULL) THEN
5011           OPEN c_je_source_name(l_err.control_account_enabled_flag);
5012           FETCH c_je_source_name INTO l_je_source_name;
5013           CLOSE c_je_source_name;
5014         END IF;
5015 
5016         IF (l_account IS NULL) THEN
5017           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
5018           FETCH c_account INTO l_account;
5019           CLOSE c_account;
5020         END IF;
5021 
5022         IF (l_app_name IS NULL) THEN
5023           SELECT application_name INTO l_app_name
5024           FROM   fnd_application_vl
5025           WHERE  application_id = g_application_id;
5026         END IF;
5027 
5028         IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
5029           xla_accounting_err_pkg.build_message(
5030                 p_appli_s_name          => 'XLA'
5031                 ,p_msg_name             => 'XLA_AP_CON_ACCT_NOT_MAT'
5032                 ,p_token_1              => 'JOURNAL_SOURCE_NAME'
5033                 ,p_value_1              => l_je_source_name
5034                 ,p_token_2              => 'ACCOUNT_VALUE'
5035                 ,p_value_2              => l_account
5036                 ,p_token_3              => 'LINE_NUM'
5037                 ,p_value_3              => l_err.ae_line_num
5038                 ,p_token_4              => 'APP_NAME'
5039                 ,p_value_4              => l_app_name
5040                 ,p_entity_id            => l_err.entity_id
5041                 ,p_event_id             => l_err.event_id
5042                 ,p_ledger_id            => g_ledger_id
5043                 ,p_ae_header_id         => l_err.ae_header_id
5044                 ,p_ae_line_num          => l_err.ae_line_num
5045                 ,p_accounting_batch_id  => NULL);
5046         ELSE
5047           xla_accounting_err_pkg.build_message(
5048                 p_appli_s_name          => 'XLA'
5049                 ,p_msg_name             => 'XLA_MJE_CON_ACCT_NOT_MAT'
5050                 ,p_token_1              => 'JOURNAL_SOURCE_NAME'
5051                 ,p_value_1              => l_je_source_name
5052                 ,p_token_2              => 'ACCOUNT_VALUE'
5053                 ,p_value_2              => l_account
5054                 ,p_token_3              => 'LINE_NUM'
5055                 ,p_value_3              => l_err.ae_line_num
5056                 ,p_token_4              => 'APP_NAME'
5057                 ,p_value_4              => l_app_name
5058                 ,p_entity_id            => l_err.entity_id
5059                 ,p_event_id             => l_err.event_id
5060                 ,p_ledger_id            => g_ledger_id
5061                 ,p_ae_header_id         => l_err.ae_header_id
5062                 ,p_ae_line_num          => l_err.ae_line_num
5063                 ,p_accounting_batch_id  => NULL);
5064         END IF;
5065       END IF;
5066 
5067       -- If the application is not control account enabled, the CCID must not be
5068       -- a control account
5069       IF (g_app_ctl_acct_source_code = 'N' AND
5070           l_err.control_account_enabled_flag <> 'N') THEN
5071 
5072         IF (l_app_name IS NULL) THEN
5073           SELECT application_name INTO l_app_name
5074           FROM   fnd_application_vl
5075           WHERE  application_id = g_application_id;
5076         END IF;
5077 
5078         xla_accounting_err_pkg.build_message(
5079                 p_appli_s_name          => 'XLA'
5080                 ,p_msg_name             =>'XLA_AP_APP_NOT_CONT_AC'
5081                 ,p_token_1              => 'ACCOUNT_VALUE'
5082                 ,p_value_1              => l_account
5083                 ,p_token_2              => 'LINE_NUM'
5084                 ,p_value_2              => l_err.ae_line_num
5085                 ,p_token_3              => 'APPLICATION_NAME'
5086                 ,p_value_3              => l_app_name
5087                 ,p_entity_id            => l_err.entity_id
5088                 ,p_event_id             => l_err.event_id
5089                 ,p_ledger_id            => g_ledger_id
5090                 ,p_ae_header_id         => l_err.ae_header_id
5091                 ,p_ae_line_num          => l_err.ae_line_num
5092                 ,p_accounting_batch_id  => NULL);
5093       END IF;
5094 
5095       --  If CCID is a control account, all party information must be provided
5096       IF (l_err.control_account_enabled_flag <> 'N' AND
5097           (l_err.party_type_code IS NULL OR
5098            l_err.party_id IS NULL OR
5099 	   (l_err.party_type_code = 'S' AND l_err.party_site_id IS NULL))) THEN
5100 
5101         IF (l_account IS NULL) THEN
5102           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
5103           FETCH c_account INTO l_account;
5104           CLOSE c_account;
5105         END IF;
5106 
5107         SELECT gain_or_loss_flag INTO l_gain_or_loss_flag
5108           FROM xla_ae_lines
5109          WHERE application_id = g_application_id
5110            AND ae_header_id   = l_err.ae_header_id
5111            AND ae_line_num    = l_err.ae_line_num;
5112 
5113         IF l_gain_or_loss_flag = 'Y' THEN
5114           xla_accounting_err_pkg.build_message(
5115                 p_appli_s_name          => 'XLA'
5116                 ,p_msg_name             => 'XLA_AP_APP_NOT_CONT_AC_GL'
5117                 ,p_token_1              => 'ACCOUNT_VALUE'
5118                 ,p_value_1              => l_account
5119                 ,p_entity_id            => l_err.entity_id
5120                 ,p_event_id             => l_err.event_id
5121                 ,p_ledger_id            => g_ledger_id
5122                 ,p_ae_header_id         => l_err.ae_header_id
5123                 ,p_ae_line_num          => l_err.ae_line_num
5124                 ,p_accounting_batch_id  => NULL);
5125         ELSE
5126           IF g_caller = C_CALLER_MPA_PROGRAM THEN
5127             g_message_name := 'XLA_MA_NO_3RD_PARTY_CONT';
5128           ELSE
5129             g_message_name := 'XLA_AP_NO_3RD_PARTY_CONT';
5130           END IF;
5131 
5132           xla_accounting_err_pkg.build_message(
5133                 p_appli_s_name          => 'XLA'
5134                 ,p_msg_name             => g_message_name  -- 4262811 'XLA_AP_NO_3RD_PARTY_CONT'
5135                 ,p_token_1              => 'ACCOUNT_VALUE'
5136                 ,p_value_1              => l_account
5137                 ,p_token_2              => 'LINE_NUM'
5138                 ,p_value_2              => l_err.ae_line_num
5139                 ,p_entity_id            => l_err.entity_id
5140                 ,p_event_id             => l_err.event_id
5141                 ,p_ledger_id            => g_ledger_iD
5142                 ,p_ae_header_id         => l_err.ae_header_id
5143                 ,p_ae_line_num          => l_err.ae_line_num
5144                 ,p_accounting_batch_id  => NULL);
5145         END IF;
5146       END IF;
5147 
5148       --  If CCID is a control account of customer or supplier, party type information must be
5149       --  consistant with the ccid type
5150       IF ((l_err.control_account_enabled_flag = 'SUPPLIER' AND l_err.party_type_code <> 'S')
5151             OR (l_err.control_account_enabled_flag = 'CUSTOMER' AND l_err.party_type_code <> 'C')) THEN
5152 
5153         IF (l_account IS NULL) THEN
5154           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
5155           FETCH c_account INTO l_account;
5156           CLOSE c_account;
5157         END IF;
5158         g_message_name := 'XLA_AP_INCONSISTANT_3RD_PARTY';
5159         ---------------------------------------
5160         xla_accounting_err_pkg.build_message(
5161                 p_appli_s_name          => 'XLA'
5162                 ,p_msg_name             => g_message_name  -- 4262811 'XLA_AP_NO_3RD_PARTY_CONT'
5163                 ,p_token_1              => 'ACCOUNT_VALUE'
5164                 ,p_value_1              => l_account
5165                 ,p_token_2              => 'LINE_NUM'
5166                 ,p_value_2              => l_err.ae_line_num
5167                 ,p_token_3              => 'PARTY_TYPE'
5168                 ,p_value_3              => l_err.control_account_enabled_flag
5169                 ,p_entity_id            => l_err.entity_id
5170                 ,p_event_id             => l_err.event_id
5171                 ,p_ledger_id            => g_ledger_iD
5172                 ,p_ae_header_id         => l_err.ae_header_id
5173                 ,p_ae_line_num          => l_err.ae_line_num
5174                 ,p_accounting_batch_id  => NULL);
5175       END IF;
5176 
5177       IF (g_ledger_coa_id <> l_err.ccid_coa_id) THEN
5178         IF (l_account IS NULL) THEN
5179           OPEN c_account(l_err.ccid_coa_id, l_ccid); --l_err.code_combination_id);
5180           FETCH c_account INTO l_account;
5181           CLOSE c_account;
5182         END IF;
5183         xla_accounting_err_pkg.build_message(
5184                 p_appli_s_name          => 'XLA'
5185                 ,p_msg_name             => 'XLA_AP_INVALID_CCID_COA_ID'
5186                 ,p_token_1              => 'ACCOUNT_VALUE'
5187                 ,p_value_1              => l_account
5188                 ,p_token_2              => 'LINE_NUM'
5189                 ,p_value_2              => l_err.ae_line_num
5190                 ,p_token_3              => 'LEDGER_NAME'
5191                 ,p_value_3              => g_ledger_name
5192                 ,p_entity_id            => l_err.entity_id
5193                 ,p_event_id             => l_err.event_id
5194                 ,p_ledger_id            => g_ledger_id
5195                 ,p_ae_header_id         => l_err.ae_header_id
5196                 ,p_ae_line_num          => l_err.ae_line_num
5197                 ,p_accounting_batch_id  => NULL);
5198       END IF;
5199 
5200     END IF;
5201 
5202     --  If CCID is a control account, party type code must be 'S' or 'C'
5203     IF (l_err.party_type_code IS NOT NULL AND
5204         l_err.party_type_code NOT IN ('S', 'C')) THEN
5205       xla_accounting_err_pkg.build_message(
5206                 p_appli_s_name          => 'XLA'
5207                 ,p_msg_name             => 'XLA_AP_INVALID_PARTY_TYPE'
5208                 ,p_token_1              => 'PARTY_TYPE'
5209                 ,p_value_1              => l_err.party_type_code
5210                 ,p_token_2              => 'LINE_NUM'
5211                 ,p_value_2              => l_err.ae_line_num
5212                 ,p_entity_id            => l_err.entity_id
5213                 ,p_event_id             => l_err.event_id
5214                 ,p_ledger_id            => g_ledger_id
5215                 ,p_ae_header_id         => l_err.ae_header_id
5216                 ,p_ae_line_num          => l_err.ae_line_num
5217                 ,p_accounting_batch_id  => NULL);
5218     END IF;
5219 
5220     -- If party id is missing when party site id is specified
5221     IF (l_err.party_site_id IS NOT NULL AND l_err.party_id IS NULL) THEN
5222       IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
5223         xla_accounting_err_pkg.build_message(
5224                 p_appli_s_name          => 'XLA'
5225                 ,p_msg_name             => 'XLA_AP_INVALID_PARTY_ID'
5226                 ,p_token_1              => 'PARTY_ID'
5227                 ,p_value_1              => l_err.party_id
5228                 ,p_token_2              => 'LINE_NUM'
5229                 ,p_value_2              => l_err.ae_line_num
5230                 ,p_entity_id            => l_err.entity_id
5231                 ,p_event_id             => l_err.event_id
5232                 ,p_ledger_id            => g_ledger_id
5233                 ,p_ae_header_id         => l_err.ae_header_id
5234                 ,p_ae_line_num          => l_err.ae_line_num
5235                 ,p_accounting_batch_id  => NULL);
5236       ELSE
5237         -- 4262811-----------------------------
5238         IF g_caller = C_CALLER_MPA_PROGRAM THEN
5239            g_message_name := 'XLA_MA_INVALID_PARTY_ID';
5240         ELSE
5241            g_message_name := 'XLA_MJE_INVALID_PARTY_ID';
5242         END IF;
5243         ---------------------------------------
5244         xla_accounting_err_pkg.build_message(
5245                 p_appli_s_name          => 'XLA'
5246                 ,p_msg_name             => g_message_name  -- 4262811 'XLA_MJE_INVALID_PARTY_ID'
5247                 ,p_token_1              => 'PARTY_ID'
5248                 ,p_value_1              => l_err.party_id
5249                 ,p_token_2              => 'LINE_NUM'
5250                 ,p_value_2              => l_err.ae_line_num
5251                 ,p_entity_id            => l_err.entity_id
5252                 ,p_event_id             => l_err.event_id
5253                 ,p_ledger_id            => g_ledger_id
5254                 ,p_ae_header_id         => l_err.ae_header_id
5255                 ,p_ae_line_num          => l_err.ae_line_num
5256                 ,p_accounting_batch_id  => NULL);
5257       END IF;
5258     END IF;
5259 
5260     --  If party site id is missing when party id is not NULL
5261 /*
5262     -- This is commented out for on bug 3648508, party site id is not always required
5263     IF (l_err.party_id IS NOT NULL AND l_err.party_type_code IS NULL AND l_err.party_site_id IS NULL) THEN
5264       IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
5265         xla_accounting_err_pkg.build_message(
5266                  p_appli_s_name         => 'XLA'
5267                 ,p_msg_name             => 'XLA_AP_INVALID_PARTY_SITE'
5268                 ,p_token_1              => 'LINE_NUM'
5269                 ,p_value_1              => l_err.displayed_line_number
5270                 ,p_entity_id            => l_err.entity_id
5271                 ,p_event_id             => l_err.event_id
5272                 ,p_ledger_id            => g_ledger_id
5273                 ,p_ae_header_id         => l_err.ae_header_id
5274                 ,p_ae_line_num          => l_err.ae_line_num
5275                 ,p_accounting_batch_id  => NULL);
5276       ELSE
5277         xla_accounting_err_pkg.build_message(
5278                  p_appli_s_name         => 'XLA'
5279                 ,p_token_1              => 'LINE_NUM'
5280                 ,p_value_1              => l_err.displayed_line_number
5281                 ,p_entity_id            => l_err.entity_id
5282                 ,p_event_id             => l_err.event_id
5283                 ,p_ledger_id            => g_ledger_id
5284                 ,p_ae_header_id         => l_err.ae_header_id
5285                 ,p_ae_line_num          => l_err.ae_line_num
5286                 ,p_accounting_batch_id  => NULL);
5287       END IF;
5288     END IF;
5289 */
5290 
5291     -- If party type code is missing when party id or party site id is specified
5292     IF ((l_err.party_id IS NOT NULL OR l_err.party_site_id IS NOT NULL) AND
5293         l_err.party_type_code IS NULL) THEN
5294       IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
5295         xla_accounting_err_pkg.build_message(
5296                 p_appli_s_name          => 'XLA'
5297                 ,p_msg_name             => 'XLA_AP_INVALID_PARTY_CODE'
5298                 ,p_token_1              => 'PARTY_TYPE'
5299                 ,p_value_1              => l_err.party_type_code
5300                 ,p_token_2              => 'LINE_NUM'
5301                 ,p_value_2              => l_err.ae_line_num
5302                 ,p_entity_id            => l_err.entity_id
5303                 ,p_event_id             => l_err.event_id
5304                 ,p_ledger_id            => g_ledger_id
5305                 ,p_ae_header_id         => l_err.ae_header_id
5306                 ,p_ae_line_num          => l_err.ae_line_num
5307                 ,p_accounting_batch_id  => NULL);
5308       ELSE
5309         xla_accounting_err_pkg.build_message(
5310                 p_appli_s_name          => 'XLA'
5311                 ,p_msg_name             => 'XLA_MJE_INVALID_PARTY_CODE'
5312                 ,p_token_1              => 'PARTY_TYPE'
5313                 ,p_value_1              => l_err.party_type_code
5314                 ,p_token_2              => 'LINE_NUM'
5315                 ,p_value_2              => l_err.ae_line_num
5316                 ,p_entity_id            => l_err.entity_id
5317                 ,p_event_id             => l_err.event_id
5318                 ,p_ledger_id            => g_ledger_id
5319                 ,p_ae_header_id         => l_err.ae_header_id
5320                 ,p_ae_line_num          => l_err.ae_line_num
5321                 ,p_accounting_batch_id  => NULL);
5322       END IF;
5323     END IF;
5324 
5325     IF (l_err.entered_dr IS NULL or l_err.entered_cr IS NOT NULL or
5326         l_err.accounted_dr IS NULL or l_err.accounted_cr IS NOT NULL) AND
5327        (l_err.entered_dr IS NOT NULL or l_err.entered_cr IS NULL or
5328         l_err.accounted_dr IS NOT NULL or l_err.accounted_cr IS NULL) AND
5329        (l_err.accounted_dr IS NOT NULL or l_err.accounted_cr IS NOT NULL) THEN
5330       IF (C_LEVEL_EVENT >= g_log_level) THEN
5331         trace(p_msg    => 'entered_dr:'||to_char(l_err.entered_dr),
5332               p_module => l_log_module,
5333               p_level  => C_LEVEL_EVENT);
5334         trace(p_msg    => 'entered_cr:'||to_char(l_err.entered_cr),
5335               p_module => l_log_module,
5336               p_level  => C_LEVEL_EVENT);
5337         trace(p_msg    => 'accounted_cr:'||to_char(l_err.accounted_cr),
5338               p_module => l_log_module,
5339               p_level  => C_LEVEL_EVENT);
5340         trace(p_msg    => 'accounted_dr:'||to_char(l_err.accounted_dr),
5341               p_module => l_log_module,
5342               p_level  => C_LEVEL_EVENT);
5343       END IF;
5344       IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
5345         xla_accounting_err_pkg.build_message(
5346                 p_appli_s_name          => 'XLA'
5347                 ,p_msg_name             => 'XLA_AP_INVALID_AMT_SIDE'
5348                 ,p_token_1              => 'LINE_NUM'
5349                 ,p_value_1              => l_err.ae_line_num
5350                 ,p_entity_id            => l_err.entity_id
5351                 ,p_event_id             => l_err.event_id
5352                 ,p_ledger_id            => g_ledger_id
5353                 ,p_ae_header_id         => l_err.ae_header_id
5354                 ,p_ae_line_num          => l_err.ae_line_num
5355                 ,p_accounting_batch_id  => NULL);
5356       ELSE
5357         xla_accounting_err_pkg.build_message(
5358                 p_appli_s_name          => 'XLA'
5359                 ,p_msg_name             => 'XLA_MJE_INVALID_AMT_SIDE'
5360                 ,p_token_1              => 'LINE_NUM'
5361                 ,p_value_1              => l_err.ae_line_num
5362                 ,p_entity_id            => l_err.entity_id
5363                 ,p_event_id             => l_err.event_id
5364                 ,p_ledger_id            => g_ledger_id
5365                 ,p_ae_header_id         => l_err.ae_header_id
5366                 ,p_ae_line_num          => l_err.ae_line_num
5367                 ,p_accounting_batch_id  => NULL);
5368       END IF;
5369     END IF;
5370 
5371     IF (NVL(l_err.entered_cr,0) > 0 AND NVL(l_err.accounted_cr,0) < 0) OR
5372        (NVL(l_err.entered_dr,0) > 0 AND NVL(l_err.accounted_dr,0) < 0) OR
5373        (NVL(l_err.entered_cr,0) < 0 AND NVL(l_err.accounted_cr,0) > 0) OR
5374        (NVL(l_err.entered_dr,0) < 0 AND NVL(l_err.accounted_dr,0) > 0) THEN
5375       xla_accounting_err_pkg.build_message(
5376                 p_appli_s_name          => 'XLA'
5377                 ,p_msg_name             => 'XLA_AP_INCONSISTENT_AMOUNTS'
5378                 ,p_token_1              => 'LINE_NUM'
5379                 ,p_value_1              => l_err.ae_line_num
5380                 ,p_entity_id            => l_err.entity_id
5381                 ,p_event_id             => l_err.event_id
5382                 ,p_ledger_id            => g_ledger_id
5383                 ,p_ae_header_id         => l_err.ae_header_id
5384                 ,p_ae_line_num          => l_err.ae_line_num
5385                 ,p_accounting_batch_id  => NULL);
5386     END IF;
5387 
5388     IF (g_ledger_currency_code = l_err.entered_currency_code AND
5389        ((l_err.entered_cr IS NULL AND l_err.unrounded_entered_dr <> l_err.unrounded_accounted_dr) or
5390         (l_err.entered_dr IS NULL AND l_err.unrounded_entered_cr <> l_err.unrounded_accounted_cr))) THEN
5391         xla_accounting_err_pkg.build_message(
5392                 p_appli_s_name          => 'XLA'
5393                 ,p_msg_name             => 'XLA_AP_INVALID_AMT_BASE'
5394                 ,p_token_1              => 'LINE_NUM'
5395                 ,p_value_1              => l_err.ae_line_num
5396                 ,p_entity_id            => l_err.entity_id
5397                 ,p_event_id             => l_err.event_id
5398                 ,p_ledger_id            => g_ledger_id
5399                 ,p_ae_header_id         => l_err.ae_header_id
5400                 ,p_ae_line_num          => l_err.ae_line_num
5401                 ,p_accounting_batch_id  => NULL);
5402     END IF;
5403 
5404     IF (l_err.accounting_class_code IS NULL) THEN
5405       xla_accounting_err_pkg.build_message(
5406                 p_appli_s_name          => 'XLA'
5407                 ,p_msg_name             => 'XLA_AP_NO_ACCT_CLASS'
5408                 ,p_token_1              => 'LINE_NUMBER'
5409                 ,p_value_1              => l_err.displayed_line_number
5410                 ,p_entity_id            => l_err.entity_id
5411                 ,p_event_id             => l_err.event_id
5412                 ,p_ledger_id            => g_ledger_id
5413                 ,p_ae_header_id         => l_err.ae_header_id
5414                 ,p_ae_line_num          => l_err.ae_line_num
5415                 ,p_accounting_batch_id  => NULL);
5416     END IF;
5417 
5418     IF (l_err.accounted_cr IS NULL and l_err.accounted_dr is Null
5419            and l_err.currency_conversion_rate is NULL) THEN
5420       IF((l_err.entered_cr is not NULL or l_err.entered_dr is not NULL)
5421             and l_err.entered_currency_code<>g_ledger_currency_code ) THEN
5422 --     if both are null, no need to report error here since it is reported
5423 --     when temp line is generated.
5424         IF (l_err.currency_conversion_type is not NULL) THEN
5425           -- Bug 4765421.
5426           OPEN c_user_conv_type(l_err.currency_conversion_type);
5427           FETCH c_user_conv_type into l_user_conv_type;
5428           CLOSE c_user_conv_type;
5429 
5430           xla_accounting_err_pkg.build_message(
5431                 p_appli_s_name          => 'XLA'
5432                 ,p_msg_name             => 'XLA_AP_NO_CONV_RATE'
5433                 ,p_token_1              => 'CURRENCY_FROM'
5434                 ,p_value_1              => l_err.entered_currency_code
5435                 ,p_token_2              => 'CURRENCY_TO'
5436                 ,p_value_2              => g_ledger_currency_code
5437                 ,p_token_3              => 'CONVERSION_TYPE'
5438                 ,p_value_3              => l_user_conv_type
5439                 ,p_token_4              => 'CONVERSION_DATE'
5440                 ,p_value_4              => l_err.currency_conversion_date
5441                 ,p_token_5              => 'LINE_NUM'
5442                 ,p_value_5              => l_err.ae_line_num
5443                 ,p_entity_id            => l_err.entity_id
5444                 ,p_event_id             => l_err.event_id
5445                 ,p_ledger_id            => g_ledger_id
5446                 ,p_ae_header_id         => l_err.ae_header_id
5447                 ,p_ae_line_num          => l_err.ae_line_num
5448                 ,p_accounting_batch_id  => NULL);
5449         ELSE
5450           xla_accounting_err_pkg.build_message(
5451                 p_appli_s_name          => 'XLA'
5452                 ,p_msg_name             => 'XLA_AP_NO_CONV_TYPE'
5453                 ,p_token_1              => 'LINE_NUM'
5454                 ,p_value_1              => l_err.ae_line_num
5455                 ,p_entity_id            => l_err.entity_id
5456                 ,p_event_id             => l_err.event_id
5457                 ,p_ledger_id            => g_ledger_id
5458                 ,p_ae_header_id         => l_err.ae_header_id
5459                 ,p_ae_line_num          => l_err.ae_line_num
5460                 ,p_accounting_batch_id  => NULL);
5461         END IF;
5462       END IF;
5463     END IF;
5464   END LOOP;
5465   IF (C_LEVEL_EVENT >= g_log_level) THEN
5466     trace(p_msg    => 'END LOOP - invalid line',
5467           p_module => l_log_module,
5468           p_level  => C_LEVEL_EVENT);
5469   END IF;
5470 
5471   IF ((g_bal_seg_value_option_code <> 'A') OR
5472       (g_mgt_seg_value_option_code <> 'A' AND g_mgt_seg_column_name IS NOT NULL)) THEN
5473 
5474     IF (g_bal_seg_value_option_code <> 'A') THEN
5475       validate_bal_segments(g_target_ledger_id);
5476     END IF;
5477     IF (g_mgt_seg_value_option_code <> 'A' AND
5478         g_mgt_seg_column_name IS NOT NULL) THEN
5479       validate_mgt_segments(g_target_ledger_id);
5480     END IF;
5481   END IF;
5482 
5483   IF (g_caller <> C_CALLER_THIRD_PARTY_MERGE) THEN
5484     validate_third_parties;
5485   end if;
5486 
5487   validate_currencies;
5488 
5489   IF (g_caller <> C_CALLER_THIRD_PARTY_MERGE) THEN
5490     validate_accounting_classes;
5491   END IF;
5492 
5493   validate_encumbrances;         -- 4458381
5494 
5495   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
5496     trace(p_msg    => 'End of function validate_lines',
5497           p_module => l_log_module,
5498           p_level  => C_LEVEL_PROCEDURE);
5499   END IF;
5500 EXCEPTION
5501 WHEN xla_exceptions_pkg.application_exception THEN
5502   IF (c_line_error%ISOPEN) THEN
5503     CLOSE c_line_error;
5504   END IF;
5505   IF (c_account%ISOPEN) THEN
5506     CLOSE c_account;
5507   END IF;
5508   IF (c_je_source_name%ISOPEN) THEN
5509     CLOSE c_je_source_name;
5510   END IF;
5511   IF (c_prod_rule_name%ISOPEN) THEN
5512     CLOSE c_prod_rule_name;
5513   END IF;
5514   IF (c_budget_name%ISOPEN) THEN
5515     CLOSE c_budget_name;
5516   END IF;
5517   RAISE;
5518 
5519 WHEN OTHERS THEN
5520   IF (c_line_error%ISOPEN) THEN
5521     CLOSE c_line_error;
5522   END IF;
5523   IF (c_account%ISOPEN) THEN
5524     CLOSE c_account;
5525   END IF;
5526   IF (c_je_source_name%ISOPEN) THEN
5527     CLOSE c_je_source_name;
5528   END IF;
5529   IF (c_prod_rule_name%ISOPEN) THEN
5530     CLOSE c_prod_rule_name;
5531   END IF;
5532   IF (c_budget_name%ISOPEN) THEN
5533     CLOSE c_budget_name;
5534   END IF;
5535   xla_exceptions_pkg.raise_message
5536       (p_location => 'xla_je_validation_pkg.validate_lines');
5537 END validate_lines;
5538 
5539 
5540 --=============================================================================
5541 --
5542 -- Name: validation
5543 -- Description: This procedure performs the validation for journal entry lines,
5544 --              journal entry headers, and the ledger security.  All journal
5545 --              entry with error will be marked as complete.
5546 --
5547 --=============================================================================
5548 PROCEDURE validation
5549 IS
5550   l_prev_err_count  INTEGER;
5551   l_temp_err_count  INTEGER;
5552   l_log_module      VARCHAR2(240);
5553   l_temp_distinct_hdr_ids XLA_AE_JOURNAL_ENTRY_PKG.t_array_value_num;
5554   l_distinct_hdr_ids t_array_int;
5555 BEGIN
5556 
5557   IF g_log_enabled THEN
5558     l_log_module := C_DEFAULT_MODULE||'.validation';
5559   END IF;
5560 
5561   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
5562     trace(p_msg    => 'BEGIN of procedure validation',
5563           p_module => l_log_module,
5564           p_level  => C_LEVEL_PROCEDURE);
5565   END IF;
5566 
5567   l_prev_err_count := g_err_count;
5568 
5569   IF (C_LEVEL_ERROR >= g_log_level) THEN
5570     trace(p_msg    => 'before error count = '||g_err_count,
5571           p_module => l_log_module,
5572           p_level  => C_LEVEL_ERROR);
5573   END IF;
5574 
5575   validate_lines;
5576   validate_access_set_security;
5577   validate_headers;
5578 
5579   IF (C_LEVEL_ERROR >= g_log_level) THEN
5580     trace(p_msg    => 'after error count = '||g_err_count,
5581           p_module => l_log_module,
5582           p_level  => C_LEVEL_ERROR);
5583   END IF;
5584 
5585   --
5586   -- Mark the journal entry as done if any error is encountered for its lines
5587   -- so no further processing will be performed on those journal entries.
5588   --
5589   IF (g_err_count > l_prev_err_count) THEN
5590 
5591     IF (C_LEVEL_ERROR >= g_log_level) THEN
5592       l_temp_err_count := g_err_count-l_prev_err_count;
5593       trace(p_msg    => '# error count from validation = '||l_temp_err_count,
5594             p_module => l_log_module,
5595             p_level  => C_LEVEL_ERROR);
5596     END IF;
5597 
5598     /* Bug 	7128871
5599        Exhausted Undo Tablespace when a single header has many lines.
5600        The following sql updates # of errors * # of lines.
5601 
5602     FORALL i IN l_prev_err_count+1..g_err_count
5603       UPDATE     xla_validation_lines_gt
5604         set      balancing_line_type = C_LINE_TYPE_COMPLETE
5605         WHERE    ae_header_id = g_err_hdr_ids(i); */
5606 
5607     --
5608     -- Bug 7128871
5609     --     Update xla_validation_lines_gt for distinct ae header ids.
5610     --
5611 
5612      FOR i IN g_prev_err_count+1..g_err_count LOOP
5613        IF NOT l_temp_distinct_hdr_ids.EXISTS(g_err_hdr_ids(i)) THEN
5614           l_distinct_hdr_ids(i) := g_err_hdr_ids(i);
5615           l_temp_distinct_hdr_ids(g_err_hdr_ids(i)) := g_err_hdr_ids(i);
5616        END IF;
5617      END LOOP;
5618      --
5619      --  As indices of l_dinstinct_hdr_ids are not consecutive,
5620      --  need to use "INDICES OF".
5621      --
5622         FORALL i IN INDICES OF l_distinct_hdr_ids
5623            UPDATE  /*+ INDEX (XLA_VALIDATION_LINES_GT,XLA_VALIDATION_LINES_GT_N2)
5624  */ XLA_VALIDATION_LINES_GT
5625               SET balancing_line_type = C_LINE_TYPE_COMPLETE
5626             WHERE ae_header_id = l_distinct_hdr_ids(i);
5627   END IF;
5628 
5629   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
5630     trace(p_msg    => 'END of procedure validation',
5631           p_module => l_log_module,
5632           p_level  => C_LEVEL_PROCEDURE);
5633   END IF;
5634 
5635 EXCEPTION
5636 WHEN xla_exceptions_pkg.application_exception THEN
5637   RAISE;
5638 
5639 WHEN OTHERS THEN
5640   xla_exceptions_pkg.raise_message
5641       (p_location => 'xla_je_validation_pkg.validation');
5642 END validation;
5643 
5644 
5645 --=============================================================================
5646 --
5647 -- Name: balance_by_bsv_and_ledger_curr
5648 -- Description: This function inserts rows to the xla_ae_lines of the specified
5649 --              subledger journal entry so that the entry will be balanced by
5650 --              balancing segments and ledger currency.
5651 --
5652 --=============================================================================
5653 PROCEDURE balance_by_bsv_and_ledger_curr
5654   (p_event_id                   IN  INTEGER,
5655    p_entity_id                  IN  INTEGER,
5656    p_ae_header_id               IN  INTEGER)
5657 IS
5658   CURSOR c_bal IS
5659     SELECT      bal_seg_value                  bal_seg_val
5660               , entered_currency_code          currency_code
5661               , max_ae_line_num                max_ae_line_num
5662               , max_displayed_line_number      max_disp_line_num
5663               , sum(nvl(accounted_dr,0))       accted_dr
5664               , sum(nvl(accounted_cr,0))       accted_cr
5665               , sum(nvl(entered_dr,0))         entered_dr
5666               , sum(nvl(entered_cr,0))         entered_cr
5667               , accounting_date                accounting_date
5668               , party_type_code                party_type_code
5669               , party_id                       party_id
5670               , party_site_id                  party_site_id
5671     FROM        xla_validation_lines_gt
5672     WHERE       ae_header_id = p_ae_header_id
5673     AND         entered_currency_code <> 'STAT' -- added for bug#10166812
5674     GROUP BY    bal_seg_value
5675               , entered_currency_code
5676               , max_ae_line_num
5677               , max_displayed_line_number
5678               , accounting_date
5679               , party_type_code
5680               , party_id
5681               , party_site_id
5682     HAVING    sum(nvl(accounted_dr,0)) <> sum(nvl(accounted_cr,0));
5683 
5684   -- 4917607 - performance changes
5685   CURSOR c_sccid_segs (p_bal_seg_val VARCHAR2, p_sus_ccid INTEGER, p_bal_seg_column VARCHAR2) IS
5686     SELECT chart_of_accounts_id
5687          , decode(p_bal_seg_column,'SEGMENT1',p_bal_seg_val,t.segment1)
5688          , decode(p_bal_seg_column,'SEGMENT2',p_bal_seg_val,t.segment2)
5689          , decode(p_bal_seg_column,'SEGMENT3',p_bal_seg_val,t.segment3)
5690          , decode(p_bal_seg_column,'SEGMENT4',p_bal_seg_val,t.segment4)
5691          , decode(p_bal_seg_column,'SEGMENT5',p_bal_seg_val,t.segment5)
5692          , decode(p_bal_seg_column,'SEGMENT6',p_bal_seg_val,t.segment6)
5693          , decode(p_bal_seg_column,'SEGMENT7',p_bal_seg_val,t.segment7)
5694          , decode(p_bal_seg_column,'SEGMENT8',p_bal_seg_val,t.segment8)
5695          , decode(p_bal_seg_column,'SEGMENT9',p_bal_seg_val,t.segment9)
5696          , decode(p_bal_seg_column,'SEGMENT10',p_bal_seg_val,t.segment10)
5697          , decode(p_bal_seg_column,'SEGMENT11',p_bal_seg_val,t.segment11)
5698          , decode(p_bal_seg_column,'SEGMENT12',p_bal_seg_val,t.segment12)
5699          , decode(p_bal_seg_column,'SEGMENT13',p_bal_seg_val,t.segment13)
5700          , decode(p_bal_seg_column,'SEGMENT14',p_bal_seg_val,t.segment14)
5701          , decode(p_bal_seg_column,'SEGMENT15',p_bal_seg_val,t.segment15)
5702          , decode(p_bal_seg_column,'SEGMENT16',p_bal_seg_val,t.segment16)
5703          , decode(p_bal_seg_column,'SEGMENT17',p_bal_seg_val,t.segment17)
5704          , decode(p_bal_seg_column,'SEGMENT18',p_bal_seg_val,t.segment18)
5705          , decode(p_bal_seg_column,'SEGMENT19',p_bal_seg_val,t.segment19)
5706          , decode(p_bal_seg_column,'SEGMENT20',p_bal_seg_val,t.segment20)
5707          , decode(p_bal_seg_column,'SEGMENT21',p_bal_seg_val,t.segment21)
5708          , decode(p_bal_seg_column,'SEGMENT22',p_bal_seg_val,t.segment22)
5709          , decode(p_bal_seg_column,'SEGMENT23',p_bal_seg_val,t.segment23)
5710          , decode(p_bal_seg_column,'SEGMENT24',p_bal_seg_val,t.segment24)
5711          , decode(p_bal_seg_column,'SEGMENT25',p_bal_seg_val,t.segment25)
5712          , decode(p_bal_seg_column,'SEGMENT26',p_bal_seg_val,t.segment26)
5713          , decode(p_bal_seg_column,'SEGMENT27',p_bal_seg_val,t.segment27)
5714          , decode(p_bal_seg_column,'SEGMENT28',p_bal_seg_val,t.segment28)
5715          , decode(p_bal_seg_column,'SEGMENT29',p_bal_seg_val,t.segment29)
5716          , decode(p_bal_seg_column,'SEGMENT30',p_bal_seg_val,t.segment30)
5717       FROM gl_code_combinations t
5718      WHERE t.code_combination_id = p_sus_ccid;
5719 
5720   CURSOR c_seg_number (p_seg_col_name VARCHAR2, p_coa_id INTEGER) IS
5721     SELECT      display_order
5722     FROM        (SELECT ROWNUM display_order, application_column_name
5723                  FROM ( SELECT application_column_name
5724                         FROM   FND_ID_FLEX_SEGMENTS_VL
5725                         WHERE  ID_FLEX_NUM    = p_coa_id
5726                         AND    ID_FLEX_CODE   = 'GL#'
5727                         AND    APPLICATION_ID = 101
5728                         order by decode(enabled_flag, 'Y', 1, 'N', 2), segment_num))
5729     WHERE       application_column_name = p_seg_col_name;
5730 
5731   l_bal                 c_bal%ROWTYPE;
5732   l_mgt_seg_val         VARCHAR2(30);
5733   l_ref3                VARCHAR2(30);
5734   l_seg_number          NUMBER;
5735   l_sus_ccid            INTEGER;
5736   l_seg                 FND_FLEX_EXT.SegmentArray;
5737   l_seg2                FND_FLEX_EXT.SegmentArray;
5738   l_coa_id              INTEGER;
5739   l_num_segs            INTEGER;
5740   l_result              INTEGER := 0;
5741   l_stmt                VARCHAR2(4000);
5742   l_log_module          VARCHAR2(240);
5743 BEGIN
5744   IF g_log_enabled THEN
5745     l_log_module := C_DEFAULT_MODULE||'.balance_by_bsv_and_ledger_curr';
5746   END IF;
5747 
5748   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
5749     trace(p_msg    => 'BEGIN of function balance_by_bsv_and_ledger_curr',
5750           p_module => l_log_module,
5751           p_level  => C_LEVEL_PROCEDURE);
5752     trace(p_msg    => 'p_ae_header_id = '||p_ae_header_id,
5753           p_module => l_log_module,
5754           p_level  => C_LEVEL_PROCEDURE);
5755   END IF;
5756 
5757   OPEN c_bal;
5758   FETCH c_bal INTO l_bal;
5759 
5760   IF (g_mgt_seg_column_name IS NULL) THEN
5761     l_mgt_seg_val := NULL;
5762   ELSIF (g_mgt_seg_column_name = g_bal_seg_column_name) THEN
5763     l_mgt_seg_val := l_bal.bal_seg_val;
5764   ELSE
5765     l_stmt := 'SELECT '||g_mgt_seg_column_name||'
5766                FROM   gl_code_combinations
5767                WHERE  code_combination_id = '||g_sla_ledger_cur_bal_sus_ccid;
5768 
5769     EXECUTE IMMEDIATE l_stmt INTO l_mgt_seg_val;
5770   END IF;
5771 
5772   IF (C_LEVEL_EVENT >= g_log_level) THEN
5773     trace(p_msg    => 'BEGIN LOOP -lance by BSV and ledger currency',
5774           p_module => l_log_module,
5775           p_level  => C_LEVEL_EVENT);
5776   END IF;
5777 
5778   WHILE (c_bal%FOUND) LOOP
5779     IF (C_LEVEL_EVENT >= g_log_level) THEN
5780       trace(p_msg    => 'LOOP balance by BSV and ledger currency: bal_seg_val = '||l_bal.bal_seg_val,
5781             p_module => l_log_module,
5782             p_level  => C_LEVEL_EVENT);
5783     END IF;
5784 
5785     OPEN c_sccid_segs(l_bal.bal_seg_val, g_sla_ledger_cur_bal_sus_ccid, g_bal_seg_column_name);
5786     FETCH c_sccid_segs INTO l_coa_id,
5787                             l_seg2(1), l_seg2(2), l_seg2(3), l_seg2(4), l_seg2(5),
5788                             l_seg2(6), l_seg2(7), l_seg2(8), l_seg2(9), l_seg2(10),
5789                             l_seg2(11), l_seg2(12), l_seg2(13), l_seg2(14), l_seg2(15),
5790                             l_seg2(16), l_seg2(17), l_seg2(18), l_seg2(19), l_seg2(20),
5791                             l_seg2(21), l_seg2(22), l_seg2(23), l_seg2(24), l_seg2(25),
5792                             l_seg2(26), l_seg2(27), l_seg2(28), l_seg2(29), l_seg2(30);
5793     CLOSE c_sccid_segs;
5794 
5795     l_stmt := 'SELECT code_combination_id, reference3 FROM gl_code_combinations '||
5796               'WHERE chart_of_accounts_id = :1 ';
5797     FOR i in 1 .. 30 LOOP
5798       IF l_seg2(i) IS NOT NULL THEN
5799         l_stmt := l_stmt || ' AND segment'||i||' = '''||l_seg2(i)||'''';
5800       ELSE
5801         l_stmt := l_stmt || ' AND segment'||i||' IS NULL ';
5802       END IF;
5803     END LOOP;
5804 
5805     BEGIN
5806       EXECUTE IMMEDIATE l_stmt
5807          INTO l_sus_ccid, l_ref3
5808         USING l_coa_id;
5809     EXCEPTION
5810       WHEN NO_DATA_FOUND THEN
5811         l_sus_ccid := NULL;
5812     END;
5813 
5814     IF (l_sus_ccid IS NULL) THEN
5815 
5816       IF (FND_FLEX_EXT.get_segments(
5817                         application_short_name       => 'SQLGL',
5818                         key_flex_code                => 'GL#',
5819                         structure_number             => g_ledger_coa_id,
5820                         combination_id               => g_sla_ledger_cur_bal_sus_ccid,
5821                         n_segments                   => l_num_segs,
5822                         segments                     => l_seg) = FALSE) THEN
5823         IF (C_LEVEL_ERROR >= g_log_level) THEN
5824           trace(p_msg    => 'XLA_INTERNAL_ERROR : Invalid balance by ledger currency suspense CCID',
5825                 p_module => l_log_module,
5826                 p_level  => C_LEVEL_ERROR);
5827           trace(p_msg    => 'Error: '||fnd_message.get,
5828                 p_module => l_log_module,
5829                 p_level  => C_LEVEL_ERROR);
5830         END IF;
5831         xla_accounting_err_pkg.build_message(
5832                  p_appli_s_name         => 'XLA'
5833                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
5834                 ,p_token_1              => 'MESSAGE'
5835                 ,p_value_1              => 'Invalid balance by ledger currency suspense CCID'
5836                 ,p_token_2              => 'LOCATION'
5837                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.balance_by_bsv_and_ledger_curr'
5838                 ,p_entity_id            => p_entity_id
5839                 ,p_event_id             => p_event_id
5840                 ,p_ledger_id            => g_ledger_id
5841                 ,p_ae_header_id         => p_ae_header_id
5842                 ,p_ae_line_num          => NULL
5843                 ,p_accounting_batch_id  => NULL);
5844         l_sus_ccid := -1;
5845         l_result := 1;
5846         l_ref3 := 'N';
5847       ELSE
5848         OPEN c_seg_number(g_bal_seg_column_name, g_ledger_coa_id);
5849         FETCH c_seg_number INTO l_seg_number;
5850         CLOSE c_seg_number;
5851 
5852         l_seg(l_seg_number) := l_bal.bal_seg_val;
5853         IF (FND_FLEX_EXT.get_combination_id(
5854                         application_short_name       => 'SQLGL',
5855                         key_flex_code                => 'GL#',
5856                         structure_number             => g_ledger_coa_id,
5857                         validation_date              => l_bal.accounting_date,
5858                         n_segments                   => l_num_segs,
5859                         segments                     => l_seg,
5860                         combination_id               => l_sus_ccid) = FALSE) THEN
5861           IF (C_LEVEL_ERROR >= g_log_level) THEN
5862             trace(p_msg    => 'XLA_INTERNAL_ERROR : Cannot get valid Code Combination ID',
5863                   p_module => l_log_module,
5864                   p_level  => C_LEVEL_ERROR);
5865             trace(p_msg    => 'Error: '||fnd_message.get,
5866                   p_module => l_log_module,
5867                   p_level  => C_LEVEL_ERROR);
5868             trace(p_msg    => 'accounting_date = '||l_bal.accounting_date,
5869                   p_module => l_log_module,
5870                   p_level  => C_LEVEL_ERROR);
5871             trace(p_msg    => 'num_segs = '||l_num_segs,
5872                   p_module => l_log_module,
5873                   p_level  => C_LEVEL_ERROR);
5874             FOR i IN 1..l_num_segs LOOP
5875               trace(p_msg    => 'seg('||i||') = '||l_seg(i),
5876                     p_module => l_log_module,
5877                     p_level  => C_LEVEL_ERROR);
5878             END LOOP;
5879           END IF;
5880 
5881           xla_accounting_err_pkg.build_message(
5882                  p_appli_s_name         => 'XLA'
5883                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
5884                 ,p_token_1              => 'MESSAGE'
5885                 ,p_value_1              => 'Cannot get valid Code Combination ID'
5886                 ,p_token_2              => 'LOCATION'
5887                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.balance_by_bsv_and_ledger_curr'
5888                 ,p_entity_id            => p_entity_id
5889                 ,p_event_id             => p_event_id
5890                 ,p_ledger_id            => g_ledger_id
5891                 ,p_ae_header_id         => p_ae_header_id
5892                 ,p_ae_line_num          => NULL
5893                 ,p_accounting_batch_id  => NULL);
5894           l_sus_ccid := -1;
5895           l_result := 1;
5896           l_ref3 := 'N';
5897         ELSE
5898           SELECT reference3 INTO l_ref3
5899             FROM gl_code_combinations
5900            WHERE code_combination_id = l_sus_ccid;
5901         END IF;
5902       END IF;
5903     END IF;
5904 
5905     IF (l_bal.accted_dr>l_bal.accted_cr) THEN
5906       l_bal.accted_cr := l_bal.accted_dr - l_bal.accted_cr;
5907       l_bal.accted_dr := NULL;
5908       l_bal.entered_cr := l_bal.entered_dr - l_bal.entered_cr;
5909       l_bal.entered_dr := NULL;
5910     ELSE
5911       l_bal.accted_dr := l_bal.accted_cr - l_bal.accted_dr;
5912       l_bal.accted_cr := NULL;
5913       l_bal.entered_dr := l_bal.entered_cr - l_bal.entered_dr;
5914       l_bal.entered_cr := NULL;
5915     END IF;
5916 
5917     INSERT INTO xla_validation_lines_gt
5918         (balancing_line_type
5919         ,ledger_id
5920         ,ae_header_id
5921         ,ae_line_num
5922         ,displayed_line_number
5923         ,max_ae_line_num
5924         ,max_displayed_line_number
5925         ,event_id
5926         ,entity_id
5927         ,accounting_date
5928         ,entered_currency_code
5929         ,entered_cr
5930         ,entered_dr
5931 	,unrounded_entered_cr
5932 	,unrounded_entered_dr
5933         ,accounted_cr
5934         ,accounted_dr
5935 	,unrounded_accounted_cr
5936 	,unrounded_accounted_dr
5937         ,code_combination_id
5938         ,mgt_seg_value
5939         ,bal_seg_value
5940         ,control_account_enabled_flag
5941         ,party_type_code
5942         ,party_id
5943         ,party_site_id)
5944         VALUES
5945         (C_LINE_TYPE_LC_BALANCING
5946         ,g_ledger_id
5947         ,p_ae_header_id
5948         ,l_bal.max_ae_line_num
5949         ,l_bal.max_disp_line_num
5950         ,l_bal.max_ae_line_num
5951         ,l_bal.max_disp_line_num
5952         ,p_event_id
5953         ,p_entity_id
5954         ,l_bal.accounting_date
5955         ,l_bal.currency_code
5956         ,l_bal.entered_cr
5957         ,l_bal.entered_dr
5958         ,l_bal.entered_cr
5959         ,l_bal.entered_dr
5960         ,l_bal.accted_cr
5961         ,l_bal.accted_dr
5962         ,l_bal.accted_cr
5963         ,l_bal.accted_dr
5964         ,l_sus_ccid
5965         ,l_mgt_seg_val
5966         ,l_bal.bal_seg_val
5967         ,l_ref3
5968         ,l_bal.party_type_code
5969         ,l_bal.party_id
5970         ,l_bal.party_site_id );
5971 
5972     g_new_line_count := g_new_line_count + 1;
5973 
5974     FETCH c_bal INTO l_bal;
5975   END LOOP;
5976 
5977   IF (C_LEVEL_EVENT >= g_log_level) THEN
5978     trace(p_msg    => 'END LOOP - balance by BSV and ledger currency',
5979           p_module => l_log_module,
5980           p_level  => C_LEVEL_EVENT);
5981   END IF;
5982   CLOSE c_bal;
5983 
5984   IF (l_result > 0) THEN
5985     g_err_count := g_err_count + 1;
5986     g_err_hdr_ids(g_err_count) := p_ae_header_id;
5987     g_err_event_ids(g_err_count) := p_event_id;
5988   END IF;
5989 
5990   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
5991     trace(p_msg    => 'End of function balance_by_bsv_and_ledger_curr',
5992           p_module => l_log_module,
5993           p_level  => C_LEVEL_PROCEDURE);
5994   END IF;
5995 EXCEPTION
5996 WHEN xla_exceptions_pkg.application_exception THEN
5997   IF (c_bal%ISOPEN) THEN
5998     CLOSE c_bal;
5999   END IF;
6000   IF (c_seg_number%ISOPEN) THEN
6001     CLOSE c_seg_number;
6002   END IF;
6003   IF (c_sccid_segs%ISOPEN) THEN
6004     CLOSE c_sccid_segs;
6005   END IF;
6006   RAISE;
6007 
6008 WHEN OTHERS THEN
6009   IF (c_bal%ISOPEN) THEN
6010     CLOSE c_bal;
6011   END IF;
6012   IF (c_seg_number%ISOPEN) THEN
6013     CLOSE c_seg_number;
6014   END IF;
6015   IF (c_sccid_segs%ISOPEN) THEN
6016     CLOSE c_sccid_segs;
6017   END IF;
6018   xla_exceptions_pkg.raise_message
6019       (p_location => 'xla_je_validation_pkg.balance_by_bsv_and_ledger_curr');
6020 END;
6021 
6022 --=============================================================================
6023 --
6024 -- Name: balance_single_entered_curr
6025 -- Description: This function checks if the journal entries that have only one
6026 --              entered currency are balanced by entered currency.  If the
6027 --              journal entry is not balanced, the entry is marked as error
6028 --
6029 --=============================================================================
6030 PROCEDURE balance_single_entered_curr
6031 is
6032 
6033   CURSOR c_bal(p_rounding_offset NUMBER) is
6034     SELECT ae_header_id
6035            ,entity_id
6036            ,event_id
6037       FROM xla_validation_lines_gt
6038      WHERE balance_type_code = 'A' --  <> 'B'   -- 4458381
6039        AND entered_currency_code <> 'STAT'
6040        AND balancing_line_type = C_LINE_TYPE_PROCESS
6041      GROUP BY ae_header_id, entity_id , event_id
6042      HAVING ROUND(nvl(sum(unrounded_entered_dr/entered_currency_mau), 0)+p_rounding_offset) <>
6043                ROUND(nvl(sum(unrounded_entered_cr/entered_currency_mau), 0)+p_rounding_offset)
6044        AND count(distinct entered_currency_code) = 1;
6045   l_comp_hdr_ids        t_array_int;
6046   l_comp_count          INTEGER := 0;
6047   l_log_module          VARCHAR2(240);
6048   l_rounding_offset     NUMBER;
6049   l_rounding_rule_code  VARCHAR2(30);
6050 BEGIN
6051 
6052   IF g_log_enabled THEN
6053     l_log_module := C_DEFAULT_MODULE||'.balance_single_entered_curr';
6054   END IF;
6055 
6056   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6057     trace(p_msg    => 'BEGIN of function balance_single_entered_curr',
6058           p_module => l_log_module,
6059           p_level  => C_LEVEL_PROCEDURE);
6060   END IF;
6061 
6062   IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
6063     l_rounding_rule_code :=xla_accounting_cache_pkg.GetValueChar(
6064                            p_source_code        => 'XLA_ROUNDING_RULE_CODE'
6065                          , p_target_ledger_id   => g_ledger_id
6066                          );
6067   ELSE
6068     SELECT xlo.rounding_rule_code
6069     INTO   l_rounding_rule_code
6070     FROM   xla_ledger_options     xlo
6071     WHERE xlo.application_id = g_application_id
6072       AND xlo.ledger_id = g_trx_ledger_id;
6073   END IF;
6074 
6075   IF l_rounding_rule_code = 'NEAREST' THEN
6076     l_rounding_offset := 0;
6077   ELSIF l_rounding_rule_code = 'UP' THEN
6078     l_rounding_offset := .5-power(10, -30);
6079   ELSIF l_rounding_rule_code = 'DOWN' THEN
6080     l_rounding_offset := -(.5-power(10, -30));
6081   ELSE
6082     l_rounding_offset := 0;
6083   END IF;
6084 
6085   FOR l_bal IN c_bal(l_rounding_offset) LOOP
6086 
6087     IF (C_LEVEL_EVENT >= g_log_level) THEN
6088       trace(p_msg    => 'LOOP - check error for single entered currency: ae_header_id = '||l_bal.ae_header_id,
6089             p_module => l_log_module,
6090             p_level  => C_LEVEL_EVENT);
6091     END IF;
6092 
6093     xla_accounting_err_pkg.build_message(
6094                  p_appli_s_name         => 'XLA'
6095                 ,p_msg_name             => 'XLA_AP_UNBAL_ENTED_AMT'
6096                 ,p_entity_id            => l_bal.entity_id
6097                 ,p_event_id             => l_bal.event_id
6098                 ,p_ledger_id            => g_ledger_id
6099                 ,p_ae_header_id         => l_bal.ae_header_id
6100                 ,p_ae_line_num          => NULL
6101                 ,p_accounting_batch_id  => NULL);
6102     g_err_count := g_err_count + 1;
6103     g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
6104     g_err_event_ids(g_err_count) := l_bal.event_id;
6105 
6106     l_comp_count := l_comp_count + 1;
6107     l_comp_hdr_ids(l_comp_count) := l_bal.ae_header_id;
6108 
6109   END LOOP;
6110 
6111   IF (C_LEVEL_EVENT >= g_log_level) THEN
6112     trace(p_msg    => 'END LOOP - check error for single entered currency',
6113           p_module => l_log_module,
6114           p_level  => C_LEVEL_EVENT);
6115   END IF;
6116 
6117   IF (l_comp_count>0) THEN
6118     FORALL j in 1..l_comp_count
6119         UPDATE  xla_validation_lines_gt
6120            SET  balancing_line_type = C_LINE_TYPE_COMPLETE
6121          WHERE  ae_header_id = l_comp_hdr_ids(j)
6122            AND  balancing_line_type = C_LINE_TYPE_PROCESS;
6123   END IF;
6124 
6125   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6126     trace(p_msg    => 'End of function balance_single_entered_curr',
6127           p_module => l_log_module,
6128           p_level  => C_LEVEL_PROCEDURE);
6129   END IF;
6130 EXCEPTION
6131 WHEN xla_exceptions_pkg.application_exception THEN
6132   IF (c_bal%ISOPEN) THEN
6133     CLOSE c_bal;
6134   END IF;
6135   RAISE;
6136 
6137 WHEN OTHERS THEN
6138   IF (c_bal%ISOPEN) THEN
6139     CLOSE c_bal;
6140   END IF;
6141   xla_exceptions_pkg.raise_message
6142       (p_location => 'xla_je_validation_pkg.balance_single_entered_curr');
6143 
6144 END balance_single_entered_curr;
6145 
6146 
6147 
6148 --=============================================================================
6149 --
6150 -- Name: balance_by_ledger_currency
6151 -- Description: This function checks if the journal entries are balanced by
6152 --              ledger currency.  If the journal entry is not balanced by
6153 --              ledger currency and the 'balance by ledger currency option'
6154 --              is 'N', error will be returned.  However, if the balance option
6155 --              is 'Y', new lines will be created to balance the journal entry
6156 --              by balancing segment and ledger currency.
6157 --
6158 --=============================================================================
6159 PROCEDURE balance_by_ledger_currency
6160 IS
6161   CURSOR c_bal(p_mau                   NUMBER
6162               ,p_rounding_offset       NUMBER) IS
6163     SELECT  ae_header_id
6164            ,entity_id
6165            ,event_id
6166     FROM    xla_validation_lines_gt
6167     WHERE   balance_type_code = 'A'
6168     AND     entered_currency_code <> 'STAT'
6169     AND     balancing_line_type = C_LINE_TYPE_PROCESS
6170     GROUP BY ae_header_id, entity_id, event_id
6171     HAVING   sum(nvl(accounted_dr,0)) <> sum(nvl(accounted_cr,0))
6172        AND   ROUND( NVL(SUM(unrounded_accounted_dr),0) /p_mau+p_rounding_offset)
6173                <> ROUND( NVL(SUM(unrounded_accounted_cr),0) /p_mau+p_rounding_offset);
6174 
6175   l_bal_seg_column      VARCHAR2(30);
6176   l_mgt_seg_column      VARCHAR2(30);
6177   l_max_ae_line_num     INTEGER;
6178   l_max_disp_line_num   INTEGER;
6179 
6180   CURSOR c_aad (p_ae_header_id INTEGER) IS
6181     SELECT  pr.name, lk.meaning, ec.name, et.name
6182     FROM    xla_product_rules_tl    pr
6183             ,xla_event_classes_tl   ec
6184             ,xla_event_types_tl     et
6185             ,xla_lookups            lk
6186             ,xla_ae_headers         h
6187     WHERE   lk.lookup_code            = h.product_rule_type_code
6188       AND   lk.lookup_type            = 'XLA_OWNER_TYPE'
6189       AND   pr.amb_context_code       = g_amb_context_code
6190       AND   pr.application_id         = g_application_id
6191       AND   pr.product_rule_type_code = h.product_rule_type_code
6192       AND   pr.product_rule_code      = h.product_rule_code
6193       AND   pr.language               = USERENV('LANG')
6194       AND   ec.application_id         = et.application_id
6195       AND   ec.event_class_code       = et.event_class_code
6196       AND   ec.language               = USERENV('LANG')
6197       AND   et.application_id         = h.application_id
6198       AND   et.event_type_code        = h.event_type_code
6199       AND   et.language               = USERENV('LANG')
6200       AND   h.ae_header_id            = p_ae_header_id
6201       AND   h.application_id          = g_application_id;
6202 
6203   l_prod_rule_name      VARCHAR2(80);
6204   l_owner               VARCHAR2(80);
6205   l_event_class_name    VARCHAR2(80);
6206   l_event_type_name     VARCHAR2(80);
6207 
6208   l_comp_hdr_ids        t_array_int;
6209   l_comp_count          INTEGER := 0;
6210   j                     INTEGER;
6211 
6212   l_mau                 NUMBER;
6213   l_rounding_offset     NUMBER;
6214   l_rounding_rule_code  VARCHAR2(30);
6215 
6216   l_log_module          VARCHAR2(240);
6217 BEGIN
6218 
6219   IF g_log_enabled THEN
6220     l_log_module := C_DEFAULT_MODULE||'.balance_by_ledger_currency';
6221   END IF;
6222 
6223   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6224     trace(p_msg    => 'BEGIN of function balance_by_ledger_currency',
6225           p_module => l_log_module,
6226           p_level  => C_LEVEL_PROCEDURE);
6227   END IF;
6228 
6229   IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
6230     l_mau:= xla_accounting_cache_pkg.GetValueNum(
6231                            p_source_code        => 'XLA_CURRENCY_MAU'
6232                          , p_target_ledger_id   => g_ledger_id);
6233 
6234     l_rounding_rule_code :=xla_accounting_cache_pkg.GetValueChar(
6235                            p_source_code        => 'XLA_ROUNDING_RULE_CODE'
6236                          , p_target_ledger_id   => g_ledger_id
6237                          );
6238   ELSE
6239     SELECT nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
6240           ,xlo.rounding_rule_code
6241     INTO   l_mau, l_rounding_rule_code
6242     FROM   xla_ledger_options     xlo
6243           ,gl_ledgers             gl
6244           ,fnd_currencies         fcu
6245     WHERE xlo.application_id = g_application_id
6246       AND xlo.ledger_id = g_trx_ledger_id
6247       AND gl.ledger_id = g_ledger_id
6248       AND fcu.currency_code = gl.currency_code;
6249   END IF;
6250 
6251   IF l_rounding_rule_code = 'NEAREST' THEN
6252     l_rounding_offset := 0;
6253   ELSIF l_rounding_rule_code = 'UP' THEN
6254     l_rounding_offset := .5-power(10, -30);
6255   ELSIF l_rounding_rule_code = 'DOWN' THEN
6256     l_rounding_offset := -(.5-power(10, -30));
6257   ELSE
6258     l_rounding_offset := 0;
6259   END IF;
6260 
6261   IF (C_LEVEL_EVENT >= g_log_level) THEN
6262     trace(p_msg    => 'l_mau = '||l_mau,
6263           p_module => l_log_module,
6264           p_level  => C_LEVEL_EVENT);
6265     trace(p_msg    => 'l_rounding_offset = '||l_rounding_offset,
6266           p_module => l_log_module,
6267           p_level  => C_LEVEL_EVENT);
6268     trace(p_msg    => 'g_sla_bal_by_ledger_curr_flag = '||g_sla_bal_by_ledger_curr_flag,
6269           p_module => l_log_module,
6270           p_level  => C_LEVEL_EVENT);
6271     trace(p_msg    => 'BEGIN LOOP - balance by ledger currency',
6272           p_module => l_log_module,
6273           p_level  => C_LEVEL_EVENT);
6274   END IF;
6275 
6276   FOR l_bal IN c_bal(l_mau,l_rounding_offset) LOOP
6277 
6278     IF (C_LEVEL_EVENT >= g_log_level) THEN
6279       trace(p_msg    => 'LOOP - balance by ledger currency: ae_header_id = '||l_bal.ae_header_id,
6280             p_module => l_log_module,
6281             p_level  => C_LEVEL_EVENT);
6282     END IF;
6283 
6284     IF (g_sla_bal_by_ledger_curr_flag = 'N') THEN
6285       IF (g_caller = C_CALLER_MANUAL) THEN
6286         xla_accounting_err_pkg.build_message(
6287                  p_appli_s_name         => 'XLA'
6288                 ,p_msg_name             => 'XLA_MJE_UNBAL_BASE_AMT'
6289                 ,p_entity_id            => l_bal.entity_id
6290                 ,p_event_id             => l_bal.event_id
6291                 ,p_ledger_id            => g_ledger_id
6292                 ,p_ae_header_id         => l_bal.ae_header_id
6293                 ,p_ae_line_num          => NULL
6294                 ,p_accounting_batch_id  => NULL);
6295       ELSE
6296         OPEN c_aad (l_bal.ae_header_id);
6297         FETCH c_aad INTO l_prod_rule_name, l_owner, l_event_class_name, l_event_type_name;
6298         CLOSE c_aad;
6299 
6300         xla_accounting_err_pkg.build_message(
6301                  p_appli_s_name         => 'XLA'
6302                 ,p_msg_name             => 'XLA_AP_UNBAL_BASE_AMT'
6303                 ,p_token_1              => 'PROD_RULE_NAME'
6304                 ,p_value_1              => l_prod_rule_name
6305                 ,p_token_2              => 'OWNER'
6306                 ,p_value_2              => l_owner
6307                 ,p_token_3              => 'EVENT_CLASS_NAME'
6308                 ,p_value_3              => l_event_class_name
6309                 ,p_token_4              => 'EVENT_TYPE_NAME'
6310                 ,p_value_4              => l_event_type_name
6311                 ,p_entity_id            => l_bal.entity_id
6312                 ,p_event_id             => l_bal.event_id
6313                 ,p_ledger_id            => g_ledger_id
6314                 ,p_ae_header_id         => l_bal.ae_header_id
6315                 ,p_ae_line_num          => NULL
6316                 ,p_accounting_batch_id  => NULL);
6317       END IF;
6318       g_err_count := g_err_count + 1;
6319       g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
6320       g_err_event_ids(g_err_count) := l_bal.event_id;
6321     ELSE
6322       balance_by_bsv_and_ledger_curr(l_bal.event_id,
6323                                      l_bal.entity_id,
6324                                      l_bal.ae_header_id);
6325     END IF;
6326 
6327     l_comp_count := l_comp_count + 1;
6328     l_comp_hdr_ids(l_comp_count) := l_bal.ae_header_id;
6329 
6330   END LOOP;
6331 
6332   IF (C_LEVEL_EVENT >= g_log_level) THEN
6333     trace(p_msg    => 'END LOOP - balance by ledger currency',
6334           p_module => l_log_module,
6335           p_level  => C_LEVEL_EVENT);
6336   END IF;
6337 
6338   IF (l_comp_count>0) THEN
6339     FORALL j in 1..l_comp_count
6340         UPDATE  xla_validation_lines_gt
6341            SET  balancing_line_type = C_LINE_TYPE_COMPLETE
6342          WHERE  ae_header_id = l_comp_hdr_ids(j)
6343            AND  balancing_line_type = C_LINE_TYPE_PROCESS;
6344   END IF;
6345 
6346   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6347     trace(p_msg    => 'End of function balance_by_ledger_curr',
6348           p_module => l_log_module,
6349           p_level  => C_LEVEL_PROCEDURE);
6350   END IF;
6351 EXCEPTION
6352 WHEN xla_exceptions_pkg.application_exception THEN
6353   IF (c_bal%ISOPEN) THEN
6354     CLOSE c_bal;
6355   END IF;
6356   RAISE;
6357 
6358 WHEN OTHERS THEN
6359   IF (c_bal%ISOPEN) THEN
6360     CLOSE c_bal;
6361   END IF;
6362   xla_exceptions_pkg.raise_message
6363       (p_location => 'xla_je_validation_pkg.balance_by_ledger_currency');
6364 END;
6365 
6366 
6367 --=============================================================================
6368 --
6369 -- Name: balance_by_journal_rounding
6370 -- Description: Journal rounding  pre segment, entered currency
6371 --
6372 --=============================================================================
6373 PROCEDURE balance_by_journal_rounding
6374 IS
6375   CURSOR c_bal IS
6376     SELECT bal_seg_value               bal_seg_val
6377           ,entered_currency_code       entered_currency_code
6378           ,nvl(sum(entered_dr), 0)     entered_dr
6379           ,nvl(sum(entered_cr), 0)     entered_cr
6380           ,nvl(sum(accounted_dr), 0)     accted_dr
6381           ,nvl(sum(accounted_cr), 0)     accted_cr
6382           ,ae_header_id                ae_header_id
6383           ,encumbrance_type_id        -- added for 9030331
6384           ,max_ae_line_num                max_ae_line_num
6385           ,max_displayed_line_number      max_disp_line_num
6386           ,accounting_date                accounting_date
6387           ,entity_id
6388           ,event_id
6389     FROM   XLA_VALIDATION_LINES_GT
6390     WHERE balancing_line_type in (C_LINE_TYPE_PROCESS
6391                                  ,C_LINE_TYPE_IC_BAL_INTER
6392                                  ,C_LINE_TYPE_IC_BAL_INTRA
6393                                  ,C_LINE_TYPE_XLA_BALANCING
6394                                  ,C_LINE_TYPE_ENC_BALANCING) -- 4458381
6395       AND balance_type_code <> 'B'
6396       AND entered_currency_code <> 'STAT'
6397     GROUP BY bal_seg_value
6398             ,encumbrance_type_id        -- added for 9030331
6399             ,entered_currency_code
6400             ,max_ae_line_num
6401             ,max_displayed_line_number
6402             ,ae_header_id
6403             ,entity_id
6404             ,event_id
6405             ,accounting_date
6406     HAVING nvl(sum(accounted_dr), 0) <> nvl(sum(accounted_cr), 0)
6407            or nvl(sum(entered_dr), 0) <> nvl(sum(entered_cr), 0);
6408 
6409   -- 4917607 - performance changes
6410   CURSOR c_rccid_segs (p_bal_seg_val VARCHAR2, p_rounding_ccid INTEGER, p_bal_seg_column VARCHAR2) IS
6411     SELECT chart_of_accounts_id
6412          , decode(p_bal_seg_column,'SEGMENT1',p_bal_seg_val,t.segment1)
6413          , decode(p_bal_seg_column,'SEGMENT2',p_bal_seg_val,t.segment2)
6414          , decode(p_bal_seg_column,'SEGMENT3',p_bal_seg_val,t.segment3)
6415          , decode(p_bal_seg_column,'SEGMENT4',p_bal_seg_val,t.segment4)
6416          , decode(p_bal_seg_column,'SEGMENT5',p_bal_seg_val,t.segment5)
6417          , decode(p_bal_seg_column,'SEGMENT6',p_bal_seg_val,t.segment6)
6418          , decode(p_bal_seg_column,'SEGMENT7',p_bal_seg_val,t.segment7)
6419          , decode(p_bal_seg_column,'SEGMENT8',p_bal_seg_val,t.segment8)
6420          , decode(p_bal_seg_column,'SEGMENT9',p_bal_seg_val,t.segment9)
6421          , decode(p_bal_seg_column,'SEGMENT10',p_bal_seg_val,t.segment10)
6422          , decode(p_bal_seg_column,'SEGMENT11',p_bal_seg_val,t.segment11)
6423          , decode(p_bal_seg_column,'SEGMENT12',p_bal_seg_val,t.segment12)
6424          , decode(p_bal_seg_column,'SEGMENT13',p_bal_seg_val,t.segment13)
6425          , decode(p_bal_seg_column,'SEGMENT14',p_bal_seg_val,t.segment14)
6426          , decode(p_bal_seg_column,'SEGMENT15',p_bal_seg_val,t.segment15)
6427          , decode(p_bal_seg_column,'SEGMENT16',p_bal_seg_val,t.segment16)
6428          , decode(p_bal_seg_column,'SEGMENT17',p_bal_seg_val,t.segment17)
6429          , decode(p_bal_seg_column,'SEGMENT18',p_bal_seg_val,t.segment18)
6430          , decode(p_bal_seg_column,'SEGMENT19',p_bal_seg_val,t.segment19)
6431          , decode(p_bal_seg_column,'SEGMENT20',p_bal_seg_val,t.segment20)
6432          , decode(p_bal_seg_column,'SEGMENT21',p_bal_seg_val,t.segment21)
6433          , decode(p_bal_seg_column,'SEGMENT22',p_bal_seg_val,t.segment22)
6434          , decode(p_bal_seg_column,'SEGMENT23',p_bal_seg_val,t.segment23)
6435          , decode(p_bal_seg_column,'SEGMENT24',p_bal_seg_val,t.segment24)
6436          , decode(p_bal_seg_column,'SEGMENT25',p_bal_seg_val,t.segment25)
6437          , decode(p_bal_seg_column,'SEGMENT26',p_bal_seg_val,t.segment26)
6438          , decode(p_bal_seg_column,'SEGMENT27',p_bal_seg_val,t.segment27)
6439          , decode(p_bal_seg_column,'SEGMENT28',p_bal_seg_val,t.segment28)
6440          , decode(p_bal_seg_column,'SEGMENT29',p_bal_seg_val,t.segment29)
6441          , decode(p_bal_seg_column,'SEGMENT30',p_bal_seg_val,t.segment30)
6442       FROM gl_code_combinations t
6443      WHERE t.code_combination_id = p_rounding_ccid;
6444 
6445   CURSOR c_seg_number (p_seg_col_name VARCHAR2, p_coa_id INTEGER) IS
6446     SELECT      display_order
6447     FROM        (SELECT ROWNUM display_order, application_column_name
6448                  FROM ( SELECT application_column_name
6449                         FROM   FND_ID_FLEX_SEGMENTS_VL
6450                         WHERE  ID_FLEX_NUM    = p_coa_id
6451                         AND    ID_FLEX_CODE   = 'GL#'
6452                         AND    APPLICATION_ID = 101
6453                         order by decode(enabled_flag, 'Y', 1, 'N', 2), segment_num))
6454     WHERE       application_column_name = p_seg_col_name;
6455 
6456   l_bal                 c_bal%ROWTYPE;
6457   l_ref3                VARCHAR2(30);
6458   l_mgt_seg_val         VARCHAR2(30);
6459   l_seg_number          NUMBER;
6460   l_seg                 FND_FLEX_EXT.SegmentArray;
6461   l_seg2                FND_FLEX_EXT.SegmentArray;
6462   l_num_segs            INTEGER;
6463   l_coa_id              INTEGER;
6464   l_stmt                VARCHAR2(4000);
6465   l_entered_cr          NUMBER;
6466   l_entered_dr          NUMBER;
6467 
6468   l_rounding_ccid       INTEGER;
6469   l_account             VARCHAR2(1000);
6470   l_log_module          VARCHAR2(240);
6471 
6472 BEGIN
6473 
6474   IF g_log_enabled THEN
6475     l_log_module := C_DEFAULT_MODULE||'.balance_by_journal_rounding';
6476   END IF;
6477 
6478   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6479     trace(p_msg    => 'BEGIN of function balance_by_journal_rounding',
6480           p_module => l_log_module,
6481           p_level  => C_LEVEL_PROCEDURE);
6482   END IF;
6483 
6484 
6485   -- to prevent unbalanced data from entering GL
6486 
6487   IF (g_sla_rounding_ccid is NULL) AND (g_suspense_allowed_flag = 'Y') THEN
6488     IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6489       trace(p_msg    => 'rounding_account not exist, suspense enabled. end of function balance_by_journal_rounding',
6490           p_module => l_log_module,
6491           p_level  => C_LEVEL_PROCEDURE);
6492     END IF;
6493     RETURN;
6494   END IF;
6495 
6496 
6497   IF (g_sla_rounding_ccid is NULL) AND (g_suspense_allowed_flag = 'N') THEN
6498 
6499 	FOR l_bal_rec IN c_bal LOOP
6500 
6501 		 xla_accounting_err_pkg.build_message(
6502                     p_appli_s_name              => 'XLA'
6503                     ,p_msg_name                 => 'XLA_NO_RND_NO_SUSP'
6504                     ,p_entity_id                => l_bal_rec.entity_id
6505                     ,p_event_id                 => l_bal_rec.event_id
6506                     ,p_ledger_id                => g_ledger_id
6507                     ,p_ae_header_id             => l_bal_rec.ae_header_id
6508                     ,p_ae_line_num              => NULL
6509                     ,p_accounting_batch_id      => NULL);
6510 
6511 		g_err_count := g_err_count + 1;
6512 		g_err_hdr_ids(g_err_count) := l_bal_rec.ae_header_id;
6513 		g_err_event_ids(g_err_count) := l_bal_rec.event_id;
6514 
6515 	END LOOP;
6516 
6517     RETURN;
6518  END IF;
6519 
6520 
6521 
6522 
6523   OPEN c_bal;
6524   FETCH c_bal INTO l_bal;
6525 
6526   IF (g_mgt_seg_column_name IS NULL) THEN
6527     l_mgt_seg_val := NULL;
6528   ELSIF (g_mgt_seg_column_name = g_bal_seg_column_name) THEN
6529     l_mgt_seg_val := l_bal.bal_seg_val;
6530   ELSE
6531     l_stmt := 'SELECT '||g_mgt_seg_column_name||'
6532                FROM   gl_code_combinations
6533                WHERE  code_combination_id = '||g_sla_rounding_ccid;
6534 
6535     EXECUTE IMMEDIATE l_stmt INTO l_mgt_seg_val;
6536   END IF;
6537 
6538   IF (C_LEVEL_EVENT >= g_log_level) THEN
6539     trace(p_msg    => 'BEGIN LOOP - balance by journal rounding',
6540           p_module => l_log_module,
6541           p_level  => C_LEVEL_EVENT);
6542   END IF;
6543 
6544   WHILE (c_bal%FOUND) LOOP
6545     IF (C_LEVEL_EVENT >= g_log_level) THEN
6546       trace(p_msg    => 'LOOP balance by journal rounding',
6547             p_module => l_log_module,
6548             p_level  => C_LEVEL_EVENT);
6549     END IF;
6550 
6551     OPEN c_rccid_segs(l_bal.bal_seg_val, g_sla_rounding_ccid, g_bal_seg_column_name);
6552     FETCH c_rccid_segs INTO l_coa_id,
6553                             l_seg2(1), l_seg2(2), l_seg2(3), l_seg2(4), l_seg2(5),
6554                             l_seg2(6), l_seg2(7), l_seg2(8), l_seg2(9), l_seg2(10),
6555                             l_seg2(11), l_seg2(12), l_seg2(13), l_seg2(14), l_seg2(15),
6556                             l_seg2(16), l_seg2(17), l_seg2(18), l_seg2(19), l_seg2(20),
6557                             l_seg2(21), l_seg2(22), l_seg2(23), l_seg2(24), l_seg2(25),
6558                             l_seg2(26), l_seg2(27), l_seg2(28), l_seg2(29), l_seg2(30);
6559     CLOSE c_rccid_segs;
6560 
6561     l_stmt := 'SELECT code_combination_id, reference3 FROM gl_code_combinations '||
6562               'WHERE chart_of_accounts_id = :1 ';
6563     FOR i in 1 .. 30 LOOP
6564       IF l_seg2(i) IS NOT NULL THEN
6565         l_stmt := l_stmt || ' AND segment'||i||' = '''||l_seg2(i)||'''';
6566       ELSE
6567         l_stmt := l_stmt || ' AND segment'||i||' IS NULL ';
6568       END IF;
6569     END LOOP;
6570 
6571     BEGIN
6572       EXECUTE IMMEDIATE l_stmt
6573          INTO l_rounding_ccid, l_ref3
6574         USING l_coa_id;
6575     EXCEPTION
6576       WHEN NO_DATA_FOUND THEN
6577         l_rounding_ccid := NULL;
6578     END;
6579 
6580     IF (C_LEVEL_EVENT >= g_log_level) THEN
6581       trace(p_msg    => 'l_rounding_ccid = '||l_rounding_ccid,
6582             p_module => l_log_module,
6583             p_level  => C_LEVEL_EVENT);
6584     END IF;
6585 
6586     IF (l_rounding_ccid IS NULL) THEN
6587 
6588       IF (FND_FLEX_EXT.get_segments(
6589                         application_short_name       => 'SQLGL',
6590                         key_flex_code                => 'GL#',
6591                         structure_number             => g_ledger_coa_id,
6592                         combination_id               => g_sla_rounding_ccid,
6593                         n_segments                   => l_num_segs,
6594                         segments                     => l_seg) = FALSE) THEN
6595         IF (C_LEVEL_ERROR >= g_log_level) THEN
6596           trace(p_msg    => 'XLA_INTERNAL_ERROR : Invalid rounding CCID',
6597                 p_module => l_log_module,
6598                 p_level  => C_LEVEL_ERROR);
6599           trace(p_msg    => 'Error: '||fnd_message.get,
6600                 p_module => l_log_module,
6601                 p_level  => C_LEVEL_ERROR);
6602         END IF;
6603         xla_accounting_err_pkg.build_message(
6604                  p_appli_s_name         => 'XLA'
6605                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
6606                 ,p_token_1              => 'MESSAGE'
6607                 ,p_value_1              => 'Invalid rounding CCID'
6608                 ,p_token_2              => 'LOCATION'
6609                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.balance_by_journal_rounding'
6610                 ,p_entity_id            => l_bal.entity_id
6611                 ,p_event_id             => l_bal.event_id
6612                 ,p_ledger_id            => g_ledger_id
6613                 ,p_ae_header_id         => l_bal.ae_header_id
6614                 ,p_ae_line_num          => NULL
6615                 ,p_accounting_batch_id  => NULL);
6616         l_rounding_ccid := -1;
6617         g_err_count := g_err_count + 1;
6618         g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
6619         g_err_event_ids(g_err_count) := l_bal.event_id;
6620       ELSE
6621         OPEN c_seg_number(g_bal_seg_column_name, g_ledger_coa_id);
6622         FETCH c_seg_number INTO l_seg_number;
6623         CLOSE c_seg_number;
6624 
6625         l_seg(l_seg_number) := l_bal.bal_seg_val;
6626         IF (FND_FLEX_EXT.get_combination_id(
6627                         application_short_name       => 'SQLGL',
6628                         key_flex_code                => 'GL#',
6629                         structure_number             => g_ledger_coa_id,
6630                         validation_date              => l_bal.accounting_date,
6631                         n_segments                   => l_num_segs,
6632                         segments                     => l_seg,
6633                         combination_id               => l_rounding_ccid) = FALSE) THEN
6634           IF (C_LEVEL_ERROR >= g_log_level) THEN
6635             trace(p_msg    => 'XLA_INTERNAL_ERROR : Cannot get valid Code Combination ID',
6636                   p_module => l_log_module,
6637                   p_level  => C_LEVEL_ERROR);
6638             trace(p_msg    => 'Error: '||fnd_message.get,
6639                   p_module => l_log_module,
6640                   p_level  => C_LEVEL_ERROR);
6641             trace(p_msg    => 'accounting_date = '||l_bal.accounting_date,
6642                   p_module => l_log_module,
6643                   p_level  => C_LEVEL_ERROR);
6644             trace(p_msg    => 'num_segs = '||l_num_segs,
6645                   p_module => l_log_module,
6646                   p_level  => C_LEVEL_ERROR);
6647             FOR i IN 1..l_num_segs LOOP
6648               trace(p_msg    => 'seg('||i||') = '||l_seg(i),
6649                     p_module => l_log_module,
6650                     p_level  => C_LEVEL_ERROR);
6651             END LOOP;
6652           END IF;
6653 
6654           xla_accounting_err_pkg.build_message(
6655                  p_appli_s_name         => 'XLA'
6656                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
6657                 ,p_token_1              => 'MESSAGE'
6658                 ,p_value_1              => 'Cannot get valid Code Combination ID'
6659                 ,p_token_2              => 'LOCATION'
6660                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.balance_by_journal_rounding'
6661                 ,p_entity_id            => l_bal.entity_id
6662                 ,p_event_id             => l_bal.event_id
6663                 ,p_ledger_id            => g_ledger_id
6664                 ,p_ae_header_id         => l_bal.ae_header_id
6665                 ,p_ae_line_num          => NULL
6666                 ,p_accounting_batch_id  => NULL);
6667           l_rounding_ccid := -1;
6668           g_err_count := g_err_count + 1;
6669           g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
6670           g_err_event_ids(g_err_count) := l_bal.event_id;
6671         ELSE
6672           SELECT reference3
6673             INTO l_ref3
6674             FROM gl_code_combinations
6675            WHERE code_combination_id = l_rounding_ccid;
6676         END IF;
6677       END IF;
6678     END IF;
6679 
6680     IF (l_bal.accted_dr>l_bal.accted_cr) THEN
6681       l_bal.accted_cr := l_bal.accted_dr - l_bal.accted_cr;
6682       l_bal.accted_dr := NULL;
6683 
6684       IF(l_bal.entered_currency_code = g_ledger_currency_code) THEN
6685         l_bal.entered_cr    := l_bal.accted_cr;
6686       ELSE
6687         l_bal.entered_cr    := l_bal.entered_dr - l_bal.entered_cr;
6688       END IF;
6689       l_bal.entered_dr    := NULL;
6690     ELSIF (l_bal.accted_dr<l_bal.accted_cr) THEN
6691       l_bal.accted_dr := l_bal.accted_cr - l_bal.accted_dr;
6692       l_bal.accted_cr := NULL;
6693       IF(l_bal.entered_currency_code = g_ledger_currency_code) THEN
6694         l_bal.entered_dr    := l_bal.accted_dr;
6695       ELSE
6696         l_bal.entered_dr    := l_bal.entered_cr - l_bal.entered_dr;
6697       END IF;
6698       l_bal.entered_cr    := NULL;
6699     -- following, we assume entered_currency can't be ledger currency
6700     ELSIF (l_bal.entered_dr>l_bal.entered_cr) THEN
6701       l_bal.accted_cr := 0;
6702       l_bal.accted_dr := NULL;
6703       l_bal.entered_cr    := l_bal.entered_dr - l_bal.entered_cr;
6704       l_bal.entered_dr    := NULL;
6705     ELSIF (l_bal.entered_dr<l_bal.entered_cr) THEN
6706       l_bal.accted_dr := 0;
6707       l_bal.accted_cr := NULL;
6708       l_bal.entered_dr    := l_bal.entered_cr - l_bal.entered_dr;
6709       l_bal.entered_cr    := NULL;
6710     END IF;
6711 
6712 
6713     INSERT INTO xla_validation_lines_gt
6714         (balancing_line_type
6715         ,ledger_id
6716         ,ae_header_id
6717         ,ae_line_num
6718         ,displayed_line_number
6719         ,max_ae_line_num
6720         ,max_displayed_line_number
6721         ,event_id
6722         ,entity_id
6723         ,accounting_date
6724         ,entered_currency_code
6725         ,entered_cr
6726         ,entered_dr
6727 	,unrounded_entered_cr
6728 	,unrounded_entered_dr
6729         ,accounted_cr
6730         ,accounted_dr
6731 	,unrounded_accounted_cr
6732 	,unrounded_accounted_dr
6733         ,code_combination_id
6734         ,control_account_enabled_flag
6735         ,mgt_seg_value
6736         ,bal_seg_value
6737         ,encumbrance_type_id        -- added for 9030331
6738         )
6739         VALUES
6740         (C_LINE_TYPE_RD_BALANCING
6741         ,g_ledger_id
6742         ,l_bal.ae_header_id
6743         ,l_bal.max_ae_line_num
6744         ,l_bal.max_disp_line_num
6745         ,l_bal.max_ae_line_num
6746         ,l_bal.max_disp_line_num
6747         ,l_bal.event_id
6748         ,l_bal.entity_id
6749         ,l_bal.accounting_date
6750         ,l_bal.entered_currency_code
6751         ,l_bal.entered_cr
6752         ,l_bal.entered_dr
6753         ,l_bal.entered_cr
6754         ,l_bal.entered_dr
6755         ,l_bal.accted_cr
6756         ,l_bal.accted_dr
6757         ,l_bal.accted_cr
6758         ,l_bal.accted_dr
6759         ,l_rounding_ccid
6760         ,l_ref3
6761         ,l_mgt_seg_val
6762         ,l_bal.bal_seg_val
6763         ,l_bal.encumbrance_type_id        -- added for 9030331
6764          );
6765 
6766     IF (NVL(l_rounding_ccid,-1) > 0 AND
6767         NVL(l_ref3,'N') NOT IN ( 'N','R') ) THEN
6768 
6769       SELECT fnd_flex_ext.get_segs('SQLGL', 'GL#', g_ledger_coa_id, l_rounding_ccid)
6770         INTO l_account
6771         FROM dual;
6772 
6773       xla_accounting_err_pkg.build_message(
6774                  p_appli_s_name         => 'XLA'
6775                 ,p_msg_name             => 'XLA_AP_ROUNDING_CONT_ACCT'
6776                 ,p_token_1              => 'ACCOUNT'
6777                 ,p_value_1              => l_account
6778                 ,p_token_2              => 'LEDGER_NAME'
6779                 ,p_value_2              => g_ledger_name
6780                 ,p_entity_id            => l_bal.entity_id
6781                 ,p_event_id             => l_bal.event_id
6782                 ,p_ledger_id            => g_ledger_id
6783                 ,p_ae_header_id         => l_bal.ae_header_id
6784                 ,p_ae_line_num          => NULL
6785                 ,p_accounting_batch_id  => NULL);
6786 
6787       g_err_count := g_err_count + 1;
6788       g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
6789       g_err_event_ids(g_err_count) := l_bal.event_id;
6790     END IF;
6791 
6792     g_new_line_count := g_new_line_count + 1;
6793 
6794     FETCH c_bal INTO l_bal;
6795   END LOOP;
6796 
6797 -- Bug 7529475
6798 /*
6799 update xla_validation_lines_gt xgt
6800 set xgt.encumbrance_type_id = (SELECT xll.encumbrance_type_id
6801                                FROM xla_validation_lines_gt xll
6802 			       WHERE xll.ae_header_id = xgt.ae_header_id
6803                                and xll.balancing_line_type=C_LINE_TYPE_ENC_BALANCING
6804                                and xll.balance_type_code <> 'B'
6805 				AND xll.entered_currency_code <> 'STAT'
6806                                 and xll.encumbrance_type_id is not null
6807                                 and rownum = 1
6808                                 )
6809 where xgt.balancing_line_type = C_LINE_TYPE_RD_BALANCING
6810 and xgt.encumbrance_type_id is null
6811 and nvl(xgt.balance_type_code, ' ') <> 'B'
6812 AND nvl(xgt.entered_currency_code, ' ') <> 'STAT';
6813 */ -- commented for 9030331
6814 
6815 IF (SQL%ROWCOUNT > 0) then
6816 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6817     trace(p_msg    => 'Encumbrance type id stamped for rounding lines',
6818           p_module => l_log_module,
6819           p_level  => C_LEVEL_PROCEDURE);
6820   END IF;
6821 END IF;
6822 
6823 -- End of Bug 7529475
6824 
6825   IF (C_LEVEL_EVENT >= g_log_level) THEN
6826     trace(p_msg    => 'END LOOP - balance by journal rounding',
6827           p_module => l_log_module,
6828           p_level  => C_LEVEL_EVENT);
6829   END IF;
6830   CLOSE c_bal;
6831 
6832 
6833   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6834     trace(p_msg    => 'End of function balance_by_journal_rounding',
6835           p_module => l_log_module,
6836           p_level  => C_LEVEL_PROCEDURE);
6837   END IF;
6838 EXCEPTION
6839 WHEN xla_exceptions_pkg.application_exception THEN
6840   IF (c_bal%ISOPEN) THEN
6841     CLOSE c_bal;
6842   END IF;
6843   IF (c_seg_number%ISOPEN) THEN
6844     CLOSE c_seg_number;
6845   END IF;
6846   IF (c_rccid_segs%ISOPEN) THEN
6847     CLOSE c_rccid_segs;
6848   END IF;
6849   RAISE;
6850 
6851 WHEN OTHERS THEN
6852   IF (c_bal%ISOPEN) THEN
6853     CLOSE c_bal;
6854   END IF;
6855   IF (c_seg_number%ISOPEN) THEN
6856     CLOSE c_seg_number;
6857   END IF;
6858   IF (c_rccid_segs%ISOPEN) THEN
6859     CLOSE c_rccid_segs;
6860   END IF;
6861   xla_exceptions_pkg.raise_message
6862       (p_location => 'xla_je_validation_pkg.balance_by_journal_rounding');
6863 
6864 END balance_by_journal_rounding;
6865 
6866 --=============================================================================
6867 --
6868 -- Name: create_intercompany_errors
6869 -- Description: Translate intercompany errors FROM FUN_BAL_ERRORS_GT into
6870 --              XLA error messages.
6871 --
6872 --=============================================================================
6873 PROCEDURE create_intercompany_errors
6874   (p_err_count           IN OUT NOCOPY INTEGER
6875   ,p_err_ae_header_ids   IN OUT NOCOPY t_array_int)
6876 IS
6877   CURSOR c_error_standard IS
6878     SELECT  distinct
6879             err.error_code
6880           , le2.name                   from_le_name
6881           , le3.name                   to_le_name
6882           , le1.name                   le_name
6883           , err.ccid
6884           , je.user_je_category_name   je_category_name
6885           , hdr.entity_id
6886           , hdr.event_id
6887           , hdr.ae_header_id
6888           , err.error_message  --added for 10180336
6889     FROM    fun_bal_errors_gt           err
6890           , xla_ae_headers_gt           hdr
6891           , gl_je_categories            je
6892           , xle_entity_profiles         le1
6893           , xle_entity_profiles         le2
6894           , xle_entity_profiles         le3
6895     WHERE   abs(err.group_id)                = hdr.ae_header_id --added for 10180336
6896       AND   je.je_category_name(+)      = hdr.je_category_name
6897       AND   le1.legal_entity_id(+)      = err.le_id
6898       AND   le2.legal_entity_id(+)      = err.from_le_id
6899       AND   le3.legal_entity_id(+)      = err.to_le_id;
6900 
6901   CURSOR c_error_manual IS
6902     SELECT  distinct
6903             err.error_code
6904           , le2.name                   from_le_name
6905           , le3.name                   to_le_name
6906           , le1.name                   le_name
6907           , err.ccid
6908           , je.user_je_category_name   je_category_name
6909           , hdr.entity_id
6910           , hdr.event_id
6911           , hdr.ae_header_id
6912           , err.error_message  --added for 10180336
6913     FROM    fun_bal_errors_gt           err
6914           , xla_ae_headers              hdr
6915           , gl_je_categories            je
6916           , xle_entity_profiles         le1
6917           , xle_entity_profiles         le2
6918           , xle_entity_profiles         le3
6919     WHERE   abs(err.group_id)                = hdr.ae_header_id --added for 10180336
6920       AND   je.je_category_name(+)      = hdr.je_category_name
6921       AND   le1.legal_entity_id(+)      = err.le_id
6922       AND   le2.legal_entity_id(+)      = err.from_le_id
6923       AND   le3.legal_entity_id(+)      = err.to_le_id
6924       AND   hdr.application_id          = g_application_id
6925       AND   hdr.ae_header_id            = g_ae_header_id;
6926 
6927   l_err                  c_error_manual%ROWTYPE;
6928   l_account              VARCHAR2(2400);
6929   l_log_module           VARCHAR2(240);
6930 BEGIN
6931   IF g_log_enabled THEN
6932     l_log_module := C_DEFAULT_MODULE||'.create_intercompany_errors';
6933   END IF;
6934 
6935   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
6936     trace(p_msg    => 'BEGIN of procedure create_intercompany_errors',
6937           p_module => l_log_module,
6938           p_level  => C_LEVEL_PROCEDURE);
6939   END IF;
6940 
6941   IF (C_LEVEL_EVENT >= g_log_level) THEN
6942     trace(p_msg    => 'BEGIN LOOP - fun_bal_errors_gt',
6943           p_module => l_log_module,
6944           p_level  => C_LEVEL_EVENT);
6945   END IF;
6946 
6947   IF (g_caller in( C_CALLER_ACCT_PROGRAM, C_CALLER_THIRD_PARTY_MERGE, C_CALLER_MPA_PROGRAM)) THEN
6948     OPEN c_error_standard;
6949   ELSE
6950     OPEN c_error_manual;
6951   END IF;
6952 
6953   LOOP
6954     IF (g_caller in (C_CALLER_ACCT_PROGRAM,  C_CALLER_THIRD_PARTY_MERGE, C_CALLER_MPA_PROGRAM)) THEN
6955       FETCH c_error_standard INTO l_err;
6956       EXIT WHEN c_error_standard%NOTFOUND;
6957     ELSE
6958       FETCH c_error_manual INTO l_err;
6959       EXIT WHEN c_error_manual%NOTFOUND;
6960     END IF;
6961 
6962     IF (C_LEVEL_EVENT >= g_log_level) THEN
6963       trace(p_msg    => 'LOOP - fun_bal_errors_gt: ae_header_id = '||l_err.ae_header_id,
6964             p_module => l_log_module,
6965             p_level  => C_LEVEL_EVENT);
6966     END IF;
6967 
6968     IF (C_LEVEL_ERROR >= g_log_level) THEN
6969       trace(p_msg    => 'ae_header_id = '||l_err.ae_header_id,
6970             p_module => l_log_module,
6971             p_level  => C_LEVEL_ERROR);
6972       trace(p_msg    => 'error_code = '||l_err.error_code,
6973             p_module => l_log_module,
6974             p_level  => C_LEVEL_ERROR);
6975     END IF;
6976 
6977     g_err_count := g_err_count + 1;
6978     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
6979     g_err_event_ids(g_err_count) := l_err.event_id;
6980 
6981     p_err_count := p_err_count + 1;
6982     p_err_ae_header_ids(p_err_count) := l_err.ae_header_id;
6983 
6984     IF (l_err.error_code = 'FUN_INTER_BSV_NOT_ASSIGNED') THEN
6985       xla_accounting_err_pkg.build_message(
6986                  p_appli_s_name         => 'XLA'
6987                 ,p_msg_name             => 'XLA_INTER_BSV_NOT_ASSIGNED'
6988                 ,p_token_1              => 'LEDGER_NAME'
6989                 ,p_value_1              => g_ledger_name
6990                 ,p_entity_id            => l_err.entity_id
6991                 ,p_event_id             => l_err.event_id
6992                 ,p_ledger_id            => g_ledger_id
6993                 ,p_ae_header_id         => l_err.ae_header_id
6994                 ,p_ae_line_num          => NULL
6995                 ,p_accounting_batch_id  => NULL);
6996     ELSIF (l_err.error_code = 'FUN_INTER_REC_NOT_ASSIGNED') THEN
6997       xla_accounting_err_pkg.build_message(
6998                  p_appli_s_name         => 'XLA'
6999                 ,p_msg_name             => 'XLA_INTER_REC_NOT_ASSIGNED'
7000                 ,p_token_1              => 'FROM_LE_ID'
7001                 ,p_value_1              => l_err.from_le_name
7002                 ,p_token_2              => 'TO_LE_ID'
7003                 ,p_value_2              => l_err.to_le_name
7004                 ,p_entity_id            => l_err.entity_id
7005                 ,p_event_id             => l_err.event_id
7006                 ,p_ledger_id            => g_ledger_id
7007                 ,p_ae_header_id         => l_err.ae_header_id
7008                 ,p_ae_line_num          => NULL
7009                 ,p_accounting_batch_id  => NULL);
7010     ELSIF (l_err.error_code = 'FUN_INTER_REC_NO_DEFAULT') THEN
7011       xla_accounting_err_pkg.build_message(
7012                  p_appli_s_name         => 'XLA'
7013                 ,p_msg_name             => 'XLA_INTER_REC_NO_DEFAULT'
7014                 ,p_token_1              => 'FROM_LE_ID'
7015                 ,p_value_1              => l_err.from_le_name
7016                 ,p_token_2              => 'TO_LE_ID'
7017                 ,p_value_2              => l_err.to_le_name
7018                 ,p_entity_id            => l_err.entity_id
7019                 ,p_event_id             => l_err.event_id
7020                 ,p_ledger_id            => g_ledger_id
7021                 ,p_ae_header_id         => l_err.ae_header_id
7022                 ,p_ae_line_num          => NULL
7023                 ,p_accounting_batch_id  => NULL);
7024     ELSIF (l_err.error_code = 'FUN_INTER_REC_NOT_VALID') THEN
7025       xla_accounting_err_pkg.build_message(
7026                  p_appli_s_name         => 'XLA'
7027                 ,p_msg_name             => 'XLA_INTER_REC_NOT_VALID'
7028                 ,p_token_1              => 'FROM_LE_ID'
7029                 ,p_value_1              => l_err.from_le_name
7030                 ,p_token_2              => 'TO_LE_ID'
7031                 ,p_value_2              => l_err.to_le_name
7032                 ,p_entity_id            => l_err.entity_id
7033                 ,p_event_id             => l_err.event_id
7034                 ,p_ledger_id            => g_ledger_id
7035                 ,p_ae_header_id         => l_err.ae_header_id
7036                 ,p_ae_line_num          => NULL
7037                 ,p_accounting_batch_id  => NULL);
7038     ELSIF (l_err.error_code = 'FUN_INTER_PAY_NOT_ASSIGNED') THEN
7039       xla_accounting_err_pkg.build_message(
7040                  p_appli_s_name         => 'XLA'
7041                 ,p_msg_name             => 'XLA_INTER_PAY_NOT_ASSIGNED'
7042                 ,p_token_1              => 'FROM_LE_ID'
7043                 ,p_value_1              => l_err.from_le_name
7044                 ,p_token_2              => 'TO_LE_ID'
7045                 ,p_value_2              => l_err.to_le_name
7046                 ,p_entity_id            => l_err.entity_id
7047                 ,p_event_id             => l_err.event_id
7048                 ,p_ledger_id            => g_ledger_id
7049                 ,p_ae_header_id         => l_err.ae_header_id
7050                 ,p_ae_line_num          => NULL
7051                 ,p_accounting_batch_id  => NULL);
7052     ELSIF (l_err.error_code = 'FUN_INTER_PAY_NO_DEFAULT') THEN
7053       xla_accounting_err_pkg.build_message(
7054                  p_appli_s_name         => 'XLA'
7055                 ,p_msg_name             => 'XLA_INTER_PAY_NO_DEFAULT'
7056                 ,p_token_1              => 'FROM_LE_ID'
7057                 ,p_value_1              => l_err.from_le_name
7058                 ,p_token_2              => 'TO_LE_ID'
7059                 ,p_value_2              => l_err.to_le_name
7060                 ,p_entity_id            => l_err.entity_id
7061                 ,p_event_id             => l_err.event_id
7062                 ,p_ledger_id            => g_ledger_id
7063                 ,p_ae_header_id         => l_err.ae_header_id
7064                 ,p_ae_line_num          => NULL
7065                 ,p_accounting_batch_id  => NULL);
7066     ELSIF (l_err.error_code = 'FUN_INTER_PAY_NOT_VALID') THEN
7067       xla_accounting_err_pkg.build_message(
7068                  p_appli_s_name         => 'XLA'
7069                 ,p_msg_name             => 'FUN_INTER_PAY_NOT_VALID'
7070                 ,p_token_1              => 'FROM_LE_ID'
7071                 ,p_value_1              => l_err.from_le_name
7072                 ,p_token_2              => 'TO_LE_ID'
7073                 ,p_value_2              => l_err.to_le_name
7074                 ,p_entity_id            => l_err.entity_id
7075                 ,p_event_id             => l_err.event_id
7076                 ,p_ledger_id            => g_ledger_id
7077                 ,p_ae_header_id         => l_err.ae_header_id
7078                 ,p_ae_line_num          => NULL
7079                 ,p_accounting_batch_id  => NULL);
7080     ELSIF (l_err.error_code = 'FUN_INTRA_RULE_NOT_ASSIGNED') THEN
7081       xla_accounting_err_pkg.build_message(
7082                  p_appli_s_name         => 'XLA'
7083                 ,p_msg_name             => 'XLA_INTRA_RULE_NOT_ASSIGNED'
7084                 ,p_token_1              => 'LEDGER_NAME'
7085                 ,p_value_1              => g_ledger_name
7086                 ,p_token_2              => 'SOURCE_NAME'
7087                 ,p_value_2              => g_app_je_source_name
7088                 ,p_token_3              => 'JE_CATEGORY'
7089                 ,p_value_3              => l_err.je_category_name
7090                 ,p_entity_id            => l_err.entity_id
7091                 ,p_event_id             => l_err.event_id
7092                 ,p_ledger_id            => g_ledger_id
7093                 ,p_ae_header_id         => l_err.ae_header_id
7094                 ,p_ae_line_num          => NULL
7095                 ,p_accounting_batch_id  => NULL);
7096     ELSIF (l_err.error_code = 'FUN_INTRA_NO_CLEARING_BSV') THEN
7097       xla_accounting_err_pkg.build_message(
7098                  p_appli_s_name         => 'XLA'
7099                 ,p_msg_name             => 'XLA_INTRA_NO_CLEARING_BSV'
7100                 ,p_token_1              => 'LEDGER_NAME'
7101                 ,p_value_1              => g_ledger_name
7102                 ,p_token_2              => 'SOURCE_NAME'
7103                 ,p_value_2              => g_app_je_source_name
7104                 ,p_token_3              => 'JE_CATEGORY'
7105                 ,p_value_3              => l_err.je_category_name
7106                 ,p_token_4              => 'LE_ID'
7107                 ,p_value_4              => l_err.le_name
7108                 ,p_entity_id            => l_err.entity_id
7109                 ,p_event_id             => l_err.event_id
7110                 ,p_ledger_id            => g_ledger_id
7111                 ,p_ae_header_id         => l_err.ae_header_id
7112                 ,p_ae_line_num          => NULL
7113                 ,p_accounting_batch_id  => NULL);
7114     ELSIF (l_err.error_code = 'FUN_INTRA_CC_NOT_VALID') THEN
7115       SELECT    fnd_flex_ext.get_segs('SQLGL', 'GL#', g_ledger_coa_id, l_err.ccid)
7116       INTO      l_account
7117       FROM      dual;
7118 
7119       xla_accounting_err_pkg.build_message(
7120                  p_appli_s_name         => 'XLA'
7121                 ,p_msg_name             => 'XLA_INTRA_CC_NOT_VALID'
7122                 ,p_token_1              => 'ACCOUNT_VALUE'
7123                 ,p_value_1              => l_account
7124                 ,p_entity_id            => l_err.entity_id
7125                 ,p_event_id             => l_err.event_id
7126                 ,p_ledger_id            => g_ledger_id
7127                 ,p_ae_header_id         => l_err.ae_header_id
7128                 ,p_ae_line_num          => NULL
7129                 ,p_accounting_batch_id  => NULL);
7130     ELSIF (l_err.error_code = 'FUN_INTRA_CC_NOT_CREATED') THEN
7131       xla_accounting_err_pkg.build_message(
7132                  p_appli_s_name         => 'XLA'
7133                 ,p_msg_name             => 'XLA_INTRA_CC_NOT_CREATED'
7134                 ,p_entity_id            => l_err.entity_id
7135                 ,p_event_id             => l_err.event_id
7136                 ,p_ledger_id            => g_ledger_id
7137                 ,p_ae_header_id         => l_err.ae_header_id
7138                 ,p_ae_line_num          => NULL
7139                 ,p_accounting_batch_id  => NULL);
7140     ELSIF (l_err.error_code = 'FUN_INTRA_CC_NOT_ACTIVE') THEN
7141       SELECT    fnd_flex_ext.get_segs('SQLGL', 'GL#', g_ledger_coa_id, l_err.ccid)
7142       INTO      l_account
7143       FROM      dual;
7144 
7145       xla_accounting_err_pkg.build_message(
7146                  p_appli_s_name         => 'XLA'
7147                 ,p_msg_name             => 'XLA_INTRA_CC_NOT_ACTIVE'
7148                 ,p_token_1              => 'ACCOUNT_VALUE'
7149                 ,p_value_1              => l_account
7150                 ,p_token_2              => 'LE_ID'
7151                 ,p_value_2              => l_err.le_name
7152                 ,p_entity_id            => l_err.entity_id
7153                 ,p_event_id             => l_err.event_id
7154                 ,p_ledger_id            => g_ledger_id
7155                 ,p_ae_header_id         => l_err.ae_header_id
7156                 ,p_ae_line_num          => NULL
7157                 ,p_accounting_batch_id  => NULL);
7158     ELSIF (l_err.error_code = 'FUN_BSV_INVALID') THEN
7159       xla_accounting_err_pkg.build_message(
7160                  p_appli_s_name         => 'XLA'
7161                 ,p_msg_name             => 'XLA_INTRA_BSV_INVALID'
7162                 ,p_entity_id            => l_err.entity_id
7163                 ,p_event_id             => l_err.event_id
7164                 ,p_ledger_id            => g_ledger_id
7165                 ,p_ae_header_id         => l_err.ae_header_id
7166                 ,p_ae_line_num          => NULL
7167                 ,p_accounting_batch_id  => NULL);
7168     -- 10180336 begin
7169 	ELSIF (l_err.error_code = 'FUN_INTER_UNEXPECTED_ERROR') THEN
7170 	  xla_accounting_err_pkg.build_message(
7171                  p_appli_s_name         => 'XLA'
7172                 ,p_msg_name             => 'XLA_FUN_INTERNAL_ERROR'
7173                 ,p_token_1              => 'LOCATION'
7174                 ,p_value_1              => 'fun_bal_pkg.journal_balancing'
7175                 ,p_token_2              => 'ERR_MSG'
7176                 ,p_value_2              => l_err.error_message
7177                 ,p_entity_id            => l_err.entity_id
7178                 ,p_event_id             => l_err.event_id
7179                 ,p_ledger_id            => g_ledger_id
7180                 ,p_ae_header_id         => l_err.ae_header_id
7181                 ,p_ae_line_num          => NULL
7182                 ,p_accounting_batch_id  => NULL);
7183 	-- 10180336 end
7184     ELSE
7185       xla_accounting_err_pkg.build_message(
7186                  p_appli_s_name         => 'FUN'
7187                 ,p_msg_name             => l_err.error_code
7188                 ,p_entity_id            => l_err.entity_id
7189                 ,p_event_id             => l_err.event_id
7190                 ,p_ledger_id            => g_ledger_id
7191                 ,p_ae_header_id         => l_err.ae_header_id
7192                 ,p_ae_line_num          => NULL
7193                 ,p_accounting_batch_id  => NULL);
7194     END IF;
7195   END LOOP;
7196   IF (C_LEVEL_EVENT >= g_log_level) THEN
7197     trace(p_msg    => 'END LOOP - fun_bal_errors_gt',
7198           p_module => l_log_module,
7199           p_level  => C_LEVEL_EVENT);
7200   END IF;
7201 
7202   IF (g_caller in (C_CALLER_ACCT_PROGRAM,  C_CALLER_THIRD_PARTY_MERGE, C_CALLER_MPA_PROGRAM)) THEN
7203     CLOSE c_error_standard;
7204   ELSE
7205     CLOSE c_error_manual;
7206   END IF;
7207 
7208     -- 10180336 begin
7209     IF (p_err_count>0) THEN
7210       FORALL j IN 1..p_err_count
7211         UPDATE     xla_validation_lines_gt
7212            SET     balancing_line_type = C_LINE_TYPE_COMPLETE
7213          WHERE     ae_header_id = p_err_ae_header_ids(j)
7214            AND     balancing_line_type = C_LINE_TYPE_PROCESS;
7215     END IF;
7216 	-- 10180336 end
7217 
7218 
7219   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
7220     trace(p_msg    => 'End of procedure create_intercompany_errors',
7221           p_module => l_log_module,
7222           p_level  => C_LEVEL_PROCEDURE);
7223   END IF;
7224 EXCEPTION
7225 WHEN xla_exceptions_pkg.application_exception THEN
7226   IF (c_error_manual%ISOPEN) THEN
7227     CLOSE c_error_manual;
7228   END IF;
7229   IF (c_error_standard%ISOPEN) THEN
7230     CLOSE c_error_standard;
7231   END IF;
7232   RAISE;
7233 
7234 WHEN OTHERS THEN
7235   IF (c_error_manual%ISOPEN) THEN
7236     CLOSE c_error_manual;
7237   END IF;
7238   IF (c_error_standard%ISOPEN) THEN
7239     CLOSE c_error_standard;
7240   END IF;
7241   xla_exceptions_pkg.raise_message
7242       (p_location => 'xla_je_validation_pkg.create_intercompany_errors');
7243 END;
7244 
7245 
7246 --=============================================================================
7247 --
7248 -- Name: balance_by_intercompany
7249 -- Description: This function inserts rows to the gl temporary balancing table
7250 --              if the journal entry is not balanced by balancing segments.  If
7251 --              rows are inserted into the gl balancing temporary table, it
7252 --              will THEN call the GL due from/due to routine which create
7253 --              entries to balance the journal entry by balancing segment.
7254 --              After the call, this function will save the new entries to the
7255 --              xla temporary balancing table.
7256 --
7257 --=============================================================================
7258 PROCEDURE balance_by_intercompany
7259 IS
7260   CURSOR c_bal(p_mau                   NUMBER
7261               ,p_rounding_offset       NUMBER
7262               ) IS SELECT ae_header_id
7263                         ,je_category_name
7264                         ,accounting_date
7265                         ,event_id
7266                         ,entity_id
7267                 FROM    xla_validation_lines_gt l
7268                 WHERE   balance_type_code       = 'A'
7269                 AND     entered_currency_code  <> 'STAT'
7270                 AND     balancing_line_type     = C_LINE_TYPE_PROCESS
7271                 GROUP BY ae_header_id
7272                         ,je_category_name
7273                         ,accounting_date
7274                         ,event_id
7275                         ,entity_id
7276                         ,bal_seg_value
7277                 --HAVING        sum(nvl(accounted_dr,0)) <> sum(nvl(accounted_cr,0))
7278                 HAVING  ROUND( NVL(SUM(unrounded_accounted_dr),0) /p_mau+p_rounding_offset)
7279                <> ROUND( NVL(SUM(unrounded_accounted_cr),0) /p_mau+p_rounding_offset)
7280 
7281                 ORDER BY ae_header_id;
7282 
7283   l_bal_count           INTEGER := 0;
7284   l_err_hdr_ids         t_array_int;
7285   l_err_count           INTEGER := 0;
7286   l_ae_header_ids       t_array_int;
7287   l_distinct_hdr_ids    t_array_int;
7288   l_je_category_names   t_array_varchar30;
7289   l_accounting_dates    t_array_date;
7290   l_count               INTEGER;
7291   j                     INTEGER;
7292 
7293   l_last_ae_header_id   INTEGER := -1;
7294 
7295   l_bal_retcode         VARCHAR2(30);
7296   l_bal_msg_count       NUMBER;
7297   l_bal_msg_data        VARCHAR2(4000);
7298   l_debug_flag          VARCHAR2(1);
7299 
7300   l_mau                 NUMBER;
7301   l_rounding_offset     NUMBER;
7302   l_rounding_rule_code  VARCHAR2(30);
7303 
7304   l_log_module          VARCHAR2(240);
7305 BEGIN
7306   IF g_log_enabled THEN
7307     l_log_module := C_DEFAULT_MODULE||'.balance_by_intercompany';
7308   END IF;
7309 
7310   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
7311     trace(p_msg    => 'BEGIN of function balance_by_intercompany',
7312           p_module => l_log_module,
7313           p_level  => C_LEVEL_PROCEDURE);
7314   END IF;
7315 
7316   --
7317   -- For journal entry unbalanced by BSV and entered currency, if the
7318   -- balance cross entity journals is disabled, mark error.
7319   --
7320   IF (C_LEVEL_EVENT >= g_log_level) THEN
7321     trace(p_msg    => 'LOOP BEGIN - balance by intercompany',
7322           p_module => l_log_module,
7323           p_level  => C_LEVEL_EVENT);
7324   END IF;
7325 
7326   IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
7327     l_mau:= xla_accounting_cache_pkg.GetValueNum(
7328                            p_source_code        => 'XLA_CURRENCY_MAU'
7329                          , p_target_ledger_id   => g_ledger_id);
7330 
7331     l_rounding_rule_code :=xla_accounting_cache_pkg.GetValueChar(
7332                            p_source_code        => 'XLA_ROUNDING_RULE_CODE'
7333                          , p_target_ledger_id   => g_ledger_id
7334                          );
7335   ELSE
7336     SELECT nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
7337           ,xlo.rounding_rule_code
7338     INTO   l_mau, l_rounding_rule_code
7339     FROM   xla_ledger_options     xlo
7340           ,gl_ledgers             gl
7341           ,fnd_currencies         fcu
7342     WHERE xlo.application_id = g_application_id
7343       AND xlo.ledger_id      = g_trx_ledger_id
7344       AND gl.ledger_id       = g_ledger_id
7345       AND fcu.currency_code  = gl.currency_code;
7346   END IF;
7347 
7348   IF l_rounding_rule_code = 'NEAREST' THEN
7349     l_rounding_offset := 0;
7350   ELSIF l_rounding_rule_code = 'UP' THEN
7351     l_rounding_offset := .5-power(10, -30);
7352   ELSIF l_rounding_rule_code = 'DOWN' THEN
7353     l_rounding_offset := -(.5-power(10, -30));
7354   ELSE
7355     l_rounding_offset := 0;
7356   END IF;
7357 
7358   FOR l_bal IN c_bal(l_mau,l_rounding_offset) LOOP
7359 
7360     IF (l_last_ae_header_id <> l_bal.ae_header_id) THEN
7361       IF (C_LEVEL_EVENT >= g_log_level) THEN
7362         trace(p_msg    => 'LOOP - balance by intercompany: ae_header_id - '||l_bal.ae_header_id,
7363               p_module => l_log_module,
7364               p_level  => C_LEVEL_EVENT);
7365       END IF;
7366 
7367       IF (g_allow_intercompany_post_flag = 'N') THEN
7368         g_err_count := g_err_count+1;
7369         g_err_hdr_ids(g_err_count) := l_bal.ae_header_id;
7370         g_err_event_ids(g_err_count) := l_bal.event_id;
7371 
7372         l_err_count := l_err_count+1;
7373         l_err_hdr_ids(l_err_count) := l_bal.ae_header_id;
7374         xla_accounting_err_pkg.build_message(
7375                  p_appli_s_name         => 'XLA'
7376                 ,p_msg_name             => 'XLA_AP_IC_POST_FLAG_OFF'
7377                 ,p_token_1              => 'LEDGER_NAME'
7378                 ,p_value_1              => g_ledger_name
7379                 ,p_entity_id            => l_bal.entity_id
7380                 ,p_event_id             => l_bal.event_id
7381                 ,p_ledger_id            => g_ledger_id
7382                 ,p_ae_header_id         => l_bal.ae_header_id
7383                 ,p_ae_line_num          => NULL
7384                 ,p_accounting_batch_id  => NULL);
7385       ELSE
7386         l_bal_count := l_bal_count+1;
7387 
7388         l_ae_header_ids(l_bal_count)     := l_bal.ae_header_id;
7389         l_je_category_names(l_bal_count) := l_bal.je_category_name;
7390         l_accounting_dates(l_bal_count)  := l_bal.accounting_date;
7391 
7392         IF (C_LEVEL_STATEMENT >= g_log_level) THEN
7393           trace(p_msg    => 'ae_header_ids('||l_bal_count||') = '||l_ae_header_ids(l_bal_count),
7394                 p_module => l_log_module,
7395                 p_level  => C_LEVEL_STATEMENT);
7396           trace(p_msg    => 'je_category_names('||l_bal_count||') = '||l_je_category_names(l_bal_count),
7397                 p_module => l_log_module,
7398                 p_level  => C_LEVEL_STATEMENT);
7399           trace(p_msg    => 'accounting_dates('||l_bal_count||') = '||l_accounting_dates(l_bal_count),
7400                 p_module => l_log_module,
7401                 p_level  => C_LEVEL_STATEMENT);
7402         END IF;
7403       END IF;
7404       l_last_ae_header_id := l_bal.ae_header_id;
7405     END IF;
7406 
7407   END LOOP;
7408   IF (C_LEVEL_EVENT >= g_log_level) THEN
7409     trace(p_msg    => 'END LOOP - balance by intercompany',
7410           p_module => l_log_module,
7411           p_level  => C_LEVEL_EVENT);
7412   END IF;
7413 
7414   --
7415   -- If FUN balancing is required for any journal entries, insert the
7416   -- journal entries into the FUN balancing tables and call the
7417   -- balancing API
7418   --
7419   IF (l_bal_count>0) THEN
7420     FORALL j IN 1..l_bal_count
7421       INSERT INTO fun_bal_headers_gt (
7422            group_id
7423           ,ledger_id
7424           ,je_source_name
7425           ,je_category_name
7426           ,gl_date
7427           ,status)
7428         VALUES (
7429            l_ae_header_ids(j)
7430           ,g_target_ledger_id
7431           ,g_app_je_source_name
7432           ,l_je_category_names(j)
7433           ,l_accounting_dates(j)
7434           ,'OK');
7435 
7436     IF (C_LEVEL_EVENT >= g_log_level) THEN
7437       trace(p_msg    => '# rows inserted into fun_bal_headers_gt: '||SQL%ROWCOUNT,
7438             p_module => l_log_module,
7439             p_level  => C_LEVEL_EVENT);
7440     END IF;
7441 
7442 
7443     --8496807
7444     --three types of unbalanced headers are handled in this FUN API-integration
7445     --a) header with no reversal: insert H1
7446     --b) header with some lines reversed, some lines not reversed: insert -H1 and H1, for XLA these are same header but FUN
7447     --   API is tricked into seeing these as two different transactions
7448     --c) header with all lines reversed: insert -H1
7449 
7450     -- for negative headers inserted, lines cr/dr are switched before sending and after being retrieved from FUN API
7451 
7452 
7453     --HINTS added on several sqls in this procedure for 9351919
7454 
7455     INSERT INTO fun_bal_headers_gt( group_id
7456           ,ledger_id
7457           ,je_source_name
7458           ,je_category_name
7459           ,gl_date
7460           ,status)
7461     SELECT group_id * -1
7462           ,ledger_id
7463           ,je_source_name
7464           ,je_category_name
7465           ,gl_date
7466           ,status
7467     FROM fun_bal_headers_gt fgt
7468     WHERE EXISTS (SELECT /*+ NO_UNNEST INDEX(xdl XLA_DISTRIBUTION_LINKS_N3)*/ 1
7469                   FROM xla_distribution_links xdl
7470 		  WHERE fgt.group_id = xdl.ae_header_id
7471 		  AND xdl.temp_line_num <0
7472 		  AND xdl.application_id = g_application_id);
7473 
7474 
7475     IF (C_LEVEL_EVENT >= g_log_level) THEN
7476       trace(p_msg    => '# rows inserted into fun_bal_headers_gt: (insert negative headers if full/partial reversal exists) '||SQL%ROWCOUNT,
7477             p_module => l_log_module,
7478             p_level  => C_LEVEL_EVENT);
7479     END IF;
7480 
7481 
7482     DELETE FROM fun_bal_headers_gt fgt
7483     WHERE fgt.group_id > 0
7484     AND NOT EXISTS (SELECT /*+ NO_UNNEST INDEX(xdl XLA_DISTRIBUTION_LINKS_N3)*/ 1
7485                     FROM xla_distribution_links xdl
7486 		    WHERE fgt.group_id = xdl.ae_header_id
7487 		    AND (xdl.temp_line_num IS NULL OR xdl.temp_line_num >0)
7488 		    AND xdl.application_id = g_application_id);
7489 
7490 
7491     IF (C_LEVEL_EVENT >= g_log_level) THEN
7492       trace(p_msg    => '# rows deleted fun_bal_headers_gt: (delete positive headers if all header-lines are reversed) '||SQL%ROWCOUNT,
7493             p_module => l_log_module,
7494             p_level  => C_LEVEL_EVENT);
7495     END IF;
7496 
7497 
7498 --normal case
7499    INSERT INTO fun_bal_lines_gt (
7500          group_id
7501         ,bal_seg_val
7502         ,entered_amt_dr
7503         ,entered_amt_cr
7504         ,entered_currency_code
7505         ,exchange_date
7506         ,exchange_rate
7507         ,exchange_rate_type
7508         ,accounted_amt_dr
7509         ,accounted_amt_cr
7510         ,generated)
7511         SELECT   /*+ leading(h) */ l.ae_header_id
7512                 ,l.bal_seg_value
7513                 ,l.unrounded_entered_dr
7514                 ,l.unrounded_entered_cr
7515                 ,l.entered_currency_code
7516                 ,l.currency_conversion_date
7517                 ,l.currency_conversion_rate
7518                 ,l.currency_conversion_type
7519                 ,l.unrounded_accounted_dr
7520                 ,l.unrounded_accounted_cr
7521                 ,'N'
7522         FROM     xla_validation_lines_gt l
7523                 ,fun_bal_headers_gt h
7524         WHERE    l.balancing_line_type = C_LINE_TYPE_PROCESS
7525         AND      l.ae_header_id = h.group_id
7526 	AND      l.entered_currency_code <> 'STAT' -- added for bug#10166812
7527 	AND      h.group_id > 0
7528 	AND      EXISTS (SELECT /*+ NO_UNNEST INDEX(xdl XLA_DISTRIBUTION_LINKS_N3)*/ 1
7529 	                 FROM xla_distribution_links xdl
7530 			 WHERE xdl.ae_header_id= l.ae_header_id
7531 			 AND xdl.ae_line_num= l.ae_line_num
7532 			 AND (xdl.temp_line_num IS NULL OR xdl.temp_line_num >0)
7533 			 AND xdl.application_id = g_application_id);
7534 
7535     IF (C_LEVEL_EVENT >= g_log_level) THEN
7536       trace(p_msg    => '# non-reversal rows inserted into fun_bal_lines_gt: '||SQL%ROWCOUNT,
7537             p_module => l_log_module,
7538             p_level  => C_LEVEL_EVENT);
7539     END IF;
7540 
7541 
7542 --reversal case
7543     INSERT INTO fun_bal_lines_gt (
7544          group_id
7545         ,bal_seg_val
7546         ,entered_amt_dr
7547         ,entered_amt_cr
7548         ,entered_currency_code
7549         ,exchange_date
7550         ,exchange_rate
7551         ,exchange_rate_type
7552         ,accounted_amt_dr
7553         ,accounted_amt_cr
7554         ,generated)
7555         SELECT   /*+ leading(h) */ l.ae_header_id * -1
7556                 ,l.bal_seg_value
7557 		,l.unrounded_entered_cr
7558                 ,l.unrounded_entered_dr
7559                 ,l.entered_currency_code
7560                 ,l.currency_conversion_date
7561                 ,l.currency_conversion_rate
7562                 ,l.currency_conversion_type
7563                 ,l.unrounded_accounted_cr
7564                 ,l.unrounded_accounted_dr
7565                 ,'N'
7566         FROM     xla_validation_lines_gt l
7567                 ,fun_bal_headers_gt h
7568         WHERE    l.balancing_line_type = C_LINE_TYPE_PROCESS
7569         AND      l.ae_header_id = h.group_id * -1
7570 	AND      l.entered_currency_code <> 'STAT' -- added for bug#10166812
7571 	AND      h.group_id < 0
7572 	AND      EXISTS (SELECT /*+ NO_UNNEST INDEX(xdl XLA_DISTRIBUTION_LINKS_N3)*/ 1
7573 	                 FROM xla_distribution_links xdl
7574 			 WHERE xdl.ae_header_id= l.ae_header_id
7575 			 AND xdl.ae_line_num= l.ae_line_num
7576 			 AND xdl.temp_line_num <0
7577 			 AND xdl.application_id = g_application_id);
7578 
7579 
7580 	IF (C_LEVEL_EVENT >= g_log_level) THEN
7581       trace(p_msg    => '# reversal rows inserted into fun_bal_lines_gt: '||SQL%ROWCOUNT,
7582             p_module => l_log_module,
7583             p_level  => C_LEVEL_EVENT);
7584     END IF;
7585 
7586 
7587     IF (g_log_enabled) THEN
7588       l_debug_flag := 'Y';
7589     ELSE
7590       l_debug_flag := 'N';
7591     END IF;
7592 
7593 
7594     fun_bal_pkg.journal_balancing
7595                 (p_api_version          => 1.0
7596                 ,p_debug                => l_debug_flag
7597                 ,x_return_status        => l_bal_retcode
7598                 ,x_msg_count            => l_bal_msg_count
7599                 ,x_msg_data             => l_bal_msg_data
7600                 ,p_product_code         => 'XLA');
7601 
7602 
7603 
7604     IF (C_LEVEL_EVENT >= g_log_level) THEN
7605       trace(p_msg    => 'l_bal_retcode = '||l_bal_retcode,
7606             p_module => l_log_module,
7607             p_level  => C_LEVEL_EVENT);
7608       trace(p_msg    => 'l_bal_msg_count = '||l_bal_msg_count,
7609             p_module => l_log_module,
7610             p_level  => C_LEVEL_EVENT);
7611       trace(p_msg    => 'l_bal_msg_data = '||l_bal_msg_data,
7612             p_module => l_log_module,
7613             p_level  => C_LEVEL_EVENT);
7614     END IF;
7615 
7616     IF (l_bal_retcode <> FND_API.G_RET_STS_SUCCESS) THEN
7617       IF (C_LEVEL_ERROR >= g_log_level) THEN
7618         trace(p_msg    => 'Error returning from fun_bal_pkg.journal_balancing: '||l_bal_retcode,
7619               p_module => l_log_module,
7620               p_level  => C_LEVEL_ERROR);
7621       END IF;
7622       create_intercompany_errors(l_err_count, l_err_hdr_ids);
7623     END IF;
7624 
7625     INSERT INTO xla_validation_lines_gt(
7626                      ae_header_id
7627                     ,ae_line_num
7628                     ,displayed_line_number
7629                     ,max_ae_line_num
7630                     ,max_displayed_line_number
7631                     ,ledger_id
7632                     ,event_id
7633                     ,entity_id
7634                     ,accounting_date
7635                     ,entered_currency_mau
7636                     ,code_combination_id
7637                     ,entered_currency_code
7638                     ,currency_conversion_date
7639                     ,currency_conversion_rate
7640                     ,currency_conversion_type
7641                     ,entered_cr
7642                     ,entered_dr
7643                     ,accounted_cr
7644                     ,accounted_dr
7645                     ,unrounded_entered_cr
7646                     ,unrounded_entered_dr
7647                     ,unrounded_accounted_cr
7648                     ,unrounded_accounted_dr
7649                     ,bal_seg_value
7650                     ,mgt_seg_value
7651                     ,balancing_line_type
7652                     ,balance_type_code)
7653             SELECT   /*+ LEADING(RES) USE_NL(L)*/ res.group_id
7654                     ,l.max_ae_line_num
7655                     ,l.max_displayed_line_number
7656                     ,l.max_ae_line_num
7657                     ,l.max_displayed_line_number
7658                     ,g_ledger_id
7659                     ,l.event_id
7660                     ,l.entity_id
7661                     ,l.accounting_date
7662                     ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
7663                     ,res.ccid
7664                     ,res.entered_currency_code
7665                     ,res.exchange_date
7666                     ,res.exchange_rate
7667                     ,res.exchange_rate_type
7668                     ,ROUND(res.entered_amt_cr /(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))+l_rounding_offset)*(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))
7669                     ,ROUND(res.entered_amt_dr /(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))+l_rounding_offset)*(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))
7670                     ,ROUND(res.accounted_amt_cr /l_mau+l_rounding_offset)*l_mau
7671                     ,ROUND(res.accounted_amt_dr /l_mau+l_rounding_offset)*l_mau
7672                     ,res.entered_amt_cr
7673                     ,res.entered_amt_dr
7674                     ,res.accounted_amt_cr
7675                     ,res.accounted_amt_dr
7676                     ,res.bal_seg_val
7677                     ,decode(g_mgt_seg_column_name
7678                             ,'SEGMENT1', ccid.segment1, 'SEGMENT2', ccid.segment2
7679                             ,'SEGMENT3', ccid.segment3, 'SEGMENT4', ccid.segment4
7680                             ,'SEGMENT5', ccid.segment5, 'SEGMENT6', ccid.segment6
7681                             ,'SEGMENT7', ccid.segment7, 'SEGMENT8', ccid.segment8
7682                             ,'SEGMENT9', ccid.segment9, 'SEGMENT10', ccid.segment10
7683                             ,'SEGMENT11', ccid.segment11, 'SEGMENT12', ccid.segment12
7684                             ,'SEGMENT13', ccid.segment13, 'SEGMENT14', ccid.segment14
7685                             ,'SEGMENT15', ccid.segment15, 'SEGMENT16', ccid.segment16
7686                             ,'SEGMENT17', ccid.segment17, 'SEGMENT18', ccid.segment18
7687                             ,'SEGMENT19', ccid.segment19, 'SEGMENT20', ccid.segment20
7688                             ,'SEGMENT21', ccid.segment21, 'SEGMENT22', ccid.segment22
7689                             ,'SEGMENT23', ccid.segment23, 'SEGMENT24', ccid.segment24
7690                             ,'SEGMENT25', ccid.segment25, 'SEGMENT26', ccid.segment26
7691                             ,'SEGMENT27', ccid.segment27, 'SEGMENT28', ccid.segment28
7692                             ,'SEGMENT29', ccid.segment29, 'SEGMENT30', ccid.segment30, NULL)
7693                     ,decode(res.balancing_type, C_FUN_INTRA, C_LINE_TYPE_IC_BAL_INTRA,
7694                                                 C_LINE_TYPE_IC_BAL_INTER)
7695                     ,l.balance_type_code
7696             FROM    fun_bal_results_gt     res
7697                     ,xla_validation_lines_gt l
7698                     ,gl_code_combinations   ccid
7699                     ,fnd_currencies fcu
7700             WHERE   l.ae_line_num           = l.max_ae_line_num
7701               AND   l.ae_header_id          = res.group_id
7702               AND   ccid.code_combination_id= res.ccid
7703 	      AND   res.group_id > 0
7704               AND   res.entered_currency_code = fcu.currency_code;
7705 
7706       l_count := SQL%ROWCOUNT;
7707       g_new_line_count := g_new_line_count + l_count;
7708 
7709 
7710 
7711     IF (C_LEVEL_EVENT >= g_log_level) THEN
7712       trace(p_msg    => '# non-reversal rows created by intercompany API  = '||SQL%ROWCOUNT,
7713             p_module => l_log_module,
7714             p_level  => C_LEVEL_EVENT);
7715     END IF;
7716 
7717 
7718 
7719     INSERT INTO xla_validation_lines_gt(
7720                      ae_header_id
7721                     ,ae_line_num
7722                     ,displayed_line_number
7723                     ,max_ae_line_num
7724                     ,max_displayed_line_number
7725                     ,ledger_id
7726                     ,event_id
7727                     ,entity_id
7728                     ,accounting_date
7729                     ,entered_currency_mau
7730                     ,code_combination_id
7731                     ,entered_currency_code
7732                     ,currency_conversion_date
7733                     ,currency_conversion_rate
7734                     ,currency_conversion_type
7735                     ,entered_cr
7736                     ,entered_dr
7737                     ,accounted_cr
7738                     ,accounted_dr
7739                     ,unrounded_entered_cr
7740                     ,unrounded_entered_dr
7741                     ,unrounded_accounted_cr
7742                     ,unrounded_accounted_dr
7743                     ,bal_seg_value
7744                     ,mgt_seg_value
7745                     ,balancing_line_type
7746                     ,balance_type_code)
7747             SELECT    /*+ LEADING(RES) USE_NL(L)*/ res.group_id * -1
7748                     ,l.max_ae_line_num
7749                     ,l.max_displayed_line_number
7750                     ,l.max_ae_line_num
7751                     ,l.max_displayed_line_number
7752                     ,g_ledger_id
7753                     ,l.event_id
7754                     ,l.entity_id
7755                     ,l.accounting_date
7756                     ,nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
7757                     ,res.ccid
7758                     ,res.entered_currency_code
7759                     ,res.exchange_date
7760                     ,res.exchange_rate
7761                     ,res.exchange_rate_type
7762                     ,ROUND(res.entered_amt_dr /(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))+l_rounding_offset)*(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))
7763 		    ,ROUND(res.entered_amt_cr /(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))+l_rounding_offset)*(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))
7764                     --,ROUND(res.entered_amt_dr /(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))+l_rounding_offset)*(nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision)))
7765                     ,ROUND(res.accounted_amt_dr /l_mau+l_rounding_offset)*l_mau
7766 		    ,ROUND(res.accounted_amt_cr /l_mau+l_rounding_offset)*l_mau
7767                     --,ROUND(res.accounted_amt_dr /l_mau+l_rounding_offset)*l_mau
7768                     ,res.entered_amt_dr
7769 		    ,res.entered_amt_cr
7770                     --,res.entered_amt_dr
7771 		    ,res.accounted_amt_dr
7772                     ,res.accounted_amt_cr
7773                     --,res.accounted_amt_dr
7774                     ,res.bal_seg_val
7775                     ,decode(g_mgt_seg_column_name
7776                             ,'SEGMENT1', ccid.segment1, 'SEGMENT2', ccid.segment2
7777                             ,'SEGMENT3', ccid.segment3, 'SEGMENT4', ccid.segment4
7778                             ,'SEGMENT5', ccid.segment5, 'SEGMENT6', ccid.segment6
7779                             ,'SEGMENT7', ccid.segment7, 'SEGMENT8', ccid.segment8
7780                             ,'SEGMENT9', ccid.segment9, 'SEGMENT10', ccid.segment10
7781                             ,'SEGMENT11', ccid.segment11, 'SEGMENT12', ccid.segment12
7782                             ,'SEGMENT13', ccid.segment13, 'SEGMENT14', ccid.segment14
7783                             ,'SEGMENT15', ccid.segment15, 'SEGMENT16', ccid.segment16
7784                             ,'SEGMENT17', ccid.segment17, 'SEGMENT18', ccid.segment18
7785                             ,'SEGMENT19', ccid.segment19, 'SEGMENT20', ccid.segment20
7786                             ,'SEGMENT21', ccid.segment21, 'SEGMENT22', ccid.segment22
7787                             ,'SEGMENT23', ccid.segment23, 'SEGMENT24', ccid.segment24
7788                             ,'SEGMENT25', ccid.segment25, 'SEGMENT26', ccid.segment26
7789                             ,'SEGMENT27', ccid.segment27, 'SEGMENT28', ccid.segment28
7790                             ,'SEGMENT29', ccid.segment29, 'SEGMENT30', ccid.segment30, NULL)
7791                     ,decode(res.balancing_type, C_FUN_INTRA, C_LINE_TYPE_IC_BAL_INTRA,
7792                                                 C_LINE_TYPE_IC_BAL_INTER)
7793                     ,l.balance_type_code
7794             FROM     fun_bal_results_gt     res
7795                     ,xla_validation_lines_gt l
7796                     ,gl_code_combinations   ccid
7797                     ,fnd_currencies fcu
7798             WHERE   l.ae_line_num           = l.max_ae_line_num
7799 	      AND   l.balancing_line_type NOT IN (C_LINE_TYPE_IC_BAL_INTRA, C_LINE_TYPE_IC_BAL_INTER)
7800               AND   l.ae_header_id          = res.group_id * -1
7801               AND   ccid.code_combination_id= res.ccid
7802               AND   res.entered_currency_code = fcu.currency_code
7803 	      AND   res.group_id < 0;
7804 
7805 
7806 
7807     l_count := SQL%ROWCOUNT;
7808     g_new_line_count := g_new_line_count + l_count;
7809 
7810     IF (C_LEVEL_EVENT >= g_log_level) THEN
7811       trace(p_msg    => '# reversal rows created by intercompany API  = '||SQL%ROWCOUNT,
7812             p_module => l_log_module,
7813             p_level  => C_LEVEL_EVENT);
7814     END IF;
7815 
7816 
7817   END IF;
7818 
7819   --
7820   -- Mark error entries
7821   --
7822   IF (l_err_count>0) THEN
7823     /* Commented out for bug 7128871
7824        Exhausted Undo Tablespace when a single header has many lines.
7825 
7826     FORALL j IN 1..l_err_count
7827       UPDATE /*+ INDEX (XLA_VALIDATION_LINES_GT,XLA_VALIDATION_LINES_GT_N2)
7828              XLA_VALIDATION_LINES_GT
7829          SET balancing_line_type = C_LINE_TYPE_COMPLETE
7830        WHERE ae_header_id = l_err_hdr_ids(j); */
7831 
7832     --
7833     -- Bug 7128871
7834     --   Retrieve distinct ae header ids not to update redundant lines.
7835     --
7836 
7837     FOR i IN 1..l_err_count LOOP
7838       IF NOT l_distinct_hdr_ids.EXISTS(l_err_hdr_ids(i)) THEN
7839          l_distinct_hdr_ids(l_err_hdr_ids(i)) := l_err_hdr_ids(i);
7840       END IF;
7841     END LOOP;
7842     --
7843     -- Bug 7128871
7844     --   Update xla_validation_lines_gt for distinct ae header ids.
7845     --   As indices of l_dinstinct_hdr_ids are not consecutive,
7846     --   need to use "INDICES OF".
7847     --
7848     FORALL i IN INDICES OF l_distinct_hdr_ids
7849       UPDATE  /*+ INDEX (XLA_VALIDATION_LINES_GT,XLA_VALIDATION_LINES_GT_N2)
7850 */ XLA_VALIDATION_LINES_GT
7851          SET balancing_line_type = C_LINE_TYPE_COMPLETE
7852        WHERE ae_header_id = l_distinct_hdr_ids(i);
7853 
7854     IF (C_LEVEL_EVENT >= g_log_level) THEN
7855       trace(p_msg    => '# rows updated with C_LINE_TYPE_COMPLETE: '||SQL%ROWCOUNT,
7856             p_module => l_log_module,
7857             p_level  => C_LEVEL_EVENT);
7858     END IF;
7859   END IF;
7860 
7861   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
7862     trace(p_msg    => 'End of function balance_by_intercompany',
7863           p_module => l_log_module,
7864           p_level  => C_LEVEL_PROCEDURE);
7865   END IF;
7866 
7867 
7868 EXCEPTION
7869 WHEN xla_exceptions_pkg.application_exception THEN
7870   IF (c_bal%ISOPEN) THEN
7871     CLOSE c_bal;
7872   END IF;
7873   RAISE;
7874 
7875 WHEN OTHERS THEN
7876   IF (c_bal%ISOPEN) THEN
7877     CLOSE c_bal;
7878   END IF;
7879   xla_exceptions_pkg.raise_message
7880       (p_location => 'xla_je_validation_pkg.balance_by_intercompany');
7881 END;
7882 --=============================================================================
7883 --
7884 -- Name: populate_missing_ccid
7885 -- Description: This function will call FND routine to create missing CCID for
7886 --              those entries created by the balancing routines.
7887 -- Result:
7888 --      0 - all missing CCID are created successfully
7889 --      1 - error is encounted when calling the FND routine to create CCID
7890 --
7891 --=============================================================================
7892 PROCEDURE populate_missing_ccid
7893   (p_err_count                  IN OUT NOCOPY INTEGER
7894   ,p_err_hdr_ids                IN OUT NOCOPY t_array_int)
7895 IS
7896   l_seg                         FND_FLEX_EXT.SegmentArray;
7897   l_result                      INTEGER;
7898   l_ccids                       t_array_int;
7899   l_reference3s                 t_array_varchar30;
7900   l_num_segments                INTEGER;
7901   l_counter                     INTEGER;
7902   i                             INTEGER := 1;
7903   j                             INTEGER;
7904 
7905   l_bal_type_codes              t_array_varchar30;
7906   l_bal_seg_values              t_array_varchar30;
7907   l_mgt_seg_values              t_array_varchar30;
7908   l_bal_seg_number              INTEGER;
7909   l_mgt_seg_number              INTEGER;
7910 
7911   l_log_module                  VARCHAR2(240);
7912 
7913   CURSOR c_ccid IS
7914     SELECT t.bal_seg_value
7915           ,t.balance_type_code       -- 4458381
7916           ,min(t.accounting_date) accounting_date
7917       FROM xla_validation_lines_gt t
7918      WHERE balancing_line_type IN (C_LINE_TYPE_XLA_BALANCING
7919                                   ,C_LINE_TYPE_ENC_BALANCING)
7920        AND t.code_combination_id IS NULL
7921        AND ((g_res_encumb_ccid IS NOT NULL AND t.balance_type_code = 'E') OR
7922             (g_sla_entered_cur_bal_sus_ccid IS NOT NULL AND t.balance_type_code = 'A'))
7923      GROUP BY  t.bal_seg_value, t.balance_type_code;
7924 
7925   CURSOR c_errors IS
7926     SELECT entity_id
7927           ,event_id
7928           ,ae_header_id
7929       FROM xla_validation_lines_gt
7930      WHERE balancing_line_type IN (C_LINE_TYPE_XLA_BALANCING
7931                                   ,C_LINE_TYPE_ENC_BALANCING)
7932        AND code_combination_id < 0
7933      GROUP BY entity_id, event_id, ae_header_id;
7934 
7935   CURSOR c_seg_number (p_seg_col_name VARCHAR2, p_coa_id INTEGER) IS
7936     SELECT      display_order
7937     FROM        (SELECT ROWNUM display_order, application_column_name
7938                  FROM ( SELECT application_column_name
7939                         FROM   FND_ID_FLEX_SEGMENTS_VL
7940                         WHERE  ID_FLEX_NUM    = p_coa_id
7941                         AND    ID_FLEX_CODE   = 'GL#'
7942                         AND    APPLICATION_ID = 101
7943                         order by decode(enabled_flag, 'Y', 1, 'N', 2), segment_num))
7944     WHERE       application_column_name = p_seg_col_name;
7945 
7946   CURSOR c_ref3 (p_ccid INTEGER) IS
7947     SELECT reference3
7948       FROM gl_code_combinations
7949      WHERE code_combination_id = p_ccid;
7950 
7951 BEGIN
7952   IF g_log_enabled THEN
7953     l_log_module := C_DEFAULT_MODULE||'.populate_missing_ccid';
7954   END IF;
7955 
7956   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
7957     trace(p_msg    => 'BEGIN of function populate_missing_ccid',
7958           p_module => l_log_module,
7959           p_level  => C_LEVEL_PROCEDURE);
7960   END IF;
7961 
7962   l_result := 0;
7963 
7964   IF (C_LEVEL_EVENT >= g_log_level) THEN
7965     trace(p_msg    => 'BEGIN LOOP - populate missing ccid',
7966           p_module => l_log_module,
7967           p_level  => C_LEVEL_EVENT);
7968   END IF;
7969 
7970   FOR l_ccid IN c_ccid LOOP
7971 
7972     IF (C_LEVEL_EVENT >= g_log_level) THEN
7973       trace(p_msg    => 'LOOP - populate missing ccid: bal_seg_value = '||l_ccid.bal_seg_value||
7974                         ', balance_type_code = '||l_ccid.balance_type_code,
7975             p_module => l_log_module,
7976             p_level  => C_LEVEL_EVENT);
7977     END IF;
7978 
7979     l_bal_seg_values(i) := l_ccid.bal_seg_value;
7980     l_bal_type_codes(i) := l_ccid.balance_type_code;
7981 
7982     IF (C_LEVEL_EVENT >= g_log_level) THEN
7983       trace(p_msg    => 'g_ledger_coa_id = '||g_ledger_coa_id||
7984                         ', balance_type_code = '||l_ccid.balance_type_code||
7985                         ', g_res_encumb_ccid = '||g_res_encumb_ccid||
7986                         ', g_sla_entered_cur_bal_sus_ccid = '||g_sla_entered_cur_bal_sus_ccid,
7987             p_module => l_log_module,
7988             p_level  => C_LEVEL_EVENT);
7989     END IF;
7990 
7991     IF ( FND_FLEX_EXT.get_segments(
7992                 application_short_name  => 'SQLGL',
7993                 key_flex_code           => 'GL#',
7994                 structure_number        => g_ledger_coa_id,
7995                 combination_id          => CASE l_ccid.balance_type_code  -- 4458381
7996                                                 WHEN 'E' THEN g_res_encumb_ccid
7997                                                 ELSE g_sla_entered_cur_bal_sus_ccid END,
7998                 n_segments              => l_num_segments,
7999                 segments                => l_seg) = FALSE) THEN
8000       IF (C_LEVEL_ERROR >= g_log_level) THEN
8001         trace(p_msg    => 'FND_FLEX_EXT.get_segments failed',
8002               p_module => l_log_module,
8003               p_level  => C_LEVEL_ERROR);
8004       END IF;
8005 
8006       l_ccids(i)          := -1;
8007       l_mgt_seg_values(i) := NULL;
8008       l_result            := 1;
8009     ELSE
8010       OPEN c_seg_number(g_bal_seg_column_name, g_ledger_coa_id);
8011       FETCH c_seg_number INTO l_bal_seg_number;
8012       CLOSE c_seg_number;
8013 
8014       l_seg(l_bal_seg_number) := l_ccid.bal_seg_value;
8015       IF (FND_FLEX_EXT.get_combination_id(
8016                         application_short_name       => 'SQLGL',
8017                         key_flex_code                => 'GL#',
8018                         structure_number             => g_ledger_coa_id,
8019                         validation_date              => l_ccid.accounting_date,
8020                         n_segments                   => l_num_segments,
8021                         segments                     => l_seg,
8022                         combination_id               => l_ccids(i)) = FALSE) THEN
8023         IF (C_LEVEL_ERROR >= g_log_level) THEN
8024           trace(p_msg    => 'XLA_INTERNAL_ERROR : Cannot get valid Code Combination ID',
8025                 p_module => l_log_module,
8026                 p_level  => C_LEVEL_ERROR);
8027           trace(p_msg    => 'Error: '||fnd_message.get,
8028                 p_module => l_log_module,
8029                 p_level  => C_LEVEL_ERROR);
8030           trace(p_msg    => 'accounting_date = '||l_ccid.accounting_date,
8031                 p_module => l_log_module,
8032                 p_level  => C_LEVEL_ERROR);
8033           trace(p_msg    => 'num_segs = '||l_num_segments,
8034                 p_module => l_log_module,
8035                 p_level  => C_LEVEL_ERROR);
8036           FOR i IN 1..l_num_segments LOOP
8037             trace(p_msg    => 'seg('||i||') = '||l_seg(i),
8038                   p_module => l_log_module,
8039                   p_level  => C_LEVEL_ERROR);
8040           END LOOP;
8041         END IF;
8042 
8043         l_ccids(i)          := -1;
8044         l_mgt_seg_values(i) := NULL;
8045         l_reference3s(i)    := 'N';
8046         l_result            := 1;
8047       ELSE
8048         IF (g_mgt_seg_column_name IS NULL) THEN
8049           l_mgt_seg_values(i) := NULL;
8050         ELSIF (g_mgt_seg_column_name = g_bal_seg_column_name) THEN
8051           l_mgt_seg_values(i) := l_ccid.bal_seg_value;
8052         ELSE
8053           OPEN c_seg_number(g_mgt_seg_column_name, g_ledger_coa_id);
8054           FETCH c_seg_number INTO l_mgt_seg_number;
8055           CLOSE c_seg_number;
8056 
8057           l_mgt_seg_values(i) := l_seg(l_mgt_seg_number);
8058         END IF;
8059 
8060         OPEN c_ref3(l_ccids(i));
8061         FETCH c_ref3 INTO l_reference3s(i);
8062         CLOSE c_ref3;
8063       END IF;
8064     END IF;
8065 
8066     i := i+1;
8067   END LOOP;
8068 
8069   IF (C_LEVEL_EVENT >= g_log_level) THEN
8070     trace(p_msg    => 'END LOOP - populate missing ccid: i = '||i,
8071           p_module => l_log_module,
8072           p_level  => C_LEVEL_EVENT);
8073   END IF;
8074 
8075   j := i-1;
8076 
8077   IF (C_LEVEL_EVENT >= g_log_level) THEN
8078     trace(p_msg    => 'j = '||j,
8079           p_module => l_log_module,
8080           p_level  => C_LEVEL_EVENT);
8081   END IF;
8082 
8083   FOR i IN 1..j LOOP
8084     IF (C_LEVEL_EVENT >= g_log_level) THEN
8085       trace(p_msg    => 'l_ccid = '||l_ccids(i),
8086             p_module => l_log_module,
8087             p_level  => C_LEVEL_EVENT);
8088     END IF;
8089     IF (C_LEVEL_EVENT >= g_log_level) THEN
8090       trace(p_msg    => 'l_mgt_seg_values = '||l_mgt_seg_values(i),
8091             p_module => l_log_module,
8092             p_level  => C_LEVEL_EVENT);
8093     END IF;
8094     IF (C_LEVEL_EVENT >= g_log_level) THEN
8095       trace(p_msg    => 'l_bal_seg_values = '||l_bal_seg_values(i),
8096             p_module => l_log_module,
8097             p_level  => C_LEVEL_EVENT);
8098     END IF;
8099     IF (C_LEVEL_EVENT >= g_log_level) THEN
8100       trace(p_msg    => 'l_bal_type_codes = '||l_bal_type_codes(i),
8101             p_module => l_log_module,
8102             p_level  => C_LEVEL_EVENT);
8103     END IF;
8104   END LOOP;
8105 
8106   FORALL i IN 1..j
8107     UPDATE   xla_validation_lines_gt t
8108        SET   code_combination_id     = l_ccids(i)
8109             ,control_account_enabled_flag = l_reference3s(i)
8110             ,mgt_seg_value           = l_mgt_seg_values(i)
8111      WHERE   t.bal_seg_value         = l_bal_seg_values(i)
8112        AND   t.balance_type_code     = l_bal_type_codes(i) -- 4458381
8113        AND   t.code_combination_id   IS NULL;
8114 
8115   IF (C_LEVEL_EVENT >= g_log_level) THEN
8116     trace(p_msg    => '# rows updated for filled for missing ccid = '||SQL%ROWCOUNT,
8117           p_module => l_log_module,
8118           p_level  => C_LEVEL_EVENT);
8119   END IF;
8120 
8121   IF (l_result = 1) THEN
8122 
8123     IF (C_LEVEL_EVENT >= g_log_level) THEN
8124       trace(p_msg    => 'BEGIN LOOP - fill in missing ccid error',
8125             p_module => l_log_module,
8126             p_level  => C_LEVEL_EVENT);
8127     END IF;
8128 
8129     FOR l_err IN c_errors LOOP
8130 
8131       IF (C_LEVEL_ERROR >= g_log_level) THEN
8132         trace(p_msg    => 'LOOP - fill in missing ccid error: l_ae_header_id = '||l_err.ae_header_id,
8133               p_module => l_log_module,
8134               p_level  => C_LEVEL_ERROR);
8135       END IF;
8136 
8137       g_err_count := g_err_count + 1;
8138       g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
8139       g_err_event_ids(g_err_count) := l_err.event_id;
8140 
8141       p_err_count := p_err_count + 1;
8142       p_err_hdr_ids(p_err_count) := l_err.ae_header_id;
8143 
8144       xla_accounting_err_pkg.build_message(
8145                  p_appli_s_name         => 'XLA'
8146                 ,p_msg_name             => 'XLA_INTERNAL_ERROR'
8147                 ,p_token_1              => 'MESSAGE'
8148                 ,p_value_1              => 'Cannot get valid code combination id'
8149                 ,p_token_2              => 'LOCATION'
8150                 ,p_value_2              => 'XLA_JE_VALIDATION_PKG.populate_missing_ccid'
8151                 ,p_entity_id            => l_err.entity_id
8152                 ,p_event_id             => l_err.event_id
8153                 ,p_ledger_id            => g_ledger_id
8154                 ,p_ae_header_id         => l_err.ae_header_id
8155                 ,p_ae_line_num          => NULL
8156                 ,p_accounting_batch_id  => NULL);
8157     END LOOP;
8158 
8159     IF (C_LEVEL_EVENT >= g_log_level) THEN
8160       trace(p_msg    => 'END LOOP - fill in missing ccid error',
8161             p_module => l_log_module,
8162             p_level  => C_LEVEL_EVENT);
8163     END IF;
8164 
8165   END IF;
8166 
8167   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
8168     trace(p_msg    => 'End of function populate_missing_ccid',
8169           p_module => l_log_module,
8170           p_level  => C_LEVEL_PROCEDURE);
8171   END IF;
8172 EXCEPTION
8173 WHEN xla_exceptions_pkg.application_exception THEN
8174   IF (c_ccid%ISOPEN) THEN
8175     CLOSE c_ccid;
8176   END IF;
8177   IF (c_seg_number%ISOPEN) THEN
8178     CLOSE c_seg_number;
8179   END IF;
8180   IF (c_errors%ISOPEN) THEN
8181     CLOSE c_errors;
8182   END IF;
8183   RAISE;
8184 
8185 WHEN OTHERS THEN
8186   IF (c_ccid%ISOPEN) THEN
8187     CLOSE c_ccid;
8188   END IF;
8189   IF (c_seg_number%ISOPEN) THEN
8190     CLOSE c_seg_number;
8191   END IF;
8192   IF (c_errors%ISOPEN) THEN
8193     CLOSE c_errors;
8194   END IF;
8195   xla_exceptions_pkg.raise_message
8196       (p_location => 'xla_je_validation_pkg.populate_missing_ccid');
8197 END;
8198 
8199 --=============================================================================
8200 --
8201 -- Name: balance_by_entered_curr
8202 -- Description: This function creates new entries to the xla temporary
8203 --              balancing table that will balance the journal entry by entered
8204 --              currency and balancing segment.  It will then determine the
8205 --              ccid for the suspense account that will be used by the new
8206 --              entries.  If the ccid is not already exists, it will call
8207 --              the FND routine to generate a new CCID.
8208 -- Return:
8209 --      0 - completed successfully
8210 --      1 - error is detected
8211 --
8212 --=============================================================================
8213 PROCEDURE balance_by_entered_curr
8214 IS
8215   l_count               INTEGER;
8216 
8217   l_bal_hdr_ids         t_array_int;
8218   l_bal_ent_currs       t_array_varchar30;
8219   l_bal_bal_segs        t_array_varchar30;
8220   l_bal_enc_ids         t_array_int;
8221   l_err_hdr_ids         t_array_int;
8222   l_err_count           INTEGER := 0;
8223   j                     INTEGER;
8224   l_log_module          VARCHAR2(240);
8225   l_rounding_offset     NUMBER;
8226   l_rounding_rule_code  VARCHAR2(30);
8227   l_mau                 NUMBER;
8228 
8229   l_already_bal_hdr_ids         t_array_int;            -- bug7210785
8230   l_already_bal_ent_currs       t_array_varchar30;      -- bug7210785
8231   --Added for bug 12710754
8232   l_bal_seg_value               t_array_varchar30;
8233 
8234 
8235   CURSOR c_no_sus_ccid IS
8236     SELECT entity_id, event_id, ae_header_id, balance_type_code
8237       FROM xla_validation_lines_gt
8238      WHERE balancing_line_type = C_LINE_TYPE_XLA_BALANCING
8239        AND balance_type_code = 'A'
8240      GROUP BY entity_id, event_id, ae_header_id, balance_type_code;
8241 
8242 BEGIN
8243 
8244   IF g_log_enabled THEN
8245     l_log_module := C_DEFAULT_MODULE||'.balance_by_entered_curr';
8246   END IF;
8247 
8248   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
8249     trace(p_msg    => 'BEGIN of function balance_by_entered_curr',
8250           p_module => l_log_module,
8251           p_level  => C_LEVEL_PROCEDURE);
8252   END IF;
8253 
8254   IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
8255     l_mau:= xla_accounting_cache_pkg.GetValueNum(
8256                            p_source_code        => 'XLA_CURRENCY_MAU'
8257                          , p_target_ledger_id   => g_ledger_id);
8258     l_rounding_rule_code :=xla_accounting_cache_pkg.GetValueChar(
8259                            p_source_code        => 'XLA_ROUNDING_RULE_CODE'
8260                          , p_target_ledger_id   => g_ledger_id
8261                          );
8262   ELSE
8263     SELECT nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
8264           ,xlo.rounding_rule_code
8265     INTO   l_mau, l_rounding_rule_code
8266     FROM   xla_ledger_options     xlo
8267           ,gl_ledgers             gl
8268           ,fnd_currencies         fcu
8269     WHERE xlo.application_id = g_application_id
8270       AND xlo.ledger_id = g_trx_ledger_id
8271       AND gl.ledger_id = g_ledger_id
8272       AND fcu.currency_code = gl.currency_code;
8273   END IF;
8274 
8275   IF (C_LEVEL_EVENT >= g_log_level) THEN
8276     trace(p_msg    => 'l_rounding_rule_code = '||l_rounding_rule_code,
8277           p_module => l_log_module,
8278           p_level  => C_LEVEL_EVENT);
8279   END IF;
8280 
8281   IF l_rounding_rule_code = 'NEAREST' THEN
8282     l_rounding_offset := 0;
8283   ELSIF l_rounding_rule_code = 'UP' THEN
8284     l_rounding_offset := .5-power(10, -30);
8285   ELSIF l_rounding_rule_code = 'DOWN' THEN
8286     l_rounding_offset := -(.5-power(10, -30));
8287   ELSE
8288     l_rounding_offset := 0;
8289   END IF;
8290 
8291   IF (C_LEVEL_EVENT >= g_log_level) THEN
8292     trace(p_msg    => 'l_rounding_offset = '||l_rounding_offset,
8293           p_module => l_log_module,
8294           p_level  => C_LEVEL_EVENT);
8295   END IF;
8296 
8297   SELECT ae_header_id, bal_seg_value, entered_currency_code, encumbrance_type_id
8298     BULK COLLECT INTO l_bal_hdr_ids, l_bal_bal_segs, l_bal_ent_currs, l_bal_enc_ids
8299     FROM xla_validation_lines_gt t
8300    WHERE balance_type_code not in('E','B')
8301      AND entered_currency_code <> 'STAT'
8302      AND balancing_line_type in (C_LINE_TYPE_PROCESS,
8303                                  C_LINE_TYPE_IC_BAL_INTER,
8304                                  C_LINE_TYPE_IC_BAL_INTRA)
8305    GROUP BY ae_header_id, entered_currency_mau, bal_seg_value, entered_currency_code, encumbrance_type_id
8306   HAVING decode(l_rounding_rule_code
8307                ,'NEAREST' ,ROUND(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)
8308                ,'UP'      ,CEIL(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)
8309                           ,FLOOR(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)) <>
8310          decode(l_rounding_rule_code
8311                ,'NEAREST' ,ROUND(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau)
8312                ,'UP'      ,CEIL(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau)
8313                           ,FLOOR(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau));
8314 
8315 
8316   IF (C_LEVEL_EVENT >= g_log_level) THEN
8317     trace(p_msg    => '# un-balanced header(1) = '||l_bal_hdr_ids.COUNT,
8318           p_module => l_log_module,
8319           p_level  => C_LEVEL_EVENT);
8320   END IF;
8321 
8322   IF (l_bal_hdr_ids.COUNT > 0) THEN
8323 
8324 	-- bug7210785 start:
8325 	-- out of the headers that need entered currency balancing, find the headers that have
8326 	-- currencies already balanced in entered amounts but not in accounted amounts.
8327 
8328 	-- Added balancing segment value in select clause and group by clause for bug 12710754
8329 
8330                   SELECT DISTINCT xvl.ae_header_id, xvl.bal_seg_value, xvl.entered_currency_code
8331 		  BULK COLLECT INTO l_already_bal_hdr_ids, l_bal_seg_value, l_already_bal_ent_currs
8332 		  FROM xla_validation_lines_gt xvl
8333                   WHERE xvl.ae_header_id IN (
8334 
8335 						  SELECT t.ae_header_id
8336 						    FROM xla_validation_lines_gt t
8337 						   WHERE t.balance_type_code not in('E','B')
8338 						     AND t.entered_currency_code <> 'STAT'
8339 						     AND t.balancing_line_type in (C_LINE_TYPE_PROCESS,
8340 										 C_LINE_TYPE_IC_BAL_INTER,
8341 										 C_LINE_TYPE_IC_BAL_INTRA)
8342 						   GROUP BY t.ae_header_id, t.entered_currency_mau, t.bal_seg_value, t.entered_currency_code, t.encumbrance_type_id
8343 						  HAVING decode(l_rounding_rule_code
8344 							       ,'NEAREST' ,ROUND(sum(nvl(t.unrounded_entered_cr,0))/t.entered_currency_mau)
8345 							       ,'UP'      ,CEIL(sum(nvl(t.unrounded_entered_cr,0))/t.entered_currency_mau)
8346 									  ,FLOOR(sum(nvl(t.unrounded_entered_cr,0))/t.entered_currency_mau)) <>
8347 							 decode(l_rounding_rule_code
8348 							       ,'NEAREST' ,ROUND(sum(nvl(t.unrounded_entered_dr,0))/t.entered_currency_mau)
8349 							       ,'UP'      ,CEIL(sum(nvl(t.unrounded_entered_dr,0))/t.entered_currency_mau)
8350 									  ,FLOOR(sum(nvl(t.unrounded_entered_dr,0))/t.entered_currency_mau))
8351 					    )
8352 		  AND  xvl.entered_currency_code <> 'STAT' -- added for bug#10166812
8353 		  GROUP BY xvl.ae_header_id, xvl.entered_currency_mau, xvl.bal_seg_value, xvl.entered_currency_code
8354 		  HAVING    decode(l_rounding_rule_code
8355 				    ,'NEAREST' ,ROUND(sum(nvl(xvl.unrounded_entered_cr,0))/xvl.entered_currency_mau)
8356 				    ,'UP'      ,CEIL(sum(nvl(xvl.unrounded_entered_cr,0))/xvl.entered_currency_mau)
8357 			           ,FLOOR(sum(nvl(xvl.unrounded_entered_cr,0))/xvl.entered_currency_mau)) =
8358 			     decode(l_rounding_rule_code
8359 				    ,'NEAREST' ,ROUND(sum(nvl(xvl.unrounded_entered_dr,0))/xvl.entered_currency_mau)
8360                                     ,'UP'      ,CEIL(sum(nvl(xvl.unrounded_entered_dr,0))/xvl.entered_currency_mau)
8361                                     ,FLOOR(sum(nvl(xvl.unrounded_entered_dr,0))/xvl.entered_currency_mau))
8362                         AND  decode(l_rounding_rule_code
8363                                     ,'NEAREST' ,ROUND(sum(nvl(xvl.unrounded_accounted_cr,0))/l_mau)*l_mau
8364                                     ,'UP' ,CEIL(sum(nvl(xvl.unrounded_accounted_cr,0))/l_mau)*l_mau
8365                                     ,FLOOR(sum(nvl(xvl.unrounded_accounted_cr,0))/l_mau)*l_mau) <>
8366                              decode(l_rounding_rule_code
8367                                     ,'NEAREST' ,ROUND(sum(nvl(xvl.unrounded_accounted_dr,0))/l_mau)*l_mau
8368                                     ,'UP',CEIL(sum(nvl(xvl.unrounded_accounted_dr,0))/l_mau)*l_mau
8369                                     ,FLOOR(sum(nvl(xvl.unrounded_accounted_dr,0))/l_mau)*l_mau);
8370 
8371 
8372 	      IF (C_LEVEL_EVENT >= g_log_level) THEN
8373 		trace(p_msg    => '# un-balanced header(2) = '||l_already_bal_hdr_ids.COUNT,
8374 			p_module => l_log_module,
8375 			 p_level  => C_LEVEL_EVENT);
8376 	      END IF;
8377 
8378 	  -- bug7210785 end
8379 
8380     --
8381     -- Note: Debit and Credit line are created by using two insert statement
8382     -- to prevent the 0 amount lines from being created
8383     --
8384     /* bug 9127520 start, for all commented out then replaced below
8385 
8386     FORALL i IN 1..l_bal_hdr_ids.COUNT
8387           INSERT INTO xla_validation_lines_gt
8388             (balancing_line_type
8389             ,ledger_id
8390             ,ae_header_id
8391             ,max_ae_line_num
8392             ,max_displayed_line_number
8393             ,ae_line_num
8394             ,displayed_line_number
8395             ,event_id
8396             ,entity_id
8397             ,balance_type_code
8398             ,accounting_date
8399             ,entered_currency_code
8400             ,unrounded_entered_dr
8401             ,entered_dr
8402             ,unrounded_accounted_dr
8403             ,accounted_dr
8404             ,unrounded_entered_cr
8405             ,entered_cr
8406             ,unrounded_accounted_cr
8407             ,accounted_cr
8408             ,bal_seg_value
8409             ,code_combination_id
8410             ,encumbrance_type_id
8411             ,party_type_code
8412             ,party_id
8413             ,party_site_id
8414             ,error_flag)
8415       SELECT C_LINE_TYPE_XLA_BALANCING
8416             ,g_ledger_id
8417             ,l_bal_hdr_ids(i)
8418             ,t.max_ae_line_num
8419             ,t.max_displayed_line_number
8420             ,t.max_ae_line_num
8421             ,t.max_displayed_line_number
8422             ,t.event_id
8423             ,t.entity_id
8424             ,t.balance_type_code
8425             ,t.accounting_date
8426             ,t.entered_currency_code
8427             ,CASE
8428                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8429                     sum(nvl(unrounded_entered_cr,0))
8430              END
8431             ,CASE
8432                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8433                     decode(l_rounding_rule_code
8434                           ,'NEAREST'
8435                           ,ROUND(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
8436                           ,'UP'
8437                           ,CEIL(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
8438                           ,FLOOR(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau)
8439              END
8440             ,CASE
8441                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8442                     sum(nvl(unrounded_accounted_cr,0))
8443              END
8444             ,CASE
8445                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8446                     decode(l_rounding_rule_code
8447                           ,'NEAREST'
8448                           ,ROUND(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
8449                           ,'UP'
8450                           ,CEIL(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
8451                           ,FLOOR(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau)
8452             END
8453            ,CASE
8454               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8455                    sum(nvl(unrounded_entered_dr,0))
8456             END  -- unrounded_entered_cr
8457            ,CASE
8458               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8459                    decode(l_rounding_rule_code
8460                          ,'NEAREST'
8461                          ,ROUND(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
8462                          ,'UP'
8463                          ,CEIL(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
8464                          ,FLOOR(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau)
8465             END  -- entered_cr
8466            ,CASE
8467               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8468                    sum(nvl(unrounded_accounted_dr,0))
8469             END  -- unrounded_accounted_cr
8470            ,CASE
8471               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8472                    decode(l_rounding_rule_code
8473                          ,'NEAREST'
8474                          ,ROUND(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
8475                          ,'UP'
8476                          ,CEIL(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
8477                          ,FLOOR(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau)
8478             END  -- accounted_cr
8479            ,t.bal_seg_value
8480            ,-1
8481            ,t.encumbrance_type_id
8482            ,t.party_type_code
8483            ,t.party_id
8484            ,t.party_site_id
8485            ,NULL
8486        FROM xla_validation_lines_gt        t
8487       WHERE ae_header_id = l_bal_hdr_ids(i)
8488         AND entered_currency_code = l_bal_ent_currs(i)
8489         AND bal_seg_value = l_bal_bal_segs(i)
8490         AND NVL(encumbrance_type_id,-99) = NVL(l_bal_enc_ids(i),-99)
8491         AND balancing_line_type IN (C_LINE_TYPE_PROCESS
8492                                    ,C_LINE_TYPE_IC_BAL_INTER
8493                                    ,C_LINE_TYPE_IC_BAL_INTRA)
8494       GROUP BY
8495             t.max_ae_line_num
8496            ,t.max_displayed_line_number
8497            ,t.event_id
8498            ,t.entity_id
8499            ,t.balance_type_code
8500            ,t.bal_seg_value
8501            ,t.entered_currency_code
8502            ,t.accounting_date
8503            ,t.entered_currency_mau
8504            ,t.encumbrance_type_id
8505            ,t.party_type_code
8506            ,t.party_id
8507            ,t.party_site_id
8508             --
8509             -- This has been added to combine two insert statements
8510             -- (for Debit and Credit) - Bug 5279912.
8511             -- Without this, credit and debit lines are merged.
8512             --
8513            ,DECODE(t.unrounded_entered_dr,NULL,'CR','DR')
8514      HAVING sum(nvl(unrounded_accounted_cr,0)) <> 0
8515          OR sum(nvl(unrounded_accounted_dr,0)) <> 0; */
8516 
8517 
8518 	FORALL i IN 1..l_bal_hdr_ids.COUNT
8519           INSERT INTO xla_validation_lines_gt
8520             (balancing_line_type
8521             ,ledger_id
8522             ,ae_header_id
8523             ,max_ae_line_num
8524             ,max_displayed_line_number
8525             ,ae_line_num
8526             ,displayed_line_number
8527             ,event_id
8528             ,entity_id
8529             ,balance_type_code
8530             ,accounting_date
8531             ,entered_currency_code
8532             ,unrounded_entered_dr
8533             ,entered_dr
8534             ,unrounded_accounted_dr
8535             ,accounted_dr
8536             ,unrounded_entered_cr
8537             ,entered_cr
8538             ,unrounded_accounted_cr
8539             ,accounted_cr
8540             ,bal_seg_value
8541             ,code_combination_id
8542             ,encumbrance_type_id
8543             ,party_type_code
8544             ,party_id
8545             ,party_site_id
8546             ,error_flag)
8547       SELECT C_LINE_TYPE_XLA_BALANCING
8548             ,g_ledger_id
8549             ,l_bal_hdr_ids(i)
8550             ,t.max_ae_line_num
8551             ,t.max_displayed_line_number
8552             ,t.max_ae_line_num
8553             ,t.max_displayed_line_number
8554             ,t.event_id
8555             ,t.entity_id
8556             ,t.balance_type_code
8557             ,t.accounting_date
8558             ,t.entered_currency_code
8559             ,CASE
8560                WHEN sum(nvl(unrounded_entered_cr,0)) <> 0 or sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8561                     sum(nvl(unrounded_entered_cr,0))
8562              END
8563             ,CASE
8564                WHEN sum(nvl(unrounded_entered_cr,0)) <> 0 or sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8565                     decode(l_rounding_rule_code
8566                           ,'NEAREST'
8567                           ,ROUND(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
8568                           ,'UP'
8569                           ,CEIL(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
8570                           ,FLOOR(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau)
8571              END
8572             ,CASE
8573                WHEN sum(nvl(unrounded_entered_cr,0)) <> 0 or sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8574                     sum(nvl(unrounded_accounted_cr,0))
8575              END
8576             ,CASE
8577                WHEN sum(nvl(unrounded_entered_cr,0)) <> 0 or sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
8578                     decode(l_rounding_rule_code
8579                           ,'NEAREST'
8580                           ,ROUND(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
8581                           ,'UP'
8582                           ,CEIL(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
8583                           ,FLOOR(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau)
8584             END
8585            ,CASE
8586               WHEN sum(nvl(unrounded_entered_dr,0)) <> 0 or sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8587                    sum(nvl(unrounded_entered_dr,0))
8588             END  -- unrounded_entered_cr
8589            ,CASE
8590               WHEN sum(nvl(unrounded_entered_dr,0)) <> 0 or sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8591                    decode(l_rounding_rule_code
8592                          ,'NEAREST'
8593                          ,ROUND(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
8594                          ,'UP'
8595                          ,CEIL(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
8596                          ,FLOOR(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau)
8597             END  -- entered_cr
8598            ,CASE
8599               WHEN sum(nvl(unrounded_entered_dr,0)) <> 0 or sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8600                    sum(nvl(unrounded_accounted_dr,0))
8601             END  -- unrounded_accounted_cr
8602            ,CASE
8603               WHEN sum(nvl(unrounded_entered_dr,0)) <> 0 or sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
8604                    decode(l_rounding_rule_code
8605                          ,'NEAREST'
8606                          ,ROUND(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
8607                          ,'UP'
8608                          ,CEIL(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
8609                          ,FLOOR(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau)
8610             END  -- accounted_cr
8611            ,t.bal_seg_value
8612            ,-1
8613            ,t.encumbrance_type_id
8614            ,t.party_type_code
8615            ,t.party_id
8616            ,t.party_site_id
8617            ,NULL
8618        FROM xla_validation_lines_gt        t
8619       WHERE ae_header_id = l_bal_hdr_ids(i)
8620         AND entered_currency_code = l_bal_ent_currs(i)
8621         AND bal_seg_value = l_bal_bal_segs(i)
8622         AND NVL(encumbrance_type_id,-99) = NVL(l_bal_enc_ids(i),-99)
8623         AND balancing_line_type IN (C_LINE_TYPE_PROCESS
8624                                    ,C_LINE_TYPE_IC_BAL_INTER
8625                                    ,C_LINE_TYPE_IC_BAL_INTRA)
8626       GROUP BY
8627             t.max_ae_line_num
8628            ,t.max_displayed_line_number
8629            ,t.event_id
8630            ,t.entity_id
8631            ,t.balance_type_code
8632            ,t.bal_seg_value
8633            ,t.entered_currency_code
8634            ,t.accounting_date
8635            ,t.entered_currency_mau
8636            ,t.encumbrance_type_id
8637            ,t.party_type_code
8638            ,t.party_id
8639            ,t.party_site_id
8640             --
8641             -- This has been added to combine two insert statements
8642             -- (for Debit and Credit) - Bug 5279912.
8643             -- Without this, credit and debit lines are merged.
8644             --
8645            ,DECODE(t.unrounded_entered_dr,NULL,'CR','DR')
8646 	HAVING sum(nvl(unrounded_accounted_cr,0)) <> 0
8647          OR sum(nvl(unrounded_accounted_dr,0)) <> 0
8648 	 OR sum(nvl(unrounded_entered_dr,0)) <> 0
8649 	 OR sum(nvl(unrounded_entered_cr,0)) <> 0;
8650 
8651       -- bug 9127520 end
8652 
8653 
8654 
8655     l_count := SQL%ROWCOUNT;
8656     g_new_line_count := g_new_line_count + l_count;
8657 
8658     IF (C_LEVEL_EVENT >= g_log_level) THEN
8659       trace(p_msg    => '# balancing rows created(1) = '||l_count,
8660             p_module => l_log_module,
8661             p_level  => C_LEVEL_EVENT);
8662     END IF;
8663 
8664 
8665 	-- bug7210785 start
8666 
8667 	IF (l_already_bal_hdr_ids.COUNT > 0) THEN
8668 
8669         FORALL i IN 1..l_already_bal_hdr_ids.COUNT
8670           INSERT INTO xla_validation_lines_gt
8671             (balancing_line_type
8672             ,ledger_id
8673             ,ae_header_id
8674             ,max_ae_line_num
8675             ,max_displayed_line_number
8676             ,ae_line_num
8677             ,displayed_line_number
8678             ,event_id
8679             ,entity_id
8680             ,balance_type_code
8681             ,accounting_date
8682             ,entered_currency_code
8683             ,entered_dr
8684             ,entered_cr
8685             ,accounted_dr
8686             ,accounted_cr
8687             ,unrounded_entered_dr
8688             ,unrounded_entered_cr
8689             ,unrounded_accounted_dr
8690             ,unrounded_accounted_cr
8691             ,bal_seg_value
8692             ,code_combination_id
8693             ,encumbrance_type_id
8694             ,party_type_code
8695             ,party_id
8696             ,party_site_id
8697             ,error_flag)
8698       SELECT C_LINE_TYPE_XLA_BALANCING
8699             ,g_ledger_id
8700             ,l_already_bal_hdr_ids(i)
8701             ,t.max_ae_line_num
8702             ,t.max_displayed_line_number
8703             ,t.max_ae_line_num
8704             ,t.max_displayed_line_number
8705             ,t.event_id
8706             ,t.entity_id
8707             ,t.balance_type_code
8708             ,t.accounting_date
8709             ,t.entered_currency_code
8710             ,t.entered_cr
8711             ,t.entered_dr
8712             ,t.accounted_cr
8713             ,t.accounted_dr
8714             ,t.unrounded_entered_cr
8715             ,t.unrounded_entered_dr
8716             ,t.unrounded_accounted_cr
8717             ,t.unrounded_accounted_dr
8718             ,t.bal_seg_value
8719             ,-1
8720             ,t.encumbrance_type_id
8721             ,t.party_type_code
8722             ,t.party_id
8723             ,t.party_site_id
8724             ,NULL
8725        FROM xla_validation_lines_gt  t
8726       WHERE t.ae_header_id = l_already_bal_hdr_ids(i)
8727         AND t.entered_currency_code = l_already_bal_ent_currs(i)
8728 	--Added for 12710754 start
8729 	AND t.bal_seg_value = l_bal_seg_value(i)
8730 	--Added for 12710754 end
8731         AND t.balancing_line_type IN (C_LINE_TYPE_PROCESS
8732                                    ,C_LINE_TYPE_IC_BAL_INTER
8733                                    ,C_LINE_TYPE_IC_BAL_INTRA);
8734 
8735 
8736 	l_count := SQL%ROWCOUNT;
8737 	g_new_line_count := g_new_line_count + l_count;
8738 
8739 	IF (C_LEVEL_EVENT >= g_log_level) THEN
8740 		trace(p_msg    => '# balancing rows created(2) = '||l_count,
8741 		      p_module => l_log_module,
8742                       p_level  => C_LEVEL_EVENT);
8743 	END IF;
8744 
8745 	END IF;
8746 
8747 	-- bug7210785 end
8748 
8749 
8750 
8751 
8752     -- Validate the suspense account is defined if balancing should be created for
8753     -- balancing entered currency and balancing segments
8754     --
8755     IF (g_sla_entered_cur_bal_sus_ccid IS NULL) THEN
8756 
8757       IF (C_LEVEL_EVENT >= g_log_level) THEN
8758         trace(p_msg    => 'BEGIN LOOP - no suspense ccid',
8759               p_module => l_log_module,
8760               p_level  => C_LEVEL_EVENT);
8761       END IF;
8762 
8763       FOR l_no_sus_ccid IN c_no_sus_ccid LOOP
8764 
8765         IF (g_sla_entered_cur_bal_sus_ccid IS NULL AND l_no_sus_ccid.balance_type_code = 'A') THEN
8766 
8767           IF (C_LEVEL_ERROR >= g_log_level) THEN
8768             trace(p_msg    => 'LOOP - no suspense ccid:'||
8769                               ' ae_header_id = '||l_no_sus_ccid.ae_header_id||
8770                               ',balance_type_code = '||l_no_sus_ccid.balance_type_code,
8771                   p_module => l_log_module,
8772                   p_level  => C_LEVEL_ERROR);
8773           END IF;
8774 
8775           g_err_count := g_err_count + 1;
8776           g_err_hdr_ids(g_err_count) := l_no_sus_ccid.ae_header_id;
8777           g_err_event_ids(g_err_count) := l_no_sus_ccid.event_id;
8778 
8779           l_err_count := l_err_count + 1;
8780           l_err_hdr_ids(l_err_count) := l_no_sus_ccid.ae_header_id;
8781 
8782           IF (l_no_sus_ccid.balance_type_code = 'A') THEN
8783             xla_accounting_err_pkg.build_message(
8784                  p_appli_s_name         => 'XLA'
8785                 ,p_msg_name             => 'XLA_AP_ENT_BAL_NO_SUS_CCID'
8786                 ,p_token_1              => 'LEDGER_NAME'
8787                 ,p_value_1              => g_ledger_name
8788                 ,p_entity_id            => l_no_sus_ccid.entity_id
8789                 ,p_event_id             => l_no_sus_ccid.event_id
8790                 ,p_ledger_id            => g_ledger_id
8791                 ,p_ae_header_id         => l_no_sus_ccid.ae_header_id
8792                 ,p_ae_line_num          => NULL
8793                 ,p_accounting_batch_id  => NULL);
8794           END IF;
8795         END IF;
8796       END LOOP;
8797 
8798       IF (C_LEVEL_EVENT >= g_log_level) THEN
8799         trace(p_msg    => 'END LOOP - no suspense ccid',
8800               p_module => l_log_module,
8801               p_level  => C_LEVEL_EVENT);
8802       END IF;
8803 
8804     END IF;
8805 
8806     UPDATE  xla_validation_lines_gt t
8807        SET (code_combination_id, control_account_enabled_flag, mgt_seg_value) = (
8808            SELECT nc.code_combination_id
8809                  ,nc.reference3
8810                  ,decode(g_mgt_seg_column_name, g_bal_seg_column_name, t.bal_seg_value,
8811                          'SEGMENT1', sc.segment1, 'SEGMENT2', sc.segment2,
8812                          'SEGMENT3', sc.segment3, 'SEGMENT4', sc.segment4,
8813                          'SEGMENT5', sc.segment5, 'SEGMENT6', sc.segment6,
8814                          'SEGMENT7', sc.segment7, 'SEGMENT8', sc.segment8,
8815                          'SEGMENT9', sc.segment9, 'SEGMENT10', sc.segment10,
8816                          'SEGMENT11', sc.segment11, 'SEGMENT12', sc.segment12,
8817                          'SEGMENT13', sc.segment13, 'SEGMENT14', sc.segment14,
8818                          'SEGMENT15', sc.segment15, 'SEGMENT16', sc.segment16,
8819                          'SEGMENT17', sc.segment17, 'SEGMENT18', sc.segment18,
8820                          'SEGMENT19', sc.segment19, 'SEGMENT20', sc.segment20,
8821                          'SEGMENT21', sc.segment21, 'SEGMENT22', sc.segment22,
8822                          'SEGMENT23', sc.segment23, 'SEGMENT24', sc.segment24,
8823                          'SEGMENT25', sc.segment25, 'SEGMENT26', sc.segment26,
8824                          'SEGMENT27', sc.segment27, 'SEGMENT28', sc.segment28,
8825                          'SEGMENT29', sc.segment29, 'SEGMENT30', sc.segment30, NULL)
8826              FROM gl_code_combinations nc,
8827                   gl_code_combinations sc
8828             WHERE nvl(nc.segment1,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT1',
8829                                                    t.bal_seg_value,nvl(sc.segment1,C_CHAR))
8830               AND nvl(nc.segment2,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT2',
8831                                                    t.bal_seg_value,nvl(sc.segment2,C_CHAR))
8832               AND nvl(nc.segment3,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT3',
8833                                                    t.bal_seg_value,nvl(sc.segment3,C_CHAR))
8834               AND nvl(nc.segment4,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT4',
8835                                                    t.bal_seg_value,nvl(sc.segment4,C_CHAR))
8836               AND nvl(nc.segment5,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT5',
8837                                                    t.bal_seg_value,nvl(sc.segment5,C_CHAR))
8838               AND nvl(nc.segment6,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT6',
8839                                                    t.bal_seg_value,nvl(sc.segment6,C_CHAR))
8840               AND nvl(nc.segment7,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT7',
8841                                                    t.bal_seg_value,nvl(sc.segment7,C_CHAR))
8842               AND nvl(nc.segment8,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT8',
8843                                                    t.bal_seg_value,nvl(sc.segment8,C_CHAR))
8844               AND nvl(nc.segment9,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT9',
8845                                                    t.bal_seg_value,nvl(sc.segment9,C_CHAR))
8846               AND nvl(nc.segment10,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT10',
8847                                                    t.bal_seg_value,nvl(sc.segment10,C_CHAR))
8848               AND nvl(nc.segment11,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT11',
8849                                                    t.bal_seg_value,nvl(sc.segment11,C_CHAR))
8850               AND nvl(nc.segment12,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT12',
8851                                                    t.bal_seg_value,nvl(sc.segment12,C_CHAR))
8852               AND nvl(nc.segment13,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT13',
8853                                                    t.bal_seg_value,nvl(sc.segment13,C_CHAR))
8854               AND nvl(nc.segment14,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT14',
8855                                                    t.bal_seg_value,nvl(sc.segment14,C_CHAR))
8856               AND nvl(nc.segment15,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT15',
8857                                                    t.bal_seg_value,nvl(sc.segment15,C_CHAR))
8858               AND nvl(nc.segment16,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT16',
8859                                                    t.bal_seg_value,nvl(sc.segment16,C_CHAR))
8860               AND nvl(nc.segment17,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT17',
8861                                                    t.bal_seg_value,nvl(sc.segment17,C_CHAR))
8862               AND nvl(nc.segment18,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT18',
8863                                                    t.bal_seg_value,nvl(sc.segment18,C_CHAR))
8864               AND nvl(nc.segment19,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT19',
8865                                                    t.bal_seg_value,nvl(sc.segment19,C_CHAR))
8866               AND nvl(nc.segment20,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT20',
8867                                                    t.bal_seg_value,nvl(sc.segment20,C_CHAR))
8868               AND nvl(nc.segment21,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT21',
8869                                                    t.bal_seg_value,nvl(sc.segment21,C_CHAR))
8870               AND nvl(nc.segment22,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT22',
8871                                                    t.bal_seg_value,nvl(sc.segment22,C_CHAR))
8872               AND nvl(nc.segment23,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT23',
8873                                                    t.bal_seg_value,nvl(sc.segment23,C_CHAR))
8874               AND nvl(nc.segment24,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT24',
8875                                                    t.bal_seg_value,nvl(sc.segment24,C_CHAR))
8876               AND nvl(nc.segment25,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT25',
8877                                                    t.bal_seg_value,nvl(sc.segment25,C_CHAR))
8878               AND nvl(nc.segment26,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT26',
8879                                                    t.bal_seg_value,nvl(sc.segment26,C_CHAR))
8880               AND nvl(nc.segment27,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT27',
8881                                                    t.bal_seg_value,nvl(sc.segment27,C_CHAR))
8882               AND nvl(nc.segment28,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT28',
8883                                                    t.bal_seg_value,nvl(sc.segment28,C_CHAR))
8884               AND nvl(nc.segment29,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT29',
8885                                                    t.bal_seg_value,nvl(sc.segment29,C_CHAR))
8886               AND nvl(nc.segment30,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT30',
8887                                                    t.bal_seg_value,nvl(sc.segment30,C_CHAR))
8888               AND nc.chart_of_accounts_id  = sc.chart_of_accounts_id
8889               AND sc.code_combination_id   = g_sla_entered_cur_bal_sus_ccid)
8890      WHERE t.balancing_line_type = C_LINE_TYPE_XLA_BALANCING;
8891 
8892     populate_missing_ccid(l_err_count, l_err_hdr_ids);
8893 
8894     IF (l_err_count>0) THEN
8895       FORALL j IN 1..l_err_count
8896         UPDATE     xla_validation_lines_gt
8897            SET     balancing_line_type = C_LINE_TYPE_COMPLETE
8898          WHERE     ae_header_id = l_err_hdr_ids(j)
8899            AND     balancing_line_type = C_LINE_TYPE_PROCESS;
8900     END IF;
8901 
8902   END IF;
8903 
8904   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
8905     trace(p_msg    => 'End of function balance_by_entered_curr',
8906           p_module => l_log_module,
8907           p_level  => C_LEVEL_PROCEDURE);
8908   END IF;
8909 EXCEPTION
8910 WHEN xla_exceptions_pkg.application_exception THEN
8911   IF (c_no_sus_ccid%ISOPEN) THEN
8912     CLOSE c_no_sus_ccid;
8913   END IF;
8914   RAISE;
8915 
8916 WHEN OTHERS THEN
8917   IF (c_no_sus_ccid%ISOPEN) THEN
8918     CLOSE c_no_sus_ccid;
8919   END IF;
8920   xla_exceptions_pkg.raise_message
8921       (p_location => 'xla_je_validation_pkg.balance_by_entered_curr');
8922 END;
8923 
8924 
8925 --=============================================================================
8926 --
8927 -- Name: balance_by_encumberance
8928 -- Description: This function creates new entries to the xla temporary
8929 --              balancing table that will balance the journal entry by
8930 --              encumbrance entries
8931 -- Return:
8932 --      0 - completed successfully
8933 --      1 - error is detected
8934 --
8935 --=============================================================================
8936 PROCEDURE balance_by_encumberance
8937 IS
8938   l_count               INTEGER;
8939 
8940   l_bal_hdr_ids         t_array_int;
8941   l_bal_ent_currs       t_array_varchar30;
8942   l_bal_bal_segs        t_array_varchar30;
8943   l_bal_enc_ids         t_array_int;
8944   l_err_hdr_ids         t_array_int;
8945   l_err_count           INTEGER := 0;
8946   j                     INTEGER;
8947   l_log_module          VARCHAR2(240);
8948   l_rounding_offset     NUMBER;
8949   l_rounding_rule_code  VARCHAR2(30);
8950   l_mau                 NUMBER;
8951 
8952   l_stmt                VARCHAR2(25000);  --8531035
8953   l_stmt2              VARCHAR2(5000);    --8531035
8954 
8955 
8956   CURSOR c_no_sus_ccid IS
8957     SELECT entity_id, event_id, ae_header_id, balance_type_code
8958       FROM xla_validation_lines_gt
8959      WHERE balancing_line_type = C_LINE_TYPE_ENC_BALANCING
8960      GROUP BY entity_id, event_id, ae_header_id, balance_type_code;
8961 
8962 BEGIN
8963 
8964   IF g_log_enabled THEN
8965     l_log_module := C_DEFAULT_MODULE||'.balance_by_encumberance';
8966   END IF;
8967 
8968   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
8969     trace(p_msg    => 'BEGIN of function balance_by_encumberance',
8970           p_module => l_log_module,
8971           p_level  => C_LEVEL_PROCEDURE);
8972   END IF;
8973 
8974   IF (g_caller = C_CALLER_ACCT_PROGRAM) THEN
8975     l_mau:= xla_accounting_cache_pkg.GetValueNum(
8976                            p_source_code        => 'XLA_CURRENCY_MAU'
8977                          , p_target_ledger_id   => g_ledger_id);
8978     l_rounding_rule_code :=xla_accounting_cache_pkg.GetValueChar(
8979                            p_source_code        => 'XLA_ROUNDING_RULE_CODE'
8980                          , p_target_ledger_id   => g_ledger_id
8981                          );
8982   ELSE
8983     SELECT nvl(fcu.minimum_accountable_unit, power(10, -1* fcu.precision))
8984           ,xlo.rounding_rule_code
8985     INTO   l_mau, l_rounding_rule_code
8986     FROM   xla_ledger_options     xlo
8987           ,gl_ledgers             gl
8988           ,fnd_currencies         fcu
8989     WHERE xlo.application_id = g_application_id
8990       AND xlo.ledger_id = g_trx_ledger_id
8991       AND gl.ledger_id = g_ledger_id
8992       AND fcu.currency_code = gl.currency_code;
8993   END IF;
8994 
8995   IF (C_LEVEL_EVENT >= g_log_level) THEN
8996     trace(p_msg    => 'l_rounding_rule_code = '||l_rounding_rule_code,
8997           p_module => l_log_module,
8998           p_level  => C_LEVEL_EVENT);
8999   END IF;
9000 
9001   IF l_rounding_rule_code = 'NEAREST' THEN
9002     l_rounding_offset := 0;
9003   ELSIF l_rounding_rule_code = 'UP' THEN
9004     l_rounding_offset := .5-power(10, -30);
9005   ELSIF l_rounding_rule_code = 'DOWN' THEN
9006     l_rounding_offset := -(.5-power(10, -30));
9007   ELSE
9008     l_rounding_offset := 0;
9009   END IF;
9010 
9011   IF (C_LEVEL_EVENT >= g_log_level) THEN
9012     trace(p_msg    => 'l_rounding_offset = '||l_rounding_offset,
9013           p_module => l_log_module,
9014           p_level  => C_LEVEL_EVENT);
9015   END IF;
9016 
9017   SELECT ae_header_id, bal_seg_value, entered_currency_code, encumbrance_type_id
9018     BULK COLLECT INTO l_bal_hdr_ids, l_bal_bal_segs, l_bal_ent_currs, l_bal_enc_ids
9019     FROM xla_validation_lines_gt t
9020    WHERE balance_type_code = 'E'
9021      AND entered_currency_code <> 'STAT'
9022      AND balancing_line_type in (C_LINE_TYPE_PROCESS,
9023                                  C_LINE_TYPE_IC_BAL_INTER,
9024                                  C_LINE_TYPE_IC_BAL_INTRA)
9025    GROUP BY ae_header_id, entered_currency_mau, bal_seg_value, entered_currency_code, encumbrance_type_id
9026   HAVING (
9027          decode(l_rounding_rule_code
9028                ,'NEAREST' ,ROUND(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)
9029                ,'UP'      ,CEIL(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)
9030                           ,FLOOR(sum(nvl(unrounded_entered_cr,0))/entered_currency_mau)) <>
9031          decode(l_rounding_rule_code
9032                ,'NEAREST' ,ROUND(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau)
9033                ,'UP'      ,CEIL(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau)
9034                           ,FLOOR(sum(nvl(unrounded_entered_dr,0))/entered_currency_mau))
9035           )
9036 	  OR
9037 	   (
9038          decode(l_rounding_rule_code
9039                ,'NEAREST' ,ROUND(sum(nvl(unrounded_accounted_cr,0))/l_mau)
9040                ,'UP'      ,CEIL(sum(nvl(unrounded_accounted_cr,0))/l_mau)
9041                           ,FLOOR(sum(nvl(unrounded_accounted_cr,0))/l_mau)) <>
9042          decode(l_rounding_rule_code
9043                ,'NEAREST' ,ROUND(sum(nvl(unrounded_accounted_dr,0))/l_mau)
9044                ,'UP'      ,CEIL(sum(nvl(unrounded_accounted_dr,0))/l_mau)
9045                           ,FLOOR(sum(nvl(unrounded_accounted_dr,0))/l_mau))
9046           );
9047 
9048   IF (C_LEVEL_EVENT >= g_log_level) THEN
9049     trace(p_msg    => '# un-balanced header = '||l_bal_hdr_ids.COUNT,
9050           p_module => l_log_module,
9051           p_level  => C_LEVEL_EVENT);
9052   END IF;
9053 
9054   IF (l_bal_hdr_ids.COUNT > 0) THEN
9055     --
9056     -- Note: Debit and Credit line are created by using two insert statement
9057     -- to prevent the 0 amount lines from being created
9058     --
9059     FORALL i IN 1..l_bal_hdr_ids.COUNT
9060           INSERT INTO xla_validation_lines_gt
9061             (balancing_line_type
9062             ,ledger_id
9063             ,ae_header_id
9064             ,max_ae_line_num
9065             ,max_displayed_line_number
9066             ,ae_line_num
9067             ,displayed_line_number
9068             ,event_id
9069             ,entity_id
9070             ,balance_type_code
9071             ,accounting_date
9072             ,entered_currency_code
9073             ,unrounded_entered_dr
9074             ,entered_dr
9075             ,unrounded_accounted_dr
9076             ,accounted_dr
9077             ,unrounded_entered_cr
9078             ,entered_cr
9079             ,unrounded_accounted_cr
9080             ,accounted_cr
9081             ,bal_seg_value
9082             ,code_combination_id
9083             ,encumbrance_type_id
9084             ,party_type_code
9085             ,party_id
9086             ,party_site_id
9087             ,error_flag)
9088       SELECT C_LINE_TYPE_ENC_BALANCING
9089             ,g_ledger_id
9090             ,l_bal_hdr_ids(i)
9091             ,t.max_ae_line_num
9092             ,t.max_displayed_line_number
9093             ,t.max_ae_line_num
9094             ,t.max_displayed_line_number
9095             ,t.event_id
9096             ,t.entity_id
9097             ,t.balance_type_code
9098             ,t.accounting_date
9099             ,t.entered_currency_code
9100             ,CASE
9101                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
9102                     sum(nvl(unrounded_entered_cr,0))
9103              END
9104             ,CASE
9105                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
9106                     decode(l_rounding_rule_code
9107                           ,'NEAREST'
9108                           ,ROUND(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
9109                           ,'UP'
9110                           ,CEIL(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau
9111                           ,FLOOR(sum(nvl(unrounded_entered_cr,0))/t.entered_currency_mau)*t.entered_currency_mau)
9112              END
9113             ,CASE
9114                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
9115                     sum(nvl(unrounded_accounted_cr,0))
9116              END
9117             ,CASE
9118                WHEN sum(nvl(unrounded_accounted_cr,0)) <> 0 THEN
9119                     decode(l_rounding_rule_code
9120                           ,'NEAREST'
9121                           ,ROUND(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
9122                           ,'UP'
9123                           ,CEIL(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau
9124                           ,FLOOR(sum(nvl(unrounded_accounted_cr,0))/l_mau)*l_mau)
9125             END
9126            ,CASE
9127               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
9128                    sum(nvl(unrounded_entered_dr,0))
9129             END  -- unrounded_entered_cr
9130            ,CASE
9131               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
9132                    decode(l_rounding_rule_code
9133                          ,'NEAREST'
9134                          ,ROUND(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
9135                          ,'UP'
9136                          ,CEIL(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau
9137                          ,FLOOR(sum(nvl(unrounded_entered_dr,0))/t.entered_currency_mau)*t.entered_currency_mau)
9138             END  -- entered_cr
9139            ,CASE
9140               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
9141                    sum(nvl(unrounded_accounted_dr,0))
9142             END  -- unrounded_accounted_cr
9143            ,CASE
9144               WHEN sum(nvl(unrounded_accounted_dr,0)) <> 0 THEN
9145                    decode(l_rounding_rule_code
9146                          ,'NEAREST'
9147                          ,ROUND(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
9148                          ,'UP'
9149                          ,CEIL(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau
9150                          ,FLOOR(sum(nvl(unrounded_accounted_dr,0))/l_mau)*l_mau)
9151             END  -- accounted_cr
9152            ,t.bal_seg_value
9153            ,-1
9154            ,t.encumbrance_type_id
9155            ,t.party_type_code
9156            ,t.party_id
9157            ,t.party_site_id
9158            ,NULL
9159        FROM xla_validation_lines_gt        t
9160       WHERE ae_header_id = l_bal_hdr_ids(i)
9161         AND entered_currency_code = l_bal_ent_currs(i)
9162         AND bal_seg_value = l_bal_bal_segs(i)
9163         AND NVL(encumbrance_type_id,-99) = NVL(l_bal_enc_ids(i),-99)
9164         AND balancing_line_type IN (C_LINE_TYPE_PROCESS
9165                                    ,C_LINE_TYPE_IC_BAL_INTER
9166                                    ,C_LINE_TYPE_IC_BAL_INTRA)
9167       GROUP BY
9168             t.max_ae_line_num
9169            ,t.max_displayed_line_number
9170            ,t.event_id
9171            ,t.entity_id
9172            ,t.balance_type_code
9173            ,t.bal_seg_value
9174            ,t.entered_currency_code
9175            ,t.accounting_date
9176            ,t.entered_currency_mau
9177            ,t.encumbrance_type_id
9178            ,t.party_type_code
9179            ,t.party_id
9180            ,t.party_site_id
9181             --
9182             -- This has been added to combine two insert statements
9183             -- (for Debit and Credit) - Bug 5279912.
9184             -- Without this, credit and debit lines are merged.
9185             --
9186            ,DECODE(t.unrounded_entered_dr,NULL,'CR','DR')
9187      HAVING sum(nvl(unrounded_accounted_cr,0)) <> 0
9188          OR sum(nvl(unrounded_accounted_dr,0)) <> 0;
9189 
9190     l_count := SQL%ROWCOUNT;
9191     g_new_line_count := g_new_line_count + l_count;
9192 
9193     IF (C_LEVEL_EVENT >= g_log_level) THEN
9194       trace(p_msg    => '# rows created = '||l_count,
9195             p_module => l_log_module,
9196             p_level  => C_LEVEL_EVENT);
9197     END IF;
9198 
9199     --
9200     -- Validate the suspense account is defined if balancing should be created for
9201     -- balancing entered currency and balancing segments
9202     --
9203     IF ( g_res_encumb_ccid IS NULL) THEN
9204 
9205       IF (C_LEVEL_EVENT >= g_log_level) THEN
9206         trace(p_msg    => 'BEGIN LOOP - no suspense ccid',
9207               p_module => l_log_module,
9208               p_level  => C_LEVEL_EVENT);
9209       END IF;
9210 
9211       FOR l_no_sus_ccid IN c_no_sus_ccid LOOP
9212 
9213         IF  (g_res_encumb_ccid IS NULL AND l_no_sus_ccid.balance_type_code = 'E') THEN
9214 
9215           IF (C_LEVEL_ERROR >= g_log_level) THEN
9216             trace(p_msg    => 'LOOP - no suspense ccid:'||
9217                               ' ae_header_id = '||l_no_sus_ccid.ae_header_id||
9218                               ',balance_type_code = '||l_no_sus_ccid.balance_type_code,
9219                   p_module => l_log_module,
9220                   p_level  => C_LEVEL_ERROR);
9221           END IF;
9222 
9223           g_err_count := g_err_count + 1;
9224           g_err_hdr_ids(g_err_count) := l_no_sus_ccid.ae_header_id;
9225           g_err_event_ids(g_err_count) := l_no_sus_ccid.event_id;
9226 
9227           l_err_count := l_err_count + 1;
9228           l_err_hdr_ids(l_err_count) := l_no_sus_ccid.ae_header_id;
9229 
9230           IF (l_no_sus_ccid.balance_type_code = 'E') THEN
9231             xla_accounting_err_pkg.build_message(
9232                  p_appli_s_name         => 'XLA'
9233                 ,p_msg_name             => 'XLA_AP_NO_RFE_CCID'
9234                 ,p_token_1              => 'LEDGER_NAME'
9235                 ,p_value_1              => g_ledger_name
9236                 ,p_entity_id            => l_no_sus_ccid.entity_id
9237                 ,p_event_id             => l_no_sus_ccid.event_id
9238                 ,p_ledger_id            => g_ledger_id
9239                 ,p_ae_header_id         => l_no_sus_ccid.ae_header_id
9240                 ,p_ae_line_num          => NULL
9241                 ,p_accounting_batch_id  => NULL);
9242           END IF;
9243         END IF;
9244       END LOOP;
9245 
9246       IF (C_LEVEL_EVENT >= g_log_level) THEN
9247         trace(p_msg    => 'END LOOP - no suspense ccid',
9248               p_module => l_log_module,
9249               p_level  => C_LEVEL_EVENT);
9250       END IF;
9251 
9252     END IF;
9253 
9254     /*UPDATE  xla_validation_lines_gt t
9255        SET (code_combination_id, control_account_enabled_flag, mgt_seg_value) = (
9256            SELECT nc.code_combination_id
9257                  ,nc.reference3
9258                  ,decode(g_mgt_seg_column_name, g_bal_seg_column_name, t.bal_seg_value,
9259                          'SEGMENT1', sc.segment1, 'SEGMENT2', sc.segment2,
9260                          'SEGMENT3', sc.segment3, 'SEGMENT4', sc.segment4,
9261                          'SEGMENT5', sc.segment5, 'SEGMENT6', sc.segment6,
9262                          'SEGMENT7', sc.segment7, 'SEGMENT8', sc.segment8,
9263                          'SEGMENT9', sc.segment9, 'SEGMENT10', sc.segment10,
9264                          'SEGMENT11', sc.segment11, 'SEGMENT12', sc.segment12,
9265                          'SEGMENT13', sc.segment13, 'SEGMENT14', sc.segment14,
9266                          'SEGMENT15', sc.segment15, 'SEGMENT16', sc.segment16,
9267                          'SEGMENT17', sc.segment17, 'SEGMENT18', sc.segment18,
9268                          'SEGMENT19', sc.segment19, 'SEGMENT20', sc.segment20,
9269                          'SEGMENT21', sc.segment21, 'SEGMENT22', sc.segment22,
9270                          'SEGMENT23', sc.segment23, 'SEGMENT24', sc.segment24,
9271                          'SEGMENT25', sc.segment25, 'SEGMENT26', sc.segment26,
9272                          'SEGMENT27', sc.segment27, 'SEGMENT28', sc.segment28,
9273                          'SEGMENT29', sc.segment29, 'SEGMENT30', sc.segment30, NULL)
9274              FROM gl_code_combinations nc,
9275                   gl_code_combinations sc
9276             WHERE nvl(nc.segment1,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT1',
9277                                                    t.bal_seg_value,nvl(sc.segment1,C_CHAR))
9278               AND nvl(nc.segment2,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT2',
9279                                                    t.bal_seg_value,nvl(sc.segment2,C_CHAR))
9280               AND nvl(nc.segment3,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT3',
9281                                                    t.bal_seg_value,nvl(sc.segment3,C_CHAR))
9282               AND nvl(nc.segment4,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT4',
9283                                                    t.bal_seg_value,nvl(sc.segment4,C_CHAR))
9284               AND nvl(nc.segment5,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT5',
9285                                                    t.bal_seg_value,nvl(sc.segment5,C_CHAR))
9286               AND nvl(nc.segment6,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT6',
9287                                                    t.bal_seg_value,nvl(sc.segment6,C_CHAR))
9288               AND nvl(nc.segment7,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT7',
9289                                                    t.bal_seg_value,nvl(sc.segment7,C_CHAR))
9290               AND nvl(nc.segment8,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT8',
9291                                                    t.bal_seg_value,nvl(sc.segment8,C_CHAR))
9292               AND nvl(nc.segment9,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT9',
9293                                                    t.bal_seg_value,nvl(sc.segment9,C_CHAR))
9294               AND nvl(nc.segment10,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT10',
9295                                                    t.bal_seg_value,nvl(sc.segment10,C_CHAR))
9296               AND nvl(nc.segment11,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT11',
9297                                                    t.bal_seg_value,nvl(sc.segment11,C_CHAR))
9298               AND nvl(nc.segment12,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT12',
9299                                                    t.bal_seg_value,nvl(sc.segment12,C_CHAR))
9300               AND nvl(nc.segment13,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT13',
9301                                                    t.bal_seg_value,nvl(sc.segment13,C_CHAR))
9302               AND nvl(nc.segment14,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT14',
9303                                                    t.bal_seg_value,nvl(sc.segment14,C_CHAR))
9304               AND nvl(nc.segment15,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT15',
9305                                                    t.bal_seg_value,nvl(sc.segment15,C_CHAR))
9306               AND nvl(nc.segment16,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT16',
9307                                                    t.bal_seg_value,nvl(sc.segment16,C_CHAR))
9308               AND nvl(nc.segment17,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT17',
9309                                                    t.bal_seg_value,nvl(sc.segment17,C_CHAR))
9310               AND nvl(nc.segment18,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT18',
9311                                                    t.bal_seg_value,nvl(sc.segment18,C_CHAR))
9312               AND nvl(nc.segment19,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT19',
9313                                                    t.bal_seg_value,nvl(sc.segment19,C_CHAR))
9314               AND nvl(nc.segment20,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT20',
9315                                                    t.bal_seg_value,nvl(sc.segment20,C_CHAR))
9316               AND nvl(nc.segment21,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT21',
9317                                                    t.bal_seg_value,nvl(sc.segment21,C_CHAR))
9318               AND nvl(nc.segment22,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT22',
9319                                                    t.bal_seg_value,nvl(sc.segment22,C_CHAR))
9320               AND nvl(nc.segment23,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT23',
9321                                                    t.bal_seg_value,nvl(sc.segment23,C_CHAR))
9322               AND nvl(nc.segment24,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT24',
9323                                                    t.bal_seg_value,nvl(sc.segment24,C_CHAR))
9324               AND nvl(nc.segment25,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT25',
9325                                                    t.bal_seg_value,nvl(sc.segment25,C_CHAR))
9326               AND nvl(nc.segment26,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT26',
9327                                                    t.bal_seg_value,nvl(sc.segment26,C_CHAR))
9328               AND nvl(nc.segment27,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT27',
9329                                                    t.bal_seg_value,nvl(sc.segment27,C_CHAR))
9330               AND nvl(nc.segment28,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT28',
9331                                                    t.bal_seg_value,nvl(sc.segment28,C_CHAR))
9332               AND nvl(nc.segment29,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT29',
9333                                                    t.bal_seg_value,nvl(sc.segment29,C_CHAR))
9334               AND nvl(nc.segment30,C_CHAR) = DECODE(g_bal_seg_column_name,'SEGMENT30',
9335                                                    t.bal_seg_value,nvl(sc.segment30,C_CHAR))
9336               AND nc.chart_of_accounts_id  = sc.chart_of_accounts_id
9337               AND sc.code_combination_id   = DECODE(t.balance_type_code, 'E'
9338                                                    ,g_res_encumb_ccid, g_sla_entered_cur_bal_sus_ccid))
9339      WHERE t.balancing_line_type = C_LINE_TYPE_ENC_BALANCING;*/
9340 
9341 
9342 
9343    --8531035 performance changes start, old query commented above
9344 
9345 l_stmt := '
9346     UPDATE  xla_validation_lines_gt t
9347        SET (code_combination_id, control_account_enabled_flag, mgt_seg_value) = (
9348            SELECT nc.code_combination_id
9349                  ,nc.reference3
9350                  ,decode(:1, :2, t.bal_seg_value,
9351                          ''SEGMENT1'', sc.segment1, ''SEGMENT2'', sc.segment2,
9352                          ''SEGMENT3'', sc.segment3, ''SEGMENT4'', sc.segment4,
9353                          ''SEGMENT5'', sc.segment5, ''SEGMENT6'', sc.segment6,
9354                          ''SEGMENT7'', sc.segment7, ''SEGMENT8'', sc.segment8,
9355                          ''SEGMENT9'', sc.segment9, ''SEGMENT10'', sc.segment10,
9356                          ''SEGMENT11'', sc.segment11, ''SEGMENT12'', sc.segment12,
9357                          ''SEGMENT13'', sc.segment13, ''SEGMENT14'', sc.segment14,
9358                          ''SEGMENT15'', sc.segment15, ''SEGMENT16'', sc.segment16,
9359                          ''SEGMENT17'', sc.segment17, ''SEGMENT18'', sc.segment18,
9360                          ''SEGMENT19'', sc.segment19, ''SEGMENT20'', sc.segment20,
9361                          ''SEGMENT21'', sc.segment21, ''SEGMENT22'', sc.segment22,
9362                          ''SEGMENT23'', sc.segment23, ''SEGMENT24'', sc.segment24,
9363                          ''SEGMENT25'', sc.segment25, ''SEGMENT26'', sc.segment26,
9364                          ''SEGMENT27'', sc.segment27, ''SEGMENT28'', sc.segment28,
9365                          ''SEGMENT29'', sc.segment29, ''SEGMENT30'', sc.segment30, NULL)
9366              FROM gl_code_combinations nc,
9367                   gl_code_combinations sc
9368             WHERE ';
9369 
9370 
9371      l_stmt2 := ' ';
9372 
9373      FOR l_rec IN  (SELECT application_column_name
9374 		    FROM   FND_ID_FLEX_SEGMENTS_VL
9375 		    WHERE  id_flex_num    = g_ledger_coa_id
9376 		    AND    id_flex_code   = 'GL#'
9377 	            AND    application_id = 101
9378 		    AND    enabled_flag = 'Y'
9379 		    MINUS
9380 		    SELECT g_bal_seg_column_name
9381 		    FROM   FND_ID_FLEX_SEGMENTS_VL
9382 		    WHERE  rownum=1
9383 		    )
9384      LOOP
9385 	l_stmt2 := l_stmt2 || 'nc.' || l_rec.application_column_name || ' = ' ||  'sc.' || l_rec.application_column_name || ' AND ';
9386      END LOOP;
9387 
9388      l_stmt2 := l_stmt2 || 'nc.' || g_bal_seg_column_name || ' = ' || 't.bal_seg_value' || '
9389                    AND nc.chart_of_accounts_id  = sc.chart_of_accounts_id
9390                    AND sc.code_combination_id   = DECODE(t.balance_type_code, ''E'',:3,:4 ))
9391                    WHERE t.balancing_line_type = :5';
9392 
9393      l_stmt := l_stmt || l_stmt2;
9394 
9395 
9396 
9397      IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9398         trace(p_msg    => 'balance by encumberance dynamic sql' || l_stmt,
9399           p_module => l_log_module,
9400           p_level  => C_LEVEL_PROCEDURE);
9401      END IF;
9402 
9403      /* g_mgt_seg_column_name :1
9404         g_bal_seg_column_name :2
9405         g_res_encumb_ccid :3
9406         g_sla_entered_cur_bal_sus_ccid :4
9407         C_LINE_TYPE_ENC_BALANCING :5 */
9408 
9409 
9410      EXECUTE IMMEDIATE l_stmt USING     g_mgt_seg_column_name,
9411 					g_bal_seg_column_name,
9412 					g_res_encumb_ccid,
9413 					g_sla_entered_cur_bal_sus_ccid,
9414 					C_LINE_TYPE_ENC_BALANCING;
9415 
9416 
9417 
9418     --8531035 end
9419 
9420     populate_missing_ccid(l_err_count, l_err_hdr_ids);
9421 
9422     IF (l_err_count>0) THEN
9423       FORALL j IN 1..l_err_count
9424         UPDATE     xla_validation_lines_gt
9425            SET     balancing_line_type = C_LINE_TYPE_COMPLETE
9426          WHERE     ae_header_id = l_err_hdr_ids(j)
9427            AND     balancing_line_type = C_LINE_TYPE_PROCESS;
9428     END IF;
9429 
9430   END IF;
9431 
9432   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9433     trace(p_msg    => 'End of function balance_by_encumberance',
9434           p_module => l_log_module,
9435           p_level  => C_LEVEL_PROCEDURE);
9436   END IF;
9437 EXCEPTION
9438 WHEN xla_exceptions_pkg.application_exception THEN
9439   IF (c_no_sus_ccid%ISOPEN) THEN
9440     CLOSE c_no_sus_ccid;
9441   END IF;
9442   RAISE;
9443 
9444 WHEN OTHERS THEN
9445   IF (c_no_sus_ccid%ISOPEN) THEN
9446     CLOSE c_no_sus_ccid;
9447   END IF;
9448   xla_exceptions_pkg.raise_message
9449       (p_location => 'xla_je_validation_pkg.balance_by_encumberance');
9450 END;
9451 
9452 
9453 --=============================================================================
9454 --
9455 -- Name: populate_balancing_lines
9456 -- Description: This function inserts the new entry lines created for the
9457 --              balancing routines into the real xla_ae_lines table.
9458 --
9459 --=============================================================================
9460 PROCEDURE populate_balancing_lines
9461 IS
9462   CURSOR c_ledger_option IS
9463     SELECT transfer_to_gl_mode_code
9464       FROM xla_ledger_options
9465      WHERE ledger_id      = g_ledger_id
9466        AND application_id = g_application_id;
9467 
9468   l_line_num                   INTEGER;
9469   l_transfer_to_gl_mode_code   VARCHAR2(1);
9470   l_log_module                 VARCHAR2(240);
9471 BEGIN
9472 
9473   IF g_log_enabled THEN
9474     l_log_module := C_DEFAULT_MODULE||'.populate_balancing_lines';
9475   END IF;
9476 
9477   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9478     trace(p_msg    => 'BEGIN of procedure populate_balancing_lines',
9479           p_module => l_log_module,
9480           p_level  => C_LEVEL_PROCEDURE);
9481   END IF;
9482 
9483   IF (C_LEVEL_STATEMENT >= g_log_level) THEN
9484     trace(p_msg    => 'ledger_id      = '||g_ledger_id,
9485           p_module => l_log_module,
9486           p_level  => C_LEVEL_STATEMENT);
9487     trace(p_msg    => 'application_id = '||g_application_id,
9488           p_module => l_log_module,
9489           p_level  => C_LEVEL_STATEMENT);
9490   END IF;
9491 
9492   OPEN c_ledger_option;
9493   FETCH c_ledger_option INTO l_transfer_to_gl_mode_code;
9494   CLOSE c_ledger_option;
9495 
9496   IF (l_transfer_to_gl_mode_code IS NULL) THEN
9497     l_transfer_to_gl_mode_code := 'D';
9498   END IF;
9499 
9500 
9501 
9502   INSERT INTO xla_ae_lines
9503         (ae_header_id
9504         ,ae_line_num
9505         ,displayed_line_number
9506         ,code_combination_id
9507         ,accounting_class_code
9508         ,application_id
9509         ,control_balance_flag
9510         ,analytical_balance_flag
9511         ,unrounded_accounted_cr
9512         ,unrounded_accounted_dr
9513         ,accounted_cr
9514         ,accounted_dr
9515 	,description               -- added line for bug 6902085
9516         ,currency_code
9517         ,currency_conversion_date
9518         ,currency_conversion_type
9519         ,currency_conversion_rate
9520         ,unrounded_entered_cr
9521         ,unrounded_entered_dr
9522         ,entered_cr
9523         ,entered_dr
9524         ,gl_sl_link_table
9525         ,gl_sl_link_id
9526         ,gl_transfer_mode_code
9527         ,gain_or_loss_flag
9528         ,creation_date
9529         ,created_by
9530         ,last_update_date
9531         ,last_updated_by
9532         ,last_update_login
9533         ,program_update_date
9534         ,program_application_id
9535         ,program_id
9536         ,request_id
9537         ,ledger_id
9538         ,accounting_date
9539         ,encumbrance_type_id
9540         ,party_type_code
9541         ,party_id
9542         ,party_site_id
9543         ,mpa_accrual_entry_flag)  -- 4262811
9544     SELECT       l.ae_header_id
9545                 ,max_ae_line_num +
9546                   ROW_NUMBER() over (partition by l.ae_header_id
9547                                      order by l.ae_line_num)
9548                 ,max_displayed_line_number +
9549                   ROW_NUMBER() over (partition by l.ae_header_id
9550                                      order by l.displayed_line_number)
9551                 ,NVL(l.code_combination_id,-1)
9552                 ,CASE l.balancing_line_type
9553                       WHEN C_LINE_TYPE_IC_BAL_INTRA THEN C_ACCT_CLASS_INTRA
9554                       WHEN C_LINE_TYPE_IC_BAL_INTER THEN C_ACCT_CLASS_INTER
9555                       WHEN C_LINE_TYPE_RD_BALANCING THEN C_ACCT_CLASS_ROUNDING
9556                       WHEN C_LINE_TYPE_ENC_BALANCING THEN C_ACCT_CLASS_RFE -- 4458381
9557                       WHEN C_LINE_TYPE_ENC_BAL_ERROR THEN C_ACCT_CLASS_RFE -- 4458381
9558                       ELSE C_ACCT_CLASS_BALANCE END
9559                 ,g_application_id
9560                 -- control_balance_flag
9561                 ,CASE l.balancing_line_type
9562                       WHEN C_LINE_TYPE_IC_BAL_INTRA THEN NULL
9563                       WHEN C_LINE_TYPE_IC_BAL_INTER THEN NULL
9564                       ELSE DECODE(NVL(ccid.reference3,'N'),'N',NULL, 'R', NULL,
9565                               DECODE(ccid.account_type, 'A', 'P'
9566                                                       , 'L', 'P'
9567                                                       , 'O', 'P'
9568                                                       , NULL)) END
9569                 ,NULL
9570                 ,l.unrounded_accounted_cr
9571                 ,l.unrounded_accounted_dr
9572                 ,l.accounted_cr
9573                 ,l.accounted_dr
9574 		,xl.meaning                            -- added line for bug 6902085
9575                 ,l.entered_currency_code
9576                 ,decode(l.entered_currency_code,
9577                         g_ledger_currency_code, NULL,
9578                         l.accounting_date)
9579                 ,decode(l.entered_currency_code, g_ledger_currency_code, NULL, 'User')
9580                 ,decode(l.entered_currency_code, g_ledger_currency_code, NULL,
9581                         CASE WHEN l.accounted_dr IS NOT NULL AND l.entered_dr <> 0
9582                                   THEN l.accounted_dr/l.entered_dr
9583                              WHEN l.accounted_dr IS NOT NULL
9584                                   THEN 1
9585                              WHEN l.entered_cr <> 0
9586                                   THEN l.accounted_cr/l.entered_cr
9587                              ELSE 1
9588                              END)
9589                 ,l.unrounded_entered_cr
9590                 ,l.unrounded_entered_dr
9591                 ,l.entered_cr
9592                 ,l.entered_dr
9593                 ,'XLAJEL'
9594                 ,decode(g_accounting_mode,'F',xla_gl_sl_link_id_s.nextval,NULL)
9595                 ,decode(l_transfer_to_gl_mode_code,'D','D','S')
9596                 ,'N'
9597                 ,TRUNC(SYSDATE)
9598                 ,xla_environment_pkg.g_usr_id
9599                 ,TRUNC(SYSDATE)
9600                 ,xla_environment_pkg.g_usr_id
9601                 ,xla_environment_pkg.g_login_id
9602                 ,TRUNC(SYSDATE)
9603                 ,xla_environment_pkg.g_Prog_Appl_Id
9604                 ,xla_environment_pkg.g_Prog_Id
9605                 ,xla_environment_pkg.g_Req_Id
9606                 ,l.ledger_id
9607                 ,l.accounting_date
9608                 ,l.encumbrance_type_id
9609                 ,l.party_type_code
9610                 ,l.party_id
9611                 ,l.party_site_id
9612                 ,'N'   -- 4262811
9613     FROM          xla_validation_lines_gt  l
9614                  ,gl_code_combinations     ccid
9615                  ,xla_lookups              xl                          -- added line for bug 6902085
9616     WHERE        l.balancing_line_type NOT IN (C_LINE_TYPE_PROCESS, C_LINE_TYPE_COMPLETE)
9617       AND        ccid.code_combination_id(+) = l.code_combination_id
9618       AND        xl.lookup_type = 'XLA_JE_VALD_LINE_DESC'              -- added filter for bug 6902085
9619       AND        xl.lookup_code = decode(l.balancing_line_type         -- added filter for bug 6902085
9620                                   ,C_LINE_TYPE_IC_BAL_INTRA
9621 				  ,'INTRA'
9622                                   ,C_LINE_TYPE_IC_BAL_INTER
9623 				  ,'INTER'
9624                                   ,C_LINE_TYPE_RD_BALANCING
9625 				  ,'ROUNDING'
9626                                   ,C_LINE_TYPE_ENC_BALANCING
9627 				  ,'RFE'
9628                                   ,C_LINE_TYPE_ENC_BAL_ERROR
9629 				  ,'RFE'
9630                                   ,'BALANCE');
9631 
9632 
9633   IF (C_LEVEL_EVENT >= g_log_level) THEN
9634     trace(p_msg    => '# xla_ae_lines inserted for balancing = '||SQL%ROWCOUNT,
9635           p_module => l_log_module,
9636           p_level  => C_LEVEL_EVENT);
9637   END IF;
9638 
9639 
9640 
9641   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9642     trace(p_msg    => 'End of procedure populate_balancing_lines',
9643           p_module => l_log_module,
9644           p_level  => C_LEVEL_PROCEDURE);
9645   END IF;
9646 EXCEPTION
9647 WHEN xla_exceptions_pkg.application_exception THEN
9648   RAISE;
9649 
9650 WHEN OTHERS THEN
9651   xla_exceptions_pkg.raise_message
9652       (p_location => 'xla_je_validation_pkg.populate_balancing_lines');
9653 END populate_balancing_lines;
9654 
9655 --=============================================================================
9656 --
9657 -- Name: populate_segment_values
9658 -- Description: This function populate the segment values for the journal entry
9659 --
9660 --=============================================================================
9661 PROCEDURE populate_segment_values
9662 IS
9663   l_log_module                 VARCHAR2(240);
9664 BEGIN
9665 
9666   IF g_log_enabled THEN
9667     l_log_module := C_DEFAULT_MODULE||'.populate_segment_values';
9668   END IF;
9669 
9670   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9671     trace(p_msg    => 'BEGIN of procedure populate_segment_values',
9672           p_module => l_log_module,
9673           p_level  => C_LEVEL_PROCEDURE);
9674   END IF;
9675 
9676   -- 4262811.  Added c_caller_mpa_program
9677   IF (g_caller in (C_CALLER_MPA_PROGRAM, C_CALLER_THIRD_PARTY_MERGE)) THEN
9678     DELETE FROM xla_ae_segment_values
9679      WHERE ae_header_id in (SELECT /*+ UNNEST NO_SEMIJOIN cardinality(XLA_AE_HEADERS_GT,1)*/ ae_header_id       -- 4752774  bug9174950
9680                               FROM xla_ae_headers_gt
9681                              WHERE ledger_id = g_ledger_id
9682                                AND accounting_date <= NVL(g_end_date, accounting_date));  -- 4262811
9683   ELSIF g_caller = C_CALLER_ACCT_PROGRAM THEN
9684      NULL;                                   -- bug 4883830
9685   ELSE
9686     DELETE FROM xla_ae_segment_values
9687      WHERE ae_header_id = g_ae_header_id;
9688   END IF;
9689 
9690   INSERT INTO xla_ae_segment_values
9691         (ae_header_id, segment_type_code, segment_value, ae_lines_count)
9692   SELECT ae_header_id, C_BAL_SEGMENT, bal_seg_value, count(*)
9693     FROM xla_validation_lines_gt
9694    WHERE bal_seg_value IS NOT NULL
9695    GROUP BY ae_header_id, bal_seg_value
9696    UNION ALL
9697   SELECT ae_header_id, C_MGT_SEGMENT, mgt_seg_value, count(*)
9698     FROM xla_validation_lines_gt
9699    WHERE mgt_seg_value IS NOT NULL
9700    GROUP BY ae_header_id, mgt_seg_value
9701    UNION ALL
9702   SELECT ae_header_id, C_CC_SEGMENT, cost_center_seg_value, count(*)
9703     FROM xla_validation_lines_gt
9704    WHERE cost_center_seg_value IS NOT NULL
9705    GROUP BY ae_header_id, cost_center_seg_value
9706    UNION ALL
9707   SELECT ae_header_id, C_NA_SEGMENT, natural_account_seg_value, count(*)
9708     FROM xla_validation_lines_gt
9709    WHERE natural_account_seg_value IS NOT NULL
9710    GROUP BY ae_header_id, natural_account_seg_value;
9711 
9712   IF (C_LEVEL_EVENT >= g_log_level) THEN
9713     trace(p_msg    => '# xla_ae_segment_values inserted = '||SQL%ROWCOUNT,
9714           p_module => l_log_module,
9715           p_level  => C_LEVEL_EVENT);
9716   END IF;
9717 
9718   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9719     trace(p_msg    => 'End of procedure populate_segment_values',
9720           p_module => l_log_module,
9721           p_level  => C_LEVEL_PROCEDURE);
9722   END IF;
9723 EXCEPTION
9724 WHEN xla_exceptions_pkg.application_exception THEN
9725   RAISE;
9726 
9727 WHEN OTHERS THEN
9728   xla_exceptions_pkg.raise_message
9729       (p_location => 'xla_je_validation_pkg.populate_segment_values');
9730 END populate_segment_values;
9731 
9732 --=============================================================================
9733 --
9734 -- Name: post_validation
9735 -- Description: This procedure performs the validation that to be done for
9736 --              the original journal entry lines as well as the XLA generated
9737 --              lines.
9738 --
9739 --=============================================================================
9740 PROCEDURE post_validation
9741 IS
9742   CURSOR c_cont_acct IS
9743     SELECT *
9744       FROM xla_validation_lines_gt
9745      WHERE balancing_line_type IN (C_LINE_TYPE_LC_BALANCING
9746                                   ,C_LINE_TYPE_XLA_BALANCING
9747                                   ,C_LINE_TYPE_ENC_BALANCING)
9748        AND control_account_enabled_flag <> 'N'
9749        AND (party_type_code IS NULL OR party_id IS NULL);
9750 
9751   l_prev_err_count  INTEGER;
9752   l_temp_err_count  INTEGER;
9753   l_log_module      VARCHAR2(240);
9754 BEGIN
9755 
9756   IF g_log_enabled THEN
9757     l_log_module := C_DEFAULT_MODULE||'.post_validation';
9758   END IF;
9759 
9760   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9761     trace(p_msg    => 'BEGIN of procedure post_validation',
9762           p_module => l_log_module,
9763           p_level  => C_LEVEL_PROCEDURE);
9764   END IF;
9765 
9766   l_prev_err_count := g_err_count;
9767 
9768   IF (C_LEVEL_ERROR >= g_log_level) THEN
9769     trace(p_msg    => 'before error count = '||g_err_count,
9770           p_module => l_log_module,
9771           p_level  => C_LEVEL_ERROR);
9772   END IF;
9773 
9774   -- logic
9775   FOR l_err IN c_cont_acct LOOP
9776     g_err_count := g_err_count+1;
9777     g_err_hdr_ids(g_err_count) := l_err.ae_header_id;
9778     g_err_event_ids(g_err_count) := l_err.event_id;
9779 
9780     IF (l_err.balancing_line_type = C_LINE_TYPE_LC_BALANCING) THEN
9781       xla_accounting_err_pkg.build_message(
9782          p_appli_s_name         => 'XLA'
9783         ,p_msg_name             => 'XLA_AP_CONT_LC_SUS_ACCT'
9784         ,p_entity_id            => l_err.entity_id
9785         ,p_event_id             => l_err.event_id
9786         ,p_ledger_id            => g_ledger_id
9787         ,p_ae_header_id         => l_err.ae_header_id
9788         ,p_ae_line_num          => l_err.ae_line_num
9789         ,p_accounting_batch_id  => NULL);
9790     ELSIF (l_err.balancing_line_type = C_LINE_TYPE_XLA_BALANCING) THEN
9791       xla_accounting_err_pkg.build_message(
9792          p_appli_s_name         => 'XLA'
9793         ,p_msg_name             => 'XLA_AP_CONT_XLA_SUS_ACCT'
9794         ,p_entity_id            => l_err.entity_id
9795         ,p_event_id             => l_err.event_id
9796         ,p_ledger_id            => g_ledger_id
9797         ,p_ae_header_id         => l_err.ae_header_id
9798         ,p_ae_line_num          => l_err.ae_line_num
9799         ,p_accounting_batch_id  => NULL);
9800     ELSE
9801       xla_accounting_err_pkg.build_message(
9802          p_appli_s_name         => 'XLA'
9803         ,p_msg_name             => 'XLA_AP_CONT_RFE_SUS_ACCT'
9804         ,p_entity_id            => l_err.entity_id
9805         ,p_event_id             => l_err.event_id
9806         ,p_ledger_id            => g_ledger_id
9807         ,p_ae_header_id         => l_err.ae_header_id
9808         ,p_ae_line_num          => l_err.ae_line_num
9809         ,p_accounting_batch_id  => NULL);
9810     END IF;
9811 
9812   END LOOP;
9813 
9814   IF (C_LEVEL_ERROR >= g_log_level) THEN
9815     trace(p_msg    => 'after error count = '||g_err_count,
9816           p_module => l_log_module,
9817           p_level  => C_LEVEL_ERROR);
9818 
9819     l_temp_err_count := g_err_count-l_prev_err_count;
9820     trace(p_msg    => '# error count from post_validation = '||l_temp_err_count,
9821           p_module => l_log_module,
9822           p_level  => C_LEVEL_ERROR);
9823   END IF;
9824 
9825   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9826     trace(p_msg    => 'END of procedure post_validation',
9827           p_module => l_log_module,
9828           p_level  => C_LEVEL_PROCEDURE);
9829   END IF;
9830 
9831 
9832 
9833 EXCEPTION
9834 WHEN xla_exceptions_pkg.application_exception THEN
9835   RAISE;
9836 
9837 WHEN OTHERS THEN
9838   xla_exceptions_pkg.raise_message
9839       (p_location => 'xla_je_validation_pkg.post_validation');
9840 END post_validation;
9841 
9842 
9843 --=============================================================================
9844 --
9845 -- Name: budgetary_control
9846 -- Description:
9847 --
9848 --=============================================================================
9849 PROCEDURE budgetary_control
9850 IS
9851   l_array_ae_header_id           t_array_int;
9852   l_array_ln_funds_status_code   t_array_varchar30;
9853   l_array_ln_funds_status        t_array_varchar80;
9854   l_array_hdr_funds_status_code  t_array_varchar30;
9855   l_array_event_id               t_array_int;
9856   l_array_entity_id              t_array_int;
9857   l_array_ae_line_num            t_array_int;
9858   l_array_balance_type_code      t_array_varchar30;
9859   l_array_entered_cr             t_array_number;
9860   l_array_entered_dr             t_array_number;
9861   l_array_accounted_cr           t_array_number;
9862   l_array_accounted_dr           t_array_number;
9863   l_array_unrounded_entered_cr   t_array_number;
9864   l_array_unrounded_entered_dr   t_array_number;
9865   l_array_unrounded_accounted_cr t_array_number;
9866   l_array_unrounded_accounted_dr t_array_number;
9867   l_msg_name                     VARCHAR2(30);
9868   l_return_code                  VARCHAR2(30);
9869   i                              INTEGER;
9870 
9871   l_log_module              VARCHAR2(240);
9872 BEGIN
9873   IF g_log_enabled THEN
9874     l_log_module := C_DEFAULT_MODULE||'.budgetary_control';
9875   END IF;
9876 
9877   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
9878     trace(p_msg    => 'BEGIN of procedure budgetary_control',
9879           p_module => l_log_module,
9880           p_level  => C_LEVEL_PROCEDURE);
9881   END IF;
9882 
9883   IF (g_err_count > 0) THEN
9884     FORALL i IN 1..g_err_count
9885       UPDATE xla_validation_lines_gt
9886          SET accounting_entry_status_code = xla_ae_journal_entry_pkg.C_INVALID
9887       WHERE ae_header_id = g_err_hdr_ids(i);
9888 
9889     FORALL i IN 1..g_err_count
9890       UPDATE xla_validation_lines_gt
9891          SET accounting_entry_status_code = xla_ae_journal_entry_pkg.C_RELATED_INVALID
9892        WHERE event_id = g_err_event_ids(i);
9893   END IF;
9894 
9895   --
9896   -- Call Funds Availablility API
9897   --
9898   -- Possible values returned in p_return_code are:
9899   -- S - If all rows in the packet pass funds check (Success)
9900   -- A - If all rows in the packet pass funds check and some of the rows have advisory warnings (Advisory)
9901   -- F - If all rows in the packet fail funds check (Fail)
9902   -- P - If some rows in the packet pass while some fail (Partial)
9903   -- T - If funds check throws a fatal error (Fatal)
9904   --
9905 
9906   IF (NOT PSA_FUNDS_CHECKER_PKG.budgetary_control
9907                (p_ledgerid    => g_ledger_id
9908                ,p_return_code => l_return_code)) THEN
9909 
9910     IF (C_LEVEL_ERROR >= g_log_level) THEN
9911       trace(p_msg    => 'ERROR: PSA_FUNDS_CHECKER_PKG.budgetary_control failed',
9912             p_module => l_log_module,
9913             p_level  => C_LEVEL_ERROR);
9914     END IF;
9915 
9916     xla_exceptions_pkg.raise_message
9917             (p_appli_s_name   => 'XLA'
9918             ,p_msg_name       => 'XLA_COMMON_ERROR'
9919             ,p_token_1        => 'LOCATION'
9920             ,p_value_1        => 'xla_je_validation_pkg.budgetary_control'
9921             ,p_token_2        => 'ERROR'
9922             ,p_value_2        => 'PSA_FUNDS_CHECK_PKG.budgetary_control failed');
9923 
9924   ELSE
9925 
9926     --
9927     -- Possible values returned to xla_ae_headers_gt.funds_status_codes are:
9928     -- S - If all rows in the packet pass funds check (Success)
9929     -- A - If all rows in the packet pass funds check and some of the rows have advisory warnings (Advisory)
9930     -- F - If all rows in the packet fail funds check (Fail)
9931     -- P - If some rows in the packet pass while some fail (Partial)
9932     -- T - If funds check throws a fatal error (Fatal)
9933     --
9934     SELECT ae_header_id
9935          , funds_status_code
9936          , event_id
9937          , entity_id
9938       BULK COLLECT INTO
9939            l_array_ae_header_id
9940          , l_array_hdr_funds_status_code
9941          , l_array_event_id
9942          , l_array_entity_id
9943       FROM xla_ae_headers_gt
9944      WHERE ledger_id = g_ledger_id;
9945 
9946     IF (C_LEVEL_STATEMENT >= g_log_level) THEN
9947       FOR i IN 1 .. l_array_ae_header_id.count LOOP
9948         trace(p_msg    => 'ae_header_id = '||l_array_ae_header_id(i)||
9949                           ', funds_status_code = '||l_array_hdr_funds_status_code(i),
9950               p_module => l_log_module,
9951               p_level  => C_LEVEL_STATEMENT);
9952       END LOOP;
9953     END IF;
9954 
9955     -- Update header level status
9956     FORALL i IN 1 .. l_array_ae_header_id.count
9957       UPDATE xla_ae_headers
9958          SET funds_status_code            = l_array_hdr_funds_status_code(i)
9959            , accounting_entry_status_code = CASE WHEN l_array_hdr_funds_status_code(i) = 'F' THEN
9960                                                       'I'
9961 			                     WHEN l_array_hdr_funds_status_code(i) = 'T' THEN
9962 					              'I'
9963                                                  ELSE accounting_entry_status_code
9964                                             END
9965              -- Bug 5056632. updates group_id back to Null if je is invalid
9966            , group_id                     = CASE WHEN l_array_hdr_funds_status_code(i) = 'F' THEN
9967                                                       NULL
9968     				            WHEN l_array_hdr_funds_status_code(i) = 'T' THEN
9969 					              NULL
9970                                                  ELSE group_id
9971                                             END
9972        WHERE application_id    = g_application_id
9973          AND ae_header_id      = l_array_ae_header_id(i);
9974 
9975     IF (C_LEVEL_EVENT >= g_log_level) THEN
9976       trace(p_msg    => '# row updated in xla_ae_headers = '||SQL%ROWCOUNT,
9977             p_module => l_log_module,
9978             p_level  => C_LEVEL_EVENT);
9979     END IF;
9980 
9981     FOR i IN 1 .. l_array_event_id.count LOOP
9982       IF (l_array_hdr_funds_status_code(i)  = 'F')OR(l_array_hdr_funds_status_code(i) = 'T') THEN
9983         g_err_count := g_err_count + 1;
9984         g_err_hdr_ids(g_err_count) := l_array_ae_header_id(i);
9985         g_err_event_ids(g_err_count) := l_array_event_id(i);
9986 
9987         xla_accounting_err_pkg.build_message(
9988               p_appli_s_name          => 'XLA'
9989               ,p_msg_name             => 'XLA_BC_FAILED_HDR'
9990               ,p_entity_id            => l_array_entity_id(i)
9991               ,p_event_id             => l_array_event_id(i)
9992               ,p_ledger_id            => g_ledger_id
9993               ,p_ae_header_id         => l_array_ae_header_id(i)
9994               ,p_ae_line_num          => NULL
9995               ,p_accounting_batch_id  => NULL);
9996 
9997       ELSIF (l_array_hdr_funds_status_code(i)  = 'A') THEN
9998 
9999         xla_accounting_err_pkg.build_message(
10000               p_appli_s_name          => 'XLA'
10001               ,p_msg_name             => 'XLA_BC_ADVISORY_HDR'
10002               ,p_entity_id            => l_array_entity_id(i)
10003               ,p_event_id             => l_array_event_id(i)
10004               ,p_ledger_id            => g_ledger_id
10005               ,p_ae_header_id         => l_array_ae_header_id(i)
10006               ,p_ae_line_num          => NULL
10007               ,p_accounting_batch_id  => NULL);
10008 
10009       ELSIF (l_array_hdr_funds_status_code(i)  = 'P') THEN
10010 
10011         xla_accounting_err_pkg.build_message(
10012               p_appli_s_name          => 'XLA'
10013               ,p_msg_name             => 'XLA_BC_PARTIAL_HDR'
10014               ,p_entity_id            => l_array_entity_id(i)
10015               ,p_event_id             => l_array_event_id(i)
10016               ,p_ledger_id            => g_ledger_id
10017               ,p_ae_header_id         => l_array_ae_header_id(i)
10018               ,p_ae_line_num          => NULL
10019               ,p_accounting_batch_id  => NULL);
10020 
10021       END IF;
10022     END LOOP;
10023 
10024     --
10025     -- Possible values returned to xla_validation_lines_gt.funds_status_codes
10026     -- can be found using
10027     -- select * from fnd_lookup_values where lookup_type like 'FUNDS_CHECK_RESULT_CODE'
10028     -- and language = 'US' order by lookup_code;
10029     -- In particular, any result code starts with 'F' (FXX) means the line is
10030     -- failed for funds check, and any result code starts with 'P' (PXX) means the line
10031     -- passed funds check.
10032     --
10033     SELECT xvl.ae_header_id
10034          , xvl.ae_line_num
10035          , xvl.event_id
10036          , xvl.entity_id
10037          , xvl.funds_status_code
10038          , flv.meaning
10039          , xah.funds_status_code
10040          , xvl.entered_cr
10041          , xvl.entered_dr
10042          , xvl.accounted_cr
10043          , xvl.accounted_dr
10044          , xvl.unrounded_entered_cr
10045          , xvl.unrounded_entered_dr
10046          , xvl.unrounded_accounted_cr
10047          , xvl.unrounded_accounted_dr
10048       BULK COLLECT INTO
10049            l_array_ae_header_id
10050          , l_array_ae_line_num
10051          , l_array_event_id
10052          , l_array_entity_id
10053          , l_array_ln_funds_status_code
10054          , l_array_ln_funds_status
10055          , l_array_hdr_funds_status_code
10056          , l_array_entered_cr
10057          , l_array_entered_dr
10058          , l_array_accounted_cr
10059          , l_array_accounted_dr
10060          , l_array_unrounded_entered_cr
10061          , l_array_unrounded_entered_dr
10062          , l_array_unrounded_accounted_cr
10063          , l_array_unrounded_accounted_dr
10064       FROM xla_validation_lines_gt xvl
10065          , xla_ae_headers          xah
10066          , fnd_lookup_values       flv
10067      WHERE xvl.ae_header_id                   = xah.ae_header_id
10068        AND xvl.accounting_class_code         <> 'RFE'
10069        AND flv.lookup_type                    = 'FUNDS_CHECK_RESULT_CODE'
10070        AND flv.lookup_code                    = xvl.funds_status_code
10071        AND flv.language                       = USERENV('LANG');
10072 
10073     IF (C_LEVEL_EVENT >= g_log_level) THEN
10074       trace(p_msg    => '# lines = '||l_array_ae_header_id.count,
10075             p_module => l_log_module,
10076             p_level  => C_LEVEL_EVENT);
10077     END IF;
10078 
10079     FOR i IN 1 .. l_array_ae_header_id.count LOOP
10080 
10081       l_msg_name := NULL;
10082 
10083       -- bug 4897846: only following codes are treated as advisory
10084       -- IF (l_array_ln_funds_status_code(i) BETWEEN 'P20' AND 'P39') THEN
10085       IF (l_array_ln_funds_status_code(i) in ('P20', 'P22', 'P25', 'P27', 'P29', 'P31', 'P35',
10086                                               'P36', 'P37', 'P38', 'P39')) THEN
10087           l_msg_name := 'XLA_BC_ADVISORY_LINE';
10088 
10089       ELSIF (SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F') THEN
10090 
10091         IF ((l_array_hdr_funds_status_code(i) = 'F')OR(l_array_hdr_funds_status_code(i)='T')) THEN
10092           l_msg_name := 'XLA_BC_FAILED_LINE';
10093 
10094         ELSE -- header status code = 'P'
10095           l_msg_name := 'XLA_BC_PARTIAL_LINE';
10096 
10097         END IF;
10098       END IF;
10099 
10100       IF (C_LEVEL_EVENT >= g_log_level) THEN
10101         trace(p_msg    => 'Funds message for event id = '||l_array_event_id(i)||
10102                           ', msg = '||NVL(l_msg_name,''),
10103               p_module => l_log_module,
10104               p_level  => C_LEVEL_EVENT);
10105       END IF;
10106 
10107       IF (l_msg_name IS NOT NULL) THEN
10108         xla_accounting_err_pkg.build_message(
10109               p_appli_s_name          => 'XLA'
10110               ,p_msg_name             => l_msg_name
10111               ,p_token_1              => 'MSG'
10112               ,p_value_1              => l_array_ln_funds_status(i)
10113               ,p_entity_id            => l_array_entity_id(i)
10114               ,p_event_id             => l_array_event_id(i)
10115               ,p_ledger_id            => g_ledger_id
10116               ,p_ae_header_id         => l_array_ae_header_id(i)
10117               ,p_ae_line_num          => l_array_ae_line_num(i)
10118               ,p_accounting_batch_id  => NULL);
10119       END IF;
10120     END LOOP;
10121 
10122     IF (C_LEVEL_EVENT >= g_log_level) THEN
10123       trace(p_msg    => 'Done stacking error messages',
10124             p_module => l_log_module,
10125             p_level  => C_LEVEL_EVENT);
10126     END IF;
10127 
10128     -- Update line level funds status, and update the amount to zero if it is
10129     -- an encumbrance entry and the BC validation partially failed for the JE
10130     FORALL i IN 1 .. l_array_ae_header_id.count
10131       UPDATE xla_ae_lines
10132        SET funds_status_code = l_array_ln_funds_status_code(i)
10133          , entered_cr   = CASE WHEN entered_cr IS NULL
10134                                THEN NULL
10135                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10136                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10137                                THEN 0
10138                                ELSE entered_cr END
10139          , entered_dr   = CASE WHEN entered_dr IS NULL
10140                                THEN NULL
10141                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10142                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10143                                THEN 0
10144                                ELSE entered_dr END
10145          , accounted_cr = CASE WHEN accounted_cr IS NULL
10146                                THEN NULL
10147                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10148                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10149                                THEN 0
10150                                ELSE accounted_cr END
10151          , accounted_dr = CASE WHEN accounted_dr IS NULL
10152                                THEN NULL
10153                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10154                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10155                                THEN 0
10156                                ELSE accounted_dr END
10157          , unrounded_entered_cr
10158                         = CASE WHEN unrounded_entered_cr IS NULL
10159                                THEN NULL
10160                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10161                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10162                                THEN 0
10163                                ELSE unrounded_entered_cr END
10164          , unrounded_entered_dr
10165                         = CASE WHEN unrounded_entered_dr IS NULL
10166                                THEN NULL
10167                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10168                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10169                                THEN 0
10170                                ELSE unrounded_entered_dr END
10171          , unrounded_accounted_cr
10172                         = CASE WHEN unrounded_accounted_cr IS NULL
10173                                THEN NULL
10174                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10175                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10176                                THEN 0
10177                                ELSE unrounded_accounted_cr END
10178          , unrounded_accounted_dr
10179                         = CASE WHEN unrounded_accounted_dr IS NULL
10180                                THEN NULL
10181                                WHEN l_array_hdr_funds_status_code(i)            = 'P'
10182                                 AND SUBSTR(l_array_ln_funds_status_code(i),1,1) = 'F'
10183                                THEN 0
10184                                ELSE unrounded_accounted_dr END
10185      WHERE application_id    = g_application_id
10186        AND ae_header_id      = l_array_ae_header_id(i)
10187        AND ae_line_num       = l_array_ae_line_num(i);
10188 
10189     IF (C_LEVEL_EVENT >= g_log_level) THEN
10190       trace(p_msg    => '# row updated in xla_ae_lines = '||SQL%ROWCOUNT,
10191             p_module => l_log_module,
10192             p_level  => C_LEVEL_EVENT);
10193     END IF;
10194 
10195     -- Adjust the amount for the RFE lines for any failed BC lines
10196     FORALL i in 1 .. l_array_ae_header_id.count
10197       UPDATE xla_ae_lines
10198          SET entered_cr   = CASE WHEN entered_cr IS NULL
10199                                  THEN NULL
10200                                  ELSE entered_cr   - NVL(l_array_entered_dr(i),0)
10201                                  END
10202            , entered_dr   = CASE WHEN entered_dr IS NULL
10203                                  THEN NULL
10204                                  ELSE entered_dr   - NVL(l_array_entered_cr(i),0)
10205                                  END
10206            , accounted_cr = CASE WHEN accounted_cr IS NULL
10207                                  THEN NULL
10208                                  ELSE accounted_cr - NVL(l_array_accounted_dr(i),0)
10209                                  END
10210            , accounted_dr = CASE WHEN accounted_dr IS NULL
10211                                  THEN NULL
10212                                  ELSE accounted_dr - NVL(l_array_accounted_cr(i),0)
10213                                  END
10214            , unrounded_entered_cr
10215                                = CASE WHEN unrounded_entered_cr IS NULL
10216                                  THEN NULL
10217                                  ELSE unrounded_entered_cr   - NVL(l_array_unrounded_entered_dr(i),0)
10218                                  END
10219            , unrounded_entered_dr
10220                                = CASE WHEN unrounded_entered_dr IS NULL
10221                                  THEN NULL
10222                                  ELSE unrounded_entered_dr   - NVL(l_array_unrounded_entered_cr(i),0)
10223                                  END
10224            , unrounded_accounted_cr
10225                                = CASE WHEN unrounded_accounted_cr IS NULL
10226                                  THEN NULL
10227                                  ELSE unrounded_accounted_cr - NVL(l_array_unrounded_accounted_dr(i),0)
10228                                  END
10229            , unrounded_accounted_dr
10230                                = CASE WHEN unrounded_accounted_dr IS NULL
10231                                  THEN NULL
10232                                  ELSE unrounded_accounted_dr - NVL(l_array_unrounded_accounted_cr(i),0)
10233                                  END
10234        WHERE application_id                               = g_application_id
10235          AND ae_header_id                                 = l_array_ae_header_id(i)
10236          AND l_array_hdr_funds_status_code(i)             = 'P'
10237          AND SUBSTR(l_array_ln_funds_status_code(i),1,1)  = 'F'
10238          AND accounting_class_code                        = 'RFE';
10239 
10240     IF (C_LEVEL_EVENT >= g_log_level) THEN
10241       trace(p_msg    => '# RFE row updated in xla_ae_lines = '||SQL%ROWCOUNT,
10242             p_module => l_log_module,
10243             p_level  => C_LEVEL_EVENT);
10244     END IF;
10245 
10246   END IF;
10247 
10248   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10249     trace(p_msg    => 'End of procedure budgetary_control',
10250           p_module => l_log_module,
10251           p_level  => C_LEVEL_PROCEDURE);
10252   END IF;
10253 EXCEPTION
10254 WHEN xla_exceptions_pkg.application_exception THEN
10255   RAISE;
10256 
10257 WHEN OTHERS THEN
10258   xla_exceptions_pkg.raise_message
10259       (p_location => 'xla_je_validation_pkg.budgetary_control');
10260 END budgetary_control;
10261 
10262 
10263 
10264 --=============================================================================
10265 --
10266 -- Name: update_error_status
10267 -- Description: This procedure update the error status if errors was encountered.
10268 --
10269 --=============================================================================
10270 PROCEDURE update_error_status
10271 IS
10272   l_log_module          VARCHAR2(240);
10273 BEGIN
10274   IF g_log_enabled THEN
10275     l_log_module := C_DEFAULT_MODULE||'.update_error_status';
10276   END IF;
10277 
10278   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10279     trace(p_msg    => 'BEGIN of procedure update_error_status',
10280           p_module => l_log_module,
10281           p_level  => C_LEVEL_PROCEDURE);
10282   END IF;
10283 
10284   --------------------------------------------------------------------------------
10285   -- 4262811a note: Do not modify. This sets the status correctly on each MPA rows
10286   --------------------------------------------------------------------------------
10287   FORALL i IN 1..g_err_count
10288     UPDATE xla_ae_headers
10289        SET accounting_entry_status_code = C_AE_STATUS_INVALID
10290            -- Bug 5056632. updates group_id back to Null if je is invalid
10291           ,group_id                     = NULL
10292      WHERE ae_header_id = g_err_hdr_ids(i)
10293        AND application_id = g_application_id;
10294 
10295   IF (C_LEVEL_EVENT >= g_log_level) THEN
10296     trace(p_msg    => '# xla_ae_headers updated to C_AE_STATUS_INVALID = '||SQL%ROWCOUNT,
10297           p_module => l_log_module,
10298           p_level  => C_LEVEL_EVENT);
10299   END IF;
10300 
10301   IF g_caller = C_CALLER_ACCT_PROGRAM THEN      -- 4262811a
10302 
10303      /*
10304      FORALL i IN 1..g_err_count
10305        UPDATE xla_ae_headers
10306           SET accounting_entry_status_code = C_AE_STATUS_RELATED
10307         WHERE accounting_entry_status_code <> C_AE_STATUS_INVALID
10308           AND event_id = g_err_event_ids(i)
10309           AND application_id = g_application_id;
10310      */
10311      FORALL i IN 1..g_err_count
10312        UPDATE xla_ae_headers xah1                  -- 4262811a
10313           SET accounting_entry_status_code = C_AE_STATUS_RELATED
10314               -- Bug 5056632. updates group_id back to Null if je is invalid
10315              ,group_id                     = NULL
10316         WHERE xah1.accounting_entry_status_code <> C_AE_STATUS_INVALID
10317           AND xah1.event_id = g_err_event_ids(i)
10318           AND xah1.application_id = g_application_id
10319           AND xah1.parent_ae_line_num IS NULL      -- 4262811a Existing logic, and this works for Accrual Reversal.
10320           AND NOT EXISTS (SELECT 1                 -- 4262811a Do not update MPA's original entry, it is set correctly above.
10321                           FROM   xla_ae_headers xah2
10322                           WHERE  xah2.event_id        = xah1.event_id         -- 5231063 g_err_event_ids(i)
10323                           AND    xah2.application_id  = xah1.application_id   -- 5231063 g_application_id
10324                           AND    xah2.ae_header_id    = g_err_hdr_ids(i)
10325                           AND    xah2.parent_ae_line_num IS NOT NULL);
10326 
10327      IF (C_LEVEL_EVENT >= g_log_level) THEN
10328        trace(p_msg    => '# xla_ae_headers updated to C_AE_STATUS_RELATED = '||SQL%ROWCOUNT,
10329              p_module => l_log_module,
10330              p_level  => C_LEVEL_EVENT);
10331      END IF;
10332      --------------------------------------------------------------------------------------
10333      -- 4262811a Update MPA rows ----------------------------------------------------------
10334      --------------------------------------------------------------------------------------
10335      FORALL i IN 1..g_err_count
10336        UPDATE xla_ae_headers xah1
10337           SET (accounting_entry_status_code, group_id) =
10338               (SELECT DECODE(xah2.accounting_entry_status_code
10339                             ,'D',xah1.accounting_entry_status_code
10340                             ,'F',xah1.accounting_entry_status_code
10341                             ,CASE  --added case statement bug 13023651 do not mark invalid mpa recog rows to 'R' when they are already 'I'
10342            			WHEN xah1.accounting_entry_status_code IN ('D','F','N')
10343                 		THEN C_AE_STATUS_RELATED
10344            			ELSE xah1.accounting_entry_status_code
10345            		     END )
10346                       --
10347                       -- Bug 5056632. updates group_id back to Null if je is invalid
10348                      ,NULL
10349                FROM   xla_ae_headers xah2
10350                WHERE  xah2.event_id       = g_err_event_ids(i)
10351                AND    xah2.application_id = g_application_id
10352                AND    xah2.ae_header_id   = xah1.parent_ae_header_id
10353                AND    xah2.parent_ae_line_num IS NULL)
10354         WHERE xah1.event_id       = g_err_event_ids(i)
10355           AND xah1.application_id = g_application_id
10356           AND xah1.parent_ae_line_num IS NOT NULL;
10357      --------------------------------------------------------------------------------------
10358 
10359      /*
10360      FORALL i IN 1..g_err_count
10361      UPDATE xla_events_gt
10362           SET process_status_code = 'I'
10363         WHERE event_id = g_err_event_ids(i)
10364           AND process_status_code <> 'E';
10365      */
10366      FORALL i IN 1..g_err_count
10367      UPDATE xla_events_gt evt     -- 4262811a
10368           SET process_status_code =
10369               (SELECT DECODE(xah2.parent_ae_line_num,NULL,'I'  -- 4262811a  Status of MPA rows does not affect event status
10370                                                          , evt.process_status_code)
10371                FROM   xla_ae_headers xah2
10372                WHERE  xah2.event_id       = g_err_event_ids(i)
10373                AND    xah2.application_id = g_application_id
10374                AND    xah2.ae_header_id   = g_err_hdr_ids(i))
10375         WHERE event_id = g_err_event_ids(i)
10376           AND process_status_code <> 'E';
10377 
10378 
10379      IF (C_LEVEL_EVENT >= g_log_level) THEN
10380        trace(p_msg    => '# xla_events_gt updated = '||SQL%ROWCOUNT,
10381              p_module => l_log_module,
10382              p_level  => C_LEVEL_EVENT);
10383      END IF;
10384   END IF;  --  4262811a g_caller = C_CALLER_ACCT_PROGRAM
10385 
10386   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10387     trace(p_msg    => 'End of procedure update_error_status',
10388           p_module => l_log_module,
10389           p_level  => C_LEVEL_PROCEDURE);
10390   END IF;
10391 EXCEPTION
10392 WHEN xla_exceptions_pkg.application_exception THEN
10393   RAISE;
10394 
10395 WHEN OTHERS THEN
10396   xla_exceptions_pkg.raise_message
10397       (p_location => 'xla_je_validation_pkg.update_error_status');
10398 END;
10399 
10400 --=============================================================================
10401 --
10402 -- Name: undo_funds_reserve
10403 -- Description: This procedure undo the funds reservation if there is any
10404 --              error in secondary or report currency ledgers
10405 --
10406 --=============================================================================
10407 PROCEDURE undo_funds_reserve
10408 IS
10409   CURSOR c_failed_je IS
10410     SELECT distinct xah.ledger_id, xah.event_id
10411       FROM xla_ae_headers xah
10412          , xla_events_gt  xeg
10413      WHERE xeg.event_id = xah.event_id
10414        AND xah.application_id = g_application_id
10415        AND xeg.process_status_code = 'I';
10416 
10417   l_failed_ldgr_array   PSA_FUNDS_CHECKER_PKG.num_rec;
10418   l_failed_evnt_array   PSA_FUNDS_CHECKER_PKG.num_rec;
10419   l_log_module          VARCHAR2(240);
10420 BEGIN
10421   IF g_log_enabled THEN
10422     l_log_module := C_DEFAULT_MODULE||'.undo_funds_reserve';
10423   END IF;
10424 
10425   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10426     trace(p_msg    => 'BEGIN of procedure undo_funds_reserve',
10427           p_module => l_log_module,
10428           p_level  => C_LEVEL_PROCEDURE);
10429   END IF;
10430 
10431   OPEN c_failed_je;
10432   FETCH c_failed_je BULK COLLECT INTO l_failed_ldgr_array, l_failed_evnt_array;
10433   CLOSE c_failed_je;
10434 
10435   psa_funds_checker_pkg.sync_xla_errors
10436       (p_failed_ldgr_array => l_failed_ldgr_array
10437       ,p_failed_evnt_array => l_failed_evnt_array);
10438 
10439   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10440     trace(p_msg    => 'End of procedure undo_funds_reserve',
10441           p_module => l_log_module,
10442           p_level  => C_LEVEL_PROCEDURE);
10443   END IF;
10444 EXCEPTION
10445 WHEN xla_exceptions_pkg.application_exception THEN
10446   RAISE;
10447 
10448 WHEN OTHERS THEN
10449   xla_exceptions_pkg.raise_message
10450       (p_location => 'xla_je_validation_pkg.undo_funds_reserve');
10451 END;
10452 
10453 
10454 --=============================================================================
10455 --
10456 -- Name: populate_ledger_info
10457 -- Description: This procedure populate ledger information to the global
10458 --              variables.
10459 --
10460 --=============================================================================
10461 PROCEDURE populate_ledger_info
10462 IS
10463   CURSOR c_qualifier_segment (p_coa_id INTEGER, p_qualifier VARCHAR2) IS
10464     SELECT application_column_name
10465       FROM fnd_segment_attribute_values
10466      WHERE application_id = 101
10467        AND id_flex_code = 'GL#'
10468        AND id_flex_num = p_coa_id
10469        AND attribute_value = 'Y'
10470        AND segment_attribute_type = p_qualifier;
10471 
10472   l_log_module           VARCHAR2(240);
10473 BEGIN
10474   IF g_log_enabled THEN
10475     l_log_module := C_DEFAULT_MODULE||'.populate_ledger_info';
10476   END IF;
10477 
10478   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10479     trace(p_msg    => 'BEGIN of function populate_ledger_info',
10480           p_module => l_log_module,
10481           p_level  => C_LEVEL_PROCEDURE);
10482   END IF;
10483 
10484   -- 4262811.  Added in C_CALLER_MPA_PROGRAM.
10485   IF (g_caller in (C_CALLER_ACCT_PROGRAM, C_CALLER_MPA_PROGRAM)) THEN
10486     g_ledger_name                  := xla_accounting_cache_pkg.GetValueChar('XLA_LEDGER_NAME',g_ledger_id);
10487     g_ledger_currency_code         := xla_accounting_cache_pkg.GetValueChar('XLA_CURRENCY_CODE',g_ledger_id);
10488     g_ledger_coa_id                := xla_accounting_cache_pkg.GetValueNum('XLA_COA_ID',g_ledger_id);
10489     g_bal_seg_column_name          := xla_accounting_cache_pkg.GetValueChar('BAL_SEG_COLUMN_NAME',g_ledger_id);
10490     g_mgt_seg_column_name          := xla_accounting_cache_pkg.GetValueChar('MGT_SEG_COLUMN_NAME',g_ledger_id);
10491     g_allow_intercompany_post_flag := xla_accounting_cache_pkg.GetValueChar('ALLOW_INTERCOMPANY_POST_FLAG',g_ledger_id);
10492     g_bal_seg_value_option_code    := xla_accounting_cache_pkg.GetValueChar('BAL_SEG_VALUE_OPTION_CODE',g_ledger_id);
10493     g_mgt_seg_value_option_code    := xla_accounting_cache_pkg.GetValueChar('MGT_SEG_VALUE_OPTION_CODE',g_ledger_id);
10494     g_sla_bal_by_ledger_curr_flag  := xla_accounting_cache_pkg.GetValueChar('SLA_BAL_BY_LEDGER_CURR_FLAG',g_ledger_id);
10495     g_sla_ledger_cur_bal_sus_ccid  := xla_accounting_cache_pkg.GetValueNum('XLA_LEDGER_CUR_BAL_SUS_CCID',g_ledger_id);
10496     g_sla_entered_cur_bal_sus_ccid := xla_accounting_cache_pkg.GetValueNum('XLA_ENTERED_CUR_BAL_SUS_CCID',g_ledger_id);
10497     g_sla_rounding_ccid            := xla_accounting_cache_pkg.GetValueNum('XLA_ROUNDING_CCID',g_ledger_id);
10498     g_latest_encumbrance_year      := xla_accounting_cache_pkg.GetValueNum('LATEST_ENCUMBRANCE_YEAR',g_ledger_id);
10499     g_transaction_calendar_id      := xla_accounting_cache_pkg.GetValueNum('TRANSACTION_CALENDAR_ID',g_ledger_id);
10500     g_enable_average_balances_flag := xla_accounting_cache_pkg.GetValueChar('ENABLE_AVERAGE_BALANCES_FLAG',g_ledger_id);
10501     g_res_encumb_ccid              := xla_accounting_cache_pkg.GetValueNum('RES_ENCUMB_CODE_COMBINATION_ID',g_ledger_id);
10502     g_ledger_category_code         := xla_accounting_cache_pkg.GetValueChar('LEDGER_CATEGORY_CODE',g_ledger_id);
10503     g_suspense_allowed_flag        := xla_accounting_cache_pkg.GetValueChar('SUSPENSE_ALLOWED_FLAG',g_ledger_id);
10504 /*
10505     SELECT suspense_allowed_flag
10506       INTO g_suspense_allowed_flag
10507       FROM gl_ledgers
10508      WHERE ledger_id = g_ledger_id;
10509 */
10510   ELSE
10511     SELECT name
10512           ,currency_code ledger_currency_code
10513           ,chart_of_accounts_id ledger_coa_id
10514           ,bal_seg_column_name
10515           ,mgt_seg_column_name
10516           ,allow_intercompany_post_flag
10517           ,bal_seg_value_option_code
10518           ,mgt_seg_value_option_code
10519           ,sla_bal_by_ledger_curr_flag
10520           ,sla_ledger_cur_bal_sus_ccid
10521           ,sla_entered_cur_bal_sus_ccid
10522           ,rounding_code_combination_id
10523           ,latest_encumbrance_year
10524           ,transaction_calendar_id
10525           ,enable_average_balances_flag
10526           ,res_encumb_code_combination_id
10527           ,ledger_category_code
10528           ,suspense_allowed_flag
10529       INTO g_ledger_name,
10530            g_ledger_currency_code,
10531            g_ledger_coa_id,
10532            g_bal_seg_column_name,
10533            g_mgt_seg_column_name,
10534            g_allow_intercompany_post_flag,
10535            g_bal_seg_value_option_code,
10536            g_mgt_seg_value_option_code,
10537            g_sla_bal_by_ledger_curr_flag,
10538            g_sla_ledger_cur_bal_sus_ccid,
10539            g_sla_entered_cur_bal_sus_ccid,
10540            g_sla_rounding_ccid,
10541            g_latest_encumbrance_year,
10542            g_transaction_calendar_id,
10543            g_enable_average_balances_flag,
10544            g_res_encumb_ccid,
10545            g_ledger_category_code,
10546            g_suspense_allowed_flag
10547       FROM gl_ledgers
10548      WHERE ledger_id = g_ledger_id;
10549   END IF;
10550 
10551   IF (g_latest_encumbrance_year IS NULL) THEN
10552     g_latest_encumbrance_year := 0;
10553   END IF;
10554 
10555   IF (g_ledger_category_code = 'ALC') THEN
10556     g_target_ledger_id := g_trx_ledger_id;
10557   ELSE
10558     g_target_ledger_id := g_ledger_id;
10559   END IF;
10560 
10561   OPEN c_qualifier_segment(g_ledger_coa_id, 'GL_ACCOUNT');
10562   FETCH c_qualifier_segment INTO g_na_seg_column_name;
10563   CLOSE c_qualifier_segment;
10564 
10565   OPEN c_qualifier_segment(g_ledger_coa_id, 'FA_COST_CTR');
10566   FETCH c_qualifier_segment INTO g_cc_seg_column_name;
10567   CLOSE c_qualifier_segment;
10568 
10569   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10570     trace(p_msg    => 'END of function populate_ledger_info',
10571           p_module => l_log_module,
10572           p_level  => C_LEVEL_PROCEDURE);
10573   END IF;
10574 EXCEPTION
10575 WHEN xla_exceptions_pkg.application_exception THEN
10576   IF (c_qualifier_segment%ISOPEN) THEN
10577     CLOSE c_qualifier_segment;
10578   END IF;
10579   RAISE;
10580 
10581 WHEN OTHERS THEN
10582   IF (c_qualifier_segment%ISOPEN) THEN
10583     CLOSE c_qualifier_segment;
10584   END IF;
10585   xla_exceptions_pkg.raise_message
10586       (p_location => 'xla_je_validation_pkg.populate_ledger_info');
10587 END populate_ledger_info;
10588 
10589 
10590 --=============================================================================
10591 --
10592 -- Name: balance_by_ledger
10593 -- Description: This procedure performs balancing and validation by ledger.
10594 --
10595 --=============================================================================
10596 PROCEDURE balance_by_ledger
10597   (p_ledger_id              INTEGER
10598   ,p_ledger_category_code   VARCHAR2
10599   ,p_budgetary_control_mode VARCHAR2)
10600 IS
10601   l_log_module           VARCHAR2(240);
10602   l_valuation_method_flag  VARCHAR2(1) := 'N';
10603 BEGIN
10604 
10605   IF g_log_enabled THEN
10606     l_log_module := C_DEFAULT_MODULE||'.balance_by_ledger';
10607   END IF;
10608 
10609   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10610     trace(p_msg    => 'BEGIN of function balance_by_ledger - ledger_id = '||p_ledger_id,
10611           p_module => l_log_module,
10612           p_level  => C_LEVEL_PROCEDURE);
10613   END IF;
10614 
10615   g_ledger_id := p_ledger_id;
10616   populate_ledger_info;
10617 
10618   --
10619   -- Load working data into the temporary table
10620 
10621  load_lines(p_budgetary_control_mode);
10622 
10623   --
10624   -- Perform validation
10625   --
10626   validation;
10627 
10628   IF (g_balance_flag) THEN
10629     balance_single_entered_curr;
10630     balance_by_ledger_currency;
10631     balance_by_intercompany;
10632     balance_by_entered_curr;
10633     balance_by_encumberance;
10634     balance_by_journal_rounding;
10635     IF (g_new_line_count > 0) THEN
10636       post_validation;
10637       populate_balancing_lines;
10638     END IF;
10639     populate_segment_values;
10640   END IF;
10641 
10642 
10643   -- 6369778 to use secondary ledger for budgetory control purpose
10644 SELECT nvl(valuation_method_flag,'N')
10645 INTO   l_valuation_method_flag
10646 FROM   XLA_SUBLEDGERS
10647 WHERE  application_id = g_application_id;
10648 
10649 IF  (p_budgetary_control_mode <> 'NONE') AND
10650         (NVL(p_ledger_category_code,'NONE') NOT IN ('ALC'))
10651         AND
10652         (  p_ledger_category_code = 'PRIMARY'
10653            OR
10654            ( NVL(p_ledger_category_code,'NONE') = 'SECONDARY' AND
10655              l_valuation_method_flag = 'Y'
10656            )
10657         ) THEN
10658       budgetary_control;
10659 END IF;
10660 
10661   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10662     trace(p_msg    => 'END of function balance_by_ledger',
10663           p_module => l_log_module,
10664           p_level  => C_LEVEL_PROCEDURE);
10665   END IF;
10666 EXCEPTION
10667 WHEN xla_exceptions_pkg.application_exception THEN
10668   RAISE;
10669 
10670 WHEN OTHERS THEN
10671   xla_exceptions_pkg.raise_message
10672       (p_location => 'xla_je_validation_pkg.balance_by_ledger');
10673 END balance_by_ledger;
10674 
10675 
10676 --=============================================================================
10677 --
10678 --
10679 --
10680 --
10681 --
10682 --          *********** public procedures and functions **********
10683 --
10684 --
10685 --
10686 --
10687 --
10688 --=============================================================================
10689 
10690 --=============================================================================
10691 --
10692 -- Name: balance_amounts
10693 -- Description: This function handle the validation and the balancing
10694 --              requirement for a standard journal entry.
10695 -- Parameters:
10696 --   p_application_id - the application id (required)
10697 --   p_ledger_id - the transaction ledger id (required)
10698 -- Result:
10699 --      0 - The balancing routine is completed successfully
10700 --      1 - Error is found in the balancing program
10701 --
10702 --=============================================================================
10703 FUNCTION balance_amounts
10704   (p_application_id             IN  INTEGER
10705   ,p_mode                       IN  VARCHAR2
10706   ,p_end_date                   IN  DATE    DEFAULT NULL
10707   ,p_ledger_id                  IN  INTEGER DEFAULT NULL
10708   ,p_budgetary_control_mode     IN  VARCHAR2
10709   ,p_accounting_mode            IN  VARCHAR2)
10710 RETURN INTEGER
10711 IS
10712   l_array_ledgers        xla_accounting_cache_pkg.t_array_ledger_id;
10713   l_ledger_id            INTEGER;
10714   l_count                INTEGER;
10715   l_result               INTEGER := 0;
10716   l_log_module           VARCHAR2(240);
10717 BEGIN
10718   IF g_log_enabled THEN
10719     l_log_module := C_DEFAULT_MODULE||'.balance_amounts';
10720   END IF;
10721 
10722   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10723     trace(p_msg    => 'BEGIN of function balance_amounts',
10724           p_module => l_log_module,
10725           p_level  => C_LEVEL_PROCEDURE);
10726   END IF;
10727 
10728   -- initialize
10729   initialize(p_application_id    => p_application_id
10730             ,p_ledger_id         => p_ledger_id
10731             ,p_ae_header_id      => NULL
10732             ,p_end_date          => p_end_date   -- 4262811
10733             ,p_mode              => p_mode       -- 4262811
10734             ,p_balance_flag      => TRUE
10735             ,p_accounting_mode   => p_accounting_mode);
10736 
10737   -- Process Primary and Secondary ledgers
10738   l_array_ledgers  := xla_accounting_cache_pkg.GetLedgers;
10739 
10740   IF  l_array_ledgers.COUNT > 0 THEN
10741     FOR l_count IN 1 .. l_array_ledgers.COUNT LOOP
10742 
10743       DELETE FROM xla_validation_lines_gt;
10744       DELETE FROM fun_bal_headers_gt;            --bug9526716 added fun table deletes in multiple place in xlajebal.pkb
10745       DELETE FROM fun_bal_lines_gt;
10746       DELETE FROM fun_bal_results_gt;
10747       DELETE FROM fun_bal_errors_gt;
10748 
10749 
10750       balance_by_ledger(l_array_ledgers(l_count)
10751                        ,gl_mc_info.get_ledger_category
10752                             (l_array_ledgers(l_count)) -- ledger category code
10753                        ,p_budgetary_control_mode);
10754     END LOOP;
10755   END IF;
10756 
10757   -- Process ALC ledgers
10758   l_array_ledgers  := xla_accounting_cache_pkg.GetAlcLedgers(
10759                             p_primary_ledger_id => g_trx_ledger_id);
10760 
10761   IF  l_array_ledgers.COUNT > 0 THEN
10762     FOR l_count IN 1 .. l_array_ledgers.COUNT LOOP
10763 
10764       DELETE FROM xla_validation_lines_gt;
10765       DELETE FROM fun_bal_headers_gt;
10766       DELETE FROM fun_bal_lines_gt;
10767       DELETE FROM fun_bal_results_gt;
10768       DELETE FROM fun_bal_errors_gt;
10769 
10770       balance_by_ledger(l_array_ledgers(l_count)
10771                        ,'ALC'
10772                        ,p_budgetary_control_mode);
10773     END LOOP;
10774   END IF;
10775 
10776   -- Record error
10777   IF (g_err_count > 0) THEN
10778     IF (C_LEVEL_ERROR >= g_log_level) THEN
10779       trace(p_msg    => 'Error founds in validation routine',
10780             p_module => l_log_module,
10781             p_level  => C_LEVEL_ERROR);
10782     END IF;
10783 
10784     update_error_status;
10785 
10786     IF (p_budgetary_control_mode = 'FUNDS_RESERVE') THEN
10787       undo_funds_reserve;
10788     END IF;
10789 
10790     l_result := 1;
10791   END IF;
10792 
10793   IF (C_LEVEL_EVENT >= g_log_level) THEN
10794     trace(p_msg    => 'l_result(balance_amounts) = '||l_result,
10795           p_module => l_log_module,
10796           p_level  => C_LEVEL_EVENT);
10797   END IF;
10798 
10799   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10800     trace(p_msg    => 'End of function balance_amounts',
10801           p_module => l_log_module,
10802           p_level  => C_LEVEL_PROCEDURE);
10803   END IF;
10804 
10805   RETURN l_result;
10806 EXCEPTION
10807 WHEN xla_exceptions_pkg.application_exception THEN
10808   RAISE;
10809 
10810 WHEN OTHERS THEN
10811   xla_exceptions_pkg.raise_message
10812       (p_location => 'xla_je_validation_pkg.balance_amounts');
10813 END;
10814 
10815 --=============================================================================
10816 --
10817 -- Name: balance_tpm_amounts
10818 -- Description: This function handle the validation and the balancing
10819 --              requirement for a standard journal entry.
10820 -- Parameters:
10821 --   p_application_id - the application id (required)
10822 --   p_ledger_id - the transaction ledger id (required)
10823 -- Result:
10824 --      0 - The balancing routine is completed successfully
10825 --      1 - Error is found in the balancing program
10826 --
10827 --=============================================================================
10828 FUNCTION balance_tpm_amounts
10829   (p_application_id             IN  INTEGER
10830   ,p_ledger_id                  IN  INTEGER
10831   ,p_ledger_array               IN  xla_accounting_cache_pkg.t_array_ledger_id
10832   ,p_accounting_mode            IN  VARCHAR2
10833 ) RETURN INTEGER
10834 IS
10835   l_ledger_id            INTEGER;
10836   l_count                INTEGER;
10837   l_result               INTEGER := 0;
10838   l_log_module           VARCHAR2(240);
10839 BEGIN
10840   IF g_log_enabled THEN
10841     l_log_module := C_DEFAULT_MODULE||'.balance_amounts';
10842   END IF;
10843 
10844   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10845     trace(p_msg    => 'BEGIN of function balance_amounts',
10846           p_module => l_log_module,
10847           p_level  => C_LEVEL_PROCEDURE);
10848   END IF;
10849 
10850   -- initialize
10851   initialize(p_application_id    => p_application_id
10852             ,p_ledger_id         => p_ledger_id
10853             ,p_ae_header_id      => NULL
10854             ,p_end_date          => null
10855             ,p_mode              => 'THIRD_PARTY_MERGE'
10856             ,p_balance_flag      => TRUE
10857             ,p_accounting_mode   => p_accounting_mode);
10858 
10859   IF  p_ledger_array.COUNT > 0 THEN
10860     FOR l_count IN 1 .. p_ledger_array.COUNT loop
10861       IF(g_err_count=0) THEN
10862 
10863 	      DELETE FROM xla_validation_lines_gt;
10864 	      DELETE FROM fun_bal_headers_gt;
10865 	      DELETE FROM fun_bal_lines_gt;
10866 	      DELETE FROM fun_bal_results_gt;
10867 	      DELETE FROM fun_bal_errors_gt;
10868 
10869         balance_by_ledger(p_ledger_array(l_count)
10870                        , NULL  -- Ledger category code
10871                        ,'NONE');
10872       END IF;
10873     END LOOP;
10874   END IF;
10875 
10876   -- Record error
10877   IF (g_err_count > 0) THEN
10878     IF (C_LEVEL_ERROR >= g_log_level) THEN
10879       trace(p_msg    => 'Error founds in validation routine',
10880             p_module => l_log_module,
10881             p_level  => C_LEVEL_ERROR);
10882     END IF;
10883 
10884 --    no need since we will rollback;
10885 --    update_error_status;
10886 
10887     l_result := 1;
10888   END IF;
10889 
10890   IF (C_LEVEL_EVENT >= g_log_level) THEN
10891     trace(p_msg    => 'l_result(balance_amounts) = '||l_result,
10892           p_module => l_log_module,
10893           p_level  => C_LEVEL_EVENT);
10894   END IF;
10895 
10896   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10897     trace(p_msg    => 'End of function balance_amounts',
10898           p_module => l_log_module,
10899           p_level  => C_LEVEL_PROCEDURE);
10900   END IF;
10901 
10902   RETURN l_result;
10903 EXCEPTION
10904 WHEN xla_exceptions_pkg.application_exception THEN
10905   RAISE;
10906 
10907 WHEN OTHERS THEN
10908   xla_exceptions_pkg.raise_message
10909       (p_location => 'xla_je_validation_pkg.balance_amounts');
10910 END;
10911 
10912 --=============================================================================
10913 --
10914 -- Name: balance_manual_entries
10915 -- Description: This function handle the validation and the balancing
10916 --              requirement for a manual journal entry.
10917 -- Parameters:
10918 --   p_application_id - the application id (required)
10919 --   p_ledger_id - the transaction ledger id (required)
10920 --   p_event_id - the event id
10921 --   p_balance_flag - indicates if balancing should be performed
10922 -- Result:
10923 --      0 - The balancing routine is completed successfully
10924 --      1 - Error is found in the balancing program
10925 --
10926 --=============================================================================
10927 FUNCTION balance_manual_entry
10928   (p_application_id     IN INTEGER
10929   ,p_balance_flag       IN BOOLEAN DEFAULT TRUE
10930   ,p_accounting_mode    IN VARCHAR2
10931   ,p_ledger_ids         IN t_array_int
10932   ,p_ae_header_ids      IN t_array_int
10933   ,p_end_date           IN DATE          -- 4262811
10934   ,p_status_codes       IN OUT NOCOPY t_array_varchar)
10935 RETURN INTEGER
10936 IS
10937   l_prev_err_count       INTEGER := 0;
10938   l_result               INTEGER := 0;
10939   l_log_module           VARCHAR2(240);
10940 BEGIN
10941   IF g_log_enabled THEN
10942     l_log_module := C_DEFAULT_MODULE||'.balance_manual_entry';
10943   END IF;
10944 
10945   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
10946     trace(p_msg    => 'BEGIN of function balance_manual_entry',
10947           p_module => l_log_module,
10948           p_level  => C_LEVEL_PROCEDURE);
10949   END IF;
10950 
10951   -- initialize
10952   initialize(p_application_id    => p_application_id
10953             ,p_ledger_id         => p_ledger_ids(1)
10954             ,p_ae_header_id      => p_ae_header_ids(1)
10955             ,p_end_date          => p_end_date            -- 4262811
10956             ,p_mode              => 'MANUAL_JE'           -- 4262811
10957             ,p_balance_flag      => p_balance_flag
10958             ,p_accounting_mode   => p_accounting_mode);
10959 
10960   -- Process ALC ledgers
10961   FOR i IN 1 .. p_ledger_ids.COUNT LOOP
10962 
10963       DELETE FROM xla_validation_lines_gt;
10964       DELETE FROM fun_bal_headers_gt;
10965       DELETE FROM fun_bal_lines_gt;
10966       DELETE FROM fun_bal_results_gt;
10967       DELETE FROM fun_bal_errors_gt;
10968 
10969     g_ae_header_id := p_ae_header_ids(i);
10970 
10971     IF (C_LEVEL_STATEMENT >= g_log_level) THEN
10972       trace(p_msg    => 'Processing ae_header_id = '||g_ae_header_id,
10973             p_module => l_log_module,
10974             p_level  => C_LEVEL_STATEMENT);
10975       trace(p_msg    => 'starting g_err_count = '||g_err_count,
10976             p_module => l_log_module,
10977             p_level  => C_LEVEL_STATEMENT);
10978     END IF;
10979 
10980     balance_by_ledger(p_ledger_ids(i)
10981                      ,NULL -- ledger category code
10982                      ,'NONE');
10983 
10984     IF (C_LEVEL_STATEMENT >= g_log_level) THEN
10985       trace(p_msg    => 'ending g_err_count = '||g_err_count,
10986             p_module => l_log_module,
10987             p_level  => C_LEVEL_STATEMENT);
10988     END IF;
10989 
10990     IF (g_err_count > l_prev_err_count) THEN
10991 
10992       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
10993         trace(p_msg    => 'Journal entry is marked as error',
10994               p_module => l_log_module,
10995               p_level  => C_LEVEL_STATEMENT);
10996       END IF;
10997 
10998       p_status_codes(i) := C_AE_STATUS_INVALID;
10999       l_prev_err_count := g_err_count;
11000       l_result := 1;
11001     END IF;
11002   END LOOP;
11003 
11004   IF (C_LEVEL_EVENT >= g_log_level) THEN
11005     trace(p_msg    => 'l_result(balance_manual_entry) = '||l_result,
11006           p_module => l_log_module,
11007           p_level  => C_LEVEL_EVENT);
11008   END IF;
11009 
11010   IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
11011     trace(p_msg    => 'End of function balance_manual_entry',
11012           p_module => l_log_module,
11013           p_level  => C_LEVEL_PROCEDURE);
11014   END IF;
11015 
11016   RETURN l_result;
11017 EXCEPTION
11018 WHEN xla_exceptions_pkg.application_exception THEN
11019   RAISE;
11020 
11021 WHEN OTHERS THEN
11022   xla_exceptions_pkg.raise_message
11023       (p_location => 'xla_je_validation_pkg.balance_manual_entry');
11024 END;
11025 
11026 
11027 --=============================================================================
11028 --
11029 -- Following code is executed when the package body is referenced for the first
11030 -- time
11031 --
11032 --=============================================================================
11033 BEGIN
11034    g_new_line_count     := 0;
11035    g_amb_context_code   := NVL(fnd_profile.value('XLA_AMB_CONTEXT'), 'DEFAULT');
11036 
11037    g_log_level          := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
11038    g_log_enabled        := fnd_log.test
11039                           (log_level  => g_log_level
11040                           ,module     => C_DEFAULT_MODULE);
11041 
11042    IF NOT g_log_enabled THEN
11043       g_log_level := C_LEVEL_LOG_DISABLED;
11044    END IF;
11045 
11046 END xla_je_validation_pkg;