[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