DBA Data[Home] [Help]

PACKAGE BODY: APPS.XLA_ACCOUNTING_ENGINE_PKG

Source


1 PACKAGE BODY xla_accounting_engine_pkg AS
2 /* $Header: xlajeaex.pkb 120.87 2007/10/30 08:23:11 pshukla ship $   */
3 /*===========================================================================+
4 |             Copyright (c) 2001-2002 Oracle Corporation                     |
5 |                       Redwood Shores, CA, USA                              |
6 |                         All rights reserved.                               |
7 +============================================================================+
8 | PACKAGE NAME                                                               |
9 |     xla_accounting_engine_pkg                                              |
10 |                                                                            |
11 | DESCRIPTION                                                                |
12 |                                                                            |
13 |                                                                            |
14 | HISTORY                                                                    |
15 |     20-NOV-2002 K.Boussema    Created                                      |
16 |     09-DEC-2002 K.Boussema    Added Call to Validation API                 |
17 |     10-JAN-2003 K.Boussema    Added 'dbdrv' command                        |
18 |     20-FEB-2003 K.Boussema    Made changes for the new bulk approach of the|
19 |                               accounting engine                            |
20 |     19-APR-2003 K.Boussema    Included Error messages                      |
21 |     28-APR-2003 K.Boussema    Added validation of PAD retrieved            |
22 |     06-MAI-2003 K.Boussema    Added the update of event status, bug2936071 |
23 |     07-MAI-2003 K.Boussema    Changed the call to cache API, bug 2945359   |
24 |     16-MAI-2003 K.Boussema    Changed the call of InsertJournalEntries,    |
25 |                               bug 2963366                                  |
26 |     03-JUN-2003 K.Boussema    Capture the uncompiled PADs, bug 2963448     |
27 |     13-JUN-2003 K.Boussema    Changed the error message, bug 2963448       |
28 |     17-JUL-2003 K.Boussema    Modified the update of events, bug 3051978   |
29 |                               Updated the call to accounting cache, 3055039|
30 |     21-JUL-2003 K.Boussema    Reviewed the call to GetSessionValueChar API |
31 |     22-JUL-2003 K.Boussema    Added the update of journal entries          |
32 |     29-JAN-2003 K.Boussema    Reviewed the code to solve bug 3072881       |
33 |     01-AUG-2003 K.Boussema    Modified according to recommendation in bug  |
34 |                               3076645                                      |
35 |     27-AUG-2003 K.Boussema    Reviewed the code according to bug 3084324   |
36 |     03-SEP-2003 K.Boussema    Changed to fix bug 3125028                   |
37 |     23-OCT-2003 K.Boussema    Changed to fix issue raise in bug 3209099    |
38 |     17-NOV-2003 K.Boussema    Changed the call to validation routine       |
39 |                               xla_je_validation_pkg.balance_amounts,3233969|
40 |     21-NOV-2003 K.Boussema    Revised message XLA_AP_PAD_INACTIVE,bg3266350|
41 |     01-DEC-2003 K.Boussema    Added InitExtractErrors, CacheExtractErrors, |
42 |                               BuildExtractErrors to validate the extract   |
43 |     03-FEB-2004 K.Boussema    Added the extract object name and level in   |
44 |                               extract error message.                       |
45 |                               Added CacheExtractObject proc. and changed   |
46 |                               CacheExtractErrors procedure                 |
47 |     04-FEB-2004 K.Boussema    Removed the token LEDGER_NAME from message   |
48 |                               XLA_AP_INV_PAD_SETUP, bug 3320707            |
49 |     12-FEB-2004 K.Boussema    Made changes for the FND_LOG.                |
50 |     22-MAR-2004 K.Boussema    Added a parameter p_module to the TRACE calls|
51 |                               and the procedure.                           |
52 |     11-MAY-2004 K.Boussema    Removed the call to XLA trace routine from   |
53 |                                 trace() procedure                          |
54 |     17-MAY-2004 W.Shen        change SubmitAccountingEngine for accounting |
55 |                                 attribute enhancement project              |
56 |     26-Jul-2004 W. Shen       Add a new parameter to CacheExtractErrors    |
57 |                                 if it is called from transaction reversal  |
58 |                                 The line count is 0 or null is not treated |
59 |                                 as an error.                               |
60 |                                 bug 3786968.                               |
61 |     23-Sep-2004 S.Singhania   Made changes for the bulk peroformance.It has|
62 |                                 changed the code at number of places.      |
63 |     05-Oct-2004 S.Singhania   Bug 3931752: Added code to remove dummy rows |
64 |                                 from XLA_AE_LINES_GT and XLA_AE_HEADERS_GT |
65 |                                 (rows with balance_type_code = 'X') in     |
66 |                                 PostAccountingEngine                       |
67 |     08-Oct-2004 S.Singhania   Bug 3928357: Made changes to make sure the   |
68 |                                 following cases are handled:               |
69 |                                 - Mark events in error when AAD is invalid |
70 |                                 - Mark events in error when AAD is missing |
71 |                                 Following routines are modified:           |
72 |                                 - SubmitAccountingEngine                   |
73 |                                 - CatchErr_UncompliedAAD                   |
74 |                                 - PostAccountingEngine                     |
75 |                                 Following new routine is added:            |
76 |                                 - CatchErr_MissingAAD                      |
77 |     21-Oct-2004 S.Singhania   Bug 3962951. Modified PostAccounting. Update |
78 |                                 statement to update event status in        |
79 |                                 xla_events_gt is  modified.                |
80 |                               Added one update statement on xla_events_gt  |
81 |                                 to update the event status to ERROR for the|
82 |                                 case where validation in AccoutningRevesal |
83 |                                 fails.                                     |
84 |     02-Nov-2004 K.Boussema    Changed for Diagnostic Framework. Included   |
85 |                                the set of gobal variable g_diagnostics_mode|
86 |     16-Dec-2004 S.Singhania   Bug 4056420. Performance changes made in:    |
87 |                                 - PostAccounting                           |
88 |                               Fixed GSCC warning File.Sql.35 in TRACE.     |
89 |     9-Mar-2005  W. SHen       Ledger Currency Project                      |
90 |                                 add call to                                |
91 |                                 XLA_AE_LINES_PKG.CalculateUnroundedAmounts |
92 |                                 XLA_AE_LINES_PKG.CalculateGainLossAmounts  |
93 |                                 XLA_AE_LINES_PKG.adjust_display_line_num   |
94 |     14-Mar-2005 K.Boussema Changed for ADR-enhancements.                   |
95 |     25-May-2005  W. SHen       remove call                                 |
96 |                                    XLA_AE_LINES_PKG.adjust_display_line_num|
97 |     17-Jun-2005  W. SHen       add call UpdateRelatedErrorsStatus back     |
98 |                                    bug 4155511                             |
99 |     24-Jun-2005  W. Chan      Fix bug4092230 - Add ValidateCompleteAADDefn |
100 |     11-Jul-2005  A. Wan    Changed for MPA.  4262811                       |
101 |     12-Jul-2005  W. Chan   Fix bug 4480650 - fix  ValidateCompleteAADDefn  |
102 |     01-Aug-2005 W. Chan     4458381 - Public Sector Enhancement            |
103 |     27-Dec-2005 A.Wan       4669308 - DeleteIncompleteMPA                  |
104 |     20-Jan-2006 W.Chan      4946123 - BC changes for prior entry           |
105 |     24-Jan-2006 A.Wan       4884853 - modify PostAccountingEngine when     |
106 |                                       rollover MPA/Accrual Reversal date.  |
107 |     27-Apr-2006 A.Wan       5095554 - performance fix for non-mergable view|
108 |                                       xla_subledger_options_v              |
109 |     02-May-2006 A.Wan       5054831  Moved check CatchErr_UncompliedAAD to |
110 |                                      xla_accounting_pkg.ValidateAAD        |
111 |     28-Jul-2006 A.Wan       5357406 - add p_ledger_id in PostAcctingEngine |
112 |                                       when calling bflow prior entry API.  |
113 +===========================================================================*/
114 --
115 /*======================================================================+
116 |                                                                       |
117 | CONSTANTS                                                             |
118 |                                                                       |
119 |                                                                       |
120 +======================================================================*/
121 --
122 C_FINAL          CONSTANT     VARCHAR2(1) := 'F';
123 C_UNPROCESSED    CONSTANT     VARCHAR2(1) := 'U';
124 C_ERROR          CONSTANT     VARCHAR2(1) := 'E';
125 C_PROCESSED      CONSTANT     VARCHAR2(1) := 'P';
126 C_DRAFT          CONSTANT     VARCHAR2(1) := 'D';
127 C_INVALID        CONSTANT     VARCHAR2(1) := 'I';
128 C_RELATED        CONSTANT     VARCHAR2(1) := 'R';
129 C_EVT_RELATED    CONSTANT     VARCHAR2(1) := 'R';
130 C_AE_EVT_RELATED CONSTANT     VARCHAR2(30):= 'RELATED_EVENT_ERROR';
131 
132 --
133 --
134 C_UNPROCESSED_ENTRIES   CONSTANT  NUMBER:= -1;
135 C_NO_ENTRIES            CONSTANT  NUMBER:=  2;
136 C_INVALID_ENTRIES       CONSTANT  NUMBER:=  1;
137 C_VALID_ENTRIES         CONSTANT  NUMBER:=  0;
138 --
139 --
140 C_EXTRACT_INVALID       CONSTANT VARCHAR2(1) := 'N';
141 C_EXTRACT_VALID         CONSTANT VARCHAR2(1) := 'Y';
142 --
143 --
144 C_DRAFT_STATUS          CONSTANT VARCHAR2(1)   := 'D';
145 C_FINAL_STATUS          CONSTANT VARCHAR2(1)   := 'F';
146 --
147 --
148 /*======================================================================+
149 |                                                                       |
150 | STRUCTURES                                                            |
151 |                                                                       |
152 |                                                                       |
153 +======================================================================*/
154 --
155 --
156 TYPE t_rec_array_event IS RECORD
157    (array_legal_entity_id                xla_ae_journal_entry_pkg.t_array_Num
158    ,array_entity_id                      xla_ae_journal_entry_pkg.t_array_Num
159    ,array_entity_code                    xla_ae_journal_entry_pkg.t_array_V30L
160    ,array_transaction_num                xla_ae_journal_entry_pkg.t_array_V240L
161    ,array_event_id                       xla_ae_journal_entry_pkg.t_array_Num
162    ,array_class_code                     xla_ae_journal_entry_pkg.t_array_V30L
163    ,array_event_type                     xla_ae_journal_entry_pkg.t_array_V30L
164    ,array_event_number                   xla_ae_journal_entry_pkg.t_array_Num
165    ,array_event_date                     xla_ae_journal_entry_pkg.t_array_Date
166    ,array_reference_num_1                xla_ae_journal_entry_pkg.t_array_Num
167    ,array_reference_num_2                xla_ae_journal_entry_pkg.t_array_Num
168    ,array_reference_num_3                xla_ae_journal_entry_pkg.t_array_Num
169    ,array_reference_num_4                xla_ae_journal_entry_pkg.t_array_Num
170    ,array_reference_char_1               xla_ae_journal_entry_pkg.t_array_V240L
171    ,array_reference_char_2               xla_ae_journal_entry_pkg.t_array_V240L
172    ,array_reference_char_3               xla_ae_journal_entry_pkg.t_array_V240L
173    ,array_reference_char_4               xla_ae_journal_entry_pkg.t_array_V240L
174    ,array_reference_date_1               xla_ae_journal_entry_pkg.t_array_Date
175    ,array_reference_date_2               xla_ae_journal_entry_pkg.t_array_Date
176    ,array_reference_date_3               xla_ae_journal_entry_pkg.t_array_Date
177    ,array_reference_date_4               xla_ae_journal_entry_pkg.t_array_Date
178    ,array_event_created_by               xla_ae_journal_entry_pkg.t_array_V100L
179    );
180 --
181 --
182 --
183 TYPE t_rec_error IS RECORD
184 (
185 entity_id                           NUMBER,
186 event_id                            NUMBER,
187 ledger_id                           NUMBER,
188 object_name                   VARCHAR2(30),
189 object_level                  VARCHAR2(30),
190 event_class                  VARCHAR2(240)
191 )
192 ;
193 
194 TYPE t_array_error    IS TABLE OF  t_rec_error INDEX BY BINARY_INTEGER;
195 
196 /*======================================================================+
197 |                                                                       |
198 | Global variables                                                      |
199 |                                                                       |
200 |                                                                       |
201 +======================================================================*/
202 --
203 g_array_error_flag               xla_ae_journal_entry_pkg.t_array_V1L;
204 g_array_error_cache              t_array_error;
205 g_event_err_Index                BINARY_INTEGER;
206 g_hdr_rowcount                   NUMBER ;
207 g_line_rowcount                  NUMBER ;
208 --
209 --
210 --=============================================================================
211 --               *********** Local Trace Routine **********
212 --=============================================================================
213 
214 C_LEVEL_STATEMENT     CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
215 C_LEVEL_PROCEDURE     CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
216 C_LEVEL_EVENT         CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
217 C_LEVEL_EXCEPTION     CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
218 C_LEVEL_ERROR         CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
219 C_LEVEL_UNEXPECTED    CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
220 
221 C_LEVEL_LOG_DISABLED  CONSTANT NUMBER := 99;
222 C_DEFAULT_MODULE      CONSTANT VARCHAR2(240) := 'xla.plsql.xla_accounting_engine_pkg';
223 
224 g_log_level           NUMBER;
225 g_log_enabled         BOOLEAN;
226 
227 PROCEDURE trace
228        (p_msg                        IN VARCHAR2
229        ,p_level                      IN NUMBER
230        ,p_module                     IN VARCHAR2) IS
231 BEGIN
232 
233    ----------------------------------------------------------------------------
234    -- Following is for FND log.
235    ----------------------------------------------------------------------------
236    IF (p_msg IS NULL AND p_level >= g_log_level) THEN
237       fnd_log.message(p_level, NVL(p_module,C_DEFAULT_MODULE));
238    ELSIF p_level >= g_log_level THEN
239       fnd_log.string(p_level, NVL(p_module,C_DEFAULT_MODULE), p_msg);
240    END IF;
241 
242 EXCEPTION
243    WHEN xla_exceptions_pkg.application_exception THEN
244       RAISE;
245    WHEN OTHERS THEN
246       xla_exceptions_pkg.raise_message
247          (p_location   => 'xla_accounting_engine_pkg.trace');
248 END trace;
249 --
250 --====================================================================
251 --
252 --
253 --
254 --
255 -- Forward declaration of local routines
256 --
257 --
258 --
259 --
260 --=====================================================================
261 --
262 PROCEDURE UpdateRelatedErrorsStatus
263 ;
264 --
265 FUNCTION PostAccountingEngine(p_application_id                 IN NUMBER
266                              ,p_accounting_batch_id            IN NUMBER
267                              ,p_ledger_id                      IN NUMBER
268                              ,p_end_date                       IN DATE    -- 4262811
269                              ,p_accounting_mode                IN VARCHAR2
270                              ,p_min_event_date                 IN DATE
271                              ,p_max_event_date                 IN DATE
272                              ,p_budgetary_control_mode         IN VARCHAR2)
273 RETURN NUMBER
274 ;
275 --
276 FUNCTION RunPAD (
277                       p_application_id         IN NUMBER
278                     , p_base_ledger_id         IN NUMBER
279                     , p_pad_package            IN VARCHAR2
280                     , p_pad_start_date         IN DATE
281                     , p_pad_end_date           IN DATE
282                     , p_primary_ledger_id      IN NUMBER
283                     , p_budgetary_control_mode IN VARCHAR2)
284 RETURN NUMBER
285 ;
286 --
287 FUNCTION SubmitAccountingEngine (
288                     p_application_id         IN NUMBER
289                   , p_ledger_id              IN NUMBER
290                   , p_accounting_mode        IN VARCHAR2
291                   , p_budgetary_control_mode IN VARCHAR2
292                   , p_accounting_batch_id    IN NUMBER
293                   , p_min_event_date         IN OUT NOCOPY DATE
294                   , p_max_event_date         IN OUT NOCOPY DATE
295                   )
296 RETURN NUMBER
297 ;
298 
299 PROCEDURE CatchErr_UncompliedAAD
300        (p_ledger_id         IN NUMBER
301        ,p_min_date          IN DATE
302        ,p_max_date          IN DATE
303        ,p_aad_name          IN VARCHAR2
304        ,p_aad_owner         IN VARCHAR2
305        ,p_slam_name         IN VARCHAR2);
306 
307 PROCEDURE CatchErr_MissingAAD
308        (p_ledger_id                 IN NUMBER
309        ,p_min_aad_start_date        IN DATE
310        ,p_max_aad_end_date          IN DATE
311        ,p_min_event_date            IN VARCHAR2
312        ,p_max_event_date            IN VARCHAR2
313        ,p_slam_name                 IN VARCHAR2);
314 
315 --
316 --====================================================================
317 --
318 --
319 --
320 --
321 --  logic to trap the extract error messages
322 --
323 --
324 --
325 --
326 --=====================================================================
327 --
328 /*======================================================================+
329 |                                                                       |
330 | PUBLIC Procedure                                                      |
331 |                                                                       |
332 |    CacheExtractErrors                                                 |
333 |                                                                       |
334 +======================================================================*/
335 --
336 PROCEDURE CacheExtractErrors(
337                              p_hdr_rowcount      IN NUMBER
338                             ,p_line_rowcount     IN NUMBER
339                             ,p_trx_reversal_flag IN VARCHAR2
340                            )
341 IS
342 --
343 Idx                                BINARY_INTEGER;
344 l_array_error_cache                t_array_error;
345 l_log_module                       VARCHAR2(240);
346 --
347 BEGIN
348 --
349 IF g_log_enabled THEN
350       l_log_module := C_DEFAULT_MODULE||'.CacheExtractErrors';
351 END IF;
352 
353 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
354       trace
355          (p_msg      => 'BEGIN of CacheExtractErrors'
356          ,p_level    => C_LEVEL_PROCEDURE
357          ,p_module   => l_log_module);
358 
359       trace
360          (p_msg      => 'p_hdr_rowcount = '||p_hdr_rowcount
361          ,p_level    => C_LEVEL_PROCEDURE
362          ,p_module   => l_log_module);
363 
364       trace
365          (p_msg      => 'p_line_rowcount = '||p_line_rowcount
366          ,p_level    => C_LEVEL_PROCEDURE
367          ,p_module   => l_log_module);
368 END IF;
369 --
370 --
371 g_hdr_rowcount        := g_hdr_rowcount  + NVL(p_hdr_rowcount,0)  ;
372 g_line_rowcount       := g_line_rowcount + NVL(p_line_rowcount,0) ;
373 --
374 IF g_hdr_rowcount > 0 AND (g_line_rowcount > 0 or
375           (g_line_rowcount = 0 and nvl(p_trx_reversal_flag, 'N') = 'Y'))THEN
376 
377     g_array_error_flag(g_event_err_Index) := C_EXTRACT_VALID;
378     g_array_error_cache                   := l_array_error_cache;
379 
380 ELSE -- g_hdr_rowcount = 0 or g_line_rowcount  = 0
381 
382    CASE  g_array_error_flag(g_event_err_Index)
383 
384        WHEN C_EXTRACT_VALID THEN  null;
385 
386        ELSE       -- null or C_EXTRACT_INVALID
387 
388            g_array_error_flag(g_event_err_Index)     := C_EXTRACT_INVALID;
389 
390   END CASE;
391 --
392 END IF;
393 
394 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
395       trace
396          (p_msg      => 'END of CacheExtractErrors'
397          ,p_level    => C_LEVEL_PROCEDURE
398          ,p_module   => l_log_module);
399 END IF;
400 
401 EXCEPTION
402 WHEN xla_exceptions_pkg.application_exception THEN
403    RAISE;
404 WHEN OTHERS  THEN
405    xla_exceptions_pkg.raise_message
406                 (p_location => 'xla_accounting_engine_pkg.CacheExtractErrors');
407    --
408 END CacheExtractErrors;
409 --
410 --
411 /*======================================================================+
412 |                                                                       |
413 | PUBLIC Procedure                                                      |
414 |                                                                       |
415 |    CacheExtractObject                                                 |
416 |                                                                       |
417 |    Important: this procedure must be called after CacheExtractErrors  |
418 +======================================================================*/
419 --
420 PROCEDURE CacheExtractObject(
421                              p_object_name    IN VARCHAR2
422                            , p_object_level   IN VARCHAR2
423                            , p_event_class    IN VARCHAR2
424                            , p_entity_id      IN NUMBER
425                            , p_event_id       IN NUMBER
426                            , p_ledger_id      IN NUMBER
427                            )
428 IS
429 --
430 Idx                                BINARY_INTEGER;
431 l_array_error_cache                t_array_error;
432 l_log_module                       VARCHAR2(240);
433 --
434 BEGIN
435 --
436 --
437 IF g_log_enabled THEN
438       l_log_module := C_DEFAULT_MODULE||'.CacheExtractObject';
439 END IF;
440 --
441 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
442       trace
443          (p_msg      => 'BEGIN of CacheExtractObject'
444          ,p_level    => C_LEVEL_PROCEDURE
445          ,p_module   => l_log_module);
446 END IF;
447 --
448 --
449 IF g_array_error_flag.EXISTS(g_event_err_Index) AND
450    NVL(g_array_error_flag(g_event_err_Index),C_EXTRACT_VALID)= C_EXTRACT_INVALID
451 THEN
452            --
453            -- cache extract object
454            --
455            Idx := NVL(g_array_error_cache.LAST,0) + 1;
456            --
457            g_array_error_cache(Idx).entity_id      := p_entity_id;
458            g_array_error_cache(Idx).event_id       := p_event_id;
459            g_array_error_cache(Idx).ledger_id      := p_ledger_id;
460            g_array_error_cache(Idx).object_name    := p_object_name;
461            g_array_error_cache(Idx).object_level   := p_object_level;
462            g_array_error_cache(Idx).event_class    := p_event_class;
463 
464 END IF;
465 --
466 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
467       trace
468          (p_msg      => 'END of CacheExtractObject'
469          ,p_level    => C_LEVEL_PROCEDURE
470          ,p_module   => l_log_module);
471 END IF;
472 
473 EXCEPTION
474 WHEN xla_exceptions_pkg.application_exception THEN
475    RAISE;
476 WHEN OTHERS  THEN
477    xla_exceptions_pkg.raise_message
478                 (p_location => 'xla_accounting_engine_pkg.CacheExtractObject');
479 END CacheExtractObject;
480 
481 --
482 /*======================================================================+
483 |                                                                       |
484 | PRIVATE Procedure                                                     |
485 |                                                                       |
486 |                                                                       |
487 +======================================================================*/
488 PROCEDURE UpdateRelatedErrorsStatus
489 IS
490 l_log_module         VARCHAR2(240);
491 
492 -- this cursor find all the entity_id which has both error and no-error event
493 -- so that we can set all the no-error event to related-error status
494 /*
495 CURSOR c_related_events is
496   SELECT xeg.entity_id, xeg.event_id
497     FROM xla_events_gt xeg
498    WHERE xeg.process_status_code = C_EVT_RELATED;
499 
500 CURSOR c_related_headers is
501   SELECT xe.event_id, xah.ae_header_id, xah.ledger_id
502     FROM xla_ae_headers xah
503          ,xla_events_gt xe
504    WHERE xah.event_id           = xe.event_id
505      AND xah.application_id     = xe.application_id
506      AND xe.process_status_code = C_EVT_RELATED;
507 */
508 
509 l_current_entity_id number:= -1;
510 l_current_event_number number:=null;
511 l_current_event_id number;
512 l_current_header_id number;
513 l_current_ledger_id number;
514 BEGIN
515 --
516 IF g_log_enabled THEN
517       l_log_module := C_DEFAULT_MODULE||'.UpdateRelatedErrorsStatus';
518 END IF;
519 --
520 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
521       trace
522          (p_msg      => 'BEGIN of UpdateRelatedErrorsStatus'
523          ,p_level    => C_LEVEL_PROCEDURE
524          ,p_module   => l_log_module);
525 END IF;
526 --
527 --
528 -- Add hint as per bug 5529420
529 --
530   UPDATE xla_events_gt xeg
531      SET xeg.process_status_code = C_EVT_RELATED
532    WHERE xeg.process_status_code in (C_DRAFT, C_PROCESSED)
533      AND EXISTS (SELECT /*+ HASH_SJ */ 1
534                    FROM xla_events_gt xeg2
535                   WHERE xeg2.entity_id = xeg.entity_id
536                     AND xeg2.process_status_code in (C_INVALID,
537                                      C_ERROR));
538 
539 /* we decide not to insert the error message for the event
540   OPEN c_related_events;
541   LOOP
542      fetch c_related_events into l_current_entity_id, l_current_entity_id;
543      EXIT WHEN c_related_events%NOTFOUND;
544 
545      xla_accounting_err_pkg.build_message(
546                        p_appli_s_name             => 'XLA'
547                       ,p_msg_name                => 'XLA_AP_RELATED_INVALID_EVENT'
548                       ,p_entity_id               => l_current_entity_id
549                       ,p_event_id                => l_current_event_id
550                       ,p_ledger_id               => null
551                       ,p_ae_header_id            => null
552                       ,p_ae_line_num             => null
553                       ,p_accounting_batch_id     => null
554                    );
555 
556   END LOOP;
557   close c_related_events;
558 */
559 
560   /* update related entry status */
561   UPDATE xla_ae_headers xah
562      SET xah.accounting_entry_status_code = C_AE_EVT_RELATED
563          -- Bug 5056632. update group_id to NULL if entry is in error
564         ,group_id                         = NULL
565    WHERE xah.event_id in
566              (SELECT xe.event_id
567                 FROM xla_events_gt xe
568                WHERE xe.process_status_code = C_EVT_RELATED );
569 
570 /*
571   OPEN c_related_headers;
572   LOOP
573     FETCH c_related_headers into l_current_event_id,
574                       l_current_header_id, l_current_ledger_id;
575     EXIT WHEN c_related_headers%NOTFOUND;
576 
577     xla_accounting_err_pkg.build_message(
578                    p_appli_s_name             => 'XLA'
579                   ,p_msg_name                => 'XLA_AP_JE_RELATED_INVALID_EVT'
580                   ,p_entity_id               => l_current_entity_id
581                   ,p_event_id                => l_current_event_id
582                   ,p_ledger_id               => l_current_ledger_id
583                   ,p_ae_header_id            => l_current_header_id
584                );
585 
586   END LOOP;
587   close c_related_headers;
588 */
589 
590 --
591 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
592       trace
593          (p_msg      => 'END of UpdateRelatedErrorsStatus'
594          ,p_level    => C_LEVEL_PROCEDURE
595          ,p_module   => l_log_module);
596 END IF;
597 --
598 EXCEPTION
599 WHEN xla_exceptions_pkg.application_exception THEN
600    RAISE;
601 WHEN OTHERS  THEN
602    xla_exceptions_pkg.raise_message
603                 (p_location => 'xla_accounting_engine_pkg.UpdateRelatedErrorsStatus');
604    --
605 END UpdateRelatedErrorsStatus;
606 
607 
608 /*======================================================================+
609 |                                                                       |
610 | PRIVATE Procedure                                                     |
611 |                                                                       |
612 |    DeleteIncompleteMPA  - 4669308                                     |
613 |                                                                       |
614 |  Delete incomplete MPA after all the validation checks taken place,   |
615 |  and the deletion should take place only for FINAL mode.              |
616 |  Since the reversal of the original entry could result in invalid     |
617 |  status after various validation (eg CCID, GL period).  So do not     |
618 |  delete the incomplete entries unless it is FINAL. This way we can    |
619 |  allow user to correct any error before deleting the incomplete MPA.  |
620 |  And also, once the incomplete MPA is deleted, it cannot be recreated.|
621 |                                                                       |
622 +======================================================================*/
623 PROCEDURE DeleteIncompleteMPA(p_application_id       IN NUMBER)
624 IS
625 
626    l_log_module               VARCHAR2(240);
627    l_array_LR_incomplete_mpa  XLA_AE_JOURNAL_ENTRY_PKG.t_array_ae_header_id;
628    l_array_LR_ledger_id       xla_accounting_cache_pkg.t_array_ledger_id;
629    l_array_LR_entity_id       xla_ae_journal_entry_pkg.t_array_Num;
630    l_array_TR_incomplete_mpa  XLA_AE_JOURNAL_ENTRY_PKG.t_array_ae_header_id;
631    l_array_TR_ledger_id       xla_accounting_cache_pkg.t_array_ledger_id;
632    l_array_TR_entity_id       xla_ae_journal_entry_pkg.t_array_Num;
633 
634 
635 BEGIN
636    --
637    IF g_log_enabled THEN
638       l_log_module := C_DEFAULT_MODULE||'.DeleteIncompleteMPA';
639    END IF;
640    --
641    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
642       trace
643          (p_msg      => 'BEGIN of DeleteIncompleteMPA'
644          ,p_level    => C_LEVEL_PROCEDURE
645          ,p_module   => l_log_module);
646       trace
647          (p_msg      => '#Line reversal lines = '||xla_ae_lines_pkg.g_incomplete_mpa_acc_LR.l_array_ae_header_id.COUNT
648          ,p_level    => C_LEVEL_PROCEDURE
649          ,p_module   => l_log_module);
650       trace
651          (p_msg      => '#Tran reversal lines = '||xla_ae_lines_pkg.g_incomplete_mpa_acc_TR.l_array_ae_header_id.COUNT
652          ,p_level    => C_LEVEL_PROCEDURE
653          ,p_module   => l_log_module);
654    END IF;
655    --
656 
657    ------------------------------
658    -- Line Reversal
659    ------------------------------
660    FOR i in 1..xla_ae_lines_pkg.g_incomplete_mpa_acc_LR.l_array_ae_header_id.COUNT LOOP      -- 5108415
661 
662       ------------------------------------------------------------------------------------
663       --  Find incomplete MPA entries whose original/parent has been reversed
664       ------------------------------------------------------------------------------------
665 
666       SELECT distinct xeh3.ae_header_id, xeh3.ledger_id, xeh3.entity_id
667       BULK COLLECT INTO  l_array_LR_incomplete_mpa, l_array_LR_ledger_id, l_array_LR_entity_id
668       FROM   xla_ae_headers         xeh1  -- reversal of original entry
669             ,xla_distribution_links xdl2  -- reversal of original entry
670             ,xla_ae_headers         xeh3  -- incomplete MPA entries
671             ,xla_ae_headers         xeh4  -- original entries
672             --------------------------------------------------------------
673             -- Find the original/parent
674             --------------------------------------------------------------
675       WHERE  xeh4.ae_header_id            = xla_ae_lines_pkg.g_incomplete_mpa_acc_LR.l_array_parent_ae_header(i) -- 5108415
676       AND    xeh4.application_id          = p_application_id
677       AND    xdl2.application_id          = p_application_id
678       AND    xdl2.ref_ae_header_id        = xeh4.ae_header_id           -- original's ae_header_id
679       AND    xdl2.ref_event_id            = xeh4.event_id
680             --------------------------------------------------------------
681             -- Check this is a reversal of original entry
682             --------------------------------------------------------------
683       AND    xeh1.application_id          = p_application_id
684       AND    xeh1.ae_header_id            = xdl2.ae_header_id
685       AND    xeh1.event_id                = xdl2.event_id
686       AND    xdl2.ref_temp_line_num is not null
687       AND    xdl2.ref_temp_line_num       = -1 * xdl2.temp_line_num
688       AND    xeh1.accounting_entry_status_code = 'F'                    --  FINAL and without errors !!!!!
689             --------------------------------------------------------------
690             -- Determine this is a incomplete MPA with same orginal/parent
691             --------------------------------------------------------------
692       AND    xeh3.application_id               = p_application_id
693       AND    xeh3.ae_header_id                 = xla_ae_lines_pkg.g_incomplete_mpa_acc_LR.l_array_ae_header_id(i) -- 5108415
694       AND    xeh3.parent_ae_header_id          = xeh4.ae_header_id
695       AND    xeh3.event_id                     = xeh4.event_id
696       AND    xeh3.accounting_entry_status_code <> 'F'
697       ORDER by xeh3.ledger_id, xeh3.entity_id, xeh3.ae_header_id;
698 
699   /*
700       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
701          trace
702             (p_msg      => '# LR rows incomplete MPA in xla_ae_headers ='||l_array_LR_incomplete_mpa.COUNT
703             ,p_level    => C_LEVEL_STATEMENT
704             ,p_module   => l_log_module);
705           FOR j in 1..l_array_LR_incomplete_mpa.COUNT LOOP
706             trace
707                (p_msg      => 'MPA ledger='||l_array_LR_ledger_id(j)||
708                               ' entity='||l_array_LR_entity_id(j)||
709                               ' ae_header='||l_array_LR_incomplete_mpa(j)
710                ,p_level    => C_LEVEL_STATEMENT
711                ,p_module   => l_log_module);
712           END LOOP;
713       END IF;
714 */
715 
716       ---------------------------------------------------------------
717       --  Delete incomplete MPA entries
718       ---------------------------------------------------------------
719       FORALL k in 1..l_array_LR_incomplete_mpa.COUNT
720          DELETE xla_ae_lines           WHERE application_id = p_application_id AND ae_header_id = l_array_LR_incomplete_mpa(k);
721       FORALL l in 1..l_array_LR_incomplete_mpa.COUNT
722          DELETE xla_ae_headers         WHERE application_id = p_application_id AND ae_header_id = l_array_LR_incomplete_mpa(l);
723       FORALL m in 1..l_array_LR_incomplete_mpa.COUNT
724          DELETE xla_distribution_links WHERE application_id = p_application_id AND ae_header_id = l_array_LR_incomplete_mpa(m);
725 
726    END LOOP;
727 
728 
729    ------------------------------
730    -- Transaction Reversal
731    ------------------------------
732    FOR i in 1..xla_ae_lines_pkg.g_incomplete_mpa_acc_TR.l_array_ae_header_id.COUNT LOOP  -- 5108415
733       ------------------------------------------------------------------------------------
734       --  Find incomplete MPA entries whose original/parent has been reversed
735       ------------------------------------------------------------------------------------
736       SELECT distinct xeh3.ae_header_id, xeh3.ledger_id, xeh3.entity_id
737       BULK COLLECT INTO  l_array_TR_incomplete_mpa, l_array_TR_ledger_id, l_array_TR_entity_id
738       FROM   xla_ae_headers         xeh1  -- reversal of original entry
739             ,xla_distribution_links xdl2  -- reversal of original entry
740             ,xla_ae_headers         xeh3  -- incomplete MPA entries
741             ,xla_ae_headers         xeh4  -- original entries
742             --------------------------------------------------------------
743             -- Find the original/parent
744             --------------------------------------------------------------
745       WHERE  xeh4.ae_header_id            = xla_ae_lines_pkg.g_incomplete_mpa_acc_TR.l_array_parent_ae_header(i) -- 5108415
746       AND    xeh4.application_id          = p_application_id
747       AND    xdl2.application_id          = p_application_id
748       AND    xdl2.ref_ae_header_id        = xeh4.ae_header_id           -- original's ae_header_id
749       AND    xdl2.ref_event_id            = xeh4.event_id
750             --------------------------------------------------------------
751             -- Check this is a reversal of original entry
752             --------------------------------------------------------------
753       AND    xeh1.application_id          = p_application_id
754       AND    xeh1.ae_header_id            = xdl2.ae_header_id
755       AND    xeh1.event_id                = xdl2.event_id
756       AND    xdl2.ref_temp_line_num is not null
757       AND    xdl2.ref_temp_line_num       = -1 * xdl2.temp_line_num
758       AND    xeh1.accounting_entry_status_code = 'F'                    --  FINAL and without errors !!!!!
759             --------------------------------------------------------------
760             -- Determine this is a incomplete MPA with same orginal/parent
761             --------------------------------------------------------------
762       AND    xeh3.application_id               = p_application_id
763       AND    xeh3.ae_header_id                 = xla_ae_lines_pkg.g_incomplete_mpa_acc_TR.l_array_ae_header_id(i) -- 5108415
764       AND    xeh3.parent_ae_header_id          = xeh4.ae_header_id
765       AND    xeh3.event_id                     = xeh4.event_id
766       AND    xeh3.accounting_entry_status_code <> 'F'
767       ORDER by xeh3.ledger_id, xeh3.entity_id, xeh3.ae_header_id;
768 
769  /*
770       IF (C_LEVEL_STATEMENT >= g_log_level) THEN
771          trace
772             (p_msg      => '# TR rows incomplete MPA in xla_ae_headers ='||l_array_TR_incomplete_mpa.COUNT
773             ,p_level    => C_LEVEL_STATEMENT
774             ,p_module   => l_log_module);
775           FOR j in 1..l_array_TR_incomplete_mpa.COUNT LOOP
776             trace
777                (p_msg      => 'MPA ledger='||l_array_TR_ledger_id(j)||
778                               ' entity='||l_array_TR_entity_id(j)||
779                               ' ae_header='||l_array_TR_incomplete_mpa(j)
780                ,p_level    => C_LEVEL_STATEMENT
781                ,p_module   => l_log_module);
782           END LOOP;
783       END IF;
784 */
785 
786       ---------------------------------------------------------------
787       --  Delete incomplete MPA entries
788       ---------------------------------------------------------------
789       FORALL k in 1..l_array_TR_incomplete_mpa.COUNT
790          DELETE xla_ae_lines           WHERE application_id = p_application_id AND ae_header_id = l_array_TR_incomplete_mpa(k);
791       FORALL l in 1..l_array_TR_incomplete_mpa.COUNT
792          DELETE xla_ae_headers         WHERE application_id = p_application_id AND ae_header_id = l_array_TR_incomplete_mpa(l);
793       FORALL m in 1..l_array_TR_incomplete_mpa.COUNT
794          DELETE xla_distribution_links WHERE application_id = p_application_id AND ae_header_id = l_array_TR_incomplete_mpa(m);
795 
796    END LOOP;
797 
798    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
799          trace
800             (p_msg      => 'END of DeleteIncompleteMPA'
801             ,p_level    => C_LEVEL_PROCEDURE
802             ,p_module   => l_log_module);
803    END IF;
804    --
805 
806 EXCEPTION
807 WHEN xla_exceptions_pkg.application_exception THEN
808    RAISE;
809 WHEN OTHERS  THEN
810    xla_exceptions_pkg.raise_message
811                 (p_location => 'xla_accounting_engine_pkg.DeleteIncompleteMPA');
812    --
813 END DeleteIncompleteMPA;
814 
815 --
816 /*======================================================================+
817 |                                                                       |
818 | PRIVATE Procedure                                                     |
819 |                                                                       |
820 |    ValidateCompleteAADDefn                                            |
821 |                                                                       |
822 +======================================================================*/
823 PROCEDURE ValidateCompleteAADDefn
824 (p_application_id       INTEGER
825 ,p_ledger_id            INTEGER
826 ,p_min_event_date       DATE
827 ,p_max_event_date       DATE)
828 IS
829 CURSOR c IS
830 SELECT xpa.event_type_code
831   FROM xla_prod_acct_headers      xpa,
832        (SELECT t1.product_rule_type_code
833              , t1.product_rule_code
834              , sum(1) over (partition by 1) aad_count
835         FROM (SELECT acd.product_rule_type_code
836                    , acd.product_rule_code
837                    , sum(1) over (partition by subl.application_id) aad_count
838              -- FROM xla_subledger_options_v    xso   -- 5095554
839                 FROM gl_ledgers ledg             -- (1)
840                    , gl_ledger_relationships glr -- (2)
841                    , xla_ledger_options lopt     -- (4)
842                    , xla_subledgers subl          -- (5)
843              --    , xla_acctg_methods_b        acm
844                    , xla_acctg_method_rules     acd
845                    , gl_ledgers                 led
846                WHERE subl.application_id = p_application_id
847                  --
848                  AND   ledg.ledger_id             = glr.target_ledger_id
849                  AND    ledg.ledger_id             = lopt.ledger_id
850                  AND    subl.application_id        = lopt.application_id
851                  AND    ledg.object_type_code      = 'L' /* only ledgers (not ledger sets) */
852                  AND    ledg.le_ledger_type_code   = 'L' /* only legal ledgers */
853                  AND    ledg.ledger_category_code in ('PRIMARY', 'SECONDARY')
854                  AND    glr.application_id         = 101
855                  AND    ( (glr.relationship_type_code = 'SUBLEDGER') OR
856                           (glr.target_ledger_category_code = 'PRIMARY'
857                  AND glr.relationship_type_code = 'NONE'))
858                  --
859                  AND DECODE(led.ledger_category_code
860                                ,'PRIMARY',glr.primary_ledger_id
861                                ,ledg.ledger_id)            = p_ledger_id
862                  AND DECODE(led.ledger_category_code
863                                ,'PRIMARY',DECODE(ledg.ledger_category_code
864                                                 ,'PRIMARY','Y'
865                                                 ,'N')
866                                ,'Y')                      = lopt.capture_event_flag
867                  AND lopt.enabled_flag   = 'Y'
868                  AND glr.relationship_enabled_flag    = 'Y'
869                  AND led.ledger_id = p_ledger_id
870                  AND ledg.sla_accounting_method_code  = acd.accounting_method_code
871                  AND ledg.sla_accounting_method_type  = acd.accounting_method_type_code
872               -- AND acm.accounting_method_code      = acd.accounting_method_code
873               -- AND acm.accounting_method_type_code = acd.accounting_method_type_code
874                  AND acd.application_id = p_application_id
875                  AND acd.amb_context_code = NVL(fnd_profile.value('XLA_AMB_CONTEXT'),'DEFAULT')
876                  AND nvl(acd.start_date_active,p_min_event_date) <= p_min_event_date
877                  AND nvl(acd.end_date_active,p_max_event_date) >= p_max_event_date) t1
878         GROUP BY t1.product_rule_type_code, t1.product_rule_code) t
879  WHERE xpa.product_rule_type_code = t.product_rule_type_code
880    AND xpa.product_rule_code      = t.product_rule_code
881    AND xpa.amb_context_code       = NVL(fnd_profile.value('XLA_AMB_CONTEXT'),'DEFAULT')
882    AND xpa.application_id         = p_application_id
883  GROUP BY xpa.event_type_code, aad_count
884  HAVING count(*) < aad_count;
885 
886 CURSOR c_je(x_event_type VARCHAR2) IS
887   SELECT entity_id, event_id
888     FROM xla_ae_headers_gt
889    WHERE event_type_code = x_event_type;
890 
891 l_array_event_type                 xla_ae_journal_entry_pkg.t_array_V30L;
892 l_count                            INTEGER;
893 l_log_module                       VARCHAR2(240);
894 --
895 BEGIN
896 --
897 --
898 IF g_log_enabled THEN
899       l_log_module := C_DEFAULT_MODULE||'.ValidateCompleteAADDefn';
900 END IF;
901 --
902 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
903       trace
904          (p_msg      => 'BEGIN of ValidateCompleteAADDefn'
905          ,p_level    => C_LEVEL_PROCEDURE
906          ,p_module   => l_log_module);
907 END IF;
908 
909 OPEN c;
910 FETCH c BULK COLLECT INTO l_array_event_type;
911 CLOSE c;
912 
913 IF (l_array_event_type.COUNT > 0) THEN
914 
915    FORALL i IN 1..l_array_event_type.COUNT
916     UPDATE xla_ae_headers_gt
917        SET accounting_entry_status_code = xla_ae_journal_entry_pkg.C_RELATED_INVALID
918           ,event_status_code            = 'I'
919      WHERE event_type_code = l_array_event_type(i);
920 
921    l_count := SQL%ROWCOUNT;
922 
923    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
924       trace
925          (p_msg      => '# rows updated in  xla_ae_headers_gt ='||l_count
926          ,p_level    => C_LEVEL_STATEMENT
927          ,p_module   => l_log_module);
928    END IF;
929 
930    IF (l_count > 0) THEN
931       FOR i IN 1..l_array_event_type.COUNT LOOP
932          FOR l_je IN c_je(l_array_event_type(i)) LOOP
933             xla_accounting_err_pkg.build_message(
934                        p_appli_s_name            => 'XLA'
935                       ,p_msg_name                => 'XLA_AP_INCOMP_EVENT_TYPE_DEFN'
936                       ,p_entity_id               => l_je.entity_id
937                       ,p_event_id                => l_je.event_id
938                       ,p_ledger_id               => null
939                       ,p_ae_header_id            => null
940                       ,p_ae_line_num             => null
941                       ,p_accounting_batch_id     => null);
942          END LOOP;
943       END LOOP;
944    END IF;
945 
946 END IF;
947 
948 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
949       trace
950          (p_msg      => 'END of ValidateCompleteAADDefn'
951          ,p_level    => C_LEVEL_PROCEDURE
952          ,p_module   => l_log_module);
953 END IF;
954 
955 EXCEPTION
956 WHEN xla_exceptions_pkg.application_exception THEN
957    RAISE;
958 WHEN OTHERS  THEN
959    xla_exceptions_pkg.raise_message
960                 (p_location => 'xla_accounting_engine_pkg.ValidateCompleteAADDefn');
961 END ValidateCompleteAADDefn;
962 
963 --
964 /*======================================================================+
965 |                                                                       |
966 | PRIVATE Procedure                                                     |
967 |                                                                       |
968 |                                                                       |
969 +======================================================================*/
970 FUNCTION PostAccountingEngine(p_application_id                 IN NUMBER
971                              ,p_accounting_batch_id            IN NUMBER
972                              ,p_ledger_id                      IN NUMBER
973                              ,p_end_date                       IN DATE    -- 4262811
974                              ,p_accounting_mode                in VARCHAR2
975                              ,p_min_event_date                 IN DATE
976                              ,p_max_event_date                 IN DATE
977                              ,p_budgetary_control_mode         IN VARCHAR2)
978 RETURN NUMBER
979 IS
980 --
981 l_array_temp_events  xla_ae_journal_entry_pkg.t_array_Num;
982 l_array_temp_status  xla_ae_journal_entry_pkg.t_array_V30L;
983 l_result             NUMBER;
984 l_log_module         VARCHAR2(240);
985 --
986 
987 BEGIN
988 --
989 IF g_log_enabled THEN
990   l_log_module := C_DEFAULT_MODULE||'.PostAccountingEngine';
991 END IF;
992 --
993 
994 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
995   trace(p_msg      => 'BEGIN of PostAccountingEngine'
996        ,p_level    => C_LEVEL_PROCEDURE
997        ,p_module   => l_log_module);
998   trace(p_msg      => 'p_application_id = '||TO_CHAR(p_application_id) ||
999                       ' - p_accounting_batch_id = '||TO_CHAR(p_accounting_batch_id) ||
1000                       ' - p_ledger_id = '||TO_CHAR(p_ledger_id)
1001        ,p_level    => C_LEVEL_PROCEDURE
1002        ,p_module   => l_log_module);
1003 END IF;
1004 
1005 /* 4219869 moved to after bflow procedures
1006 --
1007 -- perform the creation of the ccid
1008 --
1009 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1010       trace
1011          (p_msg      => '--> CALL XLA_AE_CODE_COMBINATION_PKG.BuildCcids'
1012          ,p_level    => C_LEVEL_STATEMENT
1013          ,p_module   => l_log_module);
1014 END IF;
1015 
1016 l_result := XLA_AE_CODE_COMBINATION_PKG.BuildCcids;
1017 */
1018 
1019 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1020       trace
1021          (p_msg      => '--> CALL XLA_AE_LINES_PKG.CalculateUnroundedAmounts'
1022          ,p_level    => C_LEVEL_STATEMENT
1023          ,p_module   => l_log_module);
1024 END IF;
1025 
1026 -- set the unrounded accounted amount
1027 XLA_AE_LINES_PKG.CalculateUnroundedAmounts;
1028 
1029 ---------------------------------------
1030 -- 4219869 - Process Business Flow Entries
1031 ---------------------------------------
1032 XLA_AE_LINES_PKG.BusinessFlowPriorEntries(p_accounting_mode,p_ledger_id,p_budgetary_control_mode); -- 5357406
1033 XLA_AE_LINES_PKG.BusinessFlowSameEntries;
1034 
1035 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1036       trace
1037          (p_msg      => '--> CALL LA_AE_LINES_PKG.CalculateGainLossAmounts'
1038          ,p_level    => C_LEVEL_STATEMENT
1039          ,p_module   => l_log_module);
1040 END IF;
1041 -- calculate the gain/loss amount
1042 XLA_AE_LINES_PKG.CalculateGainLossAmounts;
1043 
1044 
1045 ---------------------------------------------------------------------------
1046 -- 4219869 moved to after bflow procedures
1047 -- perform the creation of the ccid
1048 ----------------------------------------------------------------------------
1049 --
1050 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1051       trace
1052          (p_msg      => '--> CALL XLA_AE_CODE_COMBINATION_PKG.BuildCcids'
1053          ,p_level    => C_LEVEL_STATEMENT
1054          ,p_module   => l_log_module);
1055 END IF;
1056 
1057 l_result := XLA_AE_CODE_COMBINATION_PKG.BuildCcids;
1058 ----------------------------------------------------------------------------
1059 --
1060 -- bulk performance
1061 --
1062 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1063       trace
1064          (p_msg      => '--> CALL XLA_AE_LINES_PKG.AccountingReversal'
1065          ,p_level    => C_LEVEL_STATEMENT
1066          ,p_module   => l_log_module);
1067 END IF;
1068 
1069 XLA_AE_LINES_PKG.AccountingReversal(CASE WHEN p_budgetary_control_mode = 'NONE'
1070                                          THEN p_accounting_mode
1071                                          ELSE p_budgetary_control_mode END);
1072 
1073 --
1074 -- The following will mark the events with ERROR when the validation in AccountingReversal
1075 -- routine fails. i.e the DUMMY_LR lines are converted to DUMMY_LR_ERROR.
1076 --
1077 -- Bug 4056420. To improve performance the single update is replaced by a select and then
1078 -- the update
1079 --
1080 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1081       trace
1082          (p_msg      => 'SQL- update xla_events_gt'
1083          ,p_level    => C_LEVEL_STATEMENT
1084          ,p_module   => l_log_module);
1085 END IF;
1086 
1087 SELECT DISTINCT event_id BULK COLLECT
1088 INTO l_array_temp_events
1089 FROM xla_ae_lines_gt
1090 WHERE reversal_code = 'DUMMY_LR_ERROR';
1091 
1092 FORALL i IN 1..l_array_temp_events.COUNT
1093 UPDATE xla_events_gt
1094 SET process_status_code = 'E'
1095 WHERE event_id = l_array_temp_events(i);
1096 
1097 
1098 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1099       trace
1100          (p_msg      => '# rows updated in xla_events_gt ='||SQL%ROWCOUNT
1101          ,p_level    => C_LEVEL_STATEMENT
1102          ,p_module   => l_log_module);
1103 END IF;
1104 --
1105 -- Delete the dummy lines from xla_ae_lines_gt table
1106 --
1107 DELETE FROM xla_ae_lines_gt
1108   WHERE balance_type_code = 'X'
1109      OR (unrounded_accounted_cr is null AND unrounded_accounted_dr is null AND gain_or_loss_flag = 'Y' AND calculate_g_l_amts_flag= 'Y');
1110 
1111 DELETE FROM xla_ae_headers_gt
1112   WHERE balance_type_code = 'X';
1113 
1114 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1115       trace
1116          (p_msg      => 'SQL- update xla_ae_headers_gt (1)'
1117          ,p_level    => C_LEVEL_STATEMENT
1118          ,p_module   => l_log_module);
1119 END IF;
1120 
1121 
1122 UPDATE xla_ae_headers_gt     aeh
1123    SET ae_header_id = xla_ae_headers_s.nextval
1124       ,(period_name
1125       , period_year
1126       , period_closing_status
1127       , period_start_date
1128       , period_end_date) =       -- 4262811
1129        (SELECT period_name
1130              , period_year
1131              , closing_status
1132              , start_date
1133              , end_date                        -- 4262811
1134           FROM gl_period_statuses     gps
1135          WHERE gps.application_id          = 101
1136            AND gps.ledger_id               = aeh.ledger_id
1137            AND gps.adjustment_period_flag  = 'N'
1138            AND aeh.ACCOUNTING_DATE BETWEEN gps.start_date AND gps.end_date)
1139 RETURNING event_id, ledger_id, balance_type_code, header_num, ae_header_id BULK COLLECT  -- 4262811
1140 INTO xla_ae_journal_entry_pkg.g_array_event_id
1141      ,xla_ae_journal_entry_pkg.g_array_ledger_id
1142      ,xla_ae_journal_entry_pkg.g_array_balance_type
1143      ,xla_ae_journal_entry_pkg.g_array_header_num          -- 4262811
1144      ,xla_ae_journal_entry_pkg.g_array_ae_header_id;
1145 
1146 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1147       trace
1148          (p_msg      => '# rows updated in xla_ae_headers_gt(1) ='||SQL%ROWCOUNT
1149          ,p_level    => C_LEVEL_STATEMENT
1150          ,p_module   => l_log_module);
1151 END IF;
1152 
1153 
1154 -- 4262811 ----------------------------------------------------------------------
1155 -- For the following situition, the first day in the next open GL period is used:
1156 -- 1. the accrual reversal gl date mode is First Day Next GL Period
1157 -- 2. the accrual reversal gl date mode is Next Day but currenly the next day is
1158 --    in a closed or permentently closed period
1159 -- 3. the accrual reversal gl date mode is Next Day but currenly the next day is
1160 --    in a future open period and the gl date is before the End GL date parameter
1161 --
1162 UPDATE xla_ae_headers_gt xah
1163    SET first_day_next_gl_period =
1164        (SELECT min(gps.start_date)
1165           FROM gl_period_statuses gps
1166          WHERE gps.application_id         = 101
1167            AND gps.ledger_id              = xah.ledger_id
1168            AND gps.adjustment_period_flag = 'N'
1169            AND gps.closing_status         = 'O'
1170            AND gps.start_date             > xah.accounting_date)
1171  WHERE  xah.acc_rev_gl_date_option = 'XLA_FIRST_DAY_NEXT_GL_PERIOD'
1172     OR  xah.acc_rev_gl_date_option = 'XLA_LAST_DAY_NEXT_GL_PERIOD'
1173 --  4262811a  Rollover MPA Gl Date
1174     OR (xah.acc_rev_gl_date_option in ('XLA_NEXT_DAY','FIRST_DAY_GL_PERIOD','LAST_DAY_GL_PERIOD','ORIGINATING_DAY') AND
1175         xah.period_closing_status IN ('P', 'C'))
1176     OR (xah.acc_rev_gl_date_option in ('XLA_NEXT_DAY','FIRST_DAY_GL_PERIOD','LAST_DAY_GL_PERIOD','ORIGINATING_DAY') AND
1177         xah.period_closing_status = 'N' and xah.accounting_date <= p_end_date);
1178 --  OR (xah.acc_rev_gl_date_option = 'XLA_NEXT_DAY' AND xah.period_closing_status IN ('P', 'C'))
1179 --  OR (xah.acc_rev_gl_date_option = 'XLA_NEXT_DAY' AND xah.period_closing_status = 'N' and xah.accounting_date <= p_end_date);
1180 
1181 
1182 --
1183 -- If the first day next GL period is determined for any journal entry, it
1184 -- indicates that some journal entry need to move the GL date to the next
1185 -- open GL period.  Update the GL Date to the first day next GL period.
1186 --
1187 IF (SQL%ROWCOUNT > 0) THEN
1188 
1189   UPDATE xla_ae_headers_gt  xah
1190      SET (accounting_date
1191          ,period_name
1192          ,period_year
1193          ,period_closing_status
1194          ,period_start_date
1195          ,period_end_date) =
1196        --(SELECT DECODE(xah.acc_rev_gl_date_option, 'XLA_LAST_DAY_NEXT_GL_PERIOD'
1197        --              ,NVL(gps.end_date, xah.accounting_date)
1198        --              ,NVL(gps.start_date, xah.accounting_date))
1199          (SELECT NVL(gps.start_date, xah.accounting_date)        -- 4884853 rollover to the first day of next open period
1200                , NVL(gps.period_name, xah.period_name)
1201                , NVL(gps.period_year, xah.period_year)
1202                , NVL(gps.closing_status, xah.period_closing_status)
1203                , NVL(gps.start_date, xah.period_start_date)
1204                , NVL(gps.end_date, xah.period_end_date)
1205             FROM xla_ae_headers_gt  xah2
1206                , gl_period_statuses gps
1207            WHERE xah.ae_header_id               = xah2.ae_header_id
1208              AND gps.application_id         (+) = 101
1209              AND gps.ledger_id              (+) = xah2.ledger_id
1210              AND gps.adjustment_period_flag (+) = 'N'
1211              AND gps.closing_status         (+) = 'O'
1212              AND gps.start_date             (+) = xah2.first_day_next_gl_period)
1213    -- 4884853
1214    WHERE  xah.acc_rev_gl_date_option IN ('XLA_FIRST_DAY_NEXT_GL_PERIOD','XLA_LAST_DAY_NEXT_GL_PERIOD','XLA_NEXT_DAY',
1215                                          'FIRST_DAY_GL_PERIOD','LAST_DAY_GL_PERIOD','ORIGINATING_DAY')
1216      AND (xah.period_closing_status IN ('P', 'C') OR (xah.period_closing_status = 'N' AND xah.accounting_date <= p_end_date));
1217 
1218 END IF;
1219 
1220 
1221 --
1222 -- When rolling the GL date using the transaction date rule, if the accrual
1223 -- reversal gl date mode is XLA_NEXT_DAY, GL date is not rolled backward
1224 --
1225 xla_ae_header_pkg.ValidateBusinessDate
1226    (p_ledger_id => p_ledger_id);
1227 
1228 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1229       trace
1230          (p_msg      => 'SQL- update xla_ae_headers_gt (2)'
1231          ,p_level    => C_LEVEL_STATEMENT
1232          ,p_module   => l_log_module);
1233 END IF;
1234 
1235 ValidateCompleteAADDefn
1236     (p_application_id  => p_application_id
1237     ,p_ledger_id       => p_ledger_id
1238     ,p_min_event_date  => p_min_event_date
1239     ,p_max_event_date  => p_max_event_date);
1240 
1241 
1242 UPDATE xla_ae_headers_gt a
1243 SET accounting_entry_status_code = xla_ae_journal_entry_pkg.C_RELATED_INVALID
1244    ,event_status_code            = 'I'
1245 WHERE accounting_entry_status_code = xla_ae_journal_entry_pkg.C_VALID
1246 AND EXISTS
1247    (SELECT /*+ HASH_SJ */ '1'
1248       FROM xla_ae_headers_gt
1249      WHERE event_id = a.event_id
1250        AND accounting_entry_status_code = xla_ae_journal_entry_pkg.C_INVALID);
1251 
1252 
1253 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1254       trace
1255          (p_msg      => '# rows updated in  xla_ae_headers_gt(2) ='||SQL%ROWCOUNT
1256          ,p_level    => C_LEVEL_STATEMENT
1257          ,p_module   => l_log_module);
1258 END IF;
1259 
1260 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1261       trace
1262          (p_msg      => '--> CALL xla_ae_journal_entry_pkg.InsertJournalEntries'
1263          ,p_level    => C_LEVEL_STATEMENT
1264          ,p_module   => l_log_module);
1265 END IF;
1266 
1267 
1268 l_result := xla_ae_journal_entry_pkg.InsertJournalEntries
1269                (p_application_id         => p_application_id
1270                ,p_accounting_batch_id    => p_accounting_batch_id
1271                ,p_end_date               => p_end_date             -- 4262811
1272                ,p_accounting_mode        => p_accounting_mode
1273                ,p_budgetary_control_mode => p_budgetary_control_mode);
1274 
1275 
1276 --
1277 -- fixed bug 3962951. Added a decode over p_accounting_mode
1278 --
1279 -- Bug 4056420. To improve performance the single update is replaced by a select and then
1280 -- the update
1281 --
1282 SELECT DISTINCT event_id, event_status_code BULK COLLECT
1283 INTO l_array_temp_events, l_array_temp_status
1284 FROM xla_ae_headers_gt;
1285 
1286 FORALL i IN 1..l_array_temp_events.COUNT
1287 UPDATE xla_events_gt
1288 SET process_status_code = DECODE(l_array_temp_status(i)
1289                                 ,'X', DECODE(process_status_code
1290                                             ,'E','I'
1291                                             ,DECODE(p_accounting_mode
1292                                                     ,'F','P'
1293                                                     ,'D'
1294                                                     )
1295                                             )
1296                                 ,NULL,'U'
1297                                 ,l_array_temp_status(i)
1298                                 )
1299 WHERE event_id = l_array_temp_events(i);
1300 
1301 
1302 IF (l_result  = C_VALID_ENTRIES  OR  l_result = C_INVALID_ENTRIES ) THEN
1303 
1304     l_result := C_VALID_ENTRIES;
1305 
1306     --=========================
1307     -- call validation routine
1308     --=========================
1309 
1310     IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1311 
1312           trace
1313              (p_msg      => '-> CALL xla_je_validation_pkg.balance_amounts API '||l_result
1314              ,p_level    => C_LEVEL_PROCEDURE
1315              ,p_module   => l_log_module);
1316 
1317 
1318 
1319     END IF;
1320 
1321      xla_ae_journal_entry_pkg.UpdateResult(
1322        p_old_status => l_result
1323      , p_new_status => xla_je_validation_pkg.balance_amounts
1324                          (p_application_id         => p_application_id
1325                          ,p_end_date               => p_end_date           -- 4262811
1326                          ,p_mode                   => 'CREATE_ACCOUNTING'  -- 4262811
1327                          ,p_ledger_id              => p_ledger_id
1328                          ,p_budgetary_control_mode => p_budgetary_control_mode
1329                          ,p_accounting_mode        => p_accounting_mode));
1330 
1331 
1332 END IF;
1333 
1334 IF (p_budgetary_control_mode = 'NONE') THEN  -- bug 5173426
1335   UpdateRelatedErrorsStatus;
1336 END IF;
1337 
1338 -- 4669308
1339 DeleteIncompleteMPA (p_application_id         => p_application_id);
1340 
1341 --
1342 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1343 
1344       trace
1345          (p_msg      => 'return value. = '||TO_CHAR(l_result)
1346          ,p_level    => C_LEVEL_PROCEDURE
1347          ,p_module   => l_log_module);
1348 
1349       trace
1350          (p_msg      => 'END of PostAccountingEngine'
1351          ,p_level    => C_LEVEL_PROCEDURE
1352          ,p_module   => l_log_module);
1353 
1354 END IF;
1355 --
1356 RETURN l_result;
1357 EXCEPTION
1358 WHEN xla_exceptions_pkg.application_exception THEN
1359   IF (C_LEVEL_EXCEPTION >= g_log_level) THEN
1360        trace
1361            (p_msg      => 'Error. = '||sqlerrm
1362            ,p_level    => C_LEVEL_PROCEDURE
1363            ,p_module   => l_log_module);
1364   END IF;
1365   RAISE;
1366 WHEN OTHERS  THEN
1367    IF (C_LEVEL_EXCEPTION >= g_log_level) THEN
1368        trace
1369            (p_msg      => 'Error. = '||sqlerrm
1370            ,p_level    => C_LEVEL_PROCEDURE
1371            ,p_module   => l_log_module);
1372    END IF;
1373    xla_exceptions_pkg.raise_message
1374                 (p_location => 'xla_accounting_engine_pkg.PostAccountingEngine');
1375    --
1376 END PostAccountingEngine;
1377 --
1378 --
1379 --
1380 --+==========================================================================+
1381 --|  PRIVATE FUNCTION                                                        |
1382 --|      RunPAD                                                              |
1383 --+==========================================================================+
1384 --
1385 FUNCTION RunPAD
1386        (p_application_id         IN NUMBER
1387        ,p_base_ledger_id         IN NUMBER
1388        ,p_pad_package            IN VARCHAR2
1389        ,p_pad_start_date         IN DATE
1390        ,p_pad_end_date           IN DATE
1391        ,p_primary_ledger_id      IN NUMBER
1392        ,p_budgetary_control_mode IN VARCHAR2)
1393 RETURN NUMBER IS
1394 --
1395 l_result             NUMBER         := 2 ;
1396 l_statement          VARCHAR2(1000) := NULL ;
1397 l_log_module         VARCHAR2(240);
1398 l_ledger_category_code VARCHAR2(30);
1399 l_enable_bc_flag       VARCHAR2(1):=null;
1400 
1401 invalid_package      EXCEPTION;
1402 PRAGMA EXCEPTION_INIT(invalid_package,-04063);
1403 --
1404 BEGIN
1405 --
1406 IF g_log_enabled THEN
1407    l_log_module := C_DEFAULT_MODULE||'.RunPAD';
1408 END IF;
1409 --
1410 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1411    trace
1412       (p_msg      => 'BEGIN of RunPAD'
1413       ,p_level    => C_LEVEL_PROCEDURE
1414       ,p_module   => l_log_module);
1415    trace
1416       (p_msg      => 'p_application_id = '||TO_CHAR(p_application_id)||
1417                      ' - p_base_ledger_id = '||TO_CHAR(p_base_ledger_id)||
1418                      ' - p_pad_package = '||TO_CHAR(p_pad_package)
1419       ,p_level    => C_LEVEL_PROCEDURE
1420       ,p_module   => l_log_module);
1421 END IF;
1422 
1423 
1424 
1425 IF p_pad_package IS NOT NULL THEN
1426    --===========================================================================
1427    -- launch the creation of the journal entries for primary/secondary ledgers
1428    --
1429    -- Example :
1430    -- l_statement := BEGIN
1431    --                   l_result :=
1432    --                      XLA_00200_PAD_C_000001_PKG.CreateJournalEntries
1433    --                         (p_application_id
1434    --                         ,p_base_ledger_id
1435    --                         ,p_pad_start_date
1436    --                         ,p_pad_end_date
1437    --                         ,p_primary_ledger_id);
1438    --                END;
1439    --===========================================================================
1440    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1441       trace
1442          (p_msg      => '-> CALL '||p_pad_package||'.CreateJournalEntries() API'
1443          ,p_level    => C_LEVEL_PROCEDURE
1444          ,p_module   => l_log_module);
1445    END IF;
1446 
1447    IF (p_budgetary_control_mode = 'NONE') THEN
1448      l_statement := 'BEGIN :1 := '||p_pad_package ||'.CreateJournalEntries(:2,:3,:4,:5,:6 ); END;';
1449    ELSE
1450        -- 6509160 Process non bc AAd package for Secondary non bc enabled ledger
1451       -- get category code of ledger
1452      SELECT ledger_category_code,enable_budgetary_control_flag
1453      INTO l_ledger_category_code,l_enable_bc_flag
1454      FROM gl_ledgers
1455      WHERE ledger_id = p_base_ledger_id;
1456    IF l_ledger_category_code='SECONDARY' and l_enable_bc_flag='N' THEN
1457     l_statement := 'BEGIN :1 := '||p_pad_package ||'.CreateJournalEntries(:2,:3,:4,:5,:6 ); END;';
1458     ELSE
1459      l_statement := 'BEGIN :1 := '||replace(p_pad_package,'_PKG','_BC_PKG') ||'.CreateJournalEntries(:2,:3,:4,:5,:6 ); END;';
1460    END IF;
1461    END IF;
1462 
1463    IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1464       trace
1465          (p_msg      => '>> EXECUTE Dynamic SQL = '||l_statement
1466          ,p_level    => C_LEVEL_STATEMENT
1467          ,p_module   => l_log_module);
1468    END IF;
1469 
1470    EXECUTE IMMEDIATE l_statement
1471    USING OUT l_result
1472          ,IN p_application_id
1473          ,IN p_base_ledger_id
1474          ,IN p_pad_start_date
1475          ,IN p_pad_end_date
1476          ,IN p_primary_ledger_id;
1477 END IF;
1478 --
1479 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1480    trace
1481       (p_msg      => 'return value. = '||TO_CHAR(l_result)
1482       ,p_level    => C_LEVEL_PROCEDURE
1483       ,p_module   => l_log_module);
1484 
1485    trace
1486       (p_msg      => 'END of RunPAD'
1487       ,p_level    => C_LEVEL_PROCEDURE
1488       ,p_module   => l_log_module);
1489 END IF;
1490 
1491 RETURN l_result;
1492 
1493 EXCEPTION
1494 
1495 WHEN xla_exceptions_pkg.application_exception THEN
1496      RAISE;
1497 
1498 -- handle the error due to invalid AAD package. Bug 3718471.
1499 WHEN invalid_package  THEN
1500      xla_exceptions_pkg.raise_message
1501              (p_appli_s_name   => 'XLA'
1502              ,p_msg_name       => 'XLA_COMMON_ERROR'
1503              ,p_token_1        => 'ERROR'
1504              ,p_value_1        => 'The AAD package is not valid in the database.'||
1505                                   'Please Recompile the AAD and resubmit Accounting.'
1506              ,p_token_2        => 'LOCATION'
1507             ,p_value_2        => 'xla_accounting_engine_pkg.RunPAD');
1508 
1509 WHEN OTHERS THEN
1510    xla_exceptions_pkg.raise_message
1511       (p_location => 'xla_accounting_engine_pkg.RunPAD');
1512 
1513 END RunPAD;
1514 --
1515 --
1516 --+==========================================================================+
1517 --| PRIVATE FUNCTION                                                         |
1518 --|      SubmitAccountingEngine                                              |
1519 --|                                                                          |
1520 --|                                                                          |
1521 --+==========================================================================+
1522 --
1523 FUNCTION SubmitAccountingEngine
1524        (p_application_id         IN NUMBER
1525        ,p_ledger_id              IN NUMBER
1526        ,p_accounting_mode        IN VARCHAR2
1527        ,p_budgetary_control_mode IN VARCHAR2
1528        ,p_accounting_batch_id    IN NUMBER
1529        ,p_min_event_date         IN OUT NOCOPY DATE
1530        ,p_max_event_date         IN OUT NOCOPY DATE)
1531 RETURN NUMBER
1532 IS
1533 --
1534 
1535 l_result                             NUMBER;
1536 l_je_result                          NUMBER;
1537 l_pad_package                        VARCHAR2(30);
1538 l_array_base_ledgers                 xla_accounting_cache_pkg.t_array_ledger_id;
1539 l_array_null_event_ids               xla_ae_journal_entry_pkg.t_array_Num;
1540 l_array_null_event_status            xla_ae_journal_entry_pkg.t_array_V1L;
1541 l_rec_array_event                    t_rec_array_event;
1542 l_rows                               NATURAL:=1000;
1543 Idx                                  BINARY_INTEGER;
1544 EventIdx                             BINARY_INTEGER;
1545 --
1546 l_log_module           VARCHAR2(240);
1547 --
1548 l_array_pads           xla_accounting_cache_pkg.t_array_pad;
1549 l_slam_name_session    VARCHAR2(240);
1550 l_min_aad_start_date   DATE;
1551 l_max_aad_end_date     DATE;
1552 l_ledger_category_code VARCHAR2(30);
1553 l_enable_bc_flag       VARCHAR2(1);
1554 --
1555 BEGIN
1556 --
1557 IF g_log_enabled THEN
1558    l_log_module := C_DEFAULT_MODULE||'.SubmitAccountingEngine';
1559 END IF;
1560 --
1561 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1562     trace
1563        (p_msg      => 'BEGIN of SubmitAccountingEngine'
1564        ,p_level    => C_LEVEL_PROCEDURE
1565        ,p_module   => l_log_module);
1566 END IF;
1567 --
1568 -- init local variables
1569 --
1570 l_result              := C_UNPROCESSED_ENTRIES;
1571 l_je_result           := C_NO_ENTRIES;
1572 g_array_event_ids     := l_array_null_event_ids;
1573 g_array_event_status  := l_array_null_event_status;
1574 EventIdx              := 0;
1575 
1576 --
1577 -- get all the base ledgers
1578 --
1579 l_array_base_ledgers := xla_accounting_cache_pkg.GetLedgers;
1580 
1581 --
1582 -- get min and max event date from the xla_events_gt_table.
1583 -- this information is used to find the AADs that will used
1584 -- to account for events
1585 --
1586 SELECT MIN(event_date), MAX(event_date)
1587   INTO p_min_event_date, p_max_event_date
1588   FROM xla_events_gt;
1589 
1590 --
1591 -- looping for base ledgers
1592 --
1593 FOR Jdx IN 1 .. l_array_base_ledgers.COUNT LOOP
1594    --IF (p_budgetary_control_mode = 'NONE' OR
1595    --    l_array_base_ledgers(Jdx) = p_ledger_id) THEN
1596    --
1597    -- get AADs for the base ledger that fall between min and max event dates
1598    --
1599    l_array_pads :=
1600       xla_accounting_cache_pkg.GetArrayPad
1601          (p_ledger_id            => l_array_base_ledgers(Jdx)
1602          ,p_min_event_date       => p_min_event_date
1603          ,p_max_event_date       => p_max_event_date);
1604 
1605    l_min_aad_start_date := NULL;
1606    l_max_aad_end_date   := NULL;
1607    l_slam_name_session :=
1608       xla_accounting_cache_pkg.GetSessionValueChar
1609          (p_source_code         => 'XLA_ACCOUNTING_METHOD_NAME'
1610          ,p_target_ledger_id    => l_array_base_ledgers(Jdx));
1611 
1612    --
1613    -- looping for each AAD
1614    --
1615    FOR Kdx IN 1 .. l_array_pads.COUNT LOOP
1616       --
1617       -- following code will be used to see if there are missing AADs for
1618       -- which there are events in the XLA_EVENTS_GT table.
1619       -- These events should actually be marked as error/invalid.
1620       --
1621       IF (l_min_aad_start_date IS NULL OR
1622          l_min_aad_start_date > NVL(l_array_pads(Kdx).start_date_active,p_min_event_date))
1623       THEN
1624          l_min_aad_start_date :=
1625             NVL(l_array_pads(Kdx).start_date_active,p_min_event_date);
1626       END IF;
1627 
1628       IF (l_max_aad_end_date IS NULL OR
1629          l_max_aad_end_date < NVL(l_array_pads(Kdx).end_date_active,p_max_event_date))
1630       THEN
1631          l_max_aad_end_date :=
1632             NVL(l_array_pads(Kdx).end_date_active,p_max_event_date);
1633       END IF;
1634 
1635       /* 5054831  Moved to xla_accounting_pkg.ValidateAAD.
1636       IF l_array_pads(Kdx).product_rule_code IS NOT NULL AND
1637          NVL(l_array_pads(Kdx).compile_status_code,'N') <> 'Y'
1638       THEN
1639          IF (C_LEVEL_EXCEPTION >= g_log_level) THEN
1640             trace
1641                (p_msg      => 'The AAD '||l_array_pads(Kdx).product_rule_code||' is not compiled.'
1642                ,p_level    => C_LEVEL_EXCEPTION
1643                ,p_module   => l_log_module);
1644          END IF;
1645          --
1646          -- calling routine to mark the events with error and
1647          -- build messages
1648          --
1649          CatchErr_UncompliedAAD
1650             (p_ledger_id     => l_array_base_ledgers(Jdx)
1651             ,p_min_date      => NVL(l_array_pads(Kdx).start_date_active,p_min_event_date)
1652             ,p_max_date      => NVL(l_array_pads(Kdx).end_date_active,p_max_event_date)
1653             ,p_aad_name      => l_array_pads(Kdx).session_product_rule_name
1654             ,p_aad_owner     => l_array_pads(Kdx).product_rule_owner
1655             ,p_slam_name     => l_slam_name_session);
1656 
1657       ELSIF l_array_pads(Kdx).product_rule_code IS NULL THEN
1658       */
1659       IF l_array_pads(Kdx).product_rule_code IS NULL THEN
1660          --
1661          -- How can this situation ever happen???
1662          --
1663          -- build messages for each event/ledger that the PAD setup is invalid
1664 
1665          -- update event status for the events.
1666          -- .....
1667          -- .....
1668          --
1669          IF (C_LEVEL_ERROR >= g_log_level) THEN
1670             trace
1671                (p_msg      => 'ERROR: XLA_AP_INV_PAD_SETUP'
1672                ,p_level    => C_LEVEL_ERROR
1673                ,p_module   => l_log_module);
1674          END IF;
1675       ELSE
1676 
1677          l_je_result :=
1678             RunPAD
1679                (p_application_id       => p_application_id
1680                ,p_base_ledger_id       => l_array_base_ledgers(Jdx)
1681                ,p_pad_package          => l_array_pads(Kdx).pad_package_name
1682                ,p_pad_start_date       => nvl(l_array_pads(Kdx).start_date_active,p_min_event_date)
1683                ,p_pad_end_date         => nvl(l_array_pads(Kdx).end_date_active,p_max_event_date)
1684                ,p_primary_ledger_id    => p_ledger_id
1685                ,p_budgetary_control_mode => p_budgetary_control_mode);
1686       END IF;
1687 
1688    END LOOP; -- end of AAD loop
1689    --
1690    -- If there are no AADs attached to the SLAM
1691    --
1692    IF (l_min_aad_start_date IS NULL AND
1693        l_max_aad_end_date IS NULL)
1694    THEN
1695       l_min_aad_start_date := p_max_event_date +1;
1696       l_max_aad_end_date   := p_max_event_date +1;
1697    END IF;
1698 
1699    --
1700    -- calling routine to mark the events with error and
1701    -- build messages for which there were no AADs in the ledger
1702    --
1703    IF (p_min_event_date < l_min_aad_start_date OR
1704        p_max_event_date > l_max_aad_end_date)
1705    THEN
1706 
1707     -- bug 6414911 For applications where AAd is not defined for secondary ledger,it implies product teams do not want to account for secondary ledger during funds reserve/check,hence dont stamp the budgetary event with error status.
1708      SELECT ledger_category_code,enable_budgetary_control_flag
1709      INTO l_ledger_category_code,l_enable_bc_flag
1710      FROM gl_ledgers
1711      WHERE ledger_id = l_array_base_ledgers(Jdx);
1712 
1713     IF nvl(p_budgetary_control_mode,'NONE')<>'NONE' and l_ledger_category_code ='SECONDARY' and l_enable_bc_flag='N' THEN
1714            IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1715           trace
1716                 (p_msg      => 'ledger category code ='||l_ledger_category_code||' bc flag='||l_enable_bc_flag
1717                 ,p_level    => C_LEVEL_STATEMENT
1718                 ,p_module   => l_log_module);
1719 
1720           END IF;
1721      Else
1722       CatchErr_MissingAAD
1723          (p_ledger_id               => l_array_base_ledgers(Jdx)
1724          ,p_min_aad_start_date      => l_min_aad_start_date
1725          ,p_max_aad_end_date        => l_max_aad_end_date
1726          ,p_min_event_date          => p_min_event_date
1727          ,p_max_event_date          => p_max_event_date
1728          ,p_slam_name               => l_slam_name_session);
1729          End if;
1730    END IF;
1731 
1732    --END IF;
1733 
1734 END LOOP;  -- end of base ledger loop
1735 
1736 --
1737 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1738    trace
1739       (p_msg      => 'return value. = '||TO_CHAR(l_result)
1740       ,p_level    => C_LEVEL_PROCEDURE
1741       ,p_module   => l_log_module);
1742    trace
1743       (p_msg      => 'END of SubmitAccountingEngine'
1744       ,p_level    => C_LEVEL_PROCEDURE
1745       ,p_module   => l_log_module);
1746 END IF;
1747 --
1748 RETURN l_result;
1749 EXCEPTION
1750 WHEN xla_exceptions_pkg.application_exception THEN
1751    RAISE;
1752 WHEN OTHERS  THEN
1753    xla_exceptions_pkg.raise_message
1754       (p_location => 'xla_accounting_engine_pkg.RunPAD');
1755 END SubmitAccountingEngine;
1756 --
1757 --+==========================================================================+
1758 --|  PUBLIC FUNCTION                                                         |
1759 --|    CreateJournalEntries                                                  |
1760 --|                                                                          |
1761 --|                                                                          |
1762 --+==========================================================================+
1763 --
1764 FUNCTION AccountingEngine
1765        (p_application_id         IN NUMBER
1766        ,p_ledger_id              IN NUMBER
1767        ,p_end_date               IN DATE        -- 4262811
1768        ,p_accounting_mode        IN VARCHAR2
1769        ,p_accounting_batch_id    IN NUMBER
1770        ,p_budgetary_control_mode IN VARCHAR2)
1771 RETURN NUMBER IS
1772 --
1773 l_TempJE       NUMBER  := 2;
1774 l_FinalJE      NUMBER  := 2;
1775 l_log_module         VARCHAR2(240);
1776 --
1777 l_min_event_date        date;
1778 l_max_event_date        date;
1779 --
1780 BEGIN
1781 --
1782 IF g_log_enabled THEN
1783       l_log_module := C_DEFAULT_MODULE||'.AccountingEngine';
1784 END IF;
1785 --
1786 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1787 
1788       trace
1789          (p_msg      => 'BEGIN of AccountingEngine'
1790          ,p_level    => C_LEVEL_PROCEDURE
1791          ,p_module   => l_log_module);
1792 
1793       trace
1794          (p_msg      => 'p_application_id = '||TO_CHAR(p_application_id)||
1795                         ' - p_ledger_id = '||TO_CHAR(p_ledger_id)||
1796                         ' - p_accounting_mode = '||p_accounting_mode||
1797                         ' - p_accounting_batch_id = '||TO_CHAR(p_accounting_batch_id)
1798 
1799          ,p_level    => C_LEVEL_PROCEDURE
1800          ,p_module   => l_log_module);
1801 
1802 END IF;
1803 
1804 --
1805 -- Diagnotic Framework
1806 --
1807 xla_accounting_engine_pkg.g_diagnostics_mode := nvl(fnd_profile.value('XLA_DIAGNOSTIC_MODE'),'N');
1808 
1809 --
1810 -- validate to make sure that the accounting mode parameter is correct
1811 -- (it should either be 'D' or 'F' for DRAFT/FINAL)
1812 --
1813 IF p_accounting_mode NOT IN (C_DRAFT_STATUS,C_FINAL_STATUS) THEN
1814    IF (C_LEVEL_ERROR >= g_log_level) THEN
1815       trace
1816          (p_msg      => 'p_accounting_mode = '||p_accounting_mode||' is invalid value'
1817          ,p_level    => C_LEVEL_ERROR
1818          ,p_module   => l_log_module);
1819    END IF;
1820 
1821    xla_exceptions_pkg.raise_message
1822       (p_location => 'xla_accounting_engine_pkg.AccountingEngine');
1823 END IF;
1824 
1825 
1826 l_TempJE :=
1827    SubmitAccountingEngine
1828      (p_application_id         => p_application_id
1829      ,p_ledger_id              => p_ledger_id
1830      ,p_accounting_mode        => p_accounting_mode
1831      ,p_budgetary_control_mode => p_budgetary_control_mode
1832      ,p_accounting_batch_id    => p_accounting_batch_id
1833      ,p_min_event_date         => l_min_event_date
1834      ,p_max_event_date         => l_max_event_date);
1835 
1836 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1837    trace
1838      (p_msg      => 'l_TempJE = '||TO_CHAR(l_TempJE)
1839      ,p_level    => C_LEVEL_STATEMENT
1840      ,p_module   => l_log_module);
1841 END IF;
1842 
1843 l_FinalJE :=
1844    PostAccountingEngine
1845       (p_application_id              =>  p_application_id
1846       ,p_accounting_batch_id         =>  p_accounting_batch_id
1847       ,p_ledger_id                   =>  p_ledger_id
1848       ,p_end_date                    =>  p_end_date   -- 4262811
1849       ,p_accounting_mode             =>  p_accounting_mode
1850       ,p_min_event_date              => l_min_event_date
1851       ,p_max_event_date              => l_max_event_date
1852       ,p_budgetary_control_mode      => p_budgetary_control_mode);
1853 
1854 IF (C_LEVEL_STATEMENT >= g_log_level) THEN
1855    trace
1856      (p_msg      => 'l_FinalJE = '||TO_CHAR(l_FinalJE)
1857      ,p_level    => C_LEVEL_STATEMENT
1858      ,p_module   => l_log_module);
1859 END IF;
1860 
1861 --
1862 --   XLA_AE_CODE_COMBINATION_PKG.refreshCcidCache;
1863 
1864 --
1865 -- Zero temporary journal entries created
1866 -- Update events processed
1867 --
1868 --
1869 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1870    trace
1871      (p_msg      => 'END of AccountingEngine'
1872      ,p_level    => C_LEVEL_PROCEDURE
1873      ,p_module   => l_log_module);
1874 END IF;
1875 
1876 RETURN l_FinalJE;
1877 EXCEPTION
1878 WHEN xla_exceptions_pkg.application_exception THEN
1879    RAISE;
1880 WHEN OTHERS  THEN
1881    xla_exceptions_pkg.raise_message
1882       (p_location => 'xla_accounting_engine_pkg.AccountingEngine');
1883 END AccountingEngine;
1884 --
1885 --+==========================================================================+
1886 --|  PRIVATE FUNCTION                                                        |
1887 --|    CatchErr_UncompliedAAD                                                |
1888 --|                                                                          |
1889 --|                                                                          |
1890 --+==========================================================================+
1891 --
1892 PROCEDURE CatchErr_UncompliedAAD
1893        (p_ledger_id         IN NUMBER
1894        ,p_min_date          IN DATE
1895        ,p_max_date          IN DATE
1896        ,p_aad_name          IN VARCHAR2
1897        ,p_aad_owner         IN VARCHAR2
1898        ,p_slam_name         IN VARCHAR2) IS
1899 l_array_entity_id    xla_ae_journal_entry_pkg.t_array_Num;
1900 l_array_event_id     xla_ae_journal_entry_pkg.t_array_Num;
1901 l_log_module         VARCHAR2(240);
1902 BEGIN
1903    IF g_log_enabled THEN
1904       l_log_module := C_DEFAULT_MODULE||'.CatchErr_UncompliedAAD';
1905    END IF;
1906    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1907       trace
1908         (p_msg      => 'BEGIN of CatchErr_UncompliedAAD'
1909         ,p_level    => C_LEVEL_PROCEDURE
1910         ,p_module   => l_log_module);
1911       trace
1912         (p_msg      => ' p_ledger_id = '||p_ledger_id||
1913                        ' - p_aad_name = '||p_aad_name||
1914                        ' - p_min_date = '||p_min_date||
1915                        ' - p_max_date = '||p_max_date||
1916                        ' - p_aad_owner = '||p_aad_owner
1917         ,p_level    => C_LEVEL_PROCEDURE
1918         ,p_module   => l_log_module);
1919       trace
1920         (p_msg      => 'p_slam_name = '||p_slam_name
1921         ,p_level    => C_LEVEL_PROCEDURE
1922         ,p_module   => l_log_module);
1923    END IF;
1924 
1925    UPDATE xla_events_gt
1926       SET process_status_code = DECODE(process_status_code, 'U', 'E', process_status_code)
1927     WHERE event_date BETWEEN p_min_date AND p_max_date
1928    RETURNING entity_id, event_id
1929    BULK COLLECT INTO
1930        l_array_entity_id
1931       ,l_array_event_id;
1932 
1933    FOR i IN 1..l_array_event_id.COUNT LOOP
1934       xla_accounting_err_pkg.build_message
1935          (p_appli_s_name            => 'XLA'
1936          ,p_msg_name                => 'XLA_AP_PAD_INACTIVE'
1937          ,p_token_1                 => 'PAD_NAME'
1938          ,p_value_1                 => p_aad_name
1939          ,p_token_2                 => 'OWNER'
1940          ,p_value_2                 => xla_lookups_pkg.get_meaning(
1941                                           'XLA_OWNER_TYPE'
1942                                           ,p_aad_owner)
1943          ,p_token_3                 => 'SUBLEDGER_ACCTG_METHOD'
1944          ,p_value_3                 => p_slam_name
1945          ,p_entity_id               => l_array_entity_id(i)
1946          ,p_event_id                => l_array_event_id(i)
1947          ,p_ledger_id               => p_ledger_id);
1948    END LOOP;
1949    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1950       trace
1951         (p_msg      => 'END of CatchErr_UncompliedAAD'
1952         ,p_level    => C_LEVEL_PROCEDURE
1953         ,p_module   => l_log_module);
1954    END IF;
1955 EXCEPTION
1956 WHEN xla_exceptions_pkg.application_exception THEN
1957    RAISE;
1958 WHEN OTHERS  THEN
1959    xla_exceptions_pkg.raise_message
1960       (p_location => 'xla_accounting_engine_pkg.CatchErr_UncompliedAAD');
1961 END CatchErr_UncompliedAAD;
1962 
1963 
1964 --
1965 --+==========================================================================+
1966 --|  PRIVATE FUNCTION                                                        |
1967 --|    CatchErr_MissingAAD                                                   |
1968 --|                                                                          |
1969 --|                                                                          |
1970 --+==========================================================================+
1971 --
1972 PROCEDURE CatchErr_MissingAAD
1973        (p_ledger_id                 IN NUMBER
1974        ,p_min_aad_start_date        IN DATE
1975        ,p_max_aad_end_date          IN DATE
1976        ,p_min_event_date            IN VARCHAR2
1977        ,p_max_event_date            IN VARCHAR2
1978        ,p_slam_name                 IN VARCHAR2) IS
1979 l_array_entity_id    xla_ae_journal_entry_pkg.t_array_Num;
1980 l_array_event_id     xla_ae_journal_entry_pkg.t_array_Num;
1981 l_application_name   VARCHAR2(240);
1982 l_slam_owner         VARCHAR2(240);
1983 l_log_module         VARCHAR2(240);
1984 BEGIN
1985    IF g_log_enabled THEN
1986       l_log_module := C_DEFAULT_MODULE||'.CatchErr_MissingAAD';
1987    END IF;
1988    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
1989       trace
1990         (p_msg      => 'BEGIN of CatchErr_MissingAAD'
1991         ,p_level    => C_LEVEL_PROCEDURE
1992         ,p_module   => l_log_module);
1993       trace
1994         (p_msg      => 'p_ledger_id = '||p_ledger_id
1995         ,p_level    => C_LEVEL_PROCEDURE
1996         ,p_module   => l_log_module);
1997       trace
1998         (p_msg      => 'p_min_aad_start_date = '||p_min_aad_start_date
1999         ,p_level    => C_LEVEL_PROCEDURE
2000         ,p_module   => l_log_module);
2001       trace
2002         (p_msg      => 'p_max_aad_end_date = '||p_max_aad_end_date
2003         ,p_level    => C_LEVEL_PROCEDURE
2004         ,p_module   => l_log_module);
2005       trace
2006         (p_msg      => 'p_min_event_date = '||p_min_event_date
2007         ,p_level    => C_LEVEL_PROCEDURE
2008         ,p_module   => l_log_module);
2009       trace
2010         (p_msg      => 'p_max_event_date = '||p_max_event_date
2011         ,p_level    => C_LEVEL_PROCEDURE
2012         ,p_module   => l_log_module);
2013       trace
2014         (p_msg      => 'p_slam_name = '||p_slam_name
2015         ,p_level    => C_LEVEL_PROCEDURE
2016         ,p_module   => l_log_module);
2017    END IF;
2018 
2019    IF (p_min_event_date < p_min_aad_start_date AND
2020       p_max_event_date  > p_max_aad_end_date)
2021    THEN
2022       UPDATE xla_events_gt
2023          SET process_status_code = DECODE(process_status_code, 'U', 'E', process_status_code)
2024        WHERE event_date BETWEEN p_min_event_date AND (p_min_aad_start_date -1)
2025           OR event_date BETWEEN (p_max_aad_end_date +1) AND p_max_event_date
2026       RETURNING entity_id, event_id
2027       BULK COLLECT INTO
2028           l_array_entity_id
2029          ,l_array_event_id;
2030    ELSIF p_min_event_date < p_min_aad_start_date THEN
2031       UPDATE xla_events_gt
2032          SET process_status_code = DECODE(process_status_code, 'U', 'E', process_status_code)
2033        WHERE event_date BETWEEN p_min_event_date AND (p_min_aad_start_date -1)
2034       RETURNING entity_id, event_id
2035       BULK COLLECT INTO
2036           l_array_entity_id
2037          ,l_array_event_id;
2038    ELSIF p_max_event_date > p_max_aad_end_date THEN
2039       UPDATE xla_events_gt
2040          SET process_status_code = DECODE(process_status_code, 'U', 'E', process_status_code)
2041        WHERE event_date BETWEEN (p_max_aad_end_date +1) AND p_max_event_date
2042       RETURNING entity_id, event_id
2043       BULK COLLECT INTO
2044           l_array_entity_id
2045          ,l_array_event_id;
2046 
2047    END IF;
2048 
2049    l_application_name :=
2050       xla_accounting_cache_pkg.GetSessionValueChar
2051          (p_source_code         => 'XLA_EVENT_APPL_NAME');
2052 
2053    l_slam_owner :=
2054       xla_accounting_cache_pkg.GetValueChar
2055          (p_source_code         => 'XLA_ACCOUNTING_METHOD_OWNER'
2056          ,p_target_ledger_id    => p_ledger_id);
2057 
2058    FOR i IN 1..l_array_event_id.COUNT LOOP
2059       xla_accounting_err_pkg.build_message
2060          (p_appli_s_name            => 'XLA'
2061          ,p_msg_name                => 'XLA_AP_INV_PAD_SETUP'
2062          ,p_token_1                 => 'PRODUCT_NAME'
2063          ,p_value_1                 => l_application_name
2064          ,p_token_2                 => 'SUBLEDGER_ACCTG_METHOD'
2065          ,p_value_2                 => p_slam_name
2066          ,p_token_3                 => 'OWNER'
2067          ,p_value_3                 => xla_lookups_pkg.get_meaning(
2068                                        'XLA_OWNER_TYPE',l_slam_owner)
2069          ,p_entity_id               => l_array_entity_id(i)
2070          ,p_event_id                => l_array_event_id(i)
2071          ,p_ledger_id               => p_ledger_id);
2072    END LOOP;
2073    IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
2074       trace
2075         (p_msg      => 'END of CatchErr_MissingAAD'
2076         ,p_level    => C_LEVEL_PROCEDURE
2077         ,p_module   => l_log_module);
2078    END IF;
2079 EXCEPTION
2080 WHEN xla_exceptions_pkg.application_exception THEN
2081    RAISE;
2082 WHEN OTHERS  THEN
2083    xla_exceptions_pkg.raise_message
2084       (p_location => 'xla_accounting_engine_pkg.CatchErr_MissingAAD');
2085 END CatchErr_MissingAAD;
2086 
2087 --=============================================================================
2088 --
2089 --
2090 --
2091 --
2092 --
2093 --
2094 --
2095 --
2096 --
2097 --
2098 --
2099 --
2100 --
2101 --
2102 --
2103 --
2104 --
2105 --
2106 --
2107 --
2108 --
2109 --
2110 --=============================================================================
2111 --=============================================================================
2112 --          *********** Initialization routine **********
2113 --=============================================================================
2114 
2115 BEGIN
2116 
2117    g_log_level      := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2118    g_log_enabled    := fnd_log.test
2119                           (log_level  => g_log_level
2120                           ,module     => C_DEFAULT_MODULE);
2121 
2122    IF NOT g_log_enabled  THEN
2123       g_log_level := C_LEVEL_LOG_DISABLED;
2124    END IF;
2125 
2126 END xla_accounting_engine_pkg; -- end of package spec