DBA Data[Home] [Help]

PACKAGE BODY: APPS.XLA_BALANCES_PKG

Source


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