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