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