DBA Data[Home] [Help]

PACKAGE BODY: APPS.XLA_BALANCES_PKG

Source


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