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