DBA Data[Home] [Help]

PACKAGE BODY: APPS.FEM_GL_POST_PROCESS_PKG

Source


1 PACKAGE BODY FEM_GL_POST_PROCESS_PKG AS
2 /* $Header: fem_gl_post_proc.plb 120.11 2008/04/01 06:55:49 rguerrer ship $ */
3 
4 /**************************************************************************
5 -- Private Package Variables and exceptions
6 **************************************************************************/
7 
8    pc_log_level_statement       CONSTANT NUMBER   := fnd_log.level_statement;
9    pc_log_level_procedure       CONSTANT NUMBER   := fnd_log.level_procedure;
10    pc_log_level_event           CONSTANT NUMBER   := fnd_log.level_event;
11    pc_log_level_exception       CONSTANT NUMBER   := fnd_log.level_exception;
12    pc_log_level_error           CONSTANT NUMBER   := fnd_log.level_error;
13    pc_log_level_unexpected      CONSTANT NUMBER   := fnd_log.level_unexpected;
14 
15    pc_API_version               CONSTANT NUMBER   := 1.0;
16 
17    pv_proc_name                 VARCHAR2(30);
18 
19    pv_API_return_code           NUMBER;
20 
21    pv_dim_attr_id               fem_dim_attributes_b.attribute_id%TYPE;
22    pv_dim_attr_ver_id           fem_dim_attr_versions_b.version_id%TYPE;
23    pv_attr_label                fem_dim_attributes_b.attribute_varchar_label%TYPE;
24    pv_dim_name                  fem_dimensions_tl.dimension_name%TYPE;
25 
26    pv_obj_type_cd               fem_object_catalog_b.object_type_code%TYPE;
27    pv_cal_per_calendar_id       fem_cal_periods_b.calendar_id%TYPE;
28    pv_ledger_calendar_id        fem_hierarchies.calendar_id%TYPE;
29    pv_precedent_dataset_code    fem_datasets_b.dataset_code%TYPE;
30 
31    Invalid_Budget_ID            EXCEPTION;
32    Invalid_Budget_or_Dataset    EXCEPTION;
33    Invalid_Cal_Period_ID        EXCEPTION;
34    Invalid_Dataset_Code         EXCEPTION;
35    Invalid_DS_Bal_Type          EXCEPTION;
36    Invalid_Enc_Type_ID          EXCEPTION;
37    Invalid_Enc_or_Dataset       EXCEPTION;
38    Invalid_Engine_Parameter     EXCEPTION;
39    Invalid_Execution_Mode       EXCEPTION;
40    Invalid_Ledger_ID            EXCEPTION;
41    Invalid_Obj_Approval_Status  EXCEPTION;
42    Invalid_Object_Def_ID        EXCEPTION;
43    Invalid_Object_ID            EXCEPTION;
44    Invalid_QTD_YTD              EXCEPTION;
45    Invalid_Request_ID           EXCEPTION;
46    Invalid_Runtime_Parameter    EXCEPTION;
47    Ledger_Cal_NEQ_Period_Cal    EXCEPTION;
48    Value_Set_ID_Error           EXCEPTION;
49    User_Not_Allowed             EXCEPTION;
50 
51 
52 /**************************************************************************
53 -- Private Procedure Declarations
54 **************************************************************************/
55 
56    PROCEDURE Get_Dim_IDs;
57 
58 
59    PROCEDURE Validate_Budget;
60 
61    PROCEDURE Validate_Cal_Period;
62 
63    PROCEDURE Validate_Dataset;
64 
65    PROCEDURE Validate_DS_Bal_Type;
66 
67    PROCEDURE Validate_Encumbrance_Type;
68 
69    PROCEDURE Validate_Ledger;
70 
71    PROCEDURE Validate_Object_Def_ID;
72 
73 
74    PROCEDURE Validate_Engine_Parameters (x_completion_code OUT NOCOPY NUMBER);
75 
76 
77 /**************************************************************************
78 -- Public Procedures
79 **************************************************************************/
80 
81 -- =======================================================================
82    PROCEDURE Validate_XGL_Eng_Parameters
83                 (p_ledger_id               IN  NUMBER,
84                  p_cal_period_id           IN  NUMBER,
85                  p_dataset_code            IN  NUMBER,
86                  p_xgl_obj_def_id          IN  NUMBER,
87                  p_exec_mode               IN  VARCHAR2,
88                  p_qtd_ytd_code            IN  VARCHAR2 DEFAULT NULL,
89                  p_budget_id               IN  NUMBER DEFAULT NULL,
90                  p_enc_type_id             IN  NUMBER DEFAULT NULL,
91                  x_completion_code         OUT NOCOPY NUMBER) IS
92 -- =======================================================================
93 -- Purpose
94 --    XGL-specific wrapper for Validate_Engine_Parameters, which has
95 --    functionality that is common to both engines.  All functionality
96 --    for setting package variables and validating engine parameters
97 --    that is specific to the XGL engine should go here.
98 -- History
99 --    11-13-03  G Hall  Created
100 --    12-02-03  G Hall  Added Object Type validation
101 --    01-27-04  G Hall  Moved the Object ID lookup to
102 --                      Validate_Object_Def_ID.
103 --    05-12-04  G Hall  Bug# 3610446: Added validation for p_qtd_ytd_code
104 --                      parameter.
105 -- Arguments
106 --    All of the IN arguments are the same as the IN arguments for the
107 --    FEM_XGL_POST_ENGINE_PKG.Main procedure.
108 --    x_completion_code returns 0 for success, 1 for warning, 2 for failure.
109 -- Notes
110 --    Called from the beginning of FEM_XGL_POST_ENGINE_PKG.Main
111 -- =======================================================================
112 
113       v_row_count     NUMBER;
114 
115    BEGIN
116 
117       FEM_ENGINES_PKG.Tech_Message
118         (p_severity => pc_log_level_procedure,
119          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
120                        'validate_xgl_eng_parameters.begin',
121          p_msg_text => 'BEGIN');
122 
123    -- --------------------------------------------------------------------
124    -- Set all engine parameters as public package variables
125    -- --------------------------------------------------------------------
126 
127       pv_ledger_id        := p_ledger_id;
128       pv_cal_period_id    := p_cal_period_id;
129       pv_dataset_code     := p_dataset_code;
130       pv_rule_obj_def_id  := p_xgl_obj_def_id;
131       pv_exec_mode        := p_exec_mode;
132       -- Updated by L Poon to fix the GSCC warning - File.Sql.35
133       pv_qtd_ytd_code     := NVL(p_qtd_ytd_code, 'PTD');
134       pv_budget_id        := p_budget_id;
135       pv_enc_type_id      := p_enc_type_id;
136 
137    -- --------------------------------------------------------------------
138    -- Log debug messages to display values for those variables
139    -- --------------------------------------------------------------------
140 
141       FEM_ENGINES_PKG.Tech_Message
142       (p_severity    => pc_log_level_statement,
143        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
144                      'validate_xgl_eng_parameters.pv_ledger_id',
145        p_app_name => 'FEM',
146        p_msg_name => 'FEM_GL_POST_204',
147        p_token1   => 'VAR_NAME',
148        p_value1   => 'pv_ledger_id',
149        p_token2   => 'VAR_VAL',
150        p_value2   => TO_CHAR(pv_ledger_id));
151 
152       FEM_ENGINES_PKG.Tech_Message
153       (p_severity    => pc_log_level_statement,
154        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
155                      'validate_xgl_eng_parameters.pv_cal_period_id',
156        p_app_name => 'FEM',
157        p_msg_name => 'FEM_GL_POST_204',
158        p_token1   => 'VAR_NAME',
159        p_value1   => 'pv_cal_period_id',
160        p_token2   => 'VAR_VAL',
161        p_value2   => TO_CHAR(pv_cal_period_id));
162 
163       FEM_ENGINES_PKG.Tech_Message
164       (p_severity    => pc_log_level_statement,
165        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
166                      'validate_xgl_eng_parameters.pv_dataset_code',
167        p_app_name => 'FEM',
168        p_msg_name => 'FEM_GL_POST_204',
169        p_token1   => 'VAR_NAME',
170        p_value1   => 'pv_dataset_code',
171        p_token2   => 'VAR_VAL',
172        p_value2   => TO_CHAR(pv_dataset_code));
173 
174       FEM_ENGINES_PKG.Tech_Message
175       (p_severity    => pc_log_level_statement,
176        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
177                      'validate_xgl_eng_parameters.pv_budget_id',
178        p_app_name => 'FEM',
179        p_msg_name => 'FEM_GL_POST_204',
180        p_token1   => 'VAR_NAME',
181        p_value1   => 'pv_budget_id',
182        p_token2   => 'VAR_VAL',
183        p_value2   => TO_CHAR(pv_budget_id));
184 
185       FEM_ENGINES_PKG.Tech_Message
186       (p_severity    => pc_log_level_statement,
187        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
188                      'validate_xgl_eng_parameters.pv_enc_type_id',
189        p_app_name => 'FEM',
190        p_msg_name => 'FEM_GL_POST_204',
191        p_token1   => 'VAR_NAME',
192        p_value1   => 'pv_enc_type_id',
193        p_token2   => 'VAR_VAL',
194        p_value2   => TO_CHAR(pv_enc_type_id));
195 
196       FEM_ENGINES_PKG.Tech_Message
197       (p_severity    => pc_log_level_statement,
198        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
199                      'validate_xgl_eng_parameters.pv_exec_mode',
200        p_app_name => 'FEM',
201        p_msg_name => 'FEM_GL_POST_204',
202        p_token1   => 'VAR_NAME',
203        p_value1   => 'pv_exec_mode',
204        p_token2   => 'VAR_VAL',
205        p_value2   => pv_exec_mode);
206 
207       FEM_ENGINES_PKG.Tech_Message
208       (p_severity    => pc_log_level_statement,
209        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
210                      'validate_xgl_eng_parameters.pv_rule_obj_def_id',
211        p_app_name => 'FEM',
212        p_msg_name => 'FEM_GL_POST_204',
213        p_token1   => 'VAR_NAME',
214        p_value1   => 'pv_rule_obj_def_id',
215        p_token2   => 'VAR_VAL',
216        p_value2   => TO_CHAR(pv_rule_obj_def_id));
217 
218       FEM_ENGINES_PKG.Tech_Message
219       (p_severity    => pc_log_level_statement,
220        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
221                      'validate_xgl_eng_parameters.pv_qtd_ytd_code',
222        p_app_name => 'FEM',
223        p_msg_name => 'FEM_GL_POST_204',
224        p_token1   => 'VAR_NAME',
225        p_value1   => 'pv_qtd_ytd_code',
226        p_token2   => 'VAR_VAL',
227        p_value2   => pv_qtd_ytd_code);
228 
229    -- --------------------------------------------------------------------
230    -- Validate the p_qtd_ytd_code engine parameter.
231    -- --------------------------------------------------------------------
232 
233       SELECT COUNT(*)
234       INTO v_row_count
235       FROM fnd_lookup_values
236       WHERE lookup_type = 'FEM_XGL_QTD_YTD_DSC'
237         AND lookup_code = pv_qtd_ytd_code
238         AND language = USERENV('LANG')
239         AND view_application_id = 274;
240 
241       IF v_row_count = 0 THEN
242 
243          FEM_ENGINES_PKG.Tech_Message
244            (p_severity => pc_log_level_statement,
245             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
246                           'validate_xgl_eng_parameters.iqy',
247             p_msg_text => 'raising Invalid_QTD_YTD');
248 
249          RAISE Invalid_QTD_YTD;
250 
251       END IF;
252 
253    -- --------------------------------------------------------------------
254    -- Set package variables common to both GL posting engines and
255    -- validate the engine parameters that are common to both engines.
256    -- --------------------------------------------------------------------
257 
258       Validate_Engine_Parameters
259         (x_completion_code => x_completion_code);
260 
261       IF x_completion_code = 2 THEN
262 
263          RAISE Invalid_Engine_Parameter;
264 
265       END IF;
266 
267    -- Validate that the rule to be executed is an XGL_INTEGRATION rule.
268 
269       IF pv_obj_type_cd <> 'XGL_INTEGRATION' THEN
270 
271          FEM_ENGINES_PKG.Tech_Message
272            (p_severity => pc_log_level_statement,
273             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
274                           'validate_xgl_eng_parameters.iobj2.',
275             p_msg_text => 'raising Invalid_Object_ID');
276 
277          RAISE Invalid_Object_ID;
278 
279       END IF;
280 
281    -- Successful completion
282 
283       IF x_completion_code <> 1 THEN
284          x_completion_code := 0;
285       END IF;
286 
287       FEM_ENGINES_PKG.Tech_Message
288         (p_severity => pc_log_level_procedure,
289          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
290                        'validate_xgl_eng_parameters.end',
291          p_msg_text => 'END');
292 
293    EXCEPTION
294       WHEN Invalid_Engine_Parameter THEN
295       ------------------------------------------------------------------
296       -- Messages are aleady logged, x_completion_code is already set.
297       ------------------------------------------------------------------
298          NULL;
299 
300       WHEN Invalid_Object_ID THEN
301       ------------------------------------------------------------------
302       -- Invalid External GL Integration Rule:  Value not found or rule
303       -- has the wrong Object Type.
304       ------------------------------------------------------------------
305          x_completion_code := 2;
306 
307          FEM_ENGINES_PKG.Tech_Message
308            (p_severity => pc_log_level_error,
309             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
310                           'validate_xgl_eng_parameters.invalid_object_id',
311             p_app_name => 'FEM',
312             p_msg_name => 'FEM_GL_POST_010');
313 
314          FEM_ENGINES_PKG.User_Message
315            (p_app_name => 'FEM',
316             p_msg_name => 'FEM_GL_POST_010');
317 
318       WHEN Invalid_QTD_YTD THEN
319       ------------------------------------------------------------------
320       -- Invalid parameter.  Value not found.  Parameter Name:
321       -- P_QTD_YTD_CODE (Period Specific Amounts Provided)
322       ------------------------------------------------------------------
323          x_completion_code := 2;
324 
325          FEM_ENGINES_PKG.Tech_Message
326            (p_severity => pc_log_level_error,
327             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
328                           'validate_xgl_eng_parameters.invalid_qtd_ytd',
329             p_app_name => 'FEM',
330             p_msg_name => 'FEM_GL_POST_001',
331             p_token1   => 'DIMENSION_NAME',
332             p_value1   => 'P_QTD_YTD_CODE (Period Specific Amounts Provided)');
333 
334          FEM_ENGINES_PKG.User_Message
335            (p_app_name => 'FEM',
336             p_msg_name => 'FEM_GL_POST_001',
337             p_token1   => 'DIMENSION_NAME',
338             p_value1   => 'P_QTD_YTD_CODE (Period Specific Amounts Provided)');
339 
340       WHEN OTHERS THEN
341       ------------------------------------------------------------------
342       -- Unexpected exceptions
343       ------------------------------------------------------------------
344          pv_sqlerrm   := SQLERRM;
345          pv_callstack := dbms_utility.format_call_stack;
346 
347          x_completion_code := 2;
348 
349       -- Log the call stack and the Oracle error message to
350       -- FND_LOG with the "unexpected exception" severity level.
351 
352          FEM_ENGINES_PKG.Tech_Message
353            (p_severity => pc_log_level_unexpected,
354             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
355                           'validate_xgl_eng_parameters.unexpected_exception',
356             p_msg_text => pv_sqlerrm);
357 
358          FEM_ENGINES_PKG.Tech_Message
359            (p_severity => pc_log_level_unexpected,
360             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
361                           'validate_xgl_eng_parameters.unexpected_exception',
362             p_msg_text => pv_callstack);
363 
364       -- Log the Oracle error message to the Concurrent Request Log.
365 
366          FEM_ENGINES_PKG.User_Message
367            (p_app_name => 'FEM',
368             p_msg_text => pv_sqlerrm);
369 
370    END Validate_XGL_Eng_Parameters;
371 -- =======================================================================
372 
373 
374 -- =======================================================================
375    PROCEDURE Register_Process_Execution
376                (x_completion_code OUT NOCOPY NUMBER) IS
377 -- =======================================================================
378 -- Purpose
382 --    steps.
379 --    Registers the concurrent request in FEM_PL_REQUESTS, registers
380 --    the object execution in FEM_PL_OBJECT_EXECUTIION, obtaining an
381 --    FEM "execution lock, and performs other FEM process initialization
383 -- History
384 --    11-13-03  G Hall  Created
385 --    01-27-04  G Hall  Added P_EXEC_MODE_CODE parameter in call
386 --                      to Register_Request.
387 --    03-10-04  G Hall  Added OA-compliant parameters to all
388 --                      Process Lock procedure calls.
389 --    03-16-04  G Hall  Added debug messages for message stack
390 --                      operations; added p_msg_index to call to
391 --                      FND_MSG_PUB.Get.
392 --    05-13-04  G Hall  Bug# 3597495: Removed call to Register_Data_Location.
393 --                      Final_Process_Logging now makes a call for each
394 --                      valid Source System Code processed.
395 --    08-23-05  G Hall  Bug# 4521255: Fixed message decoding after API calls
396 --                      when x_msg_count = 1.
397 -- Arguments
398 --    x_completion_code returns 0 for success, 2 for failure.
399 -- Notes
400 --    Called by FEM_XGL_POST_ENGINE_PKG.Main or by
401 --    FEM_OGL_POST_ENGINE.Main prior to processing.
402 -- =======================================================================
403 
404       v_return_status    VARCHAR2(1);
405       v_msg_count        NUMBER;
406       v_msg_data         VARCHAR2(2000);
407 
408       i                  PLS_INTEGER;
409 
410       v_exec_lock_exists BOOLEAN := FALSE;
411 
412       API_Error          EXCEPTION;
413 
414    BEGIN
415 
416       FEM_ENGINES_PKG.Tech_Message
417         (p_severity => pc_log_level_procedure,
418          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
419                        'register_process_execution.begin',
420          p_msg_text => 'BEGIN');
421 
422    -- Call the FEM_PL_PKG.Register_Request API procedure to register
423    -- the concurrent request in FEM_PL_REQUESTS.
424 
425       FND_MSG_PUB.Initialize;
426 
427       FEM_PL_PKG.Register_Request
428         (P_API_VERSION            => pc_API_version,
429          P_COMMIT                 => 'T',
430          P_CAL_PERIOD_ID          => pv_cal_period_id,
431          P_LEDGER_ID              => pv_ledger_id,
432          P_OUTPUT_DATASET_CODE    => pv_dataset_code,
433          P_REQUEST_ID             => pv_req_id,
434          P_USER_ID                => pv_user_id,
435          P_LAST_UPDATE_LOGIN      => pv_login_id,
436          P_PROGRAM_ID             => pv_pgm_id,
437          P_PROGRAM_LOGIN_ID       => pv_login_id,
438          P_PROGRAM_APPLICATION_ID => pv_pgm_app_id,
439          P_EXEC_MODE_CODE         => pv_exec_mode,
440          X_MSG_COUNT              => v_msg_count,
441          X_MSG_DATA               => v_msg_data,
442          X_RETURN_STATUS          => v_return_status);
443 
444       IF v_return_status <> 'S' THEN
445 
446          FEM_ENGINES_PKG.Tech_Message
447            (p_severity => pc_log_level_statement,
448             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
449                           'register_process_execution.rrapie',
450             p_msg_text => 'raising API_Error');
451 
452          RAISE API_Error;
453 
454       END IF;
455 
456    -- Check for process locks and process overlaps, validate the Execution Mode
457    -- parameter, validate the period (for snapshot loads only), and register
458    -- the execution in FEM_PL_OBJECT_EXECUTIONS, obtaining an execution lock.
459 
460       FND_MSG_PUB.Initialize;
461 
462       FEM_PL_PKG.Register_Object_Execution
463         (P_API_VERSION               => pc_API_version,
464          P_COMMIT                    => 'T',
465          P_REQUEST_ID                => pv_req_id,
466          P_OBJECT_ID                 => pv_rule_obj_id,
467          P_EXEC_OBJECT_DEFINITION_ID => pv_rule_obj_def_id,
468          P_USER_ID                   => pv_user_id,
469          P_LAST_UPDATE_LOGIN         => pv_login_id,
470          P_EXEC_MODE_CODE            => pv_exec_mode,
471          X_EXEC_STATE                => pv_exec_state,
472          X_PREV_REQUEST_ID           => pv_prev_req_id,
473          X_MSG_COUNT                 => v_msg_count,
474          X_MSG_DATA                  => v_msg_data,
475          X_RETURN_STATUS             => v_return_status);
476 
477       IF v_return_status <> 'S' THEN
478 
479          IF v_return_status = 'E' THEN
480          -- Lock exists
481             v_exec_lock_exists := TRUE;
482          END IF;
483 
484          FEM_ENGINES_PKG.Tech_Message
485            (p_severity => pc_log_level_statement,
486             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
487                           'register_process_execution.roeapie',
488             p_msg_text => 'raising API_Error');
489 
490          RAISE API_Error;
491 
492       END IF;
493 
494       FEM_ENGINES_PKG.Tech_Message
495       (p_severity    => pc_log_level_statement,
496        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
497                      'register_process_execution.pv_exec_state',
498        p_app_name => 'FEM',
499        p_msg_name => 'FEM_GL_POST_204',
500        p_token1   => 'VAR_NAME',
501        p_value1   => 'pv_exec_state',
502        p_token2   => 'VAR_VAL',
503        p_value2   => pv_exec_state);
504 
505       IF pv_exec_state = 'RERUN' THEN
509           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
506 
507          FEM_ENGINES_PKG.Tech_Message
508          (p_severity    => pc_log_level_statement,
510                         'register_process_execution.pv_prev_req_id',
511           p_app_name => 'FEM',
512           p_msg_name => 'FEM_GL_POST_204',
513           p_token1   => 'VAR_NAME',
514           p_value1   => 'pv_prev_req_id',
515           p_token2   => 'VAR_VAL',
516           p_value2   => TO_CHAR(pv_prev_req_id));
517 
518       END If;
519 
520    -- Register the Object Definition ID together with this process execution in
521    -- FEM_PL_OBJECT_DEFS to establish the required edit locks on the executed
522    -- rule version.
523 
524       FND_MSG_PUB.Initialize;
525 
526       FEM_PL_PKG.Register_Object_Def
527         (P_API_VERSION          => pc_API_version,
528          P_COMMIT               => 'T',
529          P_REQUEST_ID           => pv_req_id,
530          P_OBJECT_ID            => pv_rule_obj_id,
531          P_OBJECT_DEFINITION_ID => pv_rule_obj_def_id,
532          P_USER_ID              => pv_user_id,
533          P_LAST_UPDATE_LOGIN    => pv_login_id,
534          X_MSG_COUNT            => v_msg_count,
535          X_MSG_DATA             => v_msg_data,
536          X_RETURN_STATUS        => v_return_status);
537 
538       IF v_return_status <> 'S' THEN
539 
540          FEM_ENGINES_PKG.Tech_Message
541            (p_severity => pc_log_level_statement,
542             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
543                           'register_process_execution.rodapie',
544             p_msg_text => 'raising API_Error');
545 
546          RAISE API_Error;
547 
548       END IF;
549 
550    -- Log Undo information in FEM_PL_TABLES for rows inserted or merged into
551    -- FEM_BALANCES.
552 
553       -- FEM-OGL Intg: Replace v_stmt_type by pv_stmt_type
554       IF pv_exec_mode = 'S' THEN
555          pv_stmt_type := 'INSERT';
556       ELSE
557          pv_stmt_type := 'MERGE';
558       END IF;
559 
560       FND_MSG_PUB.Initialize;
561 
562       FEM_PL_PKG.Register_Table
563         (P_API_VERSION        => pc_API_version,
564          P_COMMIT             => 'T',
565          P_REQUEST_ID         => pv_req_id,
566          P_OBJECT_ID          => pv_rule_obj_id,
567          P_TABLE_NAME         => 'FEM_BALANCES',
568          P_STATEMENT_TYPE     => pv_stmt_type,
569          P_NUM_OF_OUTPUT_ROWS => 0,
570          P_USER_ID            => pv_user_id,
571          P_LAST_UPDATE_LOGIN  => pv_login_id,
572          X_MSG_COUNT          => v_msg_count,
573          X_MSG_DATA           => v_msg_data,
574          X_RETURN_STATUS      => v_return_status);
575 
576       IF v_return_status <> 'S' THEN
577 
578          FEM_ENGINES_PKG.Tech_Message
579            (p_severity => pc_log_level_statement,
580             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
581                           'register_process_execution.rtapie',
582             p_msg_text => 'raising API_Error');
583 
584          RAISE API_Error;
585 
586       END IF;
587 
588    -- Successful completion
589 
590       x_completion_code := 0;
591 
592       FEM_ENGINES_PKG.Tech_Message
593         (p_severity => pc_log_level_procedure,
594          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
595                        'register_process_execution.end',
596          p_msg_text => 'END');
597 
598    EXCEPTION
599 
600       WHEN API_Error THEN
601 
602          x_completion_code := 2;
603 
604       -- Technical messages have already been logged by the API; user
605       -- messages are on the message stack.
606 
607          FND_MSG_PUB.Count_and_Get(
608            p_encoded => 'F',
609            p_count => v_msg_count,
610            p_data => v_msg_data);
611 
612          FEM_ENGINES_PKG.Tech_Message
613          (p_severity    => pc_log_level_statement,
614           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
615                         'register_process_execution.v_msg_count',
616           p_app_name => 'FEM',
617           p_msg_name => 'FEM_GL_POST_204',
618           p_token1   => 'VAR_NAME',
619           p_value1   => 'v_msg_count',
620           p_token2   => 'VAR_VAL',
621           p_value2   => TO_CHAR(v_msg_count));
622 
623          IF v_msg_count = 1 THEN
624 
625             FEM_ENGINES_PKG.Tech_Message
626             (p_severity    => pc_log_level_statement,
627              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
628                            'register_process_execution.v_msg_data1',
629              p_app_name => 'FEM',
630              p_msg_name => 'FEM_GL_POST_204',
631              p_token1   => 'VAR_NAME',
632              p_value1   => 'v_msg_data',
633              p_token2   => 'VAR_VAL',
634              p_value2   => v_msg_data);
635 
636             FEM_ENGINES_PKG.User_Message
637               (p_app_name => 'FEM',
638                p_msg_text => v_msg_data);
639 
640          ELSIF v_msg_count > 1 THEN
641 
642             FOR i IN 1 .. v_msg_count LOOP
643 
644             -- Try fuller call here; see Tim's doc.
645 
646                v_msg_data :=
647                   FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
648 
652                               'register_process_execution.v_msg_data2.',
649                FEM_ENGINES_PKG.Tech_Message
650                (p_severity    => pc_log_level_statement,
651                 p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
653                 p_app_name => 'FEM',
654                 p_msg_name => 'FEM_GL_POST_204',
655                 p_token1   => 'VAR_NAME',
656                 p_value1   => 'v_msg_data',
657                 p_token2   => 'VAR_VAL',
658                 p_value2   => v_msg_data);
659 
660                FEM_ENGINES_PKG.User_Message
661                  (p_app_name => 'FEM',
662                   p_msg_text => v_msg_data);
663 
664             END LOOP;
665 
666          END IF;
667 
668          IF v_exec_lock_exists THEN
669 
670          -- Unregister the concurrent request.
671 
672             FEM_PL_PKG.Unregister_Request
673               (P_API_VERSION   => pc_API_version,
674                P_COMMIT        => 'T',
675                P_REQUEST_ID    => pv_req_id,
676                X_MSG_COUNT     => v_msg_count,
677                X_MSG_DATA      => v_msg_data,
678                X_RETURN_STATUS => v_return_status);
679 
680          END IF;
681 
682       WHEN OTHERS THEN
683       --------------------------------------------------------------------
684       -- Unexpected exceptions
685       --------------------------------------------------------------------
686          x_completion_code := 2;
687 
688          pv_sqlerrm   := SQLERRM;
689          pv_callstack := dbms_utility.format_call_stack;
690 
691       -- Log the call stack and the Oracle error message to
692       -- FND_LOG with the "unexpected exception" severity level.
693 
694          FEM_ENGINES_PKG.Tech_Message
695            (p_severity => pc_log_level_unexpected,
696             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
697                           'register_process_execution.unexpected_exception',
698             p_msg_text => pv_sqlerrm);
699 
700          FEM_ENGINES_PKG.Tech_Message
701            (p_severity => pc_log_level_unexpected,
702             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
703                           'register_process_execution.unexpected_exception',
704             p_msg_text => pv_callstack);
705 
706       -- Log the Oracle error message to the Concurrent Request Log.
707 
708          FEM_ENGINES_PKG.User_Message
709            (p_app_name => 'FEM',
710             p_msg_text => pv_sqlerrm);
711 
712    END Register_Process_Execution;
713 -- =======================================================================
714 
715 
716 -- =======================================================================
717    PROCEDURE Final_Process_Logging
718                 (p_exec_status             IN  VARCHAR2,
719                  p_num_data_errors         IN  NUMBER,
720                  p_num_data_errors_reproc  IN  NUMBER,
721                  p_num_output_rows         IN  NUMBER,
722                  p_final_message_name      IN  VARCHAR2) IS
723 -- =======================================================================
724 -- Purpose
725 --    Performs final process logging after process completion.
726 -- History
727 --    11-13-03  G Hall  Created
728 --    03-10-04  G Hall  Added OA-compliant parameters to all
729 --                      Process Locks procedure calls.
730 --    03-16-04  G Hall  Added debug messages for message stack
731 --                      operations; added p_msg_index to call to
732 --                      FND_MSG_PUB.Get.
733 --    03-17-04  G Hall  Removed logging of p_final_message_name
734 --                      parameter to the Debug Log and the
735 --                      Concurrent Request Log. The parameter will
736 --                      be eliminated altogether during MP
737 --                      implementation.
738 --    05-12-04  G Hall  Reinstated logging of p_final_message_name
739 --                      parameter to the Debug Log and the
740 --                      Concurrent Request Log, and removed redundant
741 --                      message calls from Main.
742 --    05-13-04  G Hall  Bug# 3597495: Added a call to Register_Data_Location
743 --                      for each valid Source System Code processed.
744 --    05-25-04  G Hall  Changed call to Get_SSC_Not_Processed to parameterized
745 --                      call to Get_SSC.
746 --    07-06-05  G Hall  Bug# 4050862 Added successful and error row counts
747 --                      message to concurrent log file.
748 -- Arguments
749 --    p_exec_status             The final completion status:
750 --                              'SUCCESS','CANCELLED_RERUN','ERROR_RERUN'.
751 --    p_num_data_errors         The total number of data rows rejected
752 --                              with errors, including reprocessed
753 --                              previous errors that are still errors.
754 --    p_num_data_errors_reproc  The total number of previous error rows
755 --                              successfully reprocessed.
756 --    p_num_output_rows         The total number of rows inserted or
757 --                              merged into FEM_BALANCES by the engine.
758 --    p_final_message_name      The name of the final message to be logged
759 --                              for the engine.
760 -- Notes
761 --    Called by FEM_XGL_POST_ENGINE_PKG.Main or by
762 --    FEM_OGL_POST_ENGINE.Main after processing is complete.
766       v_msg_count        NUMBER;
763 -- =======================================================================
764 
765       v_return_status    VARCHAR2(1);
767       v_msg_data         VARCHAR2(2000);
768 
769       v_statement_type   fem_pl_tables.statement_type%TYPE;
770       v_src_sys_code     fem_source_systems_b.source_system_code%TYPE;
771 
772       i                  PLS_INTEGER;
773       j                  PLS_INTEGER;
774 
775    BEGIN
776 
777       FEM_ENGINES_PKG.Tech_Message
778         (p_severity => pc_log_level_procedure,
779          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
780                        'final_process_logging.begin',
781          p_msg_text => 'BEGIN');
782 
783    -- Update the total number of rows inserted and/or updated in FEM_BALANCES
784    -- by this execution, in the entry already posted in FEM_PL_TABLES.
785 
786       IF pv_exec_mode = 'S' THEN
787          v_statement_type := 'INSERT';
788       ELSE
789          v_statement_type := 'MERGE';
790       END IF;
791 
792       FND_MSG_PUB.Initialize;
793 
794       FEM_PL_PKG.Update_Num_of_Output_Rows
795         (P_API_VERSION        => pc_API_version,
796          P_COMMIT             => 'T',
797          P_REQUEST_ID         => pv_req_id,
798          P_OBJECT_ID          => pv_rule_obj_id,
799          P_TABLE_NAME         => 'FEM_BALANCES',
800          P_STATEMENT_TYPE     => v_statement_type,
801          P_NUM_OF_OUTPUT_ROWS => p_num_output_rows,
802          P_USER_ID            => pv_user_id,
803          P_LAST_UPDATE_LOGIN  => pv_login_id,
804          X_MSG_COUNT          => v_msg_count,
805          X_MSG_DATA           => v_msg_data,
806          X_RETURN_STATUS      => v_return_status);
807 
808    -- Log the number of data errors flagged on individual input rows in the
809    -- interface table in this execution and the number of previously failed
810    -- rows successfully reprocessed in this execution.
811 
812       FEM_PL_PKG.Update_Obj_Exec_Errors
813         (P_API_VERSION        => pc_API_version,
814          P_COMMIT             => 'T',
815          P_REQUEST_ID         => pv_req_id,
816          P_OBJECT_ID          => pv_rule_obj_id,
817          P_ERRORS_REPORTED    => p_num_data_errors,
818          P_ERRORS_REPROCESSED => p_num_data_errors_reproc,
819          P_USER_ID            => pv_user_id,
820          P_LAST_UPDATE_LOGIN  => pv_login_id,
821          X_MSG_COUNT          => v_msg_count,
822          X_MSG_DATA           => v_msg_data,
823          X_RETURN_STATUS      => v_return_status);
824 
825    -- Update the status of the object execution from 'RUNNING' to
826    -- 'SUCCESS', 'CANCELLED_RERUN', or 'ERROR_RERUN'.
827 
828       FEM_PL_PKG.Update_Obj_Exec_Status
829         (P_API_VERSION        => pc_API_version,
830          P_COMMIT             => 'T',
831          P_REQUEST_ID         => pv_req_id,
832          P_OBJECT_ID          => pv_rule_obj_id,
833          P_EXEC_STATUS_CODE   => p_exec_status,
834          P_USER_ID            => pv_user_id,
835          P_LAST_UPDATE_LOGIN  => pv_login_id,
836          X_MSG_COUNT          => v_msg_count,
837          X_MSG_DATA           => v_msg_data,
838          X_RETURN_STATUS      => v_return_status);
839 
840    -- Update the status of the concurrent request from 'RUNNING' to
841    -- 'SUCCESS', 'CANCELLED_RERUN', or 'ERROR_RERUN'.
842 
843       FEM_PL_PKG.Update_Request_Status
844         (P_API_VERSION        => pc_API_version,
845          P_COMMIT             => 'T',
846          P_REQUEST_ID         => pv_req_id,
847          P_EXEC_STATUS_CODE   => p_exec_status,
848          P_USER_ID            => pv_user_id,
849          P_LAST_UPDATE_LOGIN  => pv_login_id,
850          X_MSG_COUNT          => v_msg_count,
851          X_MSG_DATA           => v_msg_data,
852          X_RETURN_STATUS      => v_return_status);
853 
854       FND_MSG_PUB.Count_and_Get(
855         p_encoded => 'F',
856         p_count => v_msg_count,
857         p_data => v_msg_data);
858 
859       IF v_msg_count = 1 THEN
860 
861          FEM_ENGINES_PKG.User_Message
862            (p_app_name => 'FEM',
863             p_msg_text => v_msg_data);
864 
865       ELSIF v_msg_count > 1 THEN
866 
867          FOR i IN 1 .. v_msg_count LOOP
868 
869             v_msg_data :=
870                FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
871 
872             FEM_ENGINES_PKG.User_Message
873               (p_app_name => 'FEM',
874                p_msg_text => v_msg_data);
875 
876          END LOOP;
877 
878       END IF;
879 
880       IF pv_ssc_where IS NOT NULL THEN
881 
882       -- -----------------------------------------------------------------------
883       -- Register a data locations entry for each Source System Code processed,
884       -- as 'COMPLETE' or 'INCOMPLETE' depending on whether or not there are
885       -- any remaining error rows from the current process for that Source
886       -- System Code.  If pv_ssc_where is NULL, a fatal error has occurred
887       -- before any rows could be processed, so there is nothing to log in
888       -- Data Locations.
889       -- -----------------------------------------------------------------------
890 
891       -- Get the distinct list of Source System Codes with remaining error rows
892       -- for the current process set.
893 
897 
894          Get_SSC (p_dest_code => 'NP');
895 
896          j := 1;
898       -- Loop thru the Source System Codes "To Be Processed" and compare them
899       -- with the Source System Codes "Not (fully) Processed".
900 
901          FOR i IN 1..pv_ssc_tbp.count LOOP
902 
903             FEM_ENGINES_PKG.Tech_Message
904             (p_severity    => pc_log_level_statement,
905              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
906                            'final_process_logging.i',
907              p_app_name => 'FEM',
908              p_msg_name => 'FEM_GL_POST_204',
909              p_token1   => 'VAR_NAME',
910              p_value1   => 'i',
911              p_token2   => 'VAR_VAL',
912              p_value2   => TO_CHAR(i));
913 
914             FEM_ENGINES_PKG.Tech_Message
915             (p_severity    => pc_log_level_statement,
916              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
917                            'final_process_logging.j',
918              p_app_name => 'FEM',
919              p_msg_name => 'FEM_GL_POST_204',
920              p_token1   => 'VAR_NAME',
921              p_value1   => 'j',
922              p_token2   => 'VAR_VAL',
923              p_value2   => TO_CHAR(j));
924 
925             BEGIN
926 
927             -- Look up the Source System Code from the Display Code, for logging.
928 
929                SELECT source_system_code
930                INTO v_src_sys_code
931                FROM fem_source_systems_b
932                WHERE source_system_display_code = pv_ssc_tbp(i).display_code;
933 
934             EXCEPTION
935                WHEN NO_DATA_FOUND THEN
936 
937                -- No interface rows with this Source System Code should have been
938                -- processed because it's an invalid code. Don't log any Data
939                -- Locations entry for it.
940 
941                   FEM_ENGINES_PKG.Tech_Message
942                   (p_severity    => pc_log_level_statement,
943                    p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
944                                  'final_process_logging.ssc_invalid',
945                    p_app_name => 'FEM',
946                    p_msg_name => 'FEM_GL_POST_204',
947                    p_token1   => 'VAR_NAME',
948                    p_value1   => 'pv_ssc_tbp(i).display_code',
949                    p_token2   => 'VAR_VAL',
950                    p_value2   => pv_ssc_tbp(i).display_code || ' INVALID');
951 
952                   j := j + 1;
953 
954                   GOTO End_pv_ssc_tbp_Loop;
955             END;
956 
957             IF pv_ssc_tbp(i).display_code < pv_ssc_np(j).display_code THEN
958 
959             -- This Source System Display Code was completly processed: Log
960             -- it in Data Locations as 'COMPLETE'.
961 
962                FEM_DIMENSION_UTIL_PKG.Register_Data_Location
963                  (P_REQUEST_ID  => pv_req_id,
964                   P_OBJECT_ID   => pv_rule_obj_id,
965                   P_TABLE_NAME  => 'FEM_BALANCES',
966                   P_LEDGER_ID   => pv_ledger_id,
967                   P_CAL_PER_ID  => pv_cal_period_id,
968                   P_DATASET_CD  => pv_dataset_code,
969                   P_SOURCE_CD   => v_src_sys_code,
970                   P_LOAD_STATUS => 'COMPLETE');
971 
972                FEM_ENGINES_PKG.Tech_Message
973                (p_severity    => pc_log_level_statement,
974                 p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
975                               'final_process_logging.ssc_complete',
976                 p_app_name => 'FEM',
977                 p_msg_name => 'FEM_GL_POST_204',
978                 p_token1   => 'VAR_NAME',
979                 p_value1   => 'pv_ssc_tbp(i).display_code',
980                 p_token2   => 'VAR_VAL',
981                 p_value2   => pv_ssc_tbp(i).display_code || ' COMPLETE');
982 
983             ELSE
984 
985             -- They must be equal; that means there is still at least one row
986             -- for the current processing set with this Source System Code, so
987             -- it must not have been fully processed.
988 
989                IF pv_ssc_tbp(i).row_count > pv_ssc_np(j).row_count THEN
990 
991                -- The number remaining is less than the original number to be
992                -- processed: at least one row was processed for this Source
993                -- System Code, so log it in Data Locations as 'INCOMPLETE'.
994 
995                   FEM_DIMENSION_UTIL_PKG.Register_Data_Location
996                     (P_REQUEST_ID  => pv_req_id,
997                      P_OBJECT_ID   => pv_rule_obj_id,
998                      P_TABLE_NAME  => 'FEM_BALANCES',
999                      P_LEDGER_ID   => pv_ledger_id,
1000                      P_CAL_PER_ID  => pv_cal_period_id,
1001                      P_DATASET_CD  => pv_dataset_code,
1002                      P_SOURCE_CD   => v_src_sys_code,
1003                      P_LOAD_STATUS => 'INCOMPLETE');
1004 
1005                   FEM_ENGINES_PKG.Tech_Message
1006                   (p_severity    => pc_log_level_statement,
1007                    p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1008                                  'final_process_logging.ssc_complete',
1009                    p_app_name => 'FEM',
1010                    p_msg_name => 'FEM_GL_POST_204',
1011                    p_token1   => 'VAR_NAME',
1012                    p_value1   => 'pv_ssc_tbp(i).display_code',
1016                END IF;
1013                    p_token2   => 'VAR_VAL',
1014                    p_value2   => pv_ssc_tbp(i).display_code || ' INCOMPLETE');
1015 
1017 
1018                j := j + 1;
1019 
1020             END IF;
1021 
1022           <<End_pv_ssc_tbp_Loop>>
1023             NULL;
1024 
1025          END LOOP;
1026 
1027       END IF;
1028 
1029    -- Log final messages
1030 
1031       FEM_ENGINES_PKG.Tech_Message
1032         (P_SEVERITY => pc_log_level_statement,
1033          P_MODULE   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1034                       'final_process_logging.completion_status',
1035          P_APP_NAME => 'FEM',
1036          P_MSG_NAME => 'FEM_GL_POST_204',
1037          P_TOKEN1   => 'VAR_NAME',
1038          P_VALUE1   => 'Completion Status',
1039          P_TOKEN2   => 'VAR_VAL',
1040          P_VALUE2   => p_exec_status);
1041 
1042    -- Successful completion
1043 
1044    -- LOADNUM rows loaded successfully.
1045    -- REJECTNUM rows failed to load successfully.
1046       FEM_ENGINES_PKG.User_Message
1047         (P_APP_NAME => 'FEM',
1048          P_MSG_NAME => 'FEM_SD_LDR_PROCESS_SUMMARY',
1049          P_TOKEN1   => 'LOADNUM',
1050          P_VALUE1   => TO_CHAR(NVL(p_num_output_rows, 0)),
1051          P_TOKEN2   => 'REJECTNUM',
1052          P_VALUE2   => TO_CHAR(NVL(p_num_data_errors, 0)));
1053 
1054       FEM_ENGINES_PKG.User_Message
1055         (P_APP_NAME => 'FEM',
1056          P_MSG_NAME => p_final_message_name);
1057 
1058       FEM_ENGINES_PKG.Tech_Message
1059         (P_SEVERITY => pc_log_level_event,
1060          P_MODULE   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1061                        'final_process_logging.final',
1062          P_APP_NAME => 'FEM',
1063          P_MSG_NAME => p_final_message_name);
1064 
1065       FEM_ENGINES_PKG.Tech_Message
1066         (P_SEVERITY => pc_log_level_procedure,
1067          P_MODULE   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1068                        'final_process_logging.end',
1069          P_MSG_TEXT => 'END');
1070 
1071    EXCEPTION
1072 
1073       WHEN OTHERS THEN
1074       ------------------------------------------------------------------
1075       -- Unexpected exceptions
1076       ------------------------------------------------------------------
1077          pv_sqlerrm   := SQLERRM;
1078          pv_callstack := dbms_utility.format_call_stack;
1079 
1080       -- Log the call stack and the Oracle error message to
1081       -- FND_LOG with the "unexpected exception" severity level.
1082 
1083          FEM_ENGINES_PKG.Tech_Message
1084            (P_SEVERITY => pc_log_level_unexpected,
1085             P_MODULE   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1086                           'final_process_logging.exception',
1087             P_MSG_TEXT => pv_sqlerrm);
1088 
1089          FEM_ENGINES_PKG.Tech_Message
1090            (P_SEVERITY => pc_log_level_unexpected,
1091             P_MODULE   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1092                           'final_process_logging.exception',
1093             P_MSG_TEXT => pv_callstack);
1094 
1095       -- Log the Oracle error message to the Concurrent Request Log.
1096 
1097          FEM_ENGINES_PKG.User_Message
1098            (p_app_name => 'FEM',
1099             p_msg_text => pv_sqlerrm);
1100 
1101       -- LOADNUM rows loaded successfully.
1102       -- REJECTNUM rows failed to load successfully.
1103          FEM_ENGINES_PKG.User_Message
1104            (P_APP_NAME => 'FEM',
1105             P_MSG_NAME => 'FEM_SD_LDR_PROCESS_SUMMARY',
1106             P_TOKEN1   => 'LOADNUM',
1107             P_VALUE1   => TO_CHAR(NVL(p_num_output_rows, 0)),
1108             P_TOKEN2   => 'REJECTNUM',
1109             P_VALUE2   => TO_CHAR(NVL(p_num_data_errors, 0)));
1110 
1111    END Final_Process_Logging;
1112 -- =======================================================================
1113 
1114 
1115 -- ======================================================================
1116    PROCEDURE Get_Proc_Key_Info
1117                 (p_process_slice   IN  VARCHAR2,
1118                  x_completion_code OUT NOCOPY NUMBER) IS
1119 -- ======================================================================
1120 -- Purpose
1121 --    Fetches the list of FEM_BALANCES processing key columns and other
1122 --    related info from the FEM metadata.
1123 -- History
1124 --    10-31-03  S Kung  Created
1125 --    01-27-04  G Hall  Removed superfluous call to get the
1126 --                      Global VS Combo ID; Added check on
1127 --                      VALUE_SET_REQUIRED_FLAG for getting
1128 --                      Value Set ID for each dim; changed error
1129 --                      handling to match other subroutines of
1130 --                      Validate_Engine_Parameters.
1131 --    02-06-04  G Hall  Added lookup to populate
1132 --                      dim_int_disp_code_col.
1133 --    03-10-04  G Hall  Removed SOURCE_SYSTEM_CODE from dim_col_name
1134 --                      exclusion.
1135 --    05-03-04  G Hall  Bug# 3603234 Change pv_proc_keys(v).dim_member_col
1136 --                      to pv_proc_keys(v).dim_col_name.  Hard-coded a
1137 --                      temporary workaround for INTERCOMPANY_DISPLAY_CODE.
1138 --    05-07-04  G Hall  Bug# 3597527: Added IN parameter p_process_slice
1139 --                      and used it in each call to Tech_Message.
1140 --    05-12-04  G Hall  Bug# 3603260: Unhardcoded for INTERCOMPANY_
1141 --                      DISPLAY_CODE; added FEM_DISPLAY_CODE_COL_MAP into
1145 --                      (e.g. CURRENCY_TYPE_CODE).
1142 --                      BULK COLLECT join to fetch display code column names.
1143 --    05-24-04  G Hall  Changed join to fem_xdim_dimensions to outer join,
1144 --                      since some processing key columns are not dimenions
1146 --    05-25-04  G Hall  Added x_completion_code parameter; modified error-
1147 --                      handling logic for being called by Process_Data_Slice.
1148 --    06-02-04  G Hall  Bug# 3603260: Changed FEM_DISPLAY_CODE_COL_MAP to
1149 --                      FEM_INT_COLUMN_MAP per design changes for this table.
1150 --    01-28-05  G Hall  Bug# 4148677: Changed main query to get the
1151 --                      DIMENSION_ID from FEM_TAB_COLUMNS_B instead of from
1152 --                      FEM_COLUMN_REQUIREMNT_B.
1153 --  Arguments
1154 --     p_process_slice  A character string concatenation of the MP FW
1155 --                      subrequest process number and the data slice id
1156 --                      for distinguishing messages logged by different
1157 --                      executions of FEM_XGL_ENGINE_PKG.Process_Data_Slice.
1158 --     x_completion_code returns 0 for success, 2 for failure.
1159 -- Notes
1160 --    Called by Process_Data_Slice once for each subrequest.
1161 -- ======================================================================
1162 
1163       v   NUMBER;
1164 
1165    BEGIN
1166 
1167       FEM_ENGINES_PKG.Tech_Message
1168         (p_severity => pc_log_level_procedure,
1169          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1170                        'get_proc_key_info.' || p_process_slice,
1171          p_msg_text => 'BEGIN');
1172 
1173    -- Bulk select dimension information into array of records
1174 
1175       SELECT
1176          xd.dimension_id,
1177          NULL,
1178          xd.value_set_required_flag,
1179          tcp.column_name,
1180          xd.member_b_table_name,
1181          xd.member_col,
1182          xd.member_display_code_col,
1183          cm.interface_column_name,
1184          xd.attribute_table_name
1185       BULK COLLECT INTO pv_proc_keys
1186       FROM fem_tab_column_prop tcp,
1187            fem_tab_columns_b tc,
1188            fem_xdim_dimensions xd,
1189            fem_int_column_map cm
1190       WHERE tcp.table_name = 'FEM_BALANCES'
1191         AND tcp.column_property_code = 'PROCESSING_KEY'
1192         AND tc.table_name = 'FEM_BALANCES'
1193         AND tc.column_name = tcp.column_name
1194         AND xd.dimension_id = tc.dimension_id
1195         AND cm.target_column_name (+) = tcp.column_name
1196         AND cm.object_type_code   (+) = 'XGL_INTEGRATION'
1197       ORDER BY tcp.column_name;
1198 
1199       pv_proc_key_dim_num := pv_proc_keys.count;
1200 
1201       FEM_ENGINES_PKG.Tech_Message
1202         (p_severity => pc_log_level_statement,
1203          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1204                        'get_proc_key_info.' || p_process_slice,
1205          p_app_name => 'FEM',
1206          p_msg_name => 'FEM_GL_POST_204',
1207          p_token1   => 'VAR_NAME',
1208          p_value1   => 'pv_proc_key_dim_num',
1209          p_token2   => 'VAR_VAL',
1210          p_value2   => TO_CHAR(pv_proc_key_dim_num));
1211 
1212       IF pv_proc_key_dim_num = 0 THEN
1213 
1214          FEM_ENGINES_PKG.Tech_Message
1215            (p_severity => pc_log_level_error,
1216             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1217                           'get_proc_key_info.' || p_process_slice,
1218             p_app_name => 'FEM',
1219             p_msg_text => 'The FEM_BALANCES Processing Key ' ||
1220                           'has not been set up yet.');
1221 
1222       END IF;
1223 
1224       FOR v IN 1..pv_proc_key_dim_num LOOP
1225 
1226          FEM_ENGINES_PKG.Tech_Message
1227             (p_severity => pc_log_level_statement,
1228              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1229                            'get_proc_key_info.' || p_process_slice,
1230              p_app_name => 'FEM',
1231              p_msg_name => 'FEM_GL_POST_204',
1232              p_token1   => 'VAR_NAME',
1233              p_value1   => 'dim_col_name',
1234              p_token2   => 'VAR_VAL',
1235              p_value2   => pv_proc_keys(v).dim_col_name);
1236 
1237          FEM_ENGINES_PKG.Tech_Message
1238            (p_severity => pc_log_level_statement,
1239             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1240                           'get_proc_key_info.' || p_process_slice,
1241             p_app_name => 'FEM',
1242             p_msg_name => 'FEM_GL_POST_204',
1243             p_token1   => 'VAR_NAME',
1244             p_value1   => 'dimension_id',
1245             p_token2   => 'VAR_VAL',
1246             p_value2   => TO_CHAR(pv_proc_keys(v).dimension_id));
1247 
1248          IF pv_proc_keys(v).dim_vsr_flag = 'Y' THEN
1249 
1250          -- Set Value Set ID for each dimension based on the ledger
1251 
1252             pv_proc_keys(v).dim_vs_id :=
1253                FEM_DIMENSION_UTIL_PKG.Dimension_Value_Set_ID
1254                  (p_Dimension_ID  => pv_proc_keys(v).dimension_id,
1255                   p_Ledger_ID     => pv_ledger_id);
1256 
1257             IF pv_proc_keys(v).dim_vs_id = -1 THEN
1258 
1259                FEM_ENGINES_PKG.Tech_Message
1260                  (p_severity => pc_log_level_statement,
1261                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1262                                 'get_proc_key_info.' || p_process_slice,
1263                   p_msg_text => 'raising Value_Set_ID_Error');
1267 
1264 
1265                pv_dim_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
1266                                  (p_dim_id => pv_proc_keys(v).dimension_id);
1268                RAISE Value_Set_ID_Error;
1269 
1270             END IF;
1271 
1272             FEM_ENGINES_PKG.Tech_Message
1273               (p_severity => pc_log_level_statement,
1274                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1275                              'get_proc_key_info.' || p_process_slice,
1276                p_app_name => 'FEM',
1277                p_msg_name => 'FEM_GL_POST_204',
1278                p_token1   => 'VAR_NAME',
1279                p_value1   => 'dim_vs_id',
1280                p_token2   => 'VAR_VAL',
1281                p_value2   => TO_CHAR(pv_proc_keys(v).dim_vs_id));
1282 
1283          END IF;
1284 
1285          FEM_ENGINES_PKG.Tech_Message
1286             (p_severity => pc_log_level_statement,
1287              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1288                            'get_proc_key_info.' || p_process_slice,
1289              p_app_name => 'FEM',
1290              p_msg_name => 'FEM_GL_POST_204',
1291              p_token1   => 'VAR_NAME',
1292              p_value1   => 'dim_member_b_table_name',
1293              p_token2   => 'VAR_VAL',
1294              p_value2   => pv_proc_keys(v).dim_member_b_table_name);
1295 
1296          FEM_ENGINES_PKG.Tech_Message
1297             (p_severity => pc_log_level_statement,
1298              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1299                            'get_proc_key_info.' || p_process_slice,
1300              p_app_name => 'FEM',
1301              p_msg_name => 'FEM_GL_POST_204',
1302              p_token1   => 'VAR_NAME',
1303              p_value1   => 'dim_member_col',
1304              p_token2   => 'VAR_VAL',
1305              p_value2   => pv_proc_keys(v).dim_member_col);
1306 
1307          IF pv_proc_keys(v).dim_col_name NOT IN
1308                ('CAL_PERIOD_ID', 'DATASET_CODE', 'CREATED_BY_OBJECT_ID') THEN
1309 
1310             FEM_ENGINES_PKG.Tech_Message
1311                (p_severity => pc_log_level_statement,
1312                 p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1313                               'get_proc_key_info.' || p_process_slice,
1314                 p_app_name => 'FEM',
1315                 p_msg_name => 'FEM_GL_POST_204',
1316                 p_token1   => 'VAR_NAME',
1317                 p_value1   => 'dim_member_disp_code_col',
1318                 p_token2   => 'VAR_VAL',
1319                 p_value2   => pv_proc_keys(v).dim_member_disp_code_col);
1320 
1321             FEM_ENGINES_PKG.Tech_Message
1322                (p_severity => pc_log_level_statement,
1323                 p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1324                               'get_proc_key_info.' || p_process_slice,
1325                 p_app_name => 'FEM',
1326                 p_msg_name => 'FEM_GL_POST_204',
1327                 p_token1   => 'VAR_NAME',
1328                 p_value1   => 'dim_int_disp_code_col',
1329                 p_token2   => 'VAR_VAL',
1330                 p_value2   => pv_proc_keys(v).dim_int_disp_code_col);
1331 
1332          END IF;
1333 
1334          FEM_ENGINES_PKG.Tech_Message
1335             (p_severity => pc_log_level_statement,
1336              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1337                            'get_proc_key_info.' || p_process_slice,
1338              p_app_name => 'FEM',
1339              p_msg_name => 'FEM_GL_POST_204',
1340              p_token1   => 'VAR_NAME',
1341              p_value1   => 'dim_attr_table_name',
1342              p_token2   => 'VAR_VAL',
1343              p_value2   => pv_proc_keys(v).dim_attr_table_name);
1344 
1345       END LOOP;
1346 
1347       x_completion_code := 0;
1348 
1349       FEM_ENGINES_PKG.Tech_Message
1350         (p_severity => pc_log_level_procedure,
1351          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1352                        'get_proc_key_info.' || p_process_slice,
1353          p_msg_text => 'END');
1354 
1355    EXCEPTION
1356 
1357       WHEN Value_Set_ID_Error THEN
1358       ------------------------------------------------------------------
1359       -- Unable to retrieve the Value Set ID for a processing key
1360       -- dimension.  Dimension Name:
1361       ------------------------------------------------------------------
1362 
1363          x_completion_code := 2;
1364 
1365          FEM_ENGINES_PKG.Tech_Message
1366            (p_severity => pc_log_level_error,
1367             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1368                           'get_proc_key_info.' || p_process_slice,
1369             p_app_name => 'FEM',
1370             p_msg_name => 'FEM_GL_POST_022',
1371             p_token1   => 'DIMENSION_NAME',
1372             p_value1   => pv_dim_name);
1373 
1374          FEM_ENGINES_PKG.User_Message
1375            (p_app_name => 'FEM',
1376             p_msg_name => 'FEM_GL_POST_022',
1377             p_token1   => 'DIMENSION_NAME',
1378             p_value1   => pv_dim_name);
1379 
1380          FND_MSG_PUB.Initialize;
1381 
1382          FEM_ENGINES_PKG.Put_Message
1383            (p_app_name => 'FEM',
1384             p_msg_name => 'FEM_GL_POST_022',
1385             p_token1   => 'DIMENSION_NAME',
1386             p_value1   => pv_dim_name);
1387 
1388          pv_sqlerrm := FND_MSG_PUB.Get(1, p_encoded => 'F');
1389 
1390       WHEN OTHERS THEN
1394          pv_sqlerrm   := SQLERRM;
1391       ------------------------------------------------------------------
1392       -- Unexpected exceptions
1393       ------------------------------------------------------------------
1395          pv_callstack := dbms_utility.format_call_stack;
1396 
1397       -- Log the call stack and the Oracle error message to
1398       -- FND_LOG with the "unexpected exception" severity level.
1399 
1400          FEM_ENGINES_PKG.Tech_Message
1401            (p_severity => pc_log_level_unexpected,
1402             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1403                           'get_proc_key_info.' || p_process_slice,
1404             p_msg_text => pv_sqlerrm);
1405 
1406          FEM_ENGINES_PKG.Tech_Message
1407            (p_severity => pc_log_level_unexpected,
1408             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1409                           'get_proc_key_info.' || p_process_slice,
1410             p_msg_text => pv_callstack);
1411 
1412       -- Log the Oracle error message to the Concurrent Request Log.
1413 
1414          FEM_ENGINES_PKG.User_Message
1415            (p_app_name => 'FEM',
1416             p_msg_text => pv_sqlerrm);
1417 
1418    END Get_Proc_Key_Info;
1419 -- =======================================================================
1420 
1421 -- ======================================================================
1422    PROCEDURE Get_SSC (p_dest_code IN  VARCHAR2) IS
1423 -- ======================================================================
1424 -- Purpose
1425 --    Fetches the distinct list and rowcount of Source System Display
1426 --    Codes (SSDC's) from the interface table, for Data Locations logging.
1427 --    When called prior to processing, it gets SSDC's to be processed;
1428 --    when called after processing, it gets SSDC's not processed (due to
1429 --    parameter error, data error, or unexpected database error).  This
1430 --    way we can tell which SSC's to make Data Locations entries for, and
1431 --    whether to post them as complete or incomplete.
1432 -- History
1433 --    05-13-04  G Hall  Bug# 3597495: Created.
1434 --    05-25-04  G Hall  Renamed from Get_SSC_To_Be_Processed to Get_SSC;
1435 --                      Changed p_sql_where argument reference to use a
1436 --                      package variable instead; removed p_sql_where
1437 --                      argument and added p_dest_code argument, so it
1438 --                      can be used to populate both SSDC's to be
1439 --                      processed and SSDC's not processed.
1440 --    04-25-06  G Hall  Bug 5190527. Changed VARRAY to TABLE for
1441 --                      src_sys_dsp_cd_list type, to remove limit on number
1442 --                      of distinct source systems that can be loaded; this
1443 --                      required a change to the syntax for adding the
1444 --                      'ZZZZZZZZZZZZZZZ' display code as the last element
1445 --                      of the collection.
1446 --    06-01-06  G Hall  Bug 5190527 (as forward port for 11i bug 5257358).
1447 --                      Added check for pv_ssc_np.count = 0.
1448 --  Argument
1449 --     p_dest_code      'TBP' to populate the pv_ssc_tbp structure;
1450 --                      'NP'  to populate the pv_ssc_np  structure.
1451 -- Notes
1452 --    Called by Main just prior to calling MP Master, and by
1453 --    Final_Process_Logging after processing is complete on upon early
1454 --    termination due to error.
1455 -- ======================================================================
1456 
1457       v_sql_stmt  VARCHAR2(1200);
1458 
1459       TYPE SrcSysDspCdTBP_cursor IS REF CURSOR;
1460       SrcSysDspCdTBP             SrcSysDspCdTBP_cursor;
1461 
1462    BEGIN
1463 
1464       FEM_ENGINES_PKG.Tech_Message
1465         (p_severity => pc_log_level_procedure,
1466          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1467                        'get_ssc.begin',
1468          p_msg_text => 'BEGIN');
1469 
1470       v_sql_stmt := 'SELECT source_system_display_code, COUNT(*)' ||
1471                     ' FROM fem_bal_interface_t' ||
1472                     ' WHERE ' || pv_ssc_where ||
1473                     ' GROUP BY source_system_display_code' ||
1474                     ' ORDER BY source_system_display_code';
1475 
1476       FEM_ENGINES_PKG.Tech_Message
1477          (p_severity => pc_log_level_statement,
1478           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1479                         'get_ssc',
1480           p_app_name => 'FEM',
1481           p_msg_name => 'FEM_GL_POST_204',
1482           p_token1   => 'VAR_NAME',
1483           p_value1   => 'v_sql_stmt',
1484           p_token2   => 'VAR_VAL',
1485           p_value2   => v_sql_stmt);
1486 
1487       OPEN SrcSysDspCdTBP FOR v_sql_stmt;
1488 
1489       IF p_dest_code = 'TBP' THEN
1490 
1491          FETCH SrcSysDspCdTBP BULK COLLECT INTO pv_ssc_tbp;
1492 
1493          FEM_ENGINES_PKG.Tech_Message
1494             (p_severity => pc_log_level_statement,
1495              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1496                            'get_ssc',
1497              p_app_name => 'FEM',
1498              p_msg_name => 'FEM_GL_POST_204',
1499              p_token1   => 'VAR_NAME',
1500              p_value1   => 'pv_ssc_tbp.count',
1501              p_token2   => 'VAR_VAL',
1502              p_value2   => TO_CHAR(pv_ssc_tbp.count));
1503 
1504       ELSE
1505 
1506          FETCH SrcSysDspCdTBP BULK COLLECT INTO pv_ssc_np;
1507 
1508          FEM_ENGINES_PKG.Tech_Message
1512              p_app_name => 'FEM',
1509             (p_severity => pc_log_level_statement,
1510              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1511                            'get_ssc',
1513              p_msg_name => 'FEM_GL_POST_204',
1514              p_token1   => 'VAR_NAME',
1515              p_value1   => 'pv_ssc_np.count',
1516              p_token2   => 'VAR_VAL',
1517              p_value2   => TO_CHAR(pv_ssc_np.count));
1518 
1519       -- Add a dummy row at the end whose Display Code value is greater
1520       -- than all (like "high-values"). This is needed for the matching
1521       -- logic in Final_Process_Logging.
1522 
1523          IF pv_ssc_np.count = 0 THEN
1524             pv_ssc_np(1).display_code := 'ZZZZZZZZZZZZZZZ';
1525          ELSE
1526             pv_ssc_np(pv_ssc_np.last+1).display_code := 'ZZZZZZZZZZZZZZZ';
1527          END IF;
1528 
1529       END IF;
1530 
1531       CLOSE SrcSysDspCdTBP;
1532 
1533       FEM_ENGINES_PKG.Tech_Message
1534         (p_severity => pc_log_level_procedure,
1535          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1536                        'get_ssc.end',
1537          p_msg_text => 'END');
1538 
1539    END Get_SSC;
1540 -- =======================================================================
1541 
1542 
1543 -- ======================================================================
1544    PROCEDURE Undo_XGL_Interface_Error_Rows
1545                 (p_request_id              IN  NUMBER,
1546                  x_return_status           OUT NOCOPY VARCHAR2,
1547                  x_msg_data                OUT NOCOPY VARCHAR2,
1548                  x_msg_count               OUT NOCOPY NUMBER) IS
1549 -- ======================================================================
1550 -- Purpose
1551 --    Called by the Undo engine to delete remaining error rows from the
1552 --    XGL interface table that are associated with the executions being
1553 --    Undone.
1554 -- History
1555 --    05-18-04  G Hall  Bug# 3634602: Created (stubbed for now).
1556 --    06-07-04  G Hall  Bug# 3634602: Developed procedure body.
1557 --  Arguments
1558 --    p_request_id      The Request ID of the execution chosen for undo.
1559 --                      Used to look up the runtime parameters for that
1560 --                      execution, for identifying interface table rows
1561 --                      to be deleted.
1562 --    x_return_status   Returns 'S' for success, 'E' for detected logic
1563 --                      error, 'U' for unexpected error (e.g. database or
1564 --                      PL/SQL error).
1565 --    x_msg_data        Returns end-user message when there is exactly
1566 --                      one.
1567 --    x_msg_count       Returns the number of end-user messages generated.
1568 -- ======================================================================
1569 
1570       v_cal_per_dim_group_id   fem_cal_periods_b.dimension_group_id%TYPE;
1571       v_rows_deleted           NUMBER;
1572 
1573       v_param_name             fem_dimensions_tl.dimension_name%TYPE;
1574       v_param_value            VARCHAR2(40);
1575       v_attr_name              fem_dim_attributes_tl.attribute_name%TYPE;
1576 
1577    BEGIN
1578 
1579       FEM_ENGINES_PKG.Tech_Message
1580         (p_severity => pc_log_level_procedure,
1581          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1582                        'undo_xgl_int_error_rows.begin',
1583          p_msg_text => 'BEGIN');
1584 
1585    -- -------------------------------------------------------------------
1586    -- Using p_request_id, from FEM_PL_REQUESTS look up CAL_PERIOD_ID,
1587    -- LEDGER_ID, and OUTPUT_DATASET_CODE.
1588    -- -------------------------------------------------------------------
1589 
1590       BEGIN
1591 
1592          SELECT ledger_id, cal_period_id, output_dataset_code
1593          INTO pv_ledger_id, pv_cal_period_id, pv_dataset_code
1594          FROM fem_pl_requests
1595          WHERE request_id = p_request_id;
1596 
1597          FEM_ENGINES_PKG.Tech_Message
1598          (p_severity    => pc_log_level_statement,
1599           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1600                         'undo_xgl_int_error_rows.pv_ledger_id',
1601           p_app_name => 'FEM',
1602           p_msg_name => 'FEM_GL_POST_204',
1603           p_token1   => 'VAR_NAME',
1604           p_value1   => 'pv_ledger_id',
1605           p_token2   => 'VAR_VAL',
1606           p_value2   => TO_CHAR(pv_ledger_id));
1607 
1608          FEM_ENGINES_PKG.Tech_Message
1609          (p_severity    => pc_log_level_statement,
1610           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1611                         'undo_xgl_int_error_rows.pv_cal_period_id',
1612           p_app_name => 'FEM',
1613           p_msg_name => 'FEM_GL_POST_204',
1614           p_token1   => 'VAR_NAME',
1615           p_value1   => 'pv_cal_period_id',
1616           p_token2   => 'VAR_VAL',
1617           p_value2   => TO_CHAR(pv_cal_period_id));
1618 
1619          FEM_ENGINES_PKG.Tech_Message
1620          (p_severity    => pc_log_level_statement,
1621           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1622                         'undo_xgl_int_error_rows.pv_dataset_code',
1623           p_app_name => 'FEM',
1624           p_msg_name => 'FEM_GL_POST_204',
1625           p_token1   => 'VAR_NAME',
1626           p_value1   => 'pv_dataset_code',
1627           p_token2   => 'VAR_VAL',
1628           p_value2   => TO_CHAR(pv_dataset_code));
1629 
1630       EXCEPTION
1634               (p_severity => pc_log_level_statement,
1631          WHEN NO_DATA_FOUND THEN
1632 
1633             FEM_ENGINES_PKG.Tech_Message
1635                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1636                              'undo_xgl_int_error_rows.irid.',
1637                p_msg_text => 'raising Invalid_Request_ID');
1638 
1639             RAISE Invalid_Request_ID;
1640       END;
1641 
1642    -- -------------------------------------------------------------------
1643    -- Use CAL_PERIOD_ID to look up CAL_PER_DIM_GRP_DISPLAY_CODE,
1644    -- CAL_PERIOD_END_DATE, and CAL_PERIOD_NUMBER.
1645    -- -------------------------------------------------------------------
1646 
1647    -- Get the Dimension ID for Cal Period.
1648 
1649       SELECT dimension_id
1650       INTO pv_cal_per_dim_id
1651       FROM fem_dimensions_b
1652       WHERE dimension_varchar_label = 'CAL_PERIOD';
1653 
1654    -- Set variables used in messaging upon failure.
1655 
1656       v_param_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
1657                         (p_dim_id => pv_cal_per_dim_id);
1658       IF v_param_name IS NULL THEN
1659          v_param_name := 'Calendar Period';
1660       END IF;
1661       v_param_value := TO_CHAR(pv_cal_period_id);
1662       v_attr_name := NULL;
1663 
1664       BEGIN
1665 
1666       -- Get DIMENSION_GROUP_DISPLAY_CODE for the Calendar Period.
1667 
1668          SELECT dimension_group_id
1669          INTO v_cal_per_dim_group_id
1670          FROM fem_cal_periods_b
1671          WHERE cal_period_id = pv_cal_period_id
1672            AND personal_flag = 'N';
1673 
1674          v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
1675                            (p_dim_id     => pv_cal_per_dim_id,
1676                             p_attr_label => 'DIMENSION_GROUP_ID');
1677 
1678          IF v_attr_name IS NULL THEN
1679             v_attr_name := 'DIMENSION_GROUP_ID';
1680          END IF;
1681 
1682          SELECT dimension_group_display_code
1683          INTO pv_cal_per_dim_grp_dsp_cd
1684          FROM fem_dimension_grps_b
1685          WHERE dimension_group_id = v_cal_per_dim_group_id;
1686 
1687          FEM_ENGINES_PKG.Tech_Message
1688          (p_severity    => pc_log_level_statement,
1689           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1690                         'undo_xgl_int_error_rows.pv_cal_per_dim_grp_dsp_cd',
1691           p_app_name => 'FEM',
1692           p_msg_name => 'FEM_GL_POST_204',
1693           p_token1   => 'VAR_NAME',
1694           p_value1   => 'pv_cal_per_dim_grp_dsp_cd',
1695           p_token2   => 'VAR_VAL',
1696           p_value2   => pv_cal_per_dim_grp_dsp_cd);
1697 
1698       EXCEPTION
1699          WHEN NO_DATA_FOUND THEN
1700 
1701             FEM_ENGINES_PKG.Tech_Message
1702               (p_severity => pc_log_level_statement,
1703                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1704                              'undo_xgl_int_error_rows.icpid1.',
1705                p_msg_text => 'raising Invalid_Runtime_Parameter');
1706 
1707             RAISE Invalid_Runtime_Parameter;
1708       END;
1709 
1710       BEGIN
1711 
1712       -- Get the CAL_PERIOD_END_DATE attribute of the Cal Period ID.
1713 
1714          v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
1715                            (p_dim_id     => pv_cal_per_dim_id,
1716                             p_attr_label => 'CAL_PERIOD_END_DATE');
1717 
1718          IF v_attr_name IS NULL THEN
1719             v_attr_name := 'CAL_PERIOD_END_DATE';
1720          END IF;
1721 
1722          fem_dimension_util_pkg.get_dim_attr_id_ver_id
1723            (x_err_code    => pv_API_return_code,
1724             x_attr_id     => pv_dim_attr_id,
1725             x_ver_id      => pv_dim_attr_ver_id,
1726             p_dim_id      => pv_cal_per_dim_id,
1727             p_attr_label  => 'CAL_PERIOD_END_DATE');
1728 
1729          IF pv_API_return_code > 0 THEN
1730 
1731             FEM_ENGINES_PKG.Tech_Message
1732               (p_severity => pc_log_level_statement,
1733                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1734                              'undo_xgl_int_error_rows.icpid2.',
1735                p_msg_text => 'raising Invalid_Runtime_Parameter');
1736 
1737             RAISE Invalid_Runtime_Parameter;
1738 
1739          END IF;
1740 
1741          SELECT date_assign_value
1742          INTO pv_cal_per_end_date
1743          FROM fem_cal_periods_attr
1744          WHERE attribute_id  = pv_dim_attr_id
1745            AND version_id    = pv_dim_attr_ver_id
1746            AND cal_period_id = pv_cal_period_id;
1747 
1748          FEM_ENGINES_PKG.Tech_Message
1749          (p_severity    => pc_log_level_statement,
1750           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1751                         'undo_xgl_int_error_rows.pv_cal_per_end_date',
1752           p_app_name => 'FEM',
1753           p_msg_name => 'FEM_GL_POST_204',
1754           p_token1   => 'VAR_NAME',
1755           p_value1   => 'pv_cal_per_end_date',
1756           p_token2   => 'VAR_VAL',
1757           p_value2   => TO_CHAR(pv_cal_per_end_date, 'DD-MON-YYYY'));
1758 
1759       EXCEPTION
1760          WHEN NO_DATA_FOUND THEN
1761 
1762             FEM_ENGINES_PKG.Tech_Message
1763               (p_severity => pc_log_level_statement,
1764                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1768             RAISE Invalid_Runtime_Parameter;
1765                              'undo_xgl_int_error_rows.icpid3.',
1766                p_msg_text => 'raising Invalid_Runtime_Parameter');
1767 
1769       END;
1770 
1771       BEGIN
1772 
1773       -- Get the Calendar Period Number from the GL_PERIOD_NUM attribute of the
1774       -- Cal Period ID.
1775 
1776          v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
1777                            (p_dim_id     => pv_cal_per_dim_id,
1778                             p_attr_label => 'GL_PERIOD_NUM');
1779 
1780          IF v_attr_name IS NULL THEN
1781             v_attr_name := 'GL_PERIOD_NUM';
1782          END IF;
1783 
1784          fem_dimension_util_pkg.get_dim_attr_id_ver_id
1785            (x_err_code    => pv_API_return_code,
1786             x_attr_id     => pv_dim_attr_id,
1787             x_ver_id      => pv_dim_attr_ver_id,
1788             p_dim_id      => pv_cal_per_dim_id,
1789             p_attr_label  => 'GL_PERIOD_NUM');
1790 
1791          IF pv_API_return_code > 0 THEN
1792 
1793             FEM_ENGINES_PKG.Tech_Message
1794               (p_severity => pc_log_level_statement,
1795                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1796                              'undo_xgl_int_error_rows.icpid4.',
1797                p_msg_text => 'raising Invalid_Runtime_Parameter');
1798 
1799             RAISE Invalid_Runtime_Parameter;
1800 
1801          END IF;
1802 
1803          SELECT number_assign_value
1804          INTO pv_gl_per_number
1805          FROM fem_cal_periods_attr
1806          WHERE attribute_id  = pv_dim_attr_id
1807            AND version_id    = pv_dim_attr_ver_id
1808            AND cal_period_id = pv_cal_period_id;
1809 
1810          FEM_ENGINES_PKG.Tech_Message
1811          (p_severity    => pc_log_level_statement,
1812           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1813                         'undo_xgl_int_error_rows.pv_gl_per_number',
1814           p_app_name => 'FEM',
1815           p_msg_name => 'FEM_GL_POST_204',
1816           p_token1   => 'VAR_NAME',
1817           p_value1   => 'pv_gl_per_number',
1818           p_token2   => 'VAR_VAL',
1819           p_value2   => TO_CHAR(pv_gl_per_number));
1820 
1821       EXCEPTION
1822          WHEN NO_DATA_FOUND THEN
1823 
1824             FEM_ENGINES_PKG.Tech_Message
1825               (p_severity => pc_log_level_statement,
1826                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1827                              'undo_xgl_int_error_rows.icpid5.',
1828                p_msg_text => 'raising Invalid_Runtime_Parameter');
1829 
1830             RAISE Invalid_Runtime_Parameter;
1831       END;
1832 
1833    -- -------------------------------------------------------------------
1834    -- Use LEDGER_ID to look up LEDGER_DISPLAY_CODE.
1835    -- -------------------------------------------------------------------
1836 
1837    -- Get the Dimension ID for Ledger.
1838 
1839       SELECT dimension_id
1840       INTO pv_ledger_dim_id
1841       FROM fem_dimensions_b
1842       WHERE dimension_varchar_label = 'LEDGER';
1843 
1844    -- Set variables used in messaging upon failure.
1845 
1846       v_param_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
1847                         (p_dim_id => pv_ledger_dim_id);
1848       IF v_param_name IS NULL THEN
1849          v_param_name := 'Ledger';
1850       END IF;
1851       v_param_value := TO_CHAR(pv_ledger_id);
1852       v_attr_name := NULL;
1853 
1854       BEGIN
1855 
1856          SELECT ledger_display_code
1857          INTO pv_ledger_dsp_cd
1858          FROM fem_ledgers_b
1859          WHERE ledger_id = pv_ledger_id
1860            AND enabled_flag  = 'Y'
1861            AND personal_flag = 'N';
1862 
1863          FEM_ENGINES_PKG.Tech_Message
1864          (p_severity    => pc_log_level_statement,
1865           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1866                         'undo_xgl_int_error_rows.pv_ledger_dsp_cd',
1867           p_app_name => 'FEM',
1868           p_msg_name => 'FEM_GL_POST_204',
1869           p_token1   => 'VAR_NAME',
1870           p_value1   => 'pv_ledger_dsp_cd',
1871           p_token2   => 'VAR_VAL',
1872           p_value2   => pv_ledger_dsp_cd);
1873 
1874       EXCEPTION
1875          WHEN NO_DATA_FOUND THEN
1876 
1877             FEM_ENGINES_PKG.Tech_Message
1878               (p_severity => pc_log_level_statement,
1879                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1880                              'undo_xgl_int_error_rows.ilid.',
1881                p_msg_text => 'raising Invalid_Runtime_Parameter');
1882 
1883             RAISE Invalid_Runtime_Parameter;
1884       END;
1885 
1886    -- -------------------------------------------------------------------
1887    -- Use OUTPUT_DATASET_CODE to look up DS_BALANCE_TYPE_CODE, and if
1888    -- applicable, BUDGET_DISPLAY_CODE or ENCUMBRANCE_TYPE_CODE.
1889    -- -------------------------------------------------------------------
1890 
1891    -- Get the Dimension ID for Dataset Code.
1892 
1893       SELECT dimension_id
1894       INTO pv_dataset_dim_id
1895       FROM fem_dimensions_b
1896       WHERE dimension_varchar_label = 'DATASET';
1897 
1898    -- Set variables used in messaging upon failure.
1899 
1900       v_param_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
1901                         (p_dim_id => pv_dataset_dim_id);
1902       IF v_param_name IS NULL THEN
1906 
1903          v_param_name := 'Dataset';
1904       END IF;
1905       v_param_value := TO_CHAR(pv_dataset_code);
1907       BEGIN
1908 
1909       -- Look up the Dataset attribute DATASET_BALANCE_TYPE_CODE
1910 
1911          v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
1912                            (p_dim_id     => pv_dataset_dim_id,
1913                             p_attr_label => 'DATASET_BALANCE_TYPE_CODE');
1914 
1915          IF v_attr_name IS NULL THEN
1916             v_attr_name := 'DATASET_BALANCE_TYPE_CODE';
1917          END IF;
1918 
1919          fem_dimension_util_pkg.get_dim_attr_id_ver_id
1920            (x_err_code    => pv_API_return_code,
1921             x_attr_id     => pv_dim_attr_id,
1922             x_ver_id      => pv_dim_attr_ver_id,
1923             p_dim_id      => pv_dataset_dim_id,
1924             p_attr_label  => 'DATASET_BALANCE_TYPE_CODE');
1925 
1926          IF pv_API_return_code > 0 THEN
1927 
1928             FEM_ENGINES_PKG.Tech_Message
1929               (p_severity => pc_log_level_statement,
1930                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1931                              'undo_xgl_int_error_rows.idsc1.',
1932                p_msg_text => 'raising Invalid_Runtime_Parameter');
1933 
1934             RAISE Invalid_Runtime_Parameter;
1935 
1936          END IF;
1937 
1938          SELECT dim_attribute_varchar_member
1939          INTO pv_ds_balance_type_cd
1940          FROM fem_datasets_attr
1941          WHERE attribute_id  = pv_dim_attr_id
1942            AND version_id    = pv_dim_attr_ver_id
1943            AND dataset_code  = pv_dataset_code;
1944 
1945          FEM_ENGINES_PKG.Tech_Message
1946          (p_severity    => pc_log_level_statement,
1947           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1948                         'undo_xgl_int_error_rows.pv_ds_balance_type_cd',
1949           p_app_name => 'FEM',
1950           p_msg_name => 'FEM_GL_POST_204',
1951           p_token1   => 'VAR_NAME',
1952           p_value1   => 'pv_ds_balance_type_cd',
1953           p_token2   => 'VAR_VAL',
1954           p_value2   => pv_ds_balance_type_cd);
1955 
1956       EXCEPTION
1957          WHEN NO_DATA_FOUND THEN
1958 
1959             FEM_ENGINES_PKG.Tech_Message
1960               (p_severity => pc_log_level_statement,
1961                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1962                              'undo_xgl_int_error_rows.idsc2.',
1963                p_msg_text => 'raising Invalid_Runtime_Parameter');
1964 
1965             RAISE Invalid_Runtime_Parameter;
1966       END;
1967 
1968       IF pv_ds_balance_type_cd = 'BUDGET' THEN
1969 
1970          BEGIN
1971 
1972          -- Look up the Dataset Code BUDGET_ID attribute
1973 
1974             v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
1975                               (p_dim_id     => pv_dataset_dim_id,
1976                                p_attr_label => 'BUDGET_ID');
1977 
1978             IF v_attr_name IS NULL THEN
1979                v_attr_name := 'BUDGET_ID';
1980             END IF;
1981 
1982             fem_dimension_util_pkg.get_dim_attr_id_ver_id
1983               (x_err_code    => pv_API_return_code,
1984                x_attr_id     => pv_dim_attr_id,
1985                x_ver_id      => pv_dim_attr_ver_id,
1986                p_dim_id      => pv_dataset_dim_id,
1987                p_attr_label  => 'BUDGET_ID');
1988 
1989             IF pv_API_return_code > 0 THEN
1990 
1991                FEM_ENGINES_PKG.Tech_Message
1992                  (p_severity => pc_log_level_statement,
1993                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
1994                                 'undo_xgl_int_error_rows.idsc3.',
1995                   p_msg_text => 'raising Invalid_Runtime_Parameter');
1996 
1997                RAISE Invalid_Runtime_Parameter;
1998 
1999             END IF;
2000 
2001             SELECT dim_attribute_numeric_member
2002             INTO pv_budget_id
2003             FROM fem_datasets_attr
2004             WHERE attribute_id  = pv_dim_attr_id
2005               AND version_id    = pv_dim_attr_ver_id
2006               AND dataset_code  = pv_dataset_code;
2007 
2008             FEM_ENGINES_PKG.Tech_Message
2009             (p_severity    => pc_log_level_statement,
2010              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2011                            'undo_xgl_int_error_rows.pv_budget_id',
2012              p_app_name => 'FEM',
2013              p_msg_name => 'FEM_GL_POST_204',
2014              p_token1   => 'VAR_NAME',
2015              p_value1   => 'pv_budget_id',
2016              p_token2   => 'VAR_VAL',
2017              p_value2   => pv_budget_id);
2018 
2019          EXCEPTION
2020             WHEN NO_DATA_FOUND THEN
2021 
2022                FEM_ENGINES_PKG.Tech_Message
2023                  (p_severity => pc_log_level_statement,
2024                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2025                                 'undo_xgl_int_error_rows.idsc4.',
2026                   p_msg_text => 'raising Invalid_Runtime_Parameter');
2027 
2028                RAISE Invalid_Runtime_Parameter;
2029          END;
2030 
2031          BEGIN
2032 
2033          -- Look up the Budget Display Code
2034 
2035             SELECT dimension_id
2036             INTO pv_budget_dim_id
2040             v_param_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
2037             FROM fem_dimensions_b
2038             WHERE dimension_varchar_label = 'BUDGET';
2039 
2041                               (p_dim_id => pv_budget_dim_id);
2042             IF v_param_name IS NULL THEN
2043                v_param_name := 'Budget';
2044             END IF;
2045             v_param_value := TO_CHAR(pv_budget_id);
2046             v_attr_name := NULL;
2047 
2048             SELECT budget_display_code
2049             INTO pv_budget_dsp_cd
2050             FROM fem_budgets_b
2051             WHERE budget_id = pv_budget_id;
2052 
2053             FEM_ENGINES_PKG.Tech_Message
2054             (p_severity    => pc_log_level_statement,
2055              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2056                            'undo_xgl_int_error_rows.pv_budget_dsp_cd',
2057              p_app_name => 'FEM',
2058              p_msg_name => 'FEM_GL_POST_204',
2059              p_token1   => 'VAR_NAME',
2060              p_value1   => 'pv_budget_dsp_cd',
2061              p_token2   => 'VAR_VAL',
2062              p_value2   => pv_budget_dsp_cd);
2063 
2064          EXCEPTION
2065             WHEN NO_DATA_FOUND THEN
2066 
2067                FEM_ENGINES_PKG.Tech_Message
2068                  (p_severity => pc_log_level_statement,
2069                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2070                                 'undo_xgl_int_error_rows.idsc5.',
2071                   p_msg_text => 'raising Invalid_Runtime_Parameter');
2072 
2073                RAISE Invalid_Runtime_Parameter;
2074          END;
2075 
2076       ELSIF pv_ds_balance_type_cd = 'ENCUMBRANCE' THEN
2077 
2078          BEGIN
2079 
2080          -- Look up the Dataset Code ENCUMBRANCE_TYPE_ID attribute
2081 
2082             v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
2083                               (p_dim_id     => pv_dataset_dim_id,
2084                                p_attr_label => 'ENCUMBRANCE_TYPE_ID');
2085 
2086             IF v_attr_name IS NULL THEN
2087                v_attr_name := 'ENCUMBRANCE_TYPE_ID';
2088             END IF;
2089 
2090             fem_dimension_util_pkg.get_dim_attr_id_ver_id
2091               (x_err_code    => pv_API_return_code,
2092                x_attr_id     => pv_dim_attr_id,
2093                x_ver_id      => pv_dim_attr_ver_id,
2094                p_dim_id      => pv_dataset_dim_id,
2095                p_attr_label  => 'ENCUMBRANCE_TYPE_ID');
2096 
2097             IF pv_API_return_code > 0 THEN
2098 
2099                FEM_ENGINES_PKG.Tech_Message
2100                  (p_severity => pc_log_level_statement,
2101                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2102                                 'undo_xgl_int_error_rows.idsc6.',
2103                   p_msg_text => 'raising Invalid_Runtime_Parameter');
2104 
2105                RAISE Invalid_Runtime_Parameter;
2106 
2107             END IF;
2108 
2109             SELECT dim_attribute_numeric_member
2110             INTO pv_enc_type_id
2111             FROM fem_datasets_attr
2112             WHERE attribute_id  = pv_dim_attr_id
2113               AND version_id    = pv_dim_attr_ver_id
2114               AND dataset_code  = pv_dataset_code;
2115 
2116             FEM_ENGINES_PKG.Tech_Message
2117             (p_severity    => pc_log_level_statement,
2118              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2119                            'undo_xgl_int_error_rows.pv_enc_type_id',
2120              p_app_name => 'FEM',
2121              p_msg_name => 'FEM_GL_POST_204',
2122              p_token1   => 'VAR_NAME',
2123              p_value1   => 'pv_enc_type_id',
2124              p_token2   => 'VAR_VAL',
2125              p_value2   => pv_enc_type_id);
2126 
2127          EXCEPTION
2128             WHEN NO_DATA_FOUND THEN
2129 
2130                FEM_ENGINES_PKG.Tech_Message
2131                  (p_severity => pc_log_level_statement,
2132                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2133                                 'undo_xgl_int_error_rows.idsc7.',
2134                   p_msg_text => 'raising Invalid_Runtime_Parameter');
2135 
2136                RAISE Invalid_Runtime_Parameter;
2137          END;
2138 
2139          BEGIN
2140 
2141          -- Look up the Encumbrance Type (Display) Code
2142 
2143             SELECT dimension_id
2144             INTO pv_enc_type_dim_id
2145             FROM fem_dimensions_b
2146             WHERE dimension_varchar_label = 'ENCUMBRANCE_TYPE';
2147 
2148             v_param_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
2149                               (p_dim_id => pv_enc_type_dim_id);
2150             IF v_param_name IS NULL THEN
2151                v_param_name := 'Encumbrance Type';
2152             END IF;
2153             v_param_value := TO_CHAR(pv_enc_type_id);
2154             v_attr_name := NULL;
2155 
2156             SELECT encumbrance_type_code
2157             INTO pv_enc_type_dsp_cd
2158             FROM fem_encumbrance_types_b
2159             WHERE encumbrance_type_id = pv_enc_type_id;
2160 
2161             FEM_ENGINES_PKG.Tech_Message
2162             (p_severity    => pc_log_level_statement,
2163              p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2164                            'undo_xgl_int_error_rows.pv_enc_type_dsp_cd',
2165              p_app_name => 'FEM',
2166              p_msg_name => 'FEM_GL_POST_204',
2170              p_value2   => pv_enc_type_dsp_cd);
2167              p_token1   => 'VAR_NAME',
2168              p_value1   => 'pv_enc_type_dsp_cd',
2169              p_token2   => 'VAR_VAL',
2171 
2172          EXCEPTION
2173             WHEN NO_DATA_FOUND THEN
2174 
2175                FEM_ENGINES_PKG.Tech_Message
2176                  (p_severity => pc_log_level_statement,
2177                   p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2178                                 'undo_xgl_int_error_rows.idsc8.',
2179                   p_msg_text => 'raising Invalid_Runtime_Parameter');
2180 
2181                RAISE Invalid_Runtime_Parameter;
2182          END;
2183 
2184       END IF;
2185 
2186    -- -------------------------------------------------------------------
2187    -- Delete all rows for the given ledger, period, and dataset that
2188    -- have a value for POSTING_ERROR_CODE, or that have been tagged for
2189    -- processing by any XGL execution.  This puts the interface table
2190    -- to a clean state for the given ledger, period, and dataset so the
2191    -- data can be reloaded and reprocessed without the risk of
2192    -- reprocessing left-over rows resulting in double-counting.
2193    -- -------------------------------------------------------------------
2194 
2195       DELETE FROM fem_bal_interface_t
2196       WHERE cal_per_dim_grp_display_code = pv_cal_per_dim_grp_dsp_cd
2197         AND cal_period_end_date = pv_cal_per_end_date
2198         AND cal_period_number = pv_gl_per_number
2199         AND ledger_display_code = pv_ledger_dsp_cd
2200         AND ds_balance_type_code = pv_ds_balance_type_cd
2201         AND (budget_display_code = pv_budget_dsp_cd
2202              OR pv_budget_dsp_cd is NULL)
2203         AND (encumbrance_type_code = pv_enc_type_dsp_cd
2204              OR pv_enc_type_dsp_cd is NULL)
2205         AND posting_error_code IS NOT NULL;
2206 
2207       v_rows_deleted := SQL%ROWCOUNT;
2208 
2209       COMMIT;
2210 
2211       FEM_ENGINES_PKG.Tech_Message
2212       (p_severity    => pc_log_level_statement,
2213        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2214                      'undo_xgl_int_error_rows.v_rows_deleted',
2215        p_app_name => 'FEM',
2216        p_msg_name => 'FEM_GL_POST_218',
2217        p_token1   => 'NUM',
2218        p_value1   => TO_CHAR(v_rows_deleted),
2219        p_token2   => 'TABLE',
2220        p_value2   => 'FEM_BAL_INTERFACE_T');
2221 
2222       x_return_status := 'S';
2223       x_msg_data      := NULL;
2224       x_msg_count     := 0;
2225 
2226       FEM_ENGINES_PKG.Tech_Message
2227         (p_severity => pc_log_level_procedure,
2228          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2229                        'undo_xgl_int_error_rows.end',
2230          p_msg_text => 'END');
2231 
2232    EXCEPTION
2233       WHEN Invalid_Request_ID THEN
2234 
2235       -- WARNING:  Error rows not undone from FEM_BAL_INTERFACE_T
2236 
2237          FEM_ENGINES_PKG.Tech_Message
2238            (p_severity => pc_log_level_error,
2239             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2240                           'undo_xgl_int_error_rows.xirid1',
2241             p_app_name => 'FEM',
2242             p_msg_name => 'FEM_GL_POST_024');
2243 
2244          FEM_ENGINES_PKG.Put_Message
2245            (p_app_name => 'FEM',
2246             p_msg_name => 'FEM_GL_POST_024');
2247 
2248       -- Invalid parameter. Value not found. Parameter Name: Request ID.
2249 
2250          FEM_ENGINES_PKG.Tech_Message
2251            (p_severity => pc_log_level_error,
2252             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2253                           'undo_xgl_int_error_rows.xirid2',
2254             p_app_name => 'FEM',
2255             p_msg_name => 'FEM_GL_POST_001',
2256             p_token1   => 'DIMENSION_NAME',
2257             p_value1   => 'FEM_REQUEST_ID_TXT',
2258             p_trans1   => 'Y');
2259 
2260          FEM_ENGINES_PKG.Put_Message
2261            (p_app_name => 'FEM',
2262             p_msg_name => 'FEM_GL_POST_001',
2263             p_token1   => 'DIMENSION_NAME',
2264             p_value1   => 'FEM_REQUEST_ID_TXT',
2265             p_trans1   => 'Y');
2266 
2267          x_return_status := 'E';
2268          x_msg_data      := NULL;
2269          x_msg_count     := 2;
2270 
2271       WHEN Invalid_Runtime_Parameter THEN
2272       ------------------------------------------------------------------
2273       -- WARNING:  Error rows not undone from FEM_BAL_INTERFACE_T
2274       --
2275       -- Unable to resolve one of the original runtime parameter values
2276       -- into its corresponding interface column value or values due to
2277       -- a missing dimension value or dimension attribute value.
2278       -- Parameter Name: v_param_name.  Parameter Value:
2279       -- v_param_value.  Attribute Name: v_attr_name.
2280       ------------------------------------------------------------------
2281 
2282          FEM_ENGINES_PKG.Tech_Message
2283            (p_severity => pc_log_level_error,
2284             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2285                           'undo_xgl_int_error_rows.xirp1',
2286             p_app_name => 'FEM',
2287             p_msg_name => 'FEM_GL_POST_024');
2288 
2289          FEM_ENGINES_PKG.Put_Message
2290            (p_app_name => 'FEM',
2291             p_msg_name => 'FEM_GL_POST_024');
2292 
2293          FEM_ENGINES_PKG.Tech_Message
2294            (p_severity => pc_log_level_error,
2298             p_msg_name => 'FEM_GL_POST_025',
2295             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2296                           'undo_xgl_int_error_rows.xirp2',
2297             p_app_name => 'FEM',
2299             p_token1   => 'PARAMETER_NAME',
2300             p_value1   => v_param_name,
2301             p_token2   => 'PARAMETER_VALUE',
2302             p_value2   => v_param_value,
2303             p_token3   => 'ATTRIBUTE_NAME',
2304             p_value3   => v_attr_name);
2305 
2306          FEM_ENGINES_PKG.Put_Message
2307            (p_app_name => 'FEM',
2308             p_msg_name => 'FEM_GL_POST_025',
2309             p_token1   => 'PARAMETER_NAME',
2310             p_value1   => v_param_name,
2311             p_token2   => 'PARAMETER_VALUE',
2312             p_value2   => v_param_value,
2313             p_token3   => 'ATTRIBUTE_NAME',
2314             p_value3   => v_attr_name);
2315 
2316          x_return_status := 'E';
2317          x_msg_data      := NULL;
2318          x_msg_count     := 2;
2319 
2320    END Undo_XGL_Interface_Error_Rows;
2321 -- ======================================================================
2322 
2323 
2324 /**************************************************************************
2325 -- Private Procedures
2326 **************************************************************************/
2327 
2328 -- =======================================================================
2329    PROCEDURE Get_Dim_IDs IS
2330 -- =======================================================================
2331 -- Purpose
2332 --    Gets the Dimension ID for each of the dimension-based engine
2333 --    parameters and sets them in public package variables.
2334 -- History
2335 --    11-13-03  G Hall      Created
2336 --    12-15-04  L Poon      Added to log messages
2337 -- Notes
2338 --    Called by Validate_XGL_Eng_Parameters
2339 --    (and by Validate_OGL_Eng_Parameters)
2340 -- =======================================================================
2341 
2342    BEGIN
2343 
2344       FEM_ENGINES_PKG.Tech_Message
2345         (p_severity => pc_log_level_procedure,
2346          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2347                        'get_dim_ids.begin',
2348          p_msg_text => 'BEGIN');
2349 
2350       FEM_ENGINES_PKG.Tech_Message
2351         (p_severity => pc_log_level_statement,
2352          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2353                        'get_dim_ids',
2354          p_msg_text => 'Get Calendar Period dimension ID');
2355 
2356       SELECT dimension_id
2357       INTO pv_cal_per_dim_id
2358       FROM fem_dimensions_b
2359       WHERE dimension_varchar_label = 'CAL_PERIOD';
2360 
2361       FEM_ENGINES_PKG.Tech_Message
2362         (p_severity => pc_log_level_statement,
2363          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2364                        'get_dim_ids',
2365          p_msg_text => 'Get Ledger dimension ID');
2366 
2367       SELECT dimension_id
2368       INTO pv_ledger_dim_id
2369       FROM fem_dimensions_b
2370       WHERE dimension_varchar_label = 'LEDGER';
2371 
2372       FEM_ENGINES_PKG.Tech_Message
2373         (p_severity => pc_log_level_statement,
2374          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2375                        'get_dim_ids',
2376          p_msg_text => 'Get Dataset dimension ID');
2377 
2378       SELECT dimension_id
2379       INTO pv_dataset_dim_id
2380       FROM fem_dimensions_b
2381       WHERE dimension_varchar_label = 'DATASET';
2382 
2383       FEM_ENGINES_PKG.Tech_Message
2384         (p_severity => pc_log_level_statement,
2385          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2386                        'get_dim_ids',
2387          p_msg_text => 'Get Budget dimension ID');
2388 
2389       SELECT dimension_id
2390       INTO pv_budget_dim_id
2391       FROM fem_dimensions_b
2392       WHERE dimension_varchar_label = 'BUDGET';
2393 
2394       FEM_ENGINES_PKG.Tech_Message
2395         (p_severity => pc_log_level_statement,
2396          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2397                        'get_dim_ids',
2398          p_msg_text => 'Get Encumbrance Type dimension ID');
2399 
2400       SELECT dimension_id
2401       INTO pv_enc_type_dim_id
2402       FROM fem_dimensions_b
2403       WHERE dimension_varchar_label = 'ENCUMBRANCE_TYPE';
2404 
2405       FEM_ENGINES_PKG.Tech_Message
2406         (p_severity => pc_log_level_statement,
2407          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2408                        'get_dim_ids',
2409          p_msg_text => 'Get Extended Account Type dimension ID');
2410 
2411       SELECT dimension_id
2412       INTO pv_ext_acct_type_dim_id
2413       FROM fem_dimensions_b
2414       WHERE dimension_varchar_label = 'EXTENDED_ACCOUNT_TYPE';
2415 
2416       FEM_ENGINES_PKG.Tech_Message
2417         (p_severity => pc_log_level_statement,
2418          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2419                        'get_dim_ids',
2420          p_msg_text => 'Get Natural Account dimension ID');
2421 
2422       SELECT dimension_id
2423       INTO pv_nat_acct_dim_id
2424       FROM fem_dimensions_b
2425       WHERE dimension_varchar_label = 'NATURAL_ACCOUNT';
2426 
2427       FEM_ENGINES_PKG.Tech_Message
2428         (p_severity => pc_log_level_procedure,
2429          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2430                        'get_dim_ids.end',
2434 
2431          p_msg_text => 'END');
2432 
2433    EXCEPTION
2435       WHEN OTHERS THEN
2436       -- ------------------------
2437       -- Unexpected exception
2438       -- ------------------------
2439 
2440          pv_sqlerrm   := SQLERRM;
2441          pv_callstack := dbms_utility.format_call_stack;
2442          pv_proc_name := 'get_dim_ids';
2443 
2444          RAISE;
2445 
2446    END Get_Dim_IDs;
2447 -- =======================================================================
2448 
2449 
2450 -- =======================================================================
2451    PROCEDURE Validate_Budget IS
2452 -- =======================================================================
2453 -- Purpose
2454 --    Validates the Budget ID engine parameter
2455 -- History
2456 --    11-13-03  G Hall          Created
2457 --    03-30-06  G Hall          Bug# 5121106: Removed validation against
2458 --                              BUDGET_LEDGER attribute.
2459 -- Notes
2460 --    Called by Validate_Engine_Parameters
2461 -- =======================================================================
2462 
2463       v_ds_budget_id    fem_datasets_attr.dim_attribute_numeric_member%TYPE;
2464       v_budget_ledger   fem_budgets_attr.dim_attribute_numeric_member%TYPE;
2465 
2466    BEGIN
2467 
2468       FEM_ENGINES_PKG.Tech_Message
2469         (p_severity => pc_log_level_procedure,
2470          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2471                        'validate_budget.begin',
2472          p_msg_text => 'BEGIN');
2473 
2474    -- Validate the Budget ID engine parameter by looking up the Budget
2475    -- Display Code, and set it in a package variable.
2476 
2477       BEGIN
2478 
2479          SELECT budget_display_code
2480          INTO pv_budget_dsp_cd
2481          FROM fem_budgets_b
2482          WHERE budget_id = pv_budget_id
2483            AND enabled_flag  = 'Y'
2484            AND personal_flag = 'N';
2485 
2486          FEM_ENGINES_PKG.Tech_Message
2487          (p_severity    => pc_log_level_statement,
2488           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2489                         'validate_budget.pv_budget_dsp_cd',
2490           p_app_name => 'FEM',
2491           p_msg_name => 'FEM_GL_POST_204',
2492           p_token1   => 'VAR_NAME',
2493           p_value1   => 'pv_budget_dsp_cd',
2494           p_token2   => 'VAR_VAL',
2495           p_value2   => pv_budget_dsp_cd);
2496 
2497       EXCEPTION
2498          WHEN NO_DATA_FOUND THEN
2499 
2500             FEM_ENGINES_PKG.Tech_Message
2501               (p_severity => pc_log_level_statement,
2502                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2503                              'validate_budget.ibid1.',
2504                p_msg_text => 'raising Invalid_Budget_ID');
2505 
2506             RAISE Invalid_Budget_ID;
2507       END;
2508 
2509    -- Look up the BUDGET_ID attribute of the Dataset
2510    -- and make sure it matches the Budget ID parameter.
2511 
2512       BEGIN
2513 
2514          fem_dimension_util_pkg.get_dim_attr_id_ver_id
2515            (x_err_code    => pv_API_return_code,
2516             x_attr_id     => pv_dim_attr_id,
2517             x_ver_id      => pv_dim_attr_ver_id,
2518             p_dim_id      => pv_dataset_dim_id,
2519             p_attr_label  => 'BUDGET_ID');
2520 
2521          IF pv_API_return_code > 0 THEN
2522 
2523             FEM_ENGINES_PKG.Tech_Message
2524               (p_severity => pc_log_level_statement,
2525                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2526                              'validate_budget.idsc1.',
2527                p_msg_text => 'raising Invalid_Dataset_Code');
2528 
2529             RAISE Invalid_Dataset_Code;
2530 
2531          END IF;
2532 
2533          SELECT dim_attribute_numeric_member
2534          INTO v_ds_budget_id
2535          FROM fem_datasets_attr
2536          WHERE attribute_id  = pv_dim_attr_id
2537            AND version_id    = pv_dim_attr_ver_id
2538            AND dataset_code  = pv_dataset_code;
2539 
2540       EXCEPTION
2541          WHEN NO_DATA_FOUND THEN
2542 
2543             FEM_ENGINES_PKG.Tech_Message
2544               (p_severity => pc_log_level_statement,
2545                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2546                              'validate_budget.idsc2.',
2547                p_msg_text => 'raising Invalid_Dataset_Code');
2548 
2549             RAISE Invalid_Dataset_Code;
2550       END;
2551 
2552       IF pv_budget_id <> v_ds_budget_id THEN
2553 
2554          FEM_ENGINES_PKG.Tech_Message
2555            (p_severity => pc_log_level_statement,
2556             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2557                           'validate_budget.ibds1.',
2558             p_msg_text => 'raising Invalid_Budget_or_Dataset');
2559 
2560          RAISE Invalid_Budget_or_Dataset;
2561 
2562       END IF;
2563 
2564    -- Successful completion
2565 
2566       FEM_ENGINES_PKG.Tech_Message
2567         (p_severity => pc_log_level_procedure,
2568          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2569                        'validate_budget.end',
2570          p_msg_text => 'END');
2571 
2572    EXCEPTION
2573 
2574       WHEN OTHERS THEN
2575 
2576       -- In case it's an unexpected exception
2580 
2577 
2578          pv_sqlerrm   := SQLERRM;
2579          pv_callstack := dbms_utility.format_call_stack;
2581       -- For all exceptions:
2582 
2583          pv_proc_name := 'validate_budget';
2584 
2585          RAISE;
2586 
2587    END Validate_Budget;
2588 -- =======================================================================
2589 
2590 
2591 -- =======================================================================
2592    PROCEDURE Validate_Cal_Period IS
2593 -- =======================================================================
2594 -- Purpose
2595 --    Validates the Cal Period ID engine parameter and looks up and sets
2596 --    the period-related package variables.
2597 -- History
2598 --    11-13-03  G Hall  Created
2599 --    05-28-04  G Hall  Bug# 3659504: Updated Cal_Period_ID validation logic
2600 --                      as required by change in Ledger attribute for Ledger
2601 --                      Cal Period hierarchy.
2602 --    07/07/05  G Hall  Bug# 4395891: Updated validation logic to only require
2603 --                      that the CAL_PERIOD_ID belong to the same Calendar as
2604 --                      the Ledger hierarchy, but does not need to be a node
2605 --                      in that hierarchy.
2606 -- Notes
2607 --    Called by Validate_Engine_Parameters
2608 -- =======================================================================
2609 
2610       v_cal_per_dim_group_id   fem_cal_periods_b.dimension_group_id%TYPE;
2611       v_cp_exists_in_hier      VARCHAR2(1);
2612 
2613    BEGIN
2614 
2615       FEM_ENGINES_PKG.Tech_Message
2616         (p_severity => pc_log_level_procedure,
2617          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2618                        'validate_cal_period.begin',
2619          p_msg_text => 'BEGIN');
2620 
2621       BEGIN
2622 
2623       -- Get the Cal Period Calendar ID and the Cal Period Dimension Group
2624       -- Display Code, and set the former into a package variable.
2625 
2626          SELECT calendar_id, dimension_group_id
2627          INTO pv_cal_per_calendar_id, v_cal_per_dim_group_id
2628          FROM fem_cal_periods_b
2629          WHERE cal_period_id = pv_cal_period_id
2630            AND enabled_flag  = 'Y'
2631            AND personal_flag = 'N';
2632 
2633          FEM_ENGINES_PKG.Tech_Message
2634          (p_severity    => pc_log_level_statement,
2635           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2636                         'validate_cal_period.pv_cal_per_calendar_id',
2637           p_app_name => 'FEM',
2638           p_msg_name => 'FEM_GL_POST_204',
2639           p_token1   => 'VAR_NAME',
2640           p_value1   => 'pv_cal_per_calendar_id',
2641           p_token2   => 'VAR_VAL',
2642           p_value2   => TO_CHAR(pv_cal_per_calendar_id));
2643 
2644          SELECT dimension_group_display_code
2645          INTO pv_cal_per_dim_grp_dsp_cd
2646          FROM fem_dimension_grps_b
2647          WHERE dimension_group_id = v_cal_per_dim_group_id;
2648 
2649          FEM_ENGINES_PKG.Tech_Message
2650          (p_severity    => pc_log_level_statement,
2651           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2652                         'validate_cal_period.pv_cal_per_dim_grp_dsp_cd',
2653           p_app_name => 'FEM',
2654           p_msg_name => 'FEM_GL_POST_204',
2655           p_token1   => 'VAR_NAME',
2656           p_value1   => 'pv_cal_per_dim_grp_dsp_cd',
2657           p_token2   => 'VAR_VAL',
2658           p_value2   => pv_cal_per_dim_grp_dsp_cd);
2659 
2660       EXCEPTION
2661          WHEN NO_DATA_FOUND THEN
2662 
2663             FEM_ENGINES_PKG.Tech_Message
2664               (p_severity => pc_log_level_statement,
2665                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2666                              'validate_cal_period.icpid1.',
2667                p_msg_text => 'raising Invalid_Cal_Period_ID');
2668 
2669             RAISE Invalid_Cal_Period_ID;
2670       END;
2671 
2672    -- Compare the Cal Period Calendar ID and the Ledger Calendar ID.
2673 
2674       IF pv_cal_per_calendar_id <> pv_ledger_calendar_id THEN
2675 
2676          FEM_ENGINES_PKG.Tech_Message
2677            (p_severity => pc_log_level_statement,
2678             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2679                           'validate_cal_period.lcneqpc.',
2680             p_msg_text => 'raising Ledger_Cal_NEQ_Period_Cal');
2681 
2682          RAISE Ledger_Cal_NEQ_Period_Cal;
2683 
2684       END IF;
2685 
2686       BEGIN
2687 
2688       -- Retrieve the CAL_PERIOD_END_DATE attribute of the Cal Period ID
2689       -- and set it into a package variable.
2690 
2691          fem_dimension_util_pkg.get_dim_attr_id_ver_id
2692            (x_err_code    => pv_API_return_code,
2693             x_attr_id     => pv_dim_attr_id,
2694             x_ver_id      => pv_dim_attr_ver_id,
2695             p_dim_id      => pv_cal_per_dim_id,
2696             p_attr_label  => 'CAL_PERIOD_END_DATE');
2697 
2698          IF pv_API_return_code > 0 THEN
2699 
2700             FEM_ENGINES_PKG.Tech_Message
2701               (p_severity => pc_log_level_statement,
2702                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2703                              'validate_cal_period.icpid2.',
2704                p_msg_text => 'raising Invalid_Cal_Period_ID');
2705 
2706             RAISE Invalid_Cal_Period_ID;
2707 
2708          END IF;
2712          FROM fem_cal_periods_attr
2709 
2710          SELECT date_assign_value
2711          INTO pv_cal_per_end_date
2713          WHERE attribute_id  = pv_dim_attr_id
2714            AND version_id    = pv_dim_attr_ver_id
2715            AND cal_period_id = pv_cal_period_id;
2716 
2717          FEM_ENGINES_PKG.Tech_Message
2718          (p_severity    => pc_log_level_statement,
2719           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2720                         'validate_cal_period.pv_cal_per_end_date',
2721           p_app_name => 'FEM',
2722           p_msg_name => 'FEM_GL_POST_204',
2723           p_token1   => 'VAR_NAME',
2724           p_value1   => 'pv_cal_per_end_date',
2725           p_token2   => 'VAR_VAL',
2726           p_value2   => TO_CHAR(pv_cal_per_end_date, 'DD-MON-YYYY'));
2727 
2728       EXCEPTION
2729          WHEN NO_DATA_FOUND THEN
2730 
2731             FEM_ENGINES_PKG.Tech_Message
2732               (p_severity => pc_log_level_statement,
2733                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2734                              'validate_cal_period.icpid3.',
2735                p_msg_text => 'raising Invalid_Cal_Period_ID');
2736 
2737             RAISE Invalid_Cal_Period_ID;
2738       END;
2739 
2740       BEGIN
2741 
2742       -- Get the Calendar Period Number from the GL_PERIOD_NUM attribute of the
2743       -- Cal Period ID and set it into a package variable.
2744 
2745          fem_dimension_util_pkg.get_dim_attr_id_ver_id
2746            (x_err_code    => pv_API_return_code,
2747             x_attr_id     => pv_dim_attr_id,
2748             x_ver_id      => pv_dim_attr_ver_id,
2749             p_dim_id      => pv_cal_per_dim_id,
2750             p_attr_label  => 'GL_PERIOD_NUM');
2751 
2752          IF pv_API_return_code > 0 THEN
2753 
2754             FEM_ENGINES_PKG.Tech_Message
2755               (p_severity => pc_log_level_statement,
2756                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2757                              'validate_cal_period.icpid4.',
2758                p_msg_text => 'raising Invalid_Cal_Period_ID');
2759 
2760             RAISE Invalid_Cal_Period_ID;
2761 
2762          END IF;
2763 
2764          SELECT number_assign_value
2765          INTO pv_gl_per_number
2766          FROM fem_cal_periods_attr
2767          WHERE attribute_id  = pv_dim_attr_id
2768            AND version_id    = pv_dim_attr_ver_id
2769            AND cal_period_id = pv_cal_period_id;
2770 
2771          FEM_ENGINES_PKG.Tech_Message
2772          (p_severity    => pc_log_level_statement,
2773           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2774                         'validate_cal_period.pv_gl_per_number',
2775           p_app_name => 'FEM',
2776           p_msg_name => 'FEM_GL_POST_204',
2777           p_token1   => 'VAR_NAME',
2778           p_value1   => 'pv_gl_per_number',
2779           p_token2   => 'VAR_VAL',
2780           p_value2   => TO_CHAR(pv_gl_per_number));
2781 
2782       EXCEPTION
2783          WHEN NO_DATA_FOUND THEN
2784 
2785             FEM_ENGINES_PKG.Tech_Message
2786               (p_severity => pc_log_level_statement,
2787                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2788                              'validate_cal_period.icpid5.',
2789                p_msg_text => 'raising Invalid_Cal_Period_ID');
2790 
2791             RAISE Invalid_Cal_Period_ID;
2792       END;
2793 
2794    -- Successful completion
2795 
2796       FEM_ENGINES_PKG.Tech_Message
2797         (p_severity => pc_log_level_procedure,
2798          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2799                        'validate_cal_period.end',
2800          p_msg_text => 'END');
2801 
2802    EXCEPTION
2803 
2804       WHEN OTHERS THEN
2805       -- In case it's an unexpected exception
2806 
2807          pv_sqlerrm   := SQLERRM;
2808          pv_callstack := dbms_utility.format_call_stack;
2809 
2810       -- For all exceptions:
2811 
2812          pv_proc_name := 'validate_cal_period';
2813 
2814          RAISE;
2815 
2816    END Validate_Cal_Period;
2817 -- =======================================================================
2818 
2819 
2820 -- =======================================================================
2821    PROCEDURE Validate_Dataset IS
2822 -- =======================================================================
2823 -- Purpose
2824 --    Validates the Dataset Code engine parameter.
2825 -- History
2826 --    11-13-03  G Hall          Created
2827 -- Notes
2828 --    Called by Validate_Engine_Parameters
2829 -- =======================================================================
2830 
2831       v_rowcount   PLS_INTEGER;
2832 
2833    BEGIN
2834 
2835       FEM_ENGINES_PKG.Tech_Message
2836         (p_severity => pc_log_level_procedure,
2837          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2838                        'validate_dataset.begin',
2839          p_msg_text => 'BEGIN');
2840 
2841 
2842    -- Validate the Dataset Code engine parameter.
2843 
2844       SELECT COUNT(*)
2845       INTO v_rowcount
2846       FROM fem_datasets_b
2847       WHERE dataset_code  = pv_dataset_code
2848         AND enabled_flag  = 'Y'
2849         AND personal_flag = 'N';
2850 
2851       IF v_rowcount <> 1 THEN
2852 
2856                              'validate_dataset.idsc7.',
2853             FEM_ENGINES_PKG.Tech_Message
2854               (p_severity => pc_log_level_statement,
2855                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2857                p_msg_text => 'raising Invalid_Dataset_Code');
2858 
2859          RAISE Invalid_Dataset_Code;
2860 
2861       END IF;
2862 
2863    -- Look up the Dataset Code DATASET_BALANCE_TYPE_CODE attribute
2864 
2865       BEGIN
2866 
2867          fem_dimension_util_pkg.get_dim_attr_id_ver_id
2868            (x_err_code    => pv_API_return_code,
2869             x_attr_id     => pv_dim_attr_id,
2870             x_ver_id      => pv_dim_attr_ver_id,
2871             p_dim_id      => pv_dataset_dim_id,
2872             p_attr_label  => 'DATASET_BALANCE_TYPE_CODE');
2873 
2874          IF pv_API_return_code > 0 THEN
2875 
2876             FEM_ENGINES_PKG.Tech_Message
2877               (p_severity => pc_log_level_statement,
2878                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2879                              'validate_dataset.idsc8.',
2880                p_msg_text => 'raising Invalid_Dataset_Code');
2881 
2882             RAISE Invalid_Dataset_Code;
2883 
2884          END IF;
2885 
2886          SELECT dim_attribute_varchar_member
2887          INTO pv_ds_balance_type_cd
2888          FROM fem_datasets_attr
2889          WHERE attribute_id  = pv_dim_attr_id
2890            AND version_id    = pv_dim_attr_ver_id
2891            AND dataset_code  = pv_dataset_code;
2892 
2893          FEM_ENGINES_PKG.Tech_Message
2894          (p_severity    => pc_log_level_statement,
2895           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2896                         'validate_dataset.pv_ds_balance_type_cd',
2897           p_app_name => 'FEM',
2898           p_msg_name => 'FEM_GL_POST_204',
2899           p_token1   => 'VAR_NAME',
2900           p_value1   => 'pv_ds_balance_type_cd',
2901           p_token2   => 'VAR_VAL',
2902           p_value2   => pv_ds_balance_type_cd);
2903 
2904       EXCEPTION
2905          WHEN NO_DATA_FOUND THEN
2906 
2907             FEM_ENGINES_PKG.Tech_Message
2908               (p_severity => pc_log_level_statement,
2909                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2910                              'validate_dataset.idsc9.',
2911                p_msg_text => 'raising Invalid_Dataset_Code');
2912 
2913             RAISE Invalid_Dataset_Code;
2914       END;
2915 
2916    -- Successful completion
2917 
2918       FEM_ENGINES_PKG.Tech_Message
2919         (p_severity => pc_log_level_procedure,
2920          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2921                        'validate_dataset.end',
2922          p_msg_text => 'END');
2923 
2924    EXCEPTION
2925 
2926       WHEN OTHERS THEN
2927 
2928       -- In case it's an unexpected exception
2929 
2930          pv_sqlerrm   := SQLERRM;
2931          pv_callstack := dbms_utility.format_call_stack;
2932 
2933       -- For all exceptions:
2934 
2935          pv_proc_name := 'validate_dataset';
2936 
2937          RAISE;
2938 
2939    END Validate_Dataset;
2940 -- =======================================================================
2941 
2942 
2943 -- =======================================================================
2944    PROCEDURE Validate_DS_Bal_Type IS
2945 -- =======================================================================
2946 -- Purpose
2947 --    Validates that the Dataset Balance Type has not already been run
2948 --    for a different dataset for the current ledger and period.
2949 -- History
2950 --    07-19-05  G Hall  Created
2951 --    03-30-06  G Hall  Bug# 5121111: Added specific validations for
2952 --                      Budget and Encumbrance.
2953 -- Notes
2954 --    Called by Validate_Engine_Parameters
2955 -- =======================================================================
2956 
2957    BEGIN
2958 
2959       FEM_ENGINES_PKG.Tech_Message
2960         (p_severity => pc_log_level_procedure,
2961          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
2962                        'validate_ds_bal_type.begin',
2963          p_msg_text => 'BEGIN');
2964 
2965       IF pv_ds_balance_type_cd = 'ACTUAL' THEN
2966 
2967          SELECT MAX(r.output_dataset_code)
2968          INTO pv_precedent_dataset_code
2969          FROM fem_pl_requests r,
2970               fem_pl_object_executions x,
2971               fem_object_catalog_b o
2972          WHERE r.ledger_id = pv_ledger_id
2973            AND r.cal_period_id = pv_cal_period_id
2974            AND r.output_dataset_code <> pv_dataset_code
2975            AND r.exec_mode_code = 'S'
2976            AND r.exec_status_code = 'SUCCESS'
2977            AND x.request_id = r.request_id
2978            AND o.object_id = x.object_id
2979            AND o.object_type_code = 'XGL_INTEGRATION'
2980            AND 'ACTUAL' =
2981               (SELECT DIM_ATTRIBUTE_VARCHAR_MEMBER
2982                FROM fem_datasets_attr
2983                WHERE dataset_code = r.output_dataset_code
2984                  AND (attribute_id, version_id) =
2985                     (SELECT a.attribute_id, v.version_id
2986                      FROM fem_dim_attributes_b a,
2987                           fem_dim_attr_versions_b v
2988                      WHERE a.attribute_varchar_label = 'DATASET_BALANCE_TYPE_CODE'
2992       ELSIF pv_ds_balance_type_cd = 'BUDGET' THEN
2989                        AND v.attribute_id = a.attribute_id
2990                        and v.default_version_flag = 'Y'));
2991 
2993 
2994          SELECT MAX(r.output_dataset_code)
2995          INTO pv_precedent_dataset_code
2996          FROM fem_pl_requests r,
2997               fem_pl_object_executions x,
2998               fem_object_catalog_b o
2999          WHERE r.ledger_id = pv_ledger_id
3000            AND r.cal_period_id = pv_cal_period_id
3001            AND r.output_dataset_code <> pv_dataset_code
3002            AND r.exec_mode_code = 'S'
3003            AND r.exec_status_code = 'SUCCESS'
3004            AND x.request_id = r.request_id
3005            AND o.object_id = x.object_id
3006            AND o.object_type_code = 'XGL_INTEGRATION'
3007            AND pv_budget_id =
3008               (SELECT DIM_ATTRIBUTE_NUMERIC_MEMBER
3009                FROM fem_datasets_attr
3010                WHERE dataset_code = r.output_dataset_code
3011                  AND (attribute_id, version_id) =
3012                     (SELECT a.attribute_id, v.version_id
3013                      FROM fem_dim_attributes_b a,
3014                           fem_dim_attr_versions_b v
3015                      WHERE a.attribute_varchar_label = 'BUDGET_ID'
3016                        AND v.attribute_id = a.attribute_id
3017                        and v.default_version_flag = 'Y'));
3018 
3019       ELSIF pv_ds_balance_type_cd = 'ENCUMBRANCE' THEN
3020 
3021          SELECT MAX(r.output_dataset_code)
3022          INTO pv_precedent_dataset_code
3023          FROM fem_pl_requests r,
3024               fem_pl_object_executions x,
3025               fem_object_catalog_b o
3026          WHERE r.ledger_id = pv_ledger_id
3027            AND r.cal_period_id = pv_cal_period_id
3028            AND r.output_dataset_code <> pv_dataset_code
3029            AND r.exec_mode_code = 'S'
3030            AND r.exec_status_code = 'SUCCESS'
3031            AND x.request_id = r.request_id
3032            AND o.object_id = x.object_id
3033            AND o.object_type_code = 'XGL_INTEGRATION'
3034            AND pv_enc_type_id =
3035               (SELECT DIM_ATTRIBUTE_NUMERIC_MEMBER
3036                FROM fem_datasets_attr
3037                WHERE dataset_code = r.output_dataset_code
3038                  AND (attribute_id, version_id) =
3039                     (SELECT a.attribute_id, v.version_id
3040                      FROM fem_dim_attributes_b a,
3041                           fem_dim_attr_versions_b v
3042                      WHERE a.attribute_varchar_label = 'ENCUMBRANCE_TYPE_ID'
3043                        AND v.attribute_id = a.attribute_id
3044                        and v.default_version_flag = 'Y'));
3045 
3046       END IF;
3047 
3048       IF pv_precedent_dataset_code > 0 THEN
3049 
3050             FEM_ENGINES_PKG.Tech_Message
3051               (p_severity => pc_log_level_statement,
3052                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3053                              'validate_ds_bal_type.idsbt.',
3054                p_msg_text => 'raising Invalid_DS_Bal_Type');
3055 
3056          RAISE Invalid_DS_Bal_Type;
3057 
3058       END IF;
3059 
3060    -- Successful completion
3061 
3062       FEM_ENGINES_PKG.Tech_Message
3063         (p_severity => pc_log_level_procedure,
3064          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3065                        'validate_ds_bal_type.end',
3066          p_msg_text => 'END');
3067 
3068    EXCEPTION
3069 
3070       WHEN OTHERS THEN
3071 
3072       -- In case it's an unexpected exception
3073 
3074          pv_sqlerrm   := SQLERRM;
3075          pv_callstack := dbms_utility.format_call_stack;
3076 
3077       -- For all exceptions:
3078 
3079          pv_proc_name := 'validate_ds_bal_type';
3080 
3081          RAISE;
3082 
3083    END Validate_DS_Bal_Type;
3084 -- =======================================================================
3085 
3086 
3087 -- =======================================================================
3088    PROCEDURE Validate_Encumbrance_Type IS
3089 -- =======================================================================
3090 -- Purpose
3091 --    Validates the Encumbrance Type ID engine parameter
3092 -- History
3093 --    11-13-03  G Hall          Created
3094 -- Notes
3095 --    Called by Validate_Engine_Parameters
3096 -- =======================================================================
3097 
3098       v_ds_enc_type_id   fem_datasets_attr.dim_attribute_numeric_member%TYPE;
3099 
3100    BEGIN
3101 
3102       FEM_ENGINES_PKG.Tech_Message
3103         (p_severity => pc_log_level_procedure,
3104          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3105                        'validate_encumbrance_type.begin',
3106          p_msg_text => 'BEGIN');
3107 
3108    -- Validate the Encumbrance Type ID engine parameter by looking up
3109    -- the Encumbrance Type [Display] Code, and set it in a package
3110    -- variable.
3111 
3112       BEGIN
3113 
3114          SELECT encumbrance_type_code
3115          INTO pv_enc_type_dsp_cd
3116          FROM fem_encumbrance_types_b
3117          WHERE encumbrance_type_id = pv_enc_type_id
3118            AND enabled_flag  = 'Y'
3119            AND personal_flag = 'N';
3120 
3121          FEM_ENGINES_PKG.Tech_Message
3122          (p_severity    => pc_log_level_statement,
3126           p_msg_name => 'FEM_GL_POST_204',
3123           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3124                         'validate_encumbrance_type.pv_enc_type_dsp_cd',
3125           p_app_name => 'FEM',
3127           p_token1   => 'VAR_NAME',
3128           p_value1   => 'pv_enc_type_dsp_cd',
3129           p_token2   => 'VAR_VAL',
3130           p_value2   => pv_enc_type_dsp_cd);
3131 
3132       EXCEPTION
3133          WHEN NO_DATA_FOUND THEN
3134 
3135             FEM_ENGINES_PKG.Tech_Message
3136               (p_severity => pc_log_level_statement,
3137                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3138                              'validate_encumbrance_type.ietid1.',
3139                p_msg_text => 'raising Invalid_Enc_Type_ID');
3140 
3141             RAISE Invalid_Enc_Type_ID;
3142 
3143       END;
3144 
3145    -- Look up the DATASET_ENCUMBRANCE_TYPE_ID attribute of the Dataset
3146    -- and make sure it matches the Encumbrance Type ID parameter.
3147 
3148       BEGIN
3149 
3150          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3151            (x_err_code    => pv_API_return_code,
3152             x_attr_id     => pv_dim_attr_id,
3153             x_ver_id      => pv_dim_attr_ver_id,
3154             p_dim_id      => pv_dataset_dim_id,
3155             p_attr_label  => 'ENCUMBRANCE_TYPE_ID');
3156 
3157          IF pv_API_return_code > 0 THEN
3158 
3159             FEM_ENGINES_PKG.Tech_Message
3160               (p_severity => pc_log_level_statement,
3161                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3162                              'validate_encumbrance_type.idsc3.',
3163                p_msg_text => 'raising Invalid_Dataset_Code');
3164 
3165             RAISE Invalid_Dataset_Code;
3166 
3167          END IF;
3168 
3169          SELECT dim_attribute_numeric_member
3170          INTO v_ds_enc_type_id
3171          FROM fem_datasets_attr
3172          WHERE attribute_id  = pv_dim_attr_id
3173            AND version_id    = pv_dim_attr_ver_id
3174            AND dataset_code  = pv_dataset_code;
3175 
3176       EXCEPTION
3177          WHEN NO_DATA_FOUND THEN
3178 
3179             FEM_ENGINES_PKG.Tech_Message
3180               (p_severity => pc_log_level_statement,
3181                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3182                              'validate_encumbrance_type.idsc4.',
3183                p_msg_text => 'raising Invalid_Dataset_Code');
3184 
3185             RAISE Invalid_Dataset_Code;
3186       END;
3187 
3188       IF pv_enc_type_id <> v_ds_enc_type_id THEN
3189 
3190          FEM_ENGINES_PKG.Tech_Message
3191            (p_severity => pc_log_level_statement,
3192             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3193                           'validate_encumbrance_type.ieds1.',
3194             p_msg_text => 'raising Invalid_Enc_or_Dataset');
3195 
3196          RAISE Invalid_Enc_or_Dataset;
3197 
3198       END IF;
3199 
3200    -- Successful completion
3201 
3202       FEM_ENGINES_PKG.Tech_Message
3203         (p_severity => pc_log_level_procedure,
3204          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3205                        'validate_encumbrance_type.end',
3206          p_msg_text => 'END');
3207 
3208    EXCEPTION
3209 
3210       WHEN OTHERS THEN
3211 
3212       -- In case it's an unexpected exception
3213 
3214          pv_sqlerrm   := SQLERRM;
3215          pv_callstack := dbms_utility.format_call_stack;
3216 
3217       -- For all exceptions:
3218 
3219          pv_proc_name := 'validate_encumbrance_type';
3220 
3221          RAISE;
3222 
3223    END Validate_Encumbrance_Type;
3224 -- =======================================================================
3225 
3226 
3227 -- =======================================================================
3228    PROCEDURE Validate_Ledger IS
3229 -- =======================================================================
3230 -- Purpose
3231 --    Validate the Ledger ID engine parameter. Look up the Calendar ID
3232 --    assigned to it for comparison with the Calendar ID for the period.
3233 -- History
3234 --    11-13-03  G Hall  Created
3235 --    01-26-04  G Hall  Added Entered Currency Enable Flag ledger
3236 --                      attribute lookup.
3237 --    05-28-04  G Hall  Bug# 3659504: Updated Cal_Period_ID validation logic
3238 --                      as required by change in Ledger attribute for Ledger
3239 --                      Cal Period hierarchy.
3240 --    11-16-04  L POON  Add changes for FEM-OGL Integration Project
3241 -- Notes
3242 --    Called by Validate_Engine_Parameters
3243 -- =======================================================================
3244 
3245    BEGIN
3246 
3247       FEM_ENGINES_PKG.Tech_Message
3248         (p_severity => pc_log_level_procedure,
3249          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3250                        'validate_ledger.begin',
3251          p_msg_text => 'BEGIN');
3252 
3253       BEGIN
3254 
3255       -- Validate the Ledger ID engine parameter by looking up the Ledger
3256       -- Display Code, and set it in a package variable.
3257 
3258          SELECT ledger_display_code
3259          INTO pv_ledger_dsp_cd
3260          FROM fem_ledgers_b
3261          WHERE ledger_id = pv_ledger_id
3262            AND enabled_flag  = 'Y'
3266          (p_severity => pc_log_level_statement,
3263            AND personal_flag = 'N';
3264 
3265          FEM_ENGINES_PKG.Tech_Message
3267           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3268                         'validate_ledger.pv_ledger_dsp_cd',
3269           p_app_name => 'FEM',
3270           p_msg_name => 'FEM_GL_POST_204',
3271           p_token1   => 'VAR_NAME',
3272           p_value1   => 'pv_ledger_dsp_cd',
3273           p_token2   => 'VAR_VAL',
3274           p_value2   => pv_ledger_dsp_cd);
3275 
3276       EXCEPTION
3277          WHEN NO_DATA_FOUND THEN
3278 
3279             FEM_ENGINES_PKG.Tech_Message
3280               (p_severity => pc_log_level_statement,
3281                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3282                              'validate_ledger.ilid1.',
3283                p_msg_text => 'raising Invalid_Ledger_ID');
3284 
3285             RAISE Invalid_Ledger_ID;
3286       END;
3287 
3288       BEGIN
3289 
3290       -- Get the Entered Currency Enable Flag attribute of the Ledger ID and store
3291       -- it as a package variable.
3292 
3293          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3294            (x_err_code    => pv_API_return_code,
3295             x_attr_id     => pv_dim_attr_id,
3296             x_ver_id      => pv_dim_attr_ver_id,
3297             p_dim_id      => pv_ledger_dim_id,
3298             p_attr_label  => 'ENTERED_CRNCY_ENABLE_FLAG');
3299 
3300          IF pv_API_return_code > 0 THEN
3301 
3302             FEM_ENGINES_PKG.Tech_Message
3303               (p_severity => pc_log_level_statement,
3304                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3305                              'validate_ledger.ilid7.',
3306                p_msg_text => 'raising Invalid_Ledger_ID');
3307 
3308             pv_attr_label := 'ENTERED_CRNCY_ENABLE_FLAG';
3309 
3310             RAISE Invalid_Ledger_ID;
3311 
3312          END IF;
3313 
3314          SELECT dim_attribute_varchar_member
3315          INTO pv_entered_crncy_flag
3316          FROM fem_ledgers_attr
3317          WHERE attribute_id  = pv_dim_attr_id
3318            AND version_id    = pv_dim_attr_ver_id
3319            AND ledger_id     = pv_ledger_id;
3320 
3321          FEM_ENGINES_PKG.Tech_Message
3322          (p_severity    => pc_log_level_statement,
3323           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3324                         'validate_ledger.pv_entered_crncy_flag',
3325           p_app_name => 'FEM',
3326           p_msg_name => 'FEM_GL_POST_204',
3327           p_token1   => 'VAR_NAME',
3328           p_value1   => 'pv_entered_crncy_flag',
3329           p_token2   => 'VAR_VAL',
3330           p_value2   => pv_entered_crncy_flag);
3331 
3332       EXCEPTION
3333          WHEN NO_DATA_FOUND THEN
3334 
3335             FEM_ENGINES_PKG.Tech_Message
3336               (p_severity => pc_log_level_statement,
3337                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3338                              'validate_ledger.ilid8.',
3339                p_msg_text => 'raising Invalid_Ledger_ID');
3340 
3341             pv_attr_label := 'ENTERED_CRNCY_ENABLE_FLAG';
3342 
3343             RAISE Invalid_Ledger_ID;
3344       END;
3345 
3346       BEGIN
3347 
3348       -- Get the Hierarchy Object Definition ID of the Time hierarchy assigned
3349       -- to the given ledger. It is stored as a row-based ledger attribute.
3350 
3351          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3352            (x_err_code    => pv_API_return_code,
3353             x_attr_id     => pv_dim_attr_id,
3354             x_ver_id      => pv_dim_attr_ver_id,
3355             p_dim_id      => pv_ledger_dim_id,
3356             p_attr_label  => 'CAL_PERIOD_HIER_OBJ_DEF_ID');
3357 
3358          IF pv_API_return_code> 0 THEN
3359 
3360             FEM_ENGINES_PKG.Tech_Message
3361               (p_severity => pc_log_level_statement,
3362                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3363                              'validate_ledger.ilid4.',
3364                p_msg_text => 'raising Invalid_Ledger_ID');
3365 
3366             pv_attr_label := 'CAL_PERIOD_HIER_OBJ_DEF_ID';
3367 
3368             RAISE Invalid_Ledger_ID;
3369 
3370          END IF;
3371 
3372          SELECT dim_attribute_numeric_member
3373          INTO pv_ledger_per_hier_obj_def_id
3374          FROM fem_ledgers_attr
3375          WHERE attribute_id  = pv_dim_attr_id
3376            AND version_id    = pv_dim_attr_ver_id
3377            AND ledger_id     = pv_ledger_id;
3378 
3379          FEM_ENGINES_PKG.Tech_Message
3380          (p_severity    => pc_log_level_statement,
3381           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3382                         'validate_ledger.pv_lph_odid',
3383           p_app_name => 'FEM',
3384           p_msg_name => 'FEM_GL_POST_204',
3385           p_token1   => 'VAR_NAME',
3386           p_value1   => 'pv_ledger_per_hier_obj_def_id',
3387           p_token2   => 'VAR_VAL',
3388           p_value2   => pv_ledger_per_hier_obj_def_id);
3389 
3390          SELECT object_id
3391          INTO pv_ledger_per_hier_obj_id
3392          FROM fem_object_definition_b
3393          WHERE object_definition_id = pv_ledger_per_hier_obj_def_id;
3394 
3395          FEM_ENGINES_PKG.Tech_Message
3396          (p_severity    => pc_log_level_statement,
3397           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3401           p_token1   => 'VAR_NAME',
3398                         'validate_ledger.pv_lph_oid',
3399           p_app_name => 'FEM',
3400           p_msg_name => 'FEM_GL_POST_204',
3402           p_value1   => 'pv_ledger_per_hier_obj_id',
3403           p_token2   => 'VAR_VAL',
3404           p_value2   => pv_ledger_per_hier_obj_id);
3405 
3406       EXCEPTION
3407          WHEN NO_DATA_FOUND THEN
3408 
3409             FEM_ENGINES_PKG.Tech_Message
3410               (p_severity => pc_log_level_statement,
3411                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3412                              'validate_ledger.ilid5.',
3413                p_msg_text => 'raising Invalid_Ledger_ID');
3414 
3415             pv_attr_label := 'CAL_PERIOD_HIER_OBJ_DEF_ID';
3416 
3417             RAISE Invalid_Ledger_ID;
3418       END;
3419 
3420       BEGIN
3421 
3422       -- Look up the Calendar ID for that hierarchy.
3423 
3424          SELECT calendar_id
3425          INTO pv_ledger_calendar_id
3426          FROM fem_hierarchies
3427          WHERE hierarchy_obj_id = pv_ledger_per_hier_obj_id;
3428 
3429          FEM_ENGINES_PKG.Tech_Message
3430          (p_severity    => pc_log_level_statement,
3431           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3432                         'validate_ledger.pv_ledger_calendar_id',
3433           p_app_name => 'FEM',
3434           p_msg_name => 'FEM_GL_POST_204',
3435           p_token1   => 'VAR_NAME',
3436           p_value1   => 'pv_ledger_calendar_id',
3437           p_token2   => 'VAR_VAL',
3438           p_value2   => TO_CHAR(pv_ledger_calendar_id));
3439 
3440       EXCEPTION
3441          WHEN NO_DATA_FOUND THEN
3442 
3443             FEM_ENGINES_PKG.Tech_Message
3444               (p_severity => pc_log_level_statement,
3445                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3446                              'validate_ledger.ilid6.',
3447                p_msg_text => 'raising Invalid_Ledger_ID');
3448 
3449             pv_attr_label := 'CAL_PERIOD_HIER_OBJ_DEF_ID';
3450 
3451             RAISE Invalid_Ledger_ID;
3452       END;
3453 
3454 
3455       BEGIN
3456 
3457       -- FEM-OGL Intg: Added to get the Ledger Functional Currency Code
3458      -- attribute of the Ledger ID and store it as a package variable.
3459 
3460          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3461            (x_err_code    => pv_API_return_code,
3462             x_attr_id     => pv_dim_attr_id,
3463             x_ver_id      => pv_dim_attr_ver_id,
3464             p_dim_id      => pv_ledger_dim_id,
3465             p_attr_label  => 'LEDGER_FUNCTIONAL_CRNCY_CODE');
3466 
3467          IF pv_API_return_code > 0 THEN
3468 
3469             FEM_ENGINES_PKG.Tech_Message
3470               (p_severity => pc_log_level_statement,
3471                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3472                              'validate_ledger.ilid9.',
3473                p_msg_text => 'raising Invalid_Ledger_ID');
3474 
3475             pv_attr_label := 'LEDGER_FUNCTIONAL_CRNCY_CODE';
3476 
3477             RAISE Invalid_Ledger_ID;
3478 
3479          END IF;
3480 
3481          SELECT dim_attribute_varchar_member
3482          INTO pv_func_ccy_code
3483          FROM fem_ledgers_attr
3484          WHERE attribute_id  = pv_dim_attr_id
3485            AND version_id    = pv_dim_attr_ver_id
3486            AND ledger_id     = pv_ledger_id;
3487 
3488          FEM_ENGINES_PKG.Tech_Message
3489          (p_severity => pc_log_level_statement,
3490           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3491                         'validate_ledger.pv_func_ccy_code',
3492           p_app_name => 'FEM',
3493           p_msg_name => 'FEM_GL_POST_204',
3494           p_token1   => 'VAR_NAME',
3495           p_value1   => 'pv_func_ccy_code',
3496           p_token2   => 'VAR_VAL',
3497           p_value2   => pv_func_ccy_code);
3498 
3499       EXCEPTION
3500          WHEN NO_DATA_FOUND THEN
3501 
3502             FEM_ENGINES_PKG.Tech_Message
3503               (p_severity => pc_log_level_statement,
3504                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3505                              'validate_ledger.ilid10.',
3506                p_msg_text => 'raising Invalid_Ledger_ID');
3507 
3508             pv_attr_label := 'LEDGER_FUNCTIONAL_CRNCY_CODE';
3509 
3510             RAISE Invalid_Ledger_ID;
3511       END;
3512 
3513       BEGIN
3514 
3515       -- FEM-OGL Intg: Added to get the Global Value Set Combination ID
3516      -- attribute of the Ledger ID and store it as a package variable.
3517 
3518          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3519            (x_err_code    => pv_API_return_code,
3520             x_attr_id     => pv_dim_attr_id,
3521             x_ver_id      => pv_dim_attr_ver_id,
3522             p_dim_id      => pv_ledger_dim_id,
3523             p_attr_label  => 'GLOBAL_VS_COMBO');
3524 
3525          IF pv_API_return_code > 0 THEN
3526 
3527             FEM_ENGINES_PKG.Tech_Message
3528               (p_severity => pc_log_level_statement,
3529                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3530                              'validate_ledger.ilid11.',
3531                p_msg_text => 'raising Invalid_Ledger_ID');
3532 
3533             pv_attr_label := 'GLOBAL_VS_COMBO';
3534 
3535             RAISE Invalid_Ledger_ID;
3536 
3540          INTO pv_global_vs_combo_id
3537          END IF;
3538 
3539          SELECT dim_attribute_numeric_member
3541          FROM fem_ledgers_attr
3542          WHERE attribute_id  = pv_dim_attr_id
3543            AND version_id    = pv_dim_attr_ver_id
3544            AND ledger_id     = pv_ledger_id;
3545 
3546          FEM_ENGINES_PKG.Tech_Message
3547          (p_severity => pc_log_level_statement,
3548           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3549                         'validate_ledger.pv_global_vs_combo_id',
3550           p_app_name => 'FEM',
3551           p_msg_name => 'FEM_GL_POST_204',
3552           p_token1   => 'VAR_NAME',
3553           p_value1   => 'pv_global_vs_combo_id',
3554           p_token2   => 'VAR_VAL',
3555           p_value2   => pv_global_vs_combo_id);
3556 
3557       EXCEPTION
3558          WHEN NO_DATA_FOUND THEN
3559 
3560             FEM_ENGINES_PKG.Tech_Message
3561               (p_severity => pc_log_level_statement,
3562                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3563                              'validate_ledger.ilid12.',
3564                p_msg_text => 'raising Invalid_Ledger_ID');
3565 
3566             pv_attr_label := 'GLOBAL_VS_COMBO';
3567 
3568             RAISE Invalid_Ledger_ID;
3569       END;
3570 
3571    -- Successful completion
3572 
3573       FEM_ENGINES_PKG.Tech_Message
3574         (p_severity => pc_log_level_procedure,
3575          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3576                        'validate_ledger.end',
3577          p_msg_text => 'END');
3578 
3579    EXCEPTION
3580 
3581       WHEN OTHERS THEN
3582 
3583       -- In case it's an unexpected exception
3584 
3585          pv_sqlerrm   := SQLERRM;
3586          pv_callstack := dbms_utility.format_call_stack;
3587 
3588       -- For all exceptions:
3589 
3590          pv_proc_name := 'validate_ledger';
3591 
3592          RAISE;
3593 
3594    END Validate_Ledger;
3595 -- =======================================================================
3596 
3597 
3598 -- =======================================================================
3599    PROCEDURE Validate_Object_Def_ID IS
3600 -- =======================================================================
3601 -- Purpose
3602 --    Validates the Object Def ID engine parameter and its Object ID
3603 -- History
3604 --    11-13-03  G Hall  Created
3605 --    01-26-04  G Hall  Added user privileges validation; added "AND
3606 --                      old_approved_copy_flag = 'N'";
3607 --    04-22-04  G Hall  Bug# 3585824: Commented out user/folder security
3608 --                      validation since there's no Folders Security
3609 --                      UI yet.
3610 --    11-16-04  L POON  Add changes for FEM-OGL Integration Project
3611 -- Notes
3612 --    Called by Validate_Engine_Parameters
3613 -- =======================================================================
3614 
3615       v_obj_approval_status_cd   fem_object_definition_b.approval_status_code%TYPE;
3616       v_folder_id                fem_object_catalog_b.folder_id%TYPE;
3617       v_ds_production_flag       fem_datasets_attr.dim_attribute_varchar_member%TYPE;
3618       v_rowcount                 PLS_INTEGER;
3619 
3620    BEGIN
3621 
3622       FEM_ENGINES_PKG.Tech_Message
3623         (p_severity => pc_log_level_procedure,
3624          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3625                        'validate_object_def_id.begin',
3626          p_msg_text => 'BEGIN');
3627 
3628    -- --------------------------------------------------------------------
3629    -- Validate the Object Definition ID engine parameter by looking up the
3630    -- Object ID and set it in a package variable.
3631    -- --------------------------------------------------------------------
3632 
3633       BEGIN
3634 
3635          SELECT object_id, approval_status_code
3636          INTO pv_rule_obj_id, v_obj_approval_status_cd
3637          FROM fem_object_definition_b
3638          WHERE object_definition_id   = pv_rule_obj_def_id
3639            AND old_approved_copy_flag = 'N';
3640 
3641          FEM_ENGINES_PKG.Tech_Message
3642          (p_severity    => pc_log_level_statement,
3643           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3644                         'validate_object_def_id.pv_rule_obj_id',
3645           p_app_name => 'FEM',
3646           p_msg_name => 'FEM_GL_POST_204',
3647           p_token1   => 'VAR_NAME',
3648           p_value1   => 'pv_rule_obj_id',
3649           p_token2   => 'VAR_VAL',
3650           p_value2   => TO_CHAR(pv_rule_obj_id));
3651 
3652          FEM_ENGINES_PKG.Tech_Message
3653          (p_severity    => pc_log_level_statement,
3654           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3655                         'validate_object_def_id.v_obj_approval_status_cd',
3656           p_app_name => 'FEM',
3657           p_msg_name => 'FEM_GL_POST_204',
3658           p_token1   => 'VAR_NAME',
3659           p_value1   => 'v_obj_approval_status_cd',
3660           p_token2   => 'VAR_VAL',
3661           p_value2   => v_obj_approval_status_cd);
3662 
3663       EXCEPTION
3664          WHEN NO_DATA_FOUND THEN
3665 
3666             FEM_ENGINES_PKG.Tech_Message
3667               (p_severity => pc_log_level_statement,
3668                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3669                              'validate_object_def_id.iodid1.',
3673       END;
3670                p_msg_text => 'raising Invalid_Object_Def_ID');
3671 
3672             RAISE Invalid_Object_Def_ID;
3674 
3675    -- --------------------------------------------------------------------
3676    -- Get the Object Type Code and the Folder ID for the rule.
3677    -- --------------------------------------------------------------------
3678 
3679       BEGIN
3680 
3681          SELECT object_type_code, folder_id
3682          INTO pv_obj_type_cd, v_folder_id
3683          FROM fem_object_catalog_b
3684          WHERE object_id = pv_rule_obj_id;
3685 
3686          FEM_ENGINES_PKG.Tech_Message
3687          (p_severity    => pc_log_level_statement,
3688           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3689                         'validate_object_def_id.pv_obj_type_cd',
3690           p_app_name => 'FEM',
3691           p_msg_name => 'FEM_GL_POST_204',
3692           p_token1   => 'VAR_NAME',
3693           p_value1   => 'pv_obj_type_cd',
3694           p_token2   => 'VAR_VAL',
3695           p_value2   => pv_obj_type_cd);
3696 
3697          FEM_ENGINES_PKG.Tech_Message
3698          (p_severity    => pc_log_level_statement,
3699           p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3700                         'validate_object_def_id.v_folder_id',
3701           p_app_name => 'FEM',
3702           p_msg_name => 'FEM_GL_POST_204',
3703           p_token1   => 'VAR_NAME',
3704           p_value1   => 'v_folder_id',
3705           p_token2   => 'VAR_VAL',
3706           p_value2   => TO_CHAR(v_folder_id));
3707 
3708       EXCEPTION
3709          WHEN NO_DATA_FOUND THEN
3710 
3711             FEM_ENGINES_PKG.Tech_Message
3712               (p_severity => pc_log_level_statement,
3713                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3714                              'validate_object_def_id.iobj1.',
3715                p_msg_text => 'raising Invalid_Object_ID');
3716 
3717             RAISE Invalid_Object_ID;
3718       END;
3719 
3720    -- --------------------------------------------------------------------
3721    -- Validate that the user has privileges to execute this rule.
3722    -- Commented out per Bug# 3585824
3723    -- --------------------------------------------------------------------
3724 
3725    -- FEM-OGL Intg: Folder Security is ready, so uncomment the following codes
3726    -- removed code
3727 
3728    -- FEM-OGL Intg: Since workflow is not implemented for OGL, the following
3729    -- codes will be only executed for XGL for this release.
3730    IF pv_obj_type_cd = 'XGL_INTEGRATION' THEN
3731 
3732    -- --------------------------------------------------------------------
3733    -- Validate that the approval status of the Object Definition is
3734    -- compatible with the Dataset's production status.
3735    -- --------------------------------------------------------------------
3736 
3737       BEGIN
3738 
3739          fem_dimension_util_pkg.get_dim_attr_id_ver_id
3740            (x_err_code    => pv_API_return_code,
3741             x_attr_id     => pv_dim_attr_id,
3742             x_ver_id      => pv_dim_attr_ver_id,
3743             p_dim_id      => pv_dataset_dim_id,
3744             p_attr_label  => 'PRODUCTION_FLAG');
3745 
3746          IF pv_API_return_code > 0 THEN
3747 
3748             FEM_ENGINES_PKG.Tech_Message
3749               (p_severity => pc_log_level_statement,
3753 
3750                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3751                              'validate_object_def_id.idsc5.',
3752                p_msg_text => 'raising Invalid_Dataset_Code');
3754             v_ds_production_flag := 'N';
3755 
3756          END IF;
3757 
3758          SELECT dim_attribute_varchar_member
3759          INTO v_ds_production_flag
3760          FROM fem_datasets_attr
3761          WHERE attribute_id  = pv_dim_attr_id
3762            AND version_id    = pv_dim_attr_ver_id
3763            AND dataset_code  = pv_dataset_code;
3764 
3765       EXCEPTION
3766          WHEN NO_DATA_FOUND THEN
3767             v_ds_production_flag := 'N';
3768       END;
3769 
3770    -- If the Dataset is in "Production" status, then the Object definition
3771    -- must be in "Approved" status
3772 
3773       IF (v_ds_production_flag = 'Y') AND
3774          (v_obj_approval_status_cd <> 'APPROVED') THEN
3775 
3776          FEM_ENGINES_PKG.Tech_Message
3777            (p_severity => pc_log_level_statement,
3778             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3779                           'validate_object_def_id.ioas1.',
3780             p_msg_text => 'raising Invalid_Obj_Approval_Status');
3781 
3782          RAISE Invalid_Obj_Approval_Status;
3783 
3784       END IF;
3785 
3786    END IF; -- IF pv_obj_type_cd = 'XGL_INTEGRATION' THEN
3787 
3788    -- Successful completion
3789       FEM_ENGINES_PKG.Tech_Message
3790         (p_severity => pc_log_level_procedure,
3791          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3792                        'validate_object_def_id.end',
3793          p_msg_text => 'END');
3794 
3795    EXCEPTION
3796 
3797       WHEN OTHERS THEN
3798 
3799       -- In case it's an unexpected exception
3800 
3801          pv_sqlerrm   := SQLERRM;
3802          pv_callstack := dbms_utility.format_call_stack;
3803 
3804       -- For all exceptions:
3805 
3806          pv_proc_name := 'validate_object_def_id';
3807 
3808          RAISE;
3809 
3810    END Validate_Object_Def_ID;
3811 -- =======================================================================
3812 
3813 
3814 -- =======================================================================
3815    PROCEDURE Validate_Engine_Parameters
3816                (x_completion_code OUT NOCOPY NUMBER) IS
3817 -- =======================================================================
3818 -- Purpose
3819 --    Validates the dimension-based engine parameters that are common
3820 --    to both the XGL and the OGL engines, and sets additional package
3821 --    variables that are common to both.
3822 -- History
3823 --    11-13-03  G Hall  Created
3824 --    01-26-04  G Hall  Added pv_pgm_app_id; added validation for
3825 --                      Budget ID OR Encumbrance Type, not both;
3826 --    01-27-04  G Hall  Modified call to Get_Proc_Key_Info.
3827 --    02-16-04  G Hall  Enhanced validation for Budget and Encumbrance
3828 --                      parameters.
3829 --    05-07-04  G Hall  Bug# 3597527: Removed call to Get_Proc_Key_Info.
3830 --    05-25-04  G Hall  Removed Value_Set_ID_Error exception; moved it
3831 --                      to Get_Proc_Key_Info and modified it for passing
3832 --                      back a status and message to Main.
3833 --    05-28-04  G Hall  Bug# 3659504: Swapped order of calls to
3834 --                      Validate_Cal_Period and Validate_Ledger.
3835 --    03-30-06  G Hall  Bug# 5121111: Added specific error handling to
3836 --                      Invalid_DS_Bal_Type for Budget and Encumbrance.
3837 -- Arguments
3838 --    x_completion_code Returns 0 for success, 1 for warning, 2 for failure.
3839 -- Notes
3840 --    Called by Validate_XGL_Eng_Parameters
3841 --    (and by Validate_OGL_Eng_Parameters)
3842 -- =======================================================================
3843 
3844       v_dim_name1                   fem_dimensions_tl.dimension_name%TYPE;
3845       v_dim_name2                   fem_dimensions_tl.dimension_name%TYPE;
3846       v_attr_name                   fem_dim_attributes_tl.attribute_name%TYPE;
3847       v_precedent_dataset_name      fem_datasets_tl.dataset_name%TYPE;
3848       v_ds_balance_type_name        fem_ds_balance_types_tl.ds_balance_type_name%TYPE;
3849       v_budget_name                 fem_budgets_tl.budget_name%TYPE;
3850       v_enc_type_name               fem_encumbrance_types_tl.encumbrance_type_name%TYPE;
3851       v_ds_balance_type_string      VARCHAR2(300);
3852 
3853    BEGIN
3854 
3855       x_completion_code := 2;
3856       pv_proc_name  := 'validate_engine_parameters';
3857       pv_attr_label := NULL;
3858 
3859       FEM_ENGINES_PKG.Tech_Message
3860         (p_severity => pc_log_level_procedure,
3861          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3862                        'validate_engine_parameters.begin',
3863          p_msg_text => 'BEGIN');
3864 
3865    --------------------------------------------------------------------------
3866    -- Validate the execution mode parameter
3867    --------------------------------------------------------------------------
3868 
3869       IF pv_exec_mode NOT IN ('S', 'I', 'E') THEN
3870 
3871       -- Execution mode is invalid
3872 
3873          FEM_ENGINES_PKG.Tech_Message
3874            (p_severity => pc_log_level_statement,
3875             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3876                           'validate_engine_parameters.iem',
3880 
3877             p_msg_text => 'raising Invalid_Execution_Mode');
3878 
3879          RAISE Invalid_Execution_Mode;
3881       END IF;
3882 
3883    --------------------------------------------------------------------------
3884    -- Set package variables common to both XGL and OGL Posting engines
3885    -- and log debug messages to display their values.
3886    --------------------------------------------------------------------------
3887 
3888       pv_req_id       := FND_GLOBAL.Conc_Request_Id;
3889       pv_user_id      := FND_GLOBAL.User_Id;
3890       pv_login_id     := FND_GLOBAL.Login_Id;
3891       pv_pgm_id       := FND_GLOBAL.Conc_Program_Id;
3892       pv_pgm_app_id   := FND_GLOBAL.Prog_Appl_ID;
3893 
3894       FEM_ENGINES_PKG.Tech_Message
3895       (p_severity    => pc_log_level_statement,
3896        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3897                      'validate_engine_parameters.pv_req_id',
3898        p_app_name => 'FEM',
3899        p_msg_name => 'FEM_GL_POST_204',
3900        p_token1   => 'VAR_NAME',
3901        p_value1   => 'pv_req_id',
3902        p_token2   => 'VAR_VAL',
3903        p_value2   => TO_CHAR(pv_req_id));
3904 
3905       FEM_ENGINES_PKG.Tech_Message
3906       (p_severity    => pc_log_level_statement,
3907        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3908                      'validate_engine_parameters.pv_user_id',
3909        p_app_name => 'FEM',
3910        p_msg_name => 'FEM_GL_POST_204',
3911        p_token1   => 'VAR_NAME',
3912        p_value1   => 'pv_user_id',
3913        p_token2   => 'VAR_VAL',
3914        p_value2   => TO_CHAR(pv_user_id));
3915 
3916       FEM_ENGINES_PKG.Tech_Message
3917       (p_severity    => pc_log_level_statement,
3918        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3919                      'validate_engine_parameters.pv_login_id',
3920        p_app_name => 'FEM',
3921        p_msg_name => 'FEM_GL_POST_204',
3922        p_token1   => 'VAR_NAME',
3923        p_value1   => 'pv_login_id',
3924        p_token2   => 'VAR_VAL',
3925        p_value2   => TO_CHAR(pv_login_id));
3926 
3927       FEM_ENGINES_PKG.Tech_Message
3928       (p_severity    => pc_log_level_statement,
3929        p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3930                      'validate_engine_parameters.pv_pgm_id',
3931        p_app_name => 'FEM',
3932        p_msg_name => 'FEM_GL_POST_204',
3933        p_token1   => 'VAR_NAME',
3934        p_value1   => 'pv_pgm_id',
3935        p_token2   => 'VAR_VAL',
3936        p_value2   => TO_CHAR(pv_pgm_id));
3937 
3938    --------------------------------------------------------------------------
3939    -- Populate dimension ID package variables
3940    --------------------------------------------------------------------------
3941 
3942       Get_Dim_IDs;
3943 
3944    --------------------------------------------------------------------------
3945    -- Validate the p_dataset_code engine parameter.
3946    --------------------------------------------------------------------------
3947 
3948       Validate_Dataset;
3949 
3950    --------------------------------------------------------------------------
3951    -- Validate the p_xgl_obj_def_id parameter and look up and set any
3952    -- object_related package variables.
3953    --------------------------------------------------------------------------
3954 
3955       Validate_Object_Def_ID;
3956 
3957    --------------------------------------------------------------------------
3958    -- Validate the p_ledger_id engine parameter and look up the Calendar ID
3959    -- assigned to it for comparison with the Calendar ID for the period.
3960    --------------------------------------------------------------------------
3961 
3962       Validate_Ledger;
3963 
3964    --------------------------------------------------------------------------
3965    -- Validate the p_cal_period_id engine parameter and look up and set the
3966    -- period-related package variables.
3967    --------------------------------------------------------------------------
3968 
3969       Validate_Cal_Period;
3970 
3971    --------------------------------------------------------------------------
3972    -- Validate the Budget ID and Encumbrance Type ID engine parameters if
3973    -- applicable.
3974    --------------------------------------------------------------------------
3975 
3976       IF pv_ds_balance_type_cd = 'ACTUAL' THEN
3977 
3978          IF (pv_budget_id IS NOT NULL) OR
3979             (pv_enc_type_id IS NOT NULL) THEN
3980 
3981             FEM_ENGINES_PKG.Tech_Message
3982               (p_severity => pc_log_level_error,
3983                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
3984                              'validate_engine_parameters.budget_enc_ignored',
3985                p_app_name => 'FEM',
3986                p_msg_name => 'FEM_GL_POST_023');
3987 
3988             FEM_ENGINES_PKG.User_Message
3989               (p_app_name => 'FEM',
3990                p_msg_name => 'FEM_GL_POST_023');
3991 
3992             pv_budget_id      := NULL;
3993             pv_enc_type_id    := NULL;
3994             x_completion_code := 1;
3995 
3996          END IF;
3997 
3998       ELSIF pv_ds_balance_type_cd = 'BUDGET' THEN
3999 
4000          Validate_Budget;
4001 
4002          IF pv_enc_type_id IS NOT NULL THEN
4003 
4004             FEM_ENGINES_PKG.Tech_Message
4005               (p_severity => pc_log_level_error,
4009                p_msg_name => 'FEM_GL_POST_020');
4006                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4007                              'validate_engine_parameters.enc_type_ignored',
4008                p_app_name => 'FEM',
4010 
4011             FEM_ENGINES_PKG.User_Message
4012               (p_app_name => 'FEM',
4013                p_msg_name => 'FEM_GL_POST_020');
4014 
4015             pv_enc_type_id    := NULL;
4016             x_completion_code := 1;
4017 
4018          END IF;
4019 
4020       ELSIF pv_ds_balance_type_cd = 'ENCUMBRANCE' THEN
4021 
4022          Validate_Encumbrance_Type;
4023 
4024          IF pv_budget_id IS NOT NULL THEN
4025 
4026             FEM_ENGINES_PKG.Tech_Message
4027               (p_severity => pc_log_level_error,
4028                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4029                              'validate_engine_parameters.budget_id_ignored',
4030                p_app_name => 'FEM',
4031                p_msg_name => 'FEM_GL_POST_021');
4032 
4033             FEM_ENGINES_PKG.User_Message
4034               (p_app_name => 'FEM',
4035                p_msg_name => 'FEM_GL_POST_021');
4036 
4037             pv_budget_id      := NULL;
4038             x_completion_code := 1;
4039 
4040          END IF;
4041 
4042       END IF;
4043 
4044       Validate_DS_Bal_Type;
4045 
4046    --------------------------------------------------------------------------
4047    -- Successful completion
4048    --------------------------------------------------------------------------
4049 
4050       IF x_completion_code <> 1 THEN
4051          x_completion_code := 0;
4052       END IF;
4053 
4054       FEM_ENGINES_PKG.Tech_Message
4055         (p_severity => pc_log_level_procedure,
4056          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4057                        'validate_engine_parameters.end',
4058          p_msg_text => 'END');
4059 
4060    EXCEPTION
4061    ------------------------------------------------------------------
4062    -- For each exception, try to get the translated names for the
4063    -- dimensions (parameters) and dimension attributes used as
4064    -- tokens in the messages logged to FND_LOG and Concurrent
4065    -- Request Log.
4066    ------------------------------------------------------------------
4067 
4068       WHEN Invalid_Budget_ID THEN
4069       ------------------------------------------------------------------
4070       -- Invalid Budget parameter: Value not found or
4071       -- Budget attribute "Budget Ledger" not set.
4072       ------------------------------------------------------------------
4073 
4074          v_dim_name1 := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
4075                            (p_dim_id => pv_budget_dim_id);
4076 
4077          IF v_dim_name1 IS NULL THEN
4078             v_dim_name1 := 'Budget';
4079          END IF;
4080 
4081          v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
4082                            (p_dim_id     => pv_budget_dim_id,
4083                             p_attr_label => 'BUDGET_LEDGER');
4084 
4085          IF v_attr_name IS NULL THEN
4086             v_attr_name := 'Budget Ledger';
4087          END IF;
4088 
4089          FEM_ENGINES_PKG.Tech_Message
4090            (p_severity => pc_log_level_error,
4091             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4092                           pv_proc_name || '.invalid_budget_id',
4093             p_app_name => 'FEM',
4094             p_msg_name => 'FEM_GL_POST_003',
4095             p_token1   => 'DIMENSION_NAME1',
4096             p_value1   => v_dim_name1,
4097             p_token2   => 'DIMENSION_NAME2',
4098             p_value2   => v_dim_name1,
4099             p_token3   => 'ATTRIBUTE_NAME',
4100             p_value3   => v_attr_name);
4101 
4102          FEM_ENGINES_PKG.User_Message
4103            (p_app_name => 'FEM',
4107             p_token2   => 'DIMENSION_NAME2',
4104             p_msg_name => 'FEM_GL_POST_003',
4105             p_token1   => 'DIMENSION_NAME1',
4106             p_value1   => v_dim_name1,
4108             p_value2   => v_dim_name1,
4109             p_token3   => 'ATTRIBUTE_NAME',
4110             p_value3   => v_attr_name);
4111 
4112       WHEN Invalid_Budget_or_Dataset THEN
4113       ------------------------------------------------------------------
4114       -- Invalid Budget or Dataset parameter: Budget does not match
4115       -- Dataset attribute "Budget ID".
4116       ------------------------------------------------------------------
4117 
4118          FEM_ENGINES_PKG.Tech_Message
4119            (p_severity => pc_log_level_error,
4120             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4121                           pv_proc_name || '.invalid_budget_or_dataset',
4122             p_app_name => 'FEM',
4123             p_msg_name => 'FEM_GL_POST_007');
4124 
4125          FEM_ENGINES_PKG.User_Message
4126            (p_app_name => 'FEM',
4127             p_msg_name => 'FEM_GL_POST_007');
4128 
4129       WHEN Invalid_Cal_Period_ID THEN
4130       ------------------------------------------------------------------
4131       -- Invalid Calendar Period parameter: Value not found or
4132       -- Calendar Period attributes not set.
4133       ------------------------------------------------------------------
4134 
4135          v_dim_name1 := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
4136                            (p_dim_id => pv_cal_per_dim_id);
4137 
4138          IF v_dim_name1 IS NULL THEN
4139             v_dim_name1 := 'Calendar Period';
4140          END IF;
4141 
4142          FEM_ENGINES_PKG.Tech_Message
4143            (p_severity => pc_log_level_error,
4144             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4145                           pv_proc_name || '.invalid_cal_period_id',
4146             p_app_name => 'FEM',
4147             p_msg_name => 'FEM_GL_POST_002',
4148             p_token1   => 'DIMENSION_NAME1',
4149             p_value1   => v_dim_name1,
4150             p_token2   => 'DIMENSION_NAME2',
4151             p_value2   => v_dim_name1);
4152 
4153          FEM_ENGINES_PKG.User_Message
4154            (p_app_name => 'FEM',
4155             p_msg_name => 'FEM_GL_POST_002',
4156             p_token1   => 'DIMENSION_NAME1',
4157             p_value1   => v_dim_name1,
4158             p_token2   => 'DIMENSION_NAME2',
4159             p_value2   => v_dim_name1);
4160 
4161       WHEN Invalid_Dataset_Code THEN
4162       ------------------------------------------------------------------
4163       -- Invalid Dataset parameter: Value not found or Dataset
4164       -- attributes not set.
4165       ------------------------------------------------------------------
4166 
4167          v_dim_name1 := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
4168                            (p_dim_id => pv_dataset_dim_id);
4169 
4170          IF v_dim_name1 IS NULL THEN
4171             v_dim_name1 := 'Dataset';
4172          END IF;
4173 
4174          FEM_ENGINES_PKG.Tech_Message
4175            (p_severity => pc_log_level_error,
4176             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4177                           pv_proc_name || '.invalid_dataset_code',
4178             p_app_name => 'FEM',
4179             p_msg_name => 'FEM_GL_POST_002',
4180             p_token1   => 'DIMENSION_NAME1',
4184 
4181             p_value1   => v_dim_name1,
4182             p_token2   => 'DIMENSION_NAME2',
4183             p_value2   => v_dim_name1);
4185          FEM_ENGINES_PKG.User_Message
4186            (p_app_name => 'FEM',
4187             p_msg_name => 'FEM_GL_POST_002',
4188             p_token1   => 'DIMENSION_NAME1',
4189             p_value1   => v_dim_name1,
4190             p_token2   => 'DIMENSION_NAME2',
4191             p_value2   => v_dim_name1);
4192 
4193       WHEN Invalid_DS_Bal_Type THEN
4194       ------------------------------------------------------------------
4195       -- Invalid Dataset parameter: DS_BAL_TYPE_NAME data has already been loaded into
4196       -- Dataset PRECEDENT_DATASET_NAME for this Ledger and Calendar Period.  All DS_BAL_TYPE_NAME
4197       -- data for this Ledger and Calendar Period must be loaded into the same Dataset.
4198       ------------------------------------------------------------------
4199 
4200          BEGIN
4201             SELECT dataset_name
4202             INTO v_precedent_dataset_name
4203             FROM fem_datasets_vl
4204             WHERE dataset_code = pv_precedent_dataset_code;
4205          EXCEPTION
4206             WHEN OTHERS THEN
4207                v_precedent_dataset_name := TO_CHAR(pv_precedent_dataset_code);
4208          END;
4209 
4210          BEGIN
4211             SELECT ds_balance_type_name
4212             INTO v_ds_balance_type_name
4213             FROM fem_ds_balance_types_vl
4214             WHERE ds_balance_type_code = pv_ds_balance_type_cd;
4215          EXCEPTION
4216             WHEN OTHERS THEN
4217                v_ds_balance_type_name := pv_ds_balance_type_cd;
4218          END;
4219 
4220          IF pv_ds_balance_type_cd = 'ACTUAL' THEN
4221 
4222             v_ds_balance_type_string := v_ds_balance_type_name;
4223 
4224          ELSIF pv_ds_balance_type_cd = 'BUDGET' THEN
4225 
4226             BEGIN
4227                SELECT budget_name
4228                INTO v_budget_name
4229                FROM fem_budgets_vl
4230                WHERE budget_id = pv_budget_id;
4231             EXCEPTION
4232                WHEN OTHERS THEN
4233                   v_budget_name := TO_CHAR(pv_budget_id);
4234             END;
4235 
4236             v_ds_balance_type_string := v_ds_balance_type_name || ' ' || v_budget_name;
4237 
4238          ELSIF pv_ds_balance_type_cd = 'ENCUMBRANCE' THEN
4239 
4240             BEGIN
4241                SELECT encumbrance_type_name
4242                INTO v_enc_type_name
4243                FROM fem_encumbrance_types_vl
4244                WHERE encumbrance_type_id = pv_enc_type_id;
4245             EXCEPTION
4246                WHEN OTHERS THEN
4247                   v_enc_type_name := TO_CHAR(pv_enc_type_id);
4248             END;
4249 
4250             v_ds_balance_type_string := v_ds_balance_type_name || ' ' || v_enc_type_name;
4251 
4252          END IF;
4253 
4254          FEM_ENGINES_PKG.Tech_Message
4255            (p_severity => pc_log_level_error,
4256             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4257                           pv_proc_name || '.invalid_dataset_code',
4258             p_app_name => 'FEM',
4259             p_msg_name => 'FEM_GL_POST_026',
4260             p_token1   => 'DS_BAL_TYPE_NAME',
4261             p_value1   => v_ds_balance_type_string,
4262             p_token2   => 'PRECEDENT_DATASET_NAME',
4263             p_value2   => v_precedent_dataset_name);
4264 
4265          FEM_ENGINES_PKG.User_Message
4266            (p_app_name => 'FEM',
4267             p_msg_name => 'FEM_GL_POST_026',
4268             p_token1   => 'DS_BAL_TYPE_NAME',
4269             p_value1   => v_ds_balance_type_string,
4270             p_token2   => 'PRECEDENT_DATASET_NAME',
4271             p_value2   => v_precedent_dataset_name);
4272 
4273       WHEN Invalid_Enc_Type_ID THEN
4274       ------------------------------------------------------------------
4278          v_dim_name1 := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
4275       -- Invalid Encumbrance Type parameter: Value not found.
4276       ------------------------------------------------------------------
4277 
4279                            (p_dim_id => pv_enc_type_dim_id);
4280 
4281          IF v_dim_name1 IS NULL THEN
4282             v_dim_name1 := 'Encumbrance Type';
4283          END IF;
4284 
4285          FEM_ENGINES_PKG.Tech_Message
4286            (p_severity => pc_log_level_error,
4287             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4288                           pv_proc_name || '.invalid_enc_type_id',
4289             p_app_name => 'FEM',
4290             p_msg_name => 'FEM_GL_POST_001',
4291             p_token1   => 'DIMENSION_NAME',
4292             p_value1   => v_dim_name1);
4293 
4294          FEM_ENGINES_PKG.User_Message
4295            (p_app_name => 'FEM',
4296             p_msg_name => 'FEM_GL_POST_001',
4297             p_token1   => 'DIMENSION_NAME',
4298             p_value1   => v_dim_name1);
4299 
4300       WHEN Invalid_Enc_or_Dataset THEN
4301       ------------------------------------------------------------------
4302       -- Invalid Encumbrance Type or Dataset parameter: Encumbrance Type
4303       -- does not match Dataset attribute "Dataset Encumbrance Type ID".
4304       ------------------------------------------------------------------
4305 
4306          FEM_ENGINES_PKG.Tech_Message
4307            (p_severity => pc_log_level_error,
4308             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4309                           pv_proc_name || '.invalid_enc_or_dataset',
4310             p_app_name => 'FEM',
4311             p_msg_name => 'FEM_GL_POST_009');
4312 
4313          FEM_ENGINES_PKG.User_Message
4314            (p_app_name => 'FEM',
4315             p_msg_name => 'FEM_GL_POST_009');
4316 
4317       WHEN Invalid_Execution_Mode THEN
4318       ------------------------------------------------------------------
4319       -- Invalid Execution Mode.  Valid values are 'S' (Snapshot), 'I'
4320       -- (Incremental), and 'E' (Error Reprocessing Only).
4321       ------------------------------------------------------------------
4322 
4323          FEM_ENGINES_PKG.Tech_Message
4324            (p_severity => fnd_log.level_error,
4325             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4326                           pv_proc_name || '.invalid_exec_mode',
4327             p_app_name => 'FEM',
4328             p_msg_name => 'FEM_GL_POST_014');
4329 
4330          FEM_ENGINES_PKG.Put_Message
4331            (p_app_name => 'FEM',
4332             p_msg_name => 'FEM_GL_POST_014');
4333 
4334       WHEN Invalid_Ledger_ID THEN
4335       ------------------------------------------------------------------
4336       -- Invalid Ledger parameter: Value not found or Ledger attributes
4337       -- not set.
4338       ------------------------------------------------------------------
4339 
4340          -- FEM-OGL Intg: It should pass the ledger dim id instead of ledger id
4341        --               so replaced pv_ledger_id to pv_ledger_dim_id
4342          v_dim_name1 := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
4343                            (p_dim_id => pv_ledger_dim_id);
4344 
4345          IF v_dim_name1 IS NULL THEN
4346             v_dim_name1 := 'Ledger';
4347          END IF;
4348 
4349          IF pv_attr_label IS NULL THEN
4350 
4351             FEM_ENGINES_PKG.Tech_Message
4352               (p_severity => pc_log_level_error,
4353                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4354                              pv_proc_name || '.invalid_ledger_id',
4355                p_app_name => 'FEM',
4356                p_msg_name => 'FEM_GL_POST_001',
4357                p_token1   => 'DIMENSION_NAME',
4358                p_value1   => v_dim_name1);
4359 
4360             FEM_ENGINES_PKG.User_Message
4361               (p_app_name => 'FEM',
4362                p_msg_name => 'FEM_GL_POST_001',
4363                p_token1   => 'DIMENSION_NAME',
4364                p_value1   => v_dim_name1);
4365 
4366          ELSE
4367 
4368             v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
4369                               (p_dim_id     => pv_ledger_dim_id,
4370                                p_attr_label => pv_attr_label);
4371 
4372             IF v_attr_name IS NULL THEN
4373                v_attr_name := pv_attr_label;
4374             END IF;
4375 
4376             FEM_ENGINES_PKG.Tech_Message
4377               (p_severity => pc_log_level_error,
4378                p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4379                              pv_proc_name || '.invalid_ledger_id',
4380                p_app_name => 'FEM',
4381                p_msg_name => 'FEM_GL_POST_003',
4382                p_token1   => 'DIMENSION_NAME1',
4383                p_value1   => v_dim_name1,
4384                p_token2   => 'DIMENSION_NAME2',
4385                p_value2   => v_dim_name1,
4386                p_token3   => 'ATTRIBUTE_NAME',
4387                p_value3   => v_attr_name);
4388 
4389             FEM_ENGINES_PKG.User_Message
4390               (p_app_name => 'FEM',
4391                p_msg_name => 'FEM_GL_POST_003',
4392                p_token1   => 'DIMENSION_NAME1',
4393                p_value1   => v_dim_name1,
4394                p_token2   => 'DIMENSION_NAME2',
4395                p_value2   => v_dim_name1,
4396                p_token3   => 'ATTRIBUTE_NAME',
4400 
4397                p_value3   => v_attr_name);
4398 
4399          END IF;
4401       WHEN Invalid_Obj_Approval_Status THEN
4402       ------------------------------------------------------------------
4403       -- Cannot process a "production" Dataset using an Object
4404       -- Definition that is not in "approved" status.
4405       ------------------------------------------------------------------
4406 
4407          FEM_ENGINES_PKG.Tech_Message
4408            (p_severity => pc_log_level_error,
4409             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4410                           pv_proc_name || '.invalid_obj_approval_status',
4411             p_app_name => 'FEM',
4412             p_msg_name => 'FEM_GL_POST_005');
4413 
4414          FEM_ENGINES_PKG.User_Message
4415            (p_app_name => 'FEM',
4416             p_msg_name => 'FEM_GL_POST_005');
4417 
4418       WHEN Invalid_Object_ID THEN
4419       ------------------------------------------------------------------
4420       -- Invalid External GL Integration Rule:  Value not found or rule
4421       -- has the wrong Object Type.
4422       ------------------------------------------------------------------
4423 
4424          FEM_ENGINES_PKG.Tech_Message
4425            (p_severity => pc_log_level_error,
4426             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4427                           pv_proc_name || '.invalid_object_def_id',
4428             p_app_name => 'FEM',
4429             p_msg_name => 'FEM_GL_POST_010');
4430 
4431          FEM_ENGINES_PKG.User_Message
4432            (p_app_name => 'FEM',
4433             p_msg_name => 'FEM_GL_POST_010');
4434 
4435       WHEN Invalid_Object_Def_ID THEN
4436       ------------------------------------------------------------------
4437       -- Invalid Object Definition ID parameter: Value not found.
4438       ------------------------------------------------------------------
4439 
4440          FEM_ENGINES_PKG.Tech_Message
4441            (p_severity => pc_log_level_error,
4442             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4443                           pv_proc_name || '.invalid_object_def_id',
4444             p_app_name => 'FEM',
4445             p_msg_name => 'FEM_GL_POST_001',
4446             p_token1   => 'DIMENSION_NAME',
4447             p_value1   => 'FEM_OBJECT_DEF_ID_TXT',
4448             p_trans1   => 'Y');
4449 
4450          FEM_ENGINES_PKG.User_Message
4451            (p_app_name => 'FEM',
4452             p_msg_name => 'FEM_GL_POST_001',
4453             p_token1   => 'DIMENSION_NAME',
4454             p_value1   => 'FEM_OBJECT_DEF_ID_TXT',
4455             p_trans1   => 'Y');
4456 
4457       WHEN Ledger_Cal_NEQ_Period_Cal THEN
4458       ------------------------------------------------------------------
4459       -- Invalid Ledger or Calendar Period parameter:
4460       -- The Calendar assigned to the Ledger does not match
4461       -- the Calendar assigned to the Calendar Period.
4462       ------------------------------------------------------------------
4463 
4464          FEM_ENGINES_PKG.Tech_Message
4465            (p_severity => pc_log_level_error,
4466             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4467                           pv_proc_name || '.ledger_cal_neq_period_cal',
4468             p_app_name => 'FEM',
4469             p_msg_name => 'FEM_GL_POST_006');
4470 
4471          FEM_ENGINES_PKG.User_Message
4472            (p_app_name => 'FEM',
4473             p_msg_name => 'FEM_GL_POST_006');
4474 
4475       WHEN User_Not_Allowed THEN
4476       ------------------------------------------------------------------
4477       -- The current user is not allowed to execute this rule.  The
4478       -- user must have access to the folder containing the rule.
4479       ------------------------------------------------------------------
4480 
4481          FEM_ENGINES_PKG.Tech_Message
4482            (p_severity => pc_log_level_error,
4483             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4484                           pv_proc_name || '.user_not_allowed',
4485             p_app_name => 'FEM',
4486             p_msg_name => 'FEM_GL_POST_011');
4487 
4488          FEM_ENGINES_PKG.User_Message
4489            (p_app_name => 'FEM',
4490             p_msg_name => 'FEM_GL_POST_011');
4491 
4492       WHEN OTHERS THEN
4493       ------------------------------------------------------------------
4494       -- Unexpected exceptions
4495       ------------------------------------------------------------------
4496          IF pv_proc_name = 'validate_engine_parameters' THEN
4497 
4498             pv_sqlerrm   := SQLERRM;
4499             pv_callstack := dbms_utility.format_call_stack;
4500 
4501          END IF;
4502 
4503       -- Log the call stack and the Oracle error message to
4504       -- FND_LOG with the "unexpected exception" severity level.
4505 
4506          FEM_ENGINES_PKG.Tech_Message
4507            (p_severity => pc_log_level_unexpected,
4508             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4509                           pv_proc_name || '.unexpected_exception',
4510             p_msg_text => pv_sqlerrm);
4511 
4512          FEM_ENGINES_PKG.Tech_Message
4513            (p_severity => pc_log_level_unexpected,
4514             p_module   => 'fem.plsql.fem_gl_post_process_pkg.' ||
4515                           pv_proc_name || '.unexpected_exception',
4516             p_msg_text => pv_callstack);
4517 
4521            (p_app_name => 'FEM',
4518       -- Log the Oracle error message to the Concurrent Request Log.
4519 
4520          FEM_ENGINES_PKG.User_Message
4522             p_msg_text => pv_sqlerrm);
4523 
4524    END Validate_Engine_Parameters;
4525 -- =======================================================================
4526 
4527 -- =======================================================================
4528   PROCEDURE Validate_OGL_Eng_Parameters
4529                 (p_bal_rule_obj_def_id     IN            NUMBER,
4530                  p_from_period             IN            VARCHAR2,
4531                  p_to_period               IN            VARCHAR2,
4532                  p_effective_date          IN OUT NOCOPY DATE,
4533                  p_bsv_range_low           IN            VARCHAR2,
4534                  p_bsv_range_high          IN            VARCHAR2,
4535                  x_generate_report_flag    OUT    NOCOPY VARCHAR2,
4536                  x_completion_code         OUT    NOCOPY NUMBER) IS
4537 -- =======================================================================
4538 -- Purpose
4539 --    Validate the input parameters and perform initialization for FEM-OGL
4540 --    Integration Balances Rule Engine
4541 -- History
4542 --    11-16-04  L Poon  Created
4543 --    02-07-05  L Poon  Bug fix 4170124: Added codes to populate the new
4544 --                      error Other_DS_Loaded for Actual balance type
4545 --    05-27-05  Hari    Bug fix 4294018 : Added code to check whether both
4546 --                      FEM: Signage Methodology Profile option value and
4547 --                      the SIGN attribute for the dimension
4548 --                      EXTENDED_ACCOUNT_TYPE is set.
4549 --    06-22-05  Hari    Bug 4394404 - Modified code so that the periods are
4550 --                      validated differently for Budget and Encumbrance
4551 --                      Balances Rules.
4552 -- Arguments
4553 --    All of the IN arguments are the same as the IN arguments for the
4554 --    FEM_INTG_BAL_RULE_ENG_PKG.Main procedure.
4555 --
4556 --    x_generate_report_flag   Returns 'Y' after updating the error code
4557 --                             of FEM_INTG_EXEC_PARARMS_GT i.e. indicating
4558 --                             report should be generated when erroring out
4559 --                             after this point
4560 --    x_completion_code        Returns 0 for success, 1 for warning, 2 for
4561 --                             failure.
4562 -- Notes
4563 --    Called from the beginning of FEM_INTG_BAL_RULE_ENG_PKG.Main
4564 -- =======================================================================
4565 
4566     v_module     VARCHAR2(100);
4567     v_func_name  VARCHAR2(80);
4568     v_dummy_flag VARCHAR2(1);
4569     v_count      NUMBER;
4570     v_signage_method VARCHAR2(50);
4571 
4572     v_dim_name   fem_dimensions_tl.dimension_name%TYPE;
4573     v_attr_name  fem_dim_attributes_tl.attribute_name%TYPE;
4574 
4575 
4576     OGLEngParam_FatalErr EXCEPTION;
4577 
4578   BEGIN
4579     v_module    := 'fem.plsql.fem_gl_post_process_pkg.validate_ogl_eng_parameters';
4580     v_func_name := 'FEM_GL_POST_PROCESS_PKG.Validate_OGL_Eng_Parameters';
4581 
4582     -- Log the function entry time to FND_LOG
4583     FEM_ENGINES_PKG.Tech_Message
4584       (p_severity => pc_log_level_procedure,
4585        p_module   => v_module,
4586        p_app_name => 'FEM',
4587        p_msg_name => 'FEM_GL_POST_201',
4588        p_token1   => 'FUNC_NAME',
4589        p_value1   => v_func_name,
4590        p_token2   => 'TIME',
4591        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
4592 
4593     -- -----------------------
4594     -- 1. Initialize variables
4595     -- -----------------------
4596     pv_num_rows        := 0;
4597     pv_proc_name      := 'validate_ogl_eng_parameters';
4598     pv_attr_label     := NULL;
4599     v_count           := 0;
4600     -- Bug 4394404 hkaniven start - package variable to store the no of valid rows
4601     pv_num_rows_valid := 0;
4602     -- Bug 4394404 hkaniven end - package variable to store the no of valid rows
4603 
4604     -- Set Request ID and then print its value to FND_LOG
4605     pv_req_id := FND_GLOBAL.Conc_Request_Id;
4606     FEM_ENGINES_PKG.Tech_Message
4607       (p_severity => pc_log_level_statement,
4608        p_module   => v_module,
4609        p_app_name => 'FEM',
4610        p_msg_name => 'FEM_GL_POST_204',
4611        p_token1   => 'VAR_NAME',
4612        p_value1   => 'pv_req_id',
4613        p_token2   => 'VAR_VAL',
4614        p_value2   => TO_CHAR(pv_req_id));
4615 
4616     -- Set User ID and then print its value to FND_LOG
4617     pv_user_id := FND_GLOBAL.User_Id;
4618     FEM_ENGINES_PKG.Tech_Message
4619       (p_severity => pc_log_level_statement,
4620        p_module   => v_module,
4621       p_app_name => 'FEM',
4622        p_msg_name => 'FEM_GL_POST_204',
4623        p_token1   => 'VAR_NAME',
4624        p_value1   => 'pv_user_id',
4625        p_token2   => 'VAR_VAL',
4626        p_value2   => TO_CHAR(pv_user_id));
4627 
4628     -- Set Login ID and then print its value to FND_LOG
4629     pv_login_id := FND_GLOBAL.Login_Id;
4630     FEM_ENGINES_PKG.Tech_Message
4631       (p_severity => pc_log_level_statement,
4632        p_module   => v_module,
4633        p_app_name => 'FEM',
4634        p_msg_name => 'FEM_GL_POST_204',
4635        p_token1   => 'VAR_NAME',
4636        p_value1   => 'pv_login_id',
4637        p_token2   => 'VAR_VAL',
4641     pv_pgm_id := FND_GLOBAL.Conc_Program_Id;
4638        p_value2   => TO_CHAR(pv_login_id));
4639 
4640     -- Set Concurrent Program ID and then print its value to FND_LOG
4642     FEM_ENGINES_PKG.Tech_Message
4643       (p_severity => pc_log_level_statement,
4644        p_module   => v_module,
4645        p_app_name => 'FEM',
4646        p_msg_name => 'FEM_GL_POST_204',
4647        p_token1   => 'VAR_NAME',
4648        p_value1   => 'pv_pgm_id',
4649        p_token2   => 'VAR_VAL',
4650        p_value2   => TO_CHAR(pv_pgm_id));
4651 
4652     -- Set Program Application ID and then print its value to FND_LOG
4653     pv_pgm_app_id := FND_GLOBAL.Prog_Appl_ID;
4654     FEM_ENGINES_PKG.Tech_Message
4655       (p_severity => pc_log_level_statement,
4656        p_module   => v_module,
4657        p_app_name => 'FEM',
4658        p_msg_name => 'FEM_GL_POST_204',
4659        p_token1   => 'VAR_NAME',
4660        p_value1   => 'pv_pgm_app_id',
4661        p_token2   => 'VAR_VAL',
4662        p_value2   => TO_CHAR(pv_pgm_app_id));
4663 
4664     -- Read the Signage profile option
4665     FND_PROFILE.GET('FEM_SIGNAGE_METHOD', v_signage_method);
4666 
4667     -- Bug 4294018 - hkaniven start - If Signage Methodology is not set,
4668     -- then error out
4669     IF (v_signage_method IS NULL)
4670     THEN
4671       -- Print the error message to FND_LOG and concurrent program log
4672       FEM_ENGINES_PKG.Tech_Message
4673         (p_severity => pc_log_level_event,
4674          p_module   => v_module,
4675          p_app_name => 'FEM',
4676          p_msg_name => 'FEM_INTG_BAL_SIGN_PROF_NOT_SET');
4677       FEM_ENGINES_PKG.User_Message
4678         (p_app_name => 'FEM',
4679          p_msg_name => 'FEM_INTG_BAL_SIGN_PROF_NOT_SET');
4680 
4681       RAISE OGLEngParam_FatalErr;
4682     END IF;
4683     -- Bug 4294018 - hkaniven end - If Signage Methodology is not set,
4684     -- then error out
4685 
4686     -- Bug 4294018 hkaniven start - Count the no of 'SIGN' attribute rows
4687     SELECT COUNT(*)
4688     INTO v_count
4689     FROM fem_dimensions_b fdb,
4690          fem_dim_attributes_b fdab,
4691          fem_dim_attr_versions_b fdavb,
4692          fem_ext_acct_types_attr feata
4693     WHERE fdb.dimension_varchar_label = 'EXTENDED_ACCOUNT_TYPE'
4694     AND   fdab.attribute_varchar_label = 'SIGN'
4695     AND   fdb.dimension_id = fdab.dimension_id
4696     AND   fdab.attribute_id = fdavb.attribute_id
4697     AND   fdavb.default_version_flag = 'Y'
4698     AND   fdab.attribute_id = feata.attribute_id
4699     AND   fdavb.version_id =  feata.version_id;
4700     -- Bug 4294018 hkaniven end - Count the no of 'SIGN' attribute rows
4701 
4702     -- Bug 4294018 hkaniven start - If no 'SIGN' attribute rows then error out
4703     IF v_count = 0 THEN
4704       FEM_ENGINES_PKG.Tech_Message
4705         (p_severity => pc_log_level_event,
4706          p_module   => v_module,
4707          p_app_name => 'FEM',
4708          p_msg_name => 'FEM_INTG_BAL_SIGN_CP_NOT_RUN');
4709       FEM_ENGINES_PKG.User_Message
4710         (p_app_name => 'FEM',
4711          p_msg_name => 'FEM_INTG_BAL_SIGN_CP_NOT_RUN');
4712 
4713       RAISE OGLEngParam_FatalErr;
4714     END IF;
4715     -- Bug 4294018 hkaniven end - If no 'SIGN' attribute rows then error out
4716 
4717     -- Log the signage method value
4718     FEM_ENGINES_PKG.Tech_Message
4719       (p_severity => pc_log_level_statement,
4720        p_module   => v_module,
4721        p_app_name => 'FEM',
4722        p_msg_name => 'FEM_GL_POST_204',
4723        p_token1   => 'VAR_NAME',
4724        p_value1   => 'v_signage_method',
4725        p_token2   => 'VAR_VAL',
4726        p_value2   => TO_CHAR(v_signage_method));
4727 
4728     -- Set Advanced Line Item and Financial Element Mappings Flag and then
4729     -- print its value to FND_LOG
4730     FND_PROFILE.GET('FEM_GL_ADV_MAPPING_FLAG', pv_adv_li_fe_mappings_flag);
4731 
4732     -- If it is not set, default it as 'N'
4733     IF (pv_adv_li_fe_mappings_flag IS NULL)
4734     THEN
4735       -- Print the warning message to FND_LOG and concurrent program log
4736       FEM_ENGINES_PKG.Tech_Message
4737         (p_severity => pc_log_level_event,
4738          p_module   => v_module,
4739          p_app_name => 'FEM',
4740          p_msg_name => 'FEM_INTG_BAL_DEFAULT_ADV_MAP');
4741       FEM_ENGINES_PKG.User_Message
4742         (p_app_name => 'FEM',
4743          p_msg_name => 'FEM_INTG_BAL_DEFAULT_ADV_MAP');
4744       -- Default it to No
4745       pv_adv_li_fe_mappings_flag := 'N';
4746     END IF;
4747 
4748     -- Log the advanced mapping flag value
4749     FEM_ENGINES_PKG.Tech_Message
4750       (p_severity => pc_log_level_statement,
4751        p_module   => v_module,
4752        p_app_name => 'FEM',
4753        p_msg_name => 'FEM_GL_POST_204',
4754        p_token1   => 'VAR_NAME',
4755        p_value1   => 'pv_adv_li_fe_mappings_flag',
4756        p_token2   => 'VAR_VAL',
4757        p_value2   => TO_CHAR(pv_adv_li_fe_mappings_flag));
4758 
4759     -- Find the OGL Source System Code
4760     SELECT SOURCE_SYSTEM_CODE
4761     INTO pv_gl_source_system_code
4762     FROM FEM_SOURCE_SYSTEMS_B
4763     WHERE SOURCE_SYSTEM_DISPLAY_CODE = 'OGL';
4764 
4765     FEM_ENGINES_PKG.Tech_Message
4766       (p_severity => pc_log_level_statement,
4767        p_module   => v_module,
4768        p_app_name => 'FEM',
4769        p_msg_name => 'FEM_GL_POST_204',
4770        p_token1   => 'VAR_NAME',
4774 
4771        p_value1   => 'pv_gl_source_system_code',
4772        p_token2   => 'VAR_VAL',
4773        p_value2   => pv_gl_source_system_code);
4775     -- -------------------------------------------------------
4776     -- 2. Retrieve and validate the Balances Rule and Rule Def
4777     -- -------------------------------------------------------
4778    BEGIN
4779       SELECT balRDef.BAL_RULE_OBJ_DEF_ID
4780            , objDefT.DISPLAY_NAME
4781            , balRule.BAL_RULE_OBJ_ID
4782            , balRule.LEDGER_ID
4783            , lgr.NAME
4784            , balRule.CHART_OF_ACCOUNTS_ID
4785            , flex.ID_FLEX_STRUCTURE_NAME
4786            , balRule.BAL_SEG_COLUMN_NAME
4787            , balRule.DS_BAL_TYPE_CODE
4788            , balRule.INCLUDE_AVG_BAL_FLAG
4789            , balRule.MAINTAIN_QTD_FLAG
4790            , DECODE(balRDef.LOAD_METHOD_CODE
4791             , 'SNAPSHOT', 'S'
4792             , 'INCREMENTAL', 'I')
4793            , balRDef.BAL_SEG_VALUE_OPTION_CODE
4794            , balRDef.CURRENCY_OPTION_CODE
4795            , balRDef.XLATED_BAL_OPTION_CODE
4796            , balRDef.ACTUAL_OUTPUT_DATASET_CODE
4797            , objDef.EFFECTIVE_START_DATE
4798            , objDef.EFFECTIVE_END_DATE
4799       INTO   pv_rule_obj_def_id
4800            , pv_rule_obj_def_name
4801            , pv_rule_obj_id
4802            , pv_ledger_id
4803            , pv_ledger_name
4804            , pv_coa_id
4805            , pv_coa_name
4806            , pv_bsv_app_col_name
4807            , pv_ds_balance_type_cd
4808            , pv_include_avg_bal
4809            , pv_maintain_qtd_flag
4810            , pv_exec_mode
4811            , pv_bsv_option
4812            , pv_curr_option
4813            , pv_xlated_bal_option
4814            , pv_dataset_code
4815            , pv_rule_eff_start_date
4816            , pv_rule_eff_end_date
4817       FROM   FEM_INTG_BAL_RULES balRule
4818            , FEM_INTG_BAL_RULE_DEFS balRDef
4819            , FEM_OBJECT_DEFINITION_B objDef
4820            , FEM_OBJECT_DEFINITION_TL objDefT
4821            , FND_ID_FLEX_STRUCTURES_TL flex
4822            , GL_LEDGERS lgr
4823       WHERE balRule.BAL_RULE_OBJ_ID = objDef.OBJECT_ID
4824       AND objDef.OBJECT_DEFINITION_ID = balRDef.BAL_RULE_OBJ_DEF_ID
4825       AND objDefT.OBJECT_DEFINITION_ID = objDef.OBJECT_DEFINITION_ID
4826       AND objDefT.LANGUAGE = USERENV('LANG')
4827       AND balRDef.BAL_RULE_OBJ_DEF_ID = p_bal_rule_obj_def_id
4828      AND flex.APPLICATION_ID = 101
4829      AND flex.ID_FLEX_CODE = 'GL#'
4830      AND flex.ID_FLEX_NUM = balRule.CHART_OF_ACCOUNTS_ID
4831       AND flex.LANGUAGE = USERENV('LANG')
4832      AND lgr.LEDGER_ID = balRule.LEDGER_ID;
4833     EXCEPTION
4834       WHEN NO_DATA_FOUND THEN
4835         -- The balances rule object definition is not found
4836         FEM_ENGINES_PKG.Tech_Message
4837           (p_severity => pc_log_level_statement,
4838            p_module   => v_module,
4839           p_msg_text => 'Raising Invalid_Object_Def_ID exception');
4840       RAISE Invalid_Object_Def_ID;
4841    END;
4842 
4843     -- List out the balances rule setup to FND_LOG
4844     FEM_ENGINES_PKG.Tech_Message
4845       (p_severity => pc_log_level_statement,
4846        p_module   => v_module,
4847        p_app_name => 'FEM',
4848        p_msg_name => 'FEM_GL_POST_204',
4849        p_token1   => 'VAR_NAME',
4850        p_value1   => 'pv_rule_obj_def_id',
4851        p_token2   => 'VAR_VAL',
4852        p_value2   => TO_CHAR(pv_rule_obj_def_id));
4853     FEM_ENGINES_PKG.Tech_Message
4854       (p_severity => pc_log_level_statement,
4855        p_module   => v_module,
4856        p_app_name => 'FEM',
4857        p_msg_name => 'FEM_GL_POST_204',
4858        p_token1   => 'VAR_NAME',
4859        p_value1   => 'pv_rule_obj_def_name',
4860        p_token2   => 'VAR_VAL',
4861        p_value2   => pv_rule_obj_def_name);
4862     FEM_ENGINES_PKG.Tech_Message
4863       (p_severity => pc_log_level_statement,
4864        p_module   => v_module,
4865        p_app_name => 'FEM',
4866        p_msg_name => 'FEM_GL_POST_204',
4867        p_token1   => 'VAR_NAME',
4868        p_value1   => 'pv_rule_obj_id',
4869        p_token2   => 'VAR_VAL',
4870        p_value2   => TO_CHAR(pv_rule_obj_id));
4871     FEM_ENGINES_PKG.Tech_Message
4872       (p_severity => pc_log_level_statement,
4873        p_module   => v_module,
4874        p_app_name => 'FEM',
4875        p_msg_name => 'FEM_GL_POST_204',
4876        p_token1   => 'VAR_NAME',
4877        p_value1   => 'pv_ledger_id',
4878        p_token2   => 'VAR_VAL',
4879        p_value2   => TO_CHAR(pv_ledger_id));
4880     FEM_ENGINES_PKG.Tech_Message
4881       (p_severity => pc_log_level_statement,
4882        p_module   => v_module,
4883        p_app_name => 'FEM',
4884        p_msg_name => 'FEM_GL_POST_204',
4885        p_token1   => 'VAR_NAME',
4886        p_value1   => 'pv_ledger_name',
4887        p_token2   => 'VAR_VAL',
4888        p_value2   => pv_ledger_name);
4889     FEM_ENGINES_PKG.Tech_Message
4890       (p_severity => pc_log_level_statement,
4891        p_module   => v_module,
4892        p_app_name => 'FEM',
4893        p_msg_name => 'FEM_GL_POST_204',
4894        p_token1   => 'VAR_NAME',
4895        p_value1   => 'pv_coa_id',
4896        p_token2   => 'VAR_VAL',
4897        p_value2   => TO_CHAR(pv_coa_id));
4898     FEM_ENGINES_PKG.Tech_Message
4899       (p_severity => pc_log_level_statement,
4900        p_module   => v_module,
4901        p_app_name => 'FEM',
4902        p_msg_name => 'FEM_GL_POST_204',
4906        p_value2   => pv_coa_name);
4903        p_token1   => 'VAR_NAME',
4904        p_value1   => 'pv_coa_name',
4905        p_token2   => 'VAR_VAL',
4907     FEM_ENGINES_PKG.Tech_Message
4908       (p_severity => pc_log_level_statement,
4909        p_module   => v_module,
4910        p_app_name => 'FEM',
4911        p_msg_name => 'FEM_GL_POST_204',
4912        p_token1   => 'VAR_NAME',
4913        p_value1   => 'pv_bsv_app_col_name',
4914        p_token2   => 'VAR_VAL',
4915        p_value2   => pv_bsv_app_col_name);
4916     FEM_ENGINES_PKG.Tech_Message
4917       (p_severity => pc_log_level_statement,
4918        p_module   => v_module,
4919        p_app_name => 'FEM',
4920        p_msg_name => 'FEM_GL_POST_204',
4921        p_token1   => 'VAR_NAME',
4922        p_value1   => 'pv_ds_balance_type_cd',
4923        p_token2   => 'VAR_VAL',
4924        p_value2   => pv_ds_balance_type_cd);
4925     FEM_ENGINES_PKG.Tech_Message
4926       (p_severity => pc_log_level_statement,
4927        p_module   => v_module,
4928        p_app_name => 'FEM',
4929        p_msg_name => 'FEM_GL_POST_204',
4930        p_token1   => 'VAR_NAME',
4931        p_value1   => 'pv_include_avg_bal',
4932        p_token2   => 'VAR_VAL',
4933        p_value2   => pv_include_avg_bal);
4934     FEM_ENGINES_PKG.Tech_Message
4935       (p_severity => pc_log_level_statement,
4936        p_module   => v_module,
4937        p_app_name => 'FEM',
4938        p_msg_name => 'FEM_GL_POST_204',
4939        p_token1   => 'VAR_NAME',
4940        p_value1   => 'pv_maintain_qtd_flag',
4941        p_token2   => 'VAR_VAL',
4942        p_value2   => pv_maintain_qtd_flag);
4943     FEM_ENGINES_PKG.Tech_Message
4944       (p_severity => pc_log_level_statement,
4945        p_module   => v_module,
4946        p_app_name => 'FEM',
4947        p_msg_name => 'FEM_GL_POST_204',
4948        p_token1   => 'VAR_NAME',
4949        p_value1   => 'pv_exec_mode',
4950        p_token2   => 'VAR_VAL',
4951        p_value2   => pv_exec_mode);
4952     FEM_ENGINES_PKG.Tech_Message
4953       (p_severity => pc_log_level_statement,
4954        p_module   => v_module,
4955        p_app_name => 'FEM',
4956        p_msg_name => 'FEM_GL_POST_204',
4957        p_token1   => 'VAR_NAME',
4958        p_value1   => 'pv_bsv_option',
4959        p_token2   => 'VAR_VAL',
4960        p_value2   => pv_bsv_option);
4961     FEM_ENGINES_PKG.Tech_Message
4962       (p_severity => pc_log_level_statement,
4963        p_module   => v_module,
4964        p_app_name => 'FEM',
4965        p_msg_name => 'FEM_GL_POST_204',
4966        p_token1   => 'VAR_NAME',
4967        p_value1   => 'pv_curr_option',
4968        p_token2   => 'VAR_VAL',
4969        p_value2   => pv_curr_option);
4970     FEM_ENGINES_PKG.Tech_Message
4971       (p_severity => pc_log_level_statement,
4972        p_module   => v_module,
4973        p_app_name => 'FEM',
4974        p_msg_name => 'FEM_GL_POST_204',
4975        p_token1   => 'VAR_NAME',
4976        p_value1   => 'pv_xlated_bal_option',
4977        p_token2   => 'VAR_VAL',
4978        p_value2   => pv_xlated_bal_option);
4979     FEM_ENGINES_PKG.Tech_Message
4980       (p_severity => pc_log_level_statement,
4981        p_module   => v_module,
4982        p_app_name => 'FEM',
4983        p_msg_name => 'FEM_GL_POST_204',
4984        p_token1   => 'VAR_NAME',
4985        p_value1   => 'pv_dataset_code',
4986        p_token2   => 'VAR_VAL',
4987        p_value2   => pv_dataset_code);
4988     FEM_ENGINES_PKG.Tech_Message
4989       (p_severity => pc_log_level_statement,
4990        p_module   => v_module,
4991        p_app_name => 'FEM',
4992        p_msg_name => 'FEM_GL_POST_204',
4993        p_token1   => 'VAR_NAME',
4994        p_value1   => 'pv_rule_eff_start_date',
4995        p_token2   => 'VAR_VAL',
4996        p_value2   => TO_CHAR(pv_rule_eff_start_date, 'DD-MON-YYYY'));
4997     FEM_ENGINES_PKG.Tech_Message
4998       (p_severity => pc_log_level_statement,
4999        p_module   => v_module,
5000        p_app_name => 'FEM',
5001        p_msg_name => 'FEM_GL_POST_204',
5002        p_token1   => 'VAR_NAME',
5003        p_value1   => 'pv_rule_eff_end_date',
5004        p_token2   => 'VAR_VAL',
5005        p_value2   => TO_CHAR(pv_rule_eff_end_date, 'DD-MON-YYYY'));
5006 
5007     -- Validate the p_bal_rule_obj_def_id engine parameter
5008     Validate_Object_Def_ID;
5009 
5010     IF pv_obj_type_cd <> 'OGL_INTG_BAL_RULE'
5011     THEN
5012       -- It is not a FEM-OGL Integration Balances Rule
5013       FEM_ENGINES_PKG.Tech_Message
5014         (p_severity => pc_log_level_exception,
5015          p_module   => v_module,
5016          p_msg_text => 'Raising Invalid_Object_ID exception');
5017 
5018       RAISE Invalid_Object_ID;
5019     END IF; -- IF pv_obj_type_cd <> 'OGL_INTG_BAL_RULE'
5020 
5021     -- ----------------------
5022     -- 3. Validate the Ledger
5023     -- ----------------------
5024 
5025     -- Verify the ledger is assigned in the source ledger group
5026     BEGIN
5027       -- Bug fix 4214383: Changed the SQL to uptake new SLG implmentation
5028       SELECT 'Y'
5029       INTO v_dummy_flag
5030       FROM FEM_LEDGERS_HIER h
5031          , FEM_LEDGERS_B p
5032       WHERE h.HIERARCHY_OBJ_DEF_ID = 1505
5033       AND h.CHILD_ID = pv_ledger_id
5034       AND h.PARENT_ID = p.LEDGER_ID
5035       AND p.LEDGER_DISPLAY_CODE = 'OGL_SOURCE_LEDGER_GROUP';
5036     EXCEPTION
5037       WHEN NO_DATA_FOUND THEN
5041            p_module   => v_module,
5038         -- The Ledger is not assigned to the source ledger group
5039         FEM_ENGINES_PKG.Tech_Message
5040           (p_severity => pc_log_level_error,
5042            p_app_name => 'FEM',
5043            p_msg_name => 'FEM_INTG_BAL_LG_NOT_IN_SRC',
5044            p_token1   => 'LEDGER_NAME',
5045            p_value1   => pv_ledger_name);
5046 
5047         FEM_ENGINES_PKG.User_Message
5048           (p_app_name => 'FEM',
5049            p_msg_name => 'FEM_INTG_BAL_LG_NOT_IN_SRC',
5050            p_token1   => 'LEDGER_NAME',
5051            p_value1   => pv_ledger_name);
5052 
5053       RAISE OGLEngParam_FatalErr;
5054     END;
5055 
5056     -- Cache the dimension IDs
5057     Get_Dim_IDs;
5058 
5059     -- Validate the pv_ledger_id retrieved from the balance rule def and
5060     -- cache ledger attributes
5061     Validate_Ledger;
5062 
5063     -- Verify the Time Hierarchy Object ID and Time Hierarchy Object Def ID
5064     -- this Ledger
5065     IF (pv_ledger_per_hier_obj_def_id = -1 OR pv_ledger_per_hier_obj_id = -1)
5066     THEN
5067       -- The Time Hierarchy Object ID/Object Def ID is wrong
5068       FEM_ENGINES_PKG.Tech_Message
5069         (p_severity => pc_log_level_error,
5070          p_module   => v_module,
5071          p_app_name => 'FEM',
5072          p_msg_name => 'FEM_INTG_BAL_PER_HIER_ERR',
5073          p_token1   => 'LEDGER_NAME',
5074          p_value1   => pv_ledger_name);
5075 
5076       FEM_ENGINES_PKG.User_Message
5077         (p_app_name => 'FEM',
5078          p_msg_name => 'FEM_INTG_BAL_PER_HIER_ERR',
5079          p_token1   => 'LEDGER_NAME',
5080          p_value1   => pv_ledger_name);
5081 
5082       RAISE OGLEngParam_FatalErr;
5083     END IF;
5084 
5085    -- Verify all Value-Set-Required dimensions are defined in the Global
5086    -- Value Set Combination
5087    BEGIN
5088       SELECT DISTINCT 'X'
5089       INTO v_dummy_flag
5090       FROM FEM_XDIM_DIMENSIONS xdim, FEM_DIMENSIONS_B dim
5091       WHERE xdim.VALUE_SET_REQUIRED_FLAG = 'Y'
5092       AND xdim.DIMENSION_ID = dim.DIMENSION_ID
5093       AND dim.DIMENSION_VARCHAR_LABEL
5094            NOT IN ('COMPANY', 'COST_CENTER') -- Bug fix 4158130
5095       AND NOT EXISTS
5096        (SELECT 'X'
5097         FROM FEM_GLOBAL_VS_COMBO_DEFS gvsc
5098         WHERE gvsc.DIMENSION_ID = dim.DIMENSION_ID
5099         AND gvsc.GLOBAL_VS_COMBO_ID = pv_global_vs_combo_id);
5100     EXCEPTION
5101       WHEN NO_DATA_FOUND THEN
5102         -- No missing value-set-required dimensions
5103         FEM_ENGINES_PKG.Tech_Message
5104           (p_severity => pc_log_level_statement,
5105            p_module   => v_module,
5106            p_msg_text => 'All Value-Set-Required dimensions are defined in the GVSC');
5107     END;
5108 
5109     IF (v_dummy_flag = 'X')
5110     THEN
5111       -- Incomplete the Global Value Set Comboination setup
5112       FEM_ENGINES_PKG.Tech_Message
5113         (p_severity => pc_log_level_error,
5114          p_module   => v_module,
5115          p_app_name => 'FEM',
5116          p_msg_name => 'FEM_INTG_BAL_GVSC_ERR',
5117          p_token1   => 'COA_NAME',
5118          p_value1   => pv_coa_name);
5119 
5120       FEM_ENGINES_PKG.User_Message
5121         (p_app_name => 'FEM',
5122          p_msg_name => 'FEM_INTG_BAL_GVSC_ERR',
5123          p_token1   => 'COA_NAME',
5124          p_value1   => pv_coa_name);
5125 
5126       Raise OGLEngParam_FatalErr;
5127     END IF; -- IF (v_dummy_flag = 'X')
5128 
5129     -- Bug fix 4242130: Validate the dimension rules for non-processing key
5130    -- dimensions should have SINGLEVAL option
5131    BEGIN
5132      SELECT DISTINCT 'X'
5133      INTO v_dummy_flag
5134      FROM   fem_intg_dim_rules r
5135            , fem_intg_dim_rule_defs rd
5136            , fem_object_definition_b od
5137       WHERE r.dim_rule_obj_id = od.object_id
5138       AND rd.dim_rule_obj_def_id = od.object_definition_id
5139       AND rd.dim_mapping_option_code <> 'SINGLEVAL'
5140       AND r.dimension_id <> 0
5141       AND r.dimension_id NOT IN
5142            (SELECT tc.dimension_id
5143               FROM fem_tab_column_prop tcp
5144                  , fem_tab_columns_b tc
5145              WHERE tcp.table_name = 'FEM_BALANCES'
5146                AND tcp.column_property_code = 'PROCESSING_KEY'
5147                AND tc.table_name = 'FEM_BALANCES'
5148                AND tc.column_name = tcp.column_name)
5149       AND r.chart_of_accounts_id = pv_coa_id;
5150    EXCEPTION
5151       WHEN NO_DATA_FOUND THEN
5152         -- All non-processing key dimensions have SINGLEVAL dim rule versions
5153         FEM_ENGINES_PKG.Tech_Message
5154           (p_severity => pc_log_level_statement,
5155            p_module   => v_module,
5156            p_msg_text => 'All non-processing key dimensions have SINGLEVAL dimension rule versions');
5157    END;
5158 
5159     IF (v_dummy_flag = 'X')
5160     THEN
5161       -- Invalid dimension rule setup for this COA
5162       FEM_ENGINES_PKG.Tech_Message
5163         (p_severity => pc_log_level_error,
5164          p_module   => v_module,
5165          p_app_name => 'FEM',
5166          p_msg_name => 'FEM_INTG_BAL_DIM_RULE_ERR',
5167          p_token1   => 'COA_NAME',
5168          p_value1   => pv_coa_name);
5169 
5170       FEM_ENGINES_PKG.User_Message
5171         (p_app_name => 'FEM',
5172          p_msg_name => 'FEM_INTG_BAL_DIM_RULE_ERR',
5173          p_token1   => 'COA_NAME',
5177     END IF;
5174          p_value1   => pv_coa_name);
5175 
5176       Raise OGLEngParam_FatalErr;
5178 
5179     -- ----------------------------
5180     -- 4. Validate the Period Range
5181     -- ----------------------------
5182 
5183     -- Check the From Period is a valid OGL period for the Ledger by getting
5184     -- its end date and period effective number
5185     -- Bug fix 4332989: Changed to get the end date of From Period to validate
5186     --                  the effective period range
5187     BEGIN
5188       SELECT per.END_DATE
5189            , per.EFFECTIVE_PERIOD_NUM
5190       INTO   pv_from_date
5191            , pv_from_period_eff_num
5192       FROM   GL_PERIOD_STATUSES per
5193       WHERE per.APPLICATION_ID = 101
5194       AND per.LEDGER_ID = pv_ledger_id
5195       AND per.PERIOD_NAME = p_from_period;
5196     EXCEPTION
5197       WHEN NO_DATA_FOUND THEN
5198         -- The From Period is not a valid OGL period
5199         FEM_ENGINES_PKG.Tech_Message
5200           (p_severity => pc_log_level_error,
5201            p_module   => v_module,
5202            p_app_name => 'FEM',
5203            p_msg_name => 'FEM_GL_POST_001',
5204            p_token1   => 'DIMENSION_NAME',
5205            p_value1   => 'FEM_FROM_PERIOD_TXT',
5206            p_trans1   => 'Y');
5207         FEM_ENGINES_PKG.User_Message
5208           (p_app_name => 'FEM',
5209            p_msg_name => 'FEM_GL_POST_001',
5210            p_token1   => 'DIMENSION_NAME',
5211            p_value1   => 'FEM_FROM_PERIOD_TXT',
5212            p_trans1   => 'Y');
5213 
5214         Raise OGLEngParam_FatalErr;
5215     END;
5216 
5217     FEM_ENGINES_PKG.Tech_Message
5218       (p_severity => pc_log_level_statement,
5219        p_module   => v_module,
5220        p_app_name => 'FEM',
5221        p_msg_name => 'FEM_GL_POST_204',
5222        p_token1   => 'VAR_NAME',
5223        p_value1   => 'pv_from_date',
5224        p_token2   => 'VAR_VAL',
5225        p_value2   => TO_CHAR(pv_from_date, 'DD-MON-YYYY'));
5226 
5227     -- Check the To Period is a valid OGL period for the Ledger by getting
5228    -- its start date and period effective number
5229     BEGIN
5230       SELECT per.END_DATE
5231            , per.EFFECTIVE_PERIOD_NUM
5232            , (SELECT 'Y' FROM DUAL
5233               WHERE NVL(p_effective_date, per.END_DATE) BETWEEN per.START_DATE
5234                                                         AND per.END_DATE)
5235       INTO   pv_to_date
5236            , pv_to_period_eff_num
5237            , v_dummy_flag
5238       FROM   GL_PERIOD_STATUSES per
5239       WHERE per.APPLICATION_ID = 101
5240       AND per.LEDGER_ID = pv_ledger_id
5241       AND per.PERIOD_NAME = p_to_period;
5242     EXCEPTION
5243       WHEN NO_DATA_FOUND THEN
5244         -- The To Period is not a valid OGL period
5245         FEM_ENGINES_PKG.Tech_Message
5246           (p_severity => pc_log_level_error,
5247            p_module   => v_module,
5248            p_app_name => 'FEM',
5249            p_msg_name => 'FEM_GL_POST_001',
5250            p_token1   => 'DIMENSION_NAME',
5251            p_value1   => 'FEM_TO_PERIOD_TXT',
5252            p_trans1   => 'Y');
5253         FEM_ENGINES_PKG.User_Message
5254           (p_app_name => 'FEM',
5255            p_msg_name => 'FEM_GL_POST_001',
5256            p_token1   => 'DIMENSION_NAME',
5257            p_value1   => 'FEM_TO_PERIOD_TXT',
5258            p_trans1   => 'Y');
5259 
5260         Raise OGLEngParam_FatalErr;
5261     END;
5262 
5263     FEM_ENGINES_PKG.Tech_Message
5264       (p_severity => pc_log_level_statement,
5265        p_module   => v_module,
5266        p_app_name => 'FEM',
5267        p_msg_name => 'FEM_GL_POST_204',
5268        p_token1   => 'VAR_NAME',
5269        p_value1   => 'pv_to_date',
5273     -- Validate the From Period must be earlier than or same as To Period
5270        p_token2   => 'VAR_VAL',
5271        p_value2   => TO_CHAR(pv_to_date, 'DD-MON-YYYY'));
5272 
5274     IF (pv_from_period_eff_num > pv_to_period_eff_num)
5275     THEN
5276         FEM_ENGINES_PKG.Tech_Message
5277           (p_severity => pc_log_level_error,
5278            p_module   => v_module,
5279            p_app_name => 'FEM',
5280            p_msg_name => 'FEM_INTG_BAL_PER_RANGE_ERR',
5281            p_token1   => 'FROM_PERIOD',
5282            p_value1   => p_from_period,
5283            p_token2   => 'TO_PERIOD',
5284            p_value2   => p_to_period);
5285         FEM_ENGINES_PKG.User_Message
5286           (p_app_name => 'FEM',
5287            p_msg_name => 'FEM_INTG_BAL_PER_RANGE_ERR',
5288            p_token1   => 'FROM_PERIOD',
5289            p_value1   => p_from_period,
5290            p_token2   => 'TO_PERIOD',
5291            p_value2   => p_to_period);
5292 
5293         Raise OGLEngParam_FatalErr;
5294     END IF; -- IF (pv_from_period_eff_num > pv_to_period_eff_num)
5295 
5296     -- Validate the pass period range must be within the balance rule effective
5297     -- date range
5298     IF (pv_from_date < pv_rule_eff_start_date
5299        OR pv_to_date > pv_rule_eff_end_date)
5300     THEN
5301         FEM_ENGINES_PKG.Tech_Message
5302           (p_severity => pc_log_level_error,
5303            p_module   => v_module,
5304            p_app_name => 'FEM',
5305            p_msg_name => 'FEM_INTG_BAL_RULE_NOT_EFF');
5306         FEM_ENGINES_PKG.User_Message
5307           (p_app_name => 'FEM',
5308            p_msg_name => 'FEM_INTG_BAL_RULE_NOT_EFF');
5309 
5310         Raise OGLEngParam_FatalErr;
5311     END IF; -- IF (pv_from_date < pv_rule_eff_start_date ...
5312 
5313     -- Check the As-Of-Date parameter if Include Average Balance Flag is Yes
5314     IF ((pv_include_avg_bal = 'Y')
5315        AND (p_effective_date IS NULL OR v_dummy_flag IS NULL))
5316     THEN
5317       -- If the As-Of-Date parameter is not provided or it is not within the To
5318      -- Period, we set it as the end date of the To Period
5319       p_effective_date := pv_to_date;
5320 
5321      -- Log a warning message to FND_LOG as well as the concurrent request log
5322       FEM_ENGINES_PKG.Tech_Message
5323         (p_severity => pc_log_level_event,
5324          p_module   => v_module,
5325          p_app_name => 'FEM',
5326          p_msg_name => 'FEM_INTG_BAL_EFF_DATE_WARN');
5327       FEM_ENGINES_PKG.User_Message
5328         (p_app_name => 'FEM',
5329          p_msg_name => 'FEM_INTG_BAL_EFF_DATE_WARN');
5330     END IF; -- IF (pv_include_avg_bal = 'Y' ...
5331 
5332     -- ------------------------------------------------------------
5333     -- 4.5. Validate the BSV's
5334     -- ------------------------------------------------------------
5335     IF (p_bsv_range_low IS NOT NULL AND p_bsv_range_high IS NULL) OR
5336        (p_bsv_range_low IS NULL AND p_bsv_range_high IS NOT NULL) THEN
5337 
5338       FEM_ENGINES_PKG.Tech_Message
5339         (p_severity => pc_log_level_event,
5340          p_module   => v_module,
5341          p_app_name => 'FEM',
5342          p_msg_name => 'FEM_INTG_BSV_ONE_NULL');
5343       FEM_ENGINES_PKG.User_Message
5344         (p_app_name => 'FEM',
5345          p_msg_name => 'FEM_INTG_BSV_ONE_NULL');
5346 
5347       Raise OGLEngParam_FatalErr;
5348     END IF;
5349 
5350     -- Start bug fix 5520680
5351     -- ------------------------------------------------------------
5352     -- we must ensure that no balances have been loaded
5353     -- for this Ledger/Output Dataset/Cal Period
5354     -- since snapshot mode is execution-once-only rules
5358 
5355     -- ------------------------------------------------------------
5356     IF (pv_exec_mode = 'S') THEN
5357         BEGIN
5359             SELECT 'Y'
5360               INTO v_dummy_flag
5361               FROM DUAL
5362              WHERE EXISTS
5363                     (SELECT 'Loaded'
5364                        FROM FEM_DL_DIMENSIONS
5365                       WHERE LEDGER_ID = pv_ledger_id
5366                         AND EXISTS (SELECT 1
5367                                       FROM GL_PERIOD_STATUSES per
5368                                      WHERE per.APPLICATION_ID = 101
5369                                        AND per.LEDGER_ID = pv_ledger_id
5370                                        AND FEM_DL_DIMENSIONS.CAL_PERIOD_ID =
5371                                                    FEM_DIMENSION_UTIL_PKG.Get_Cal_Period_ID(  pv_ledger_id
5372                                                                                               , 'OGL_'||per.PERIOD_TYPE
5373                                                                                               , per.PERIOD_NUM
5374                                                                                               , per.PERIOD_YEAR)
5375                                        AND per.EFFECTIVE_PERIOD_NUM BETWEEN pv_from_period_eff_num
5376                                                                     AND pv_to_period_eff_num)
5377                         AND DATASET_CODE = pv_dataset_code
5378                         AND SOURCE_SYSTEM_CODE = pv_gl_source_system_code
5379                         AND TABLE_NAME = 'FEM_BALANCES');
5380 
5381              EXCEPTION
5382                   WHEN NO_DATA_FOUND THEN NULL;
5383 
5384          END;
5385 
5386          IF (v_dummy_flag = 'Y') THEN
5387 
5388              FEM_ENGINES_PKG.Tech_Message
5389                (p_severity => pc_log_level_event,
5390                 p_module   => v_module,
5391                 p_app_name => 'FEM',
5392                 p_msg_name => 'FEM_INTG_SNAPSHOT_LOAD_ERR');
5393              FEM_ENGINES_PKG.User_Message
5394                (p_app_name => 'FEM',
5395                 p_msg_name => 'FEM_INTG_SNAPSHOT_LOAD_ERR');
5396 
5397              Raise OGLEngParam_FatalErr;
5398         END IF;
5399 
5400     END IF;
5401     -- End bug fix 5520680
5402 
5403     -- ------------------------------------------------------------
5404     -- 5. Populate FEM_INTG_EXEC_PARAMS_GT base on the balance type
5405     -- ------------------------------------------------------------
5406     IF (pv_ds_balance_type_cd = 'ACTUAL')
5407     THEN
5408       INSERT INTO FEM_INTG_EXEC_PARAMS_GT
5409       (      OUTPUT_DATASET_CODE
5410            , EFFECTIVE_PERIOD_NUM
5411            , PERIOD_NAME
5412            , CAL_PERIOD_ID
5413            , LOAD_METHOD_CODE
5414            , ERROR_CODE
5415            , NUM_OF_ROWS_SELECTED
5416            , NUM_OF_ROWS_POSTED
5417       )
5418       SELECT pv_dataset_code
5419            , per.EFFECTIVE_PERIOD_NUM
5420            , per.PERIOD_NAME
5421            , FEM_DIMENSION_UTIL_PKG.Get_Cal_Period_ID(  pv_ledger_id
5422                                                       , 'OGL_'||per.PERIOD_TYPE
5423                                                       , per.PERIOD_NUM
5424                                                       , per.PERIOD_YEAR)
5425            , pv_exec_mode
5426            , DECODE(per.CLOSING_STATUS
5427               , 'C', NULL
5428               , 'O', NULL
5429               , 'P', NULL
5430                    , 'INVALID_PERIOD_STATUS')
5431            , 0
5432            , 0
5433       FROM   GL_PERIOD_STATUSES per
5434       WHERE per.APPLICATION_ID = 101
5435       AND per.LEDGER_ID = pv_ledger_id
5436       AND per.EFFECTIVE_PERIOD_NUM BETWEEN pv_from_period_eff_num
5437                                        AND pv_to_period_eff_num;
5438 
5439     ELSIF (pv_ds_balance_type_cd = 'BUDGET')
5440     THEN
5441       INSERT INTO FEM_INTG_EXEC_PARAMS_GT
5442       (      OUTPUT_DATASET_CODE
5443          , BUDGET_ID
5444            , EFFECTIVE_PERIOD_NUM
5445            , PERIOD_NAME
5446            , CAL_PERIOD_ID
5447            , LOAD_METHOD_CODE
5448            , ERROR_CODE
5449            , NUM_OF_ROWS_SELECTED
5450            , NUM_OF_ROWS_POSTED
5451       )
5452       SELECT bgetDS.OUTPUT_DATASET_CODE
5453            , bget.BUDGET_ID
5454            , per.EFFECTIVE_PERIOD_NUM
5455            , per.PERIOD_NAME
5456            , FEM_DIMENSION_UTIL_PKG.Get_Cal_Period_ID(  pv_ledger_id
5457                                                       , 'OGL_'||per.PERIOD_TYPE
5458                                                       , per.PERIOD_NUM
5459                                                       , per.PERIOD_YEAR)
5460            , pv_exec_mode
5461            -- Bug 4394404 hkaniven start - populate 'INVALID_PERIOD_STATUS' error
5462            -- code if period's period year greater than the latest opened period
5463            -- year of the Budget
5464            , DECODE(SIGN(gb.latest_opened_year - per.period_year)
5465                 , -1, 'INVALID_PERIOD_STATUS'
5466                 , NULL)
5467            -- Bug 4394404 hkaniven end - populate 'INVALID_PERIOD_STATUS' error
5468            -- code if period's period year greater than the latest opened period
5469            -- year of the Budget
5470            , 0
5471            , 0
5472       FROM   GL_PERIOD_STATUSES per
5473            , FEM_INTG_BAL_DEF_BUDGTS bget
5477            , GL_BUDGETS gb
5474            , FEM_INTG_BUDGT_DS bgetDS
5475            -- Bug 4394404 hkaniven start - to get the latest opened year of each
5476            -- budget
5478            , GL_BUDGET_VERSIONS gbv
5479            -- Bug 4394404 hkaniven end - to get the latest opened year of each
5480            -- budget
5481       WHERE per.APPLICATION_ID = 101
5482       AND per.LEDGER_ID = pv_ledger_id
5483       AND per.EFFECTIVE_PERIOD_NUM BETWEEN pv_from_period_eff_num
5484                                        AND pv_to_period_eff_num
5485       AND bget.BAL_RULE_OBJ_DEF_ID = pv_rule_obj_def_id
5486       AND bgetDS.BUDGET_ID = bget.BUDGET_ID
5487       -- Bug 4394404 hkaniven start - to get the latest opened year of each
5488       -- budget
5489       AND gbv.budget_version_id = bget.budget_id
5490       AND gb.budget_name = gbv.budget_name;
5491       -- Bug 4394404 hkaniven end - to get the latest opened year of each
5492       -- budget
5493 
5494     ELSE -- i.e. Encumbrance Types
5495       INSERT INTO FEM_INTG_EXEC_PARAMS_GT
5496       (      OUTPUT_DATASET_CODE
5497            , ENCUMBRANCE_TYPE_ID
5498            , EFFECTIVE_PERIOD_NUM
5499            , PERIOD_NAME
5500            , CAL_PERIOD_ID
5501            , LOAD_METHOD_CODE
5502            , ERROR_CODE
5503            , NUM_OF_ROWS_SELECTED
5504            , NUM_OF_ROWS_POSTED
5505       )
5506       SELECT encTypeDS.OUTPUT_DATASET_CODE
5507            , encType.ENCUMBRANCE_TYPE_ID
5508            , per.EFFECTIVE_PERIOD_NUM
5509            , per.PERIOD_NAME
5510            , FEM_DIMENSION_UTIL_PKG.Get_Cal_Period_ID(  pv_ledger_id
5511                                                       , 'OGL_'||per.PERIOD_TYPE
5512                                                       , per.PERIOD_NUM
5513                                                       , per.PERIOD_YEAR)
5514            , pv_exec_mode
5515            -- Bug 4394404 hkaniven start - populate 'INVALID_PERIOD_STATUS' error
5516            -- code if period's period year greater than the latest encumbrance year
5517            , DECODE(SIGN(glgr.latest_encumbrance_year - per.period_year)
5518                , -1, 'INVALID_PERIOD_STATUS'
5519                , NULL)
5520            -- Bug 4394404 hkaniven end - populate 'INVALID_PERIOD_STATUS' error
5521            -- code if period's period year greater than the latest encumbrance year
5522            , 0
5523            , 0
5524       FROM   GL_PERIOD_STATUSES per
5525            , FEM_INTG_BAL_DEF_ENCS encType
5526            , FEM_INTG_ENC_TYPE_DS encTypeDS
5527            -- Bug 4394404 hkaniven start - to get latest encumbrance year
5528            , GL_LEDGERS glgr
5529            -- Bug 4394404 hkaniven end - to get latest encumbrance year
5530       WHERE per.APPLICATION_ID = 101
5531       AND per.LEDGER_ID = pv_ledger_id
5532       AND per.EFFECTIVE_PERIOD_NUM BETWEEN pv_from_period_eff_num
5533                                        AND pv_to_period_eff_num
5534       AND encType.BAL_RULE_OBJ_DEF_ID = pv_rule_obj_def_id
5535       AND encTypeDS.ENCUMBRANCE_TYPE_ID = encType.ENCUMBRANCE_TYPE_ID
5536       -- Bug 4394404 hkaniven start - to get latest encumbrance year
5537       AND glgr.ledger_id = pv_ledger_id;
5538       -- Bug 4394404 hkaniven end - to get latest encumbrance year
5539 
5540     END IF; -- IF (pv_ds_balance_type_cd = 'ACTUAL')
5541 
5542     -- Get the number of rows inserted and log it to FND_LOG
5543     pv_num_rows := SQL%ROWCOUNT;
5544     FEM_ENGINES_PKG.Tech_Message
5545       (p_severity => pc_log_level_statement,
5546        p_module   => v_module,
5547        p_app_name => 'FEM',
5548        p_msg_name => 'FEM_GL_POST_216',
5549        p_token1   => 'NUM',
5550        p_value1   => TO_CHAR(pv_num_rows),
5554     IF (pv_num_rows = 0)
5551        p_token2   => 'TABLE',
5552        p_value2   => 'FEM_INTG_EXEC_PARAMS_GT');
5553 
5555     THEN
5556       -- No rows are inserted. It can be invalid budget/encumbrance type setup.
5557       -- If it is Actual balance type, it's impossible for them to get 0 rows.
5558       IF (pv_ds_balance_type_cd = 'BUDGET')
5559       THEN
5560         FEM_ENGINES_PKG.Tech_Message
5561           (p_severity => pc_log_level_error,
5562            p_module   => v_module,
5563            p_app_name => 'FEM',
5564            p_msg_name => 'FEM_INTG_BAL_BGT_SETUP_ERR');
5565         FEM_ENGINES_PKG.User_Message
5566           (p_app_name => 'FEM',
5567            p_msg_name => 'FEM_INTG_BAL_BGT_SETUP_ERR');
5568 
5569       ELSE -- i.e. Encumbrance Type
5570         FEM_ENGINES_PKG.Tech_Message
5571           (p_severity => pc_log_level_error,
5572            p_module   => v_module,
5573            p_app_name => 'FEM',
5574            p_msg_name => 'FEM_INTG_BAL_ECT_SETUP_ERR');
5575         FEM_ENGINES_PKG.User_Message
5576           (p_app_name => 'FEM',
5577            p_msg_name => 'FEM_INTG_BAL_ECT_SETUP_ERR');
5578 
5579       END IF; -- IF (pv_ds_balance_type_cd = 'BUDGET')
5580 
5581       Raise OGLEngParam_FatalErr;
5582     END IF; -- IF (pv_num_rows = 0)
5583 
5584     -- For Actual Balance Type, if the balances should be loaded into the same
5585    -- dataset for the entire accounting year, populate the error code for those
5586    -- periods whose accounting year has been loaded into other datasets.
5587     IF (pv_ds_balance_type_cd = 'ACTUAL')
5588     THEN
5589       -- The error OTHER_DS_LOADED will override other errors codes
5590       UPDATE FEM_INTG_EXEC_PARAMS_GT gt
5591       SET ERROR_CODE = 'OTHER_DS_LOADED'
5592       WHERE EFFECTIVE_PERIOD_NUM IN
5593         (SELECT DISTINCT per.EFFECTIVE_PERIOD_NUM
5594            FROM FEM_DL_DIMENSIONS dl
5595               , FEM_CAL_PERIODS_ATTR year
5596               , FEM_DIM_ATTR_VERSIONS_B yearV
5597               , GL_PERIOD_STATUSES per
5598           WHERE dl.LEDGER_ID = pv_ledger_id
5599             AND dl.DATASET_CODE <> pv_dataset_code
5600             AND dl.SOURCE_SYSTEM_CODE = pv_gl_source_system_code
5601             AND dl.TABLE_NAME = 'FEM_BALANCES'
5602       -- Bug fix 4335649: Change to check ACTUAL balance type only
5603             AND dl.BALANCE_TYPE_CODE = 'ACTUAL'
5604             AND year.CAL_PERIOD_ID = dl.CAL_PERIOD_ID
5605             AND year.ATTRIBUTE_ID =
5606                  (SELECT ATTRIBUTE_ID
5607                     FROM FEM_DIM_ATTRIBUTES_B
5608                    WHERE ATTRIBUTE_VARCHAR_LABEL = 'ACCOUNTING_YEAR')
5609             AND year.ATTRIBUTE_ID = yearV.ATTRIBUTE_ID
5610             AND year.VERSION_ID = yearV.VERSION_ID
5611             AND yearV.DEFAULT_VERSION_FLAG = 'Y'
5612             AND year.NUMBER_ASSIGN_VALUE = per.PERIOD_YEAR
5613             AND per.APPLICATION_ID = 101
5614             AND per.LEDGER_ID = dl.LEDGER_ID
5615             AND per.EFFECTIVE_PERIOD_NUM BETWEEN pv_from_period_eff_num
5616                                              AND pv_to_period_eff_num);
5617 
5618       -- Log the number of rows updated in FEM_INTG_EXEC_PARAMS_GT
5619       FEM_ENGINES_PKG.Tech_Message
5620         (p_severity => pc_log_level_statement,
5621          p_module   => v_module,
5622          p_app_name => 'FEM',
5623          p_msg_name => 'FEM_GL_POST_217',
5624          p_token1   => 'NUM',
5625          p_value1   => TO_CHAR(SQL%ROWCOUNT),
5626          p_token2   => 'TABLE',
5627          p_value2   => 'FEM_INTG_EXEC_PARAMS_GT');
5628 
5632     UPDATE FEM_INTG_EXEC_PARAMS_GT
5629     END IF; -- IF (pv_ds_balance_type_cd = 'ACTUAL')
5630 
5631     -- For peirods not mapped to the FEM Cal Periods, update their error codes
5633     SET ERROR_CODE = 'PERIOD_NOT_MAPPED'
5634     WHERE ERROR_CODE IS NULL
5635     AND CAL_PERIOD_ID = -1;
5636 
5637     -- Set the Generate Report Flag to 'Y' i.e. indicating report should be
5638     -- generated when erroring out after this point
5639     x_generate_report_flag := 'Y';
5640 
5641     -- Log the number of rows updated in FEM_INTG_EXEC_PARAMS_GT
5642     FEM_ENGINES_PKG.Tech_Message
5643       (p_severity => pc_log_level_statement,
5644        p_module   => v_module,
5645        p_app_name => 'FEM',
5646        p_msg_name => 'FEM_GL_POST_217',
5647        p_token1   => 'NUM',
5648        p_value1   => TO_CHAR(SQL%ROWCOUNT),
5649        p_token2   => 'TABLE',
5650        p_value2   => 'FEM_INTG_EXEC_PARAMS_GT');
5651 
5652     -- Find the min and max valid period effective numbers
5653     SELECT NVL(min(EFFECTIVE_PERIOD_NUM), -1)
5654          , NVL(max(EFFECTIVE_PERIOD_NUM), -1)
5655     INTO   pv_min_valid_period_eff_num
5656          , pv_max_valid_period_eff_num
5657     FROM FEM_INTG_EXEC_PARAMS_GT
5658     WHERE ERROR_CODE IS NULL;
5659 
5660     FEM_ENGINES_PKG.Tech_Message
5661       (p_severity => pc_log_level_statement,
5662        p_module   => v_module,
5663        p_app_name => 'FEM',
5664        p_msg_name => 'FEM_GL_POST_204',
5665        p_token1   => 'VAR_NAME',
5666        p_value1   => 'pv_min_valid_period_eff_num',
5667        p_token2   => 'VAR_VAL',
5668        p_value2   => TO_CHAR(pv_min_valid_period_eff_num));
5669 
5670     FEM_ENGINES_PKG.Tech_Message
5671       (p_severity => pc_log_level_statement,
5672        p_module   => v_module,
5673        p_app_name => 'FEM',
5674        p_msg_name => 'FEM_GL_POST_204',
5675        p_token1   => 'VAR_NAME',
5676        p_value1   => 'pv_max_valid_period_eff_num',
5677        p_token2   => 'VAR_VAL',
5678        p_value2   => TO_CHAR(pv_max_valid_period_eff_num));
5679 
5680     -- Bug 4394404 hkaniven start - Get the no of valid rows in
5681     -- FEM_INTG_EXEC_PARAMS_GT if the Balance type is 'Budget'
5682     IF (pv_ds_balance_type_cd = 'BUDGET') THEN
5683         SELECT COUNT(*)
5684         INTO pv_num_rows_valid
5685         FROM FEM_INTG_EXEC_PARAMS_GT
5686         WHERE ERROR_CODE IS NULL;
5687     END IF;
5688     -- Bug 4394404 hkaniven end - Get the no of valid rows in
5689     -- FEM_INTG_EXEC_PARAMS_GT if the Balance type is 'Budget'
5690 
5691     -- Check if there are any valid periods for processing
5692     IF (pv_min_valid_period_eff_num = -1)
5693     THEN
5694       -- All periods are invalid, so errors out
5695       -- Bug fix 4170124: The message is changed and doesn't have any tockens.
5696       FEM_ENGINES_PKG.Tech_Message
5697         (p_severity => pc_log_level_error,
5698          p_module   => v_module,
5699          p_app_name => 'FEM',
5700          p_msg_name => 'FEM_INTG_BAL_NO_VALID_PER');
5701       FEM_ENGINES_PKG.User_Message
5702         (p_app_name => 'FEM',
5703          p_msg_name => 'FEM_INTG_BAL_NO_VALID_PER');
5704 
5705       Raise OGLEngParam_FatalErr;
5706 
5707     ELSIF ((pv_min_valid_period_eff_num <> pv_from_period_eff_num
5708             OR pv_max_valid_period_eff_num <> pv_to_period_eff_num)
5709 
5710           -- Bug 4394404 hkaniven start - End the program with a warning
5711           -- if the Balance type is 'Budget' and if any of the rows in
5712           -- FEM_INTG_EXEC_PARAMS_GT is not valid
5713           OR
5714           (pv_ds_balance_type_cd = 'BUDGET'
5715             AND pv_num_rows <> pv_num_rows_valid))
5716           -- Bug 4394404 hkaniven end - End the program with a warning
5717           -- if the Balance type is 'Budget' and if any of the rows in
5718           -- FEM_INTG_EXEC_PARAMS_GT is not valid
5719 
5720     THEN
5721       -- At least one but not all peroid are invalid, so set the return code to
5722       -- 1 i.e. indicating warning
5723       x_completion_code := 1;
5724 
5725       -- Log a warning message to FND_LOG as well as the concurrent request log
5726       -- Bug fix 4170124: The message is changed and doesn't have any tockens.
5727       FEM_ENGINES_PKG.Tech_Message
5728         (p_severity => pc_log_level_exception,
5729          p_module   => v_module,
5730          p_app_name => 'FEM',
5731          p_msg_name => 'FEM_INTG_BAL_INVALID_PER');
5732       FEM_ENGINES_PKG.User_Message
5733         (p_app_name => 'FEM',
5734          p_msg_name => 'FEM_INTG_BAL_INVALID_PER');
5735 
5736     END IF; -- IF (pv_min_valid_period_eff_num = -1)
5737 
5738     -- ---------------------------------
5739     -- 6. Cache the Maximum Delta Run ID
5740     -- ---------------------------------
5741     SELECT NVL(MAX(DELTA_RUN_ID), 0)
5742     INTO   pv_max_delta_run_id
5743     FROM   GL_BALANCES_DELTA;
5744 
5745     FEM_ENGINES_PKG.Tech_Message
5746       (p_severity => pc_log_level_statement,
5747        p_module   => v_module,
5748        p_app_name => 'FEM',
5749        p_msg_name => 'FEM_GL_POST_204',
5750        p_token1   => 'VAR_NAME',
5751        p_value1   => 'pv_max_delta_run_id',
5752        p_token2   => 'VAR_VAL',
5753        p_value2   => TO_CHAR(pv_max_delta_run_id));
5754 
5755     -- ----------------------------
5756     -- 7. Exit with success/warning
5757     -- ----------------------------
5758 
5759     -- Log the function exit time to FND_LOG (successful completion)
5763        p_app_name => 'FEM',
5760     FEM_ENGINES_PKG.Tech_Message
5761       (p_severity => pc_log_level_procedure,
5762        p_module   => v_module,
5764        p_msg_name => 'FEM_GL_POST_202',
5765        p_token1   => 'FUNC_NAME',
5766        p_value1   => v_func_name,
5767        p_token2   => 'TIME',
5768        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5769 
5770   EXCEPTION
5771     WHEN Invalid_Object_Def_ID THEN
5772       -- <<< Balances rule definition not found >>>
5773       x_completion_code := 2; -- Indicating fatal error
5774 
5775       FEM_ENGINES_PKG.Tech_Message
5776         (p_severity => pc_log_level_error,
5777          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5778          p_app_name => 'FEM',
5779          p_msg_name => 'FEM_GL_POST_001',
5780          p_token1   => 'DIMENSION_NAME',
5781          p_value1   => 'FEM_OBJECT_DEF_ID_TXT',
5782          p_trans1   => 'Y');
5783       FEM_ENGINES_PKG.User_Message
5784         (p_app_name => 'FEM',
5785          p_msg_name => 'FEM_GL_POST_001',
5786          p_token1   => 'DIMENSION_NAME',
5787          p_value1   => 'FEM_OBJECT_DEF_ID_TXT',
5788          p_trans1   => 'Y');
5789 
5790       -- Log the function exit time to FND_LOG (with error)
5791       FEM_ENGINES_PKG.Tech_Message
5792         (p_severity => pc_log_level_procedure,
5793          p_module   => v_module,
5794          p_app_name => 'FEM',
5795          p_msg_name => 'FEM_GL_POST_203',
5796          p_token1   => 'FUNC_NAME',
5797          p_value1   => v_func_name,
5798          p_token2   => 'TIME',
5799          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5800 
5801     WHEN Invalid_Object_ID THEN
5802       -- <<< Balances rule not found or wrong object type >>>
5803       x_completion_code := 2; -- Indicating fatal error
5804 
5805       FEM_ENGINES_PKG.Tech_Message
5806         (p_severity => pc_log_level_error,
5807          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5808          p_app_name => 'FEM',
5809          p_msg_name => 'FEM_INTG_BAL_INVALID_RULE');
5810       FEM_ENGINES_PKG.User_Message
5811         (p_app_name => 'FEM',
5812          p_msg_name => 'FEM_INTG_BAL_INVALID_RULE');
5813 
5814       -- Log the function exit time to FND_LOG (with error)
5815       FEM_ENGINES_PKG.Tech_Message
5816         (p_severity => pc_log_level_procedure,
5817          p_module   => v_module,
5818          p_app_name => 'FEM',
5819          p_msg_name => 'FEM_GL_POST_203',
5820          p_token1   => 'FUNC_NAME',
5821          p_value1   => v_func_name,
5822          p_token2   => 'TIME',
5823          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5824 
5825     WHEN User_Not_Allowed THEN
5826       -- <<< User not allowed to execute >>>
5827       x_completion_code := 2; -- Indicating fatal error
5828 
5829       FEM_ENGINES_PKG.Tech_Message
5830         (p_severity => pc_log_level_error,
5831          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5832        p_app_name => 'FEM',
5833          p_msg_name => 'FEM_GL_POST_011');
5834       FEM_ENGINES_PKG.User_Message
5835         (p_app_name => 'FEM',
5836          p_msg_name => 'FEM_GL_POST_011');
5837 
5838       -- Log the function exit time to FND_LOG (with error)
5839       FEM_ENGINES_PKG.Tech_Message
5840         (p_severity => pc_log_level_procedure,
5841          p_module   => v_module,
5842          p_app_name => 'FEM',
5843          p_msg_name => 'FEM_GL_POST_203',
5844          p_token1   => 'FUNC_NAME',
5845          p_value1   => v_func_name,
5846          p_token2   => 'TIME',
5847          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5848 
5849     WHEN Invalid_Ledger_ID THEN
5850       -- <<< Ledger not found or ledger attribute not set >>>
5851       x_completion_code := 2; -- Indicating fatal error
5852 
5853       -- Get the name for Ledger dimension
5854       v_dim_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
5855                       (p_dim_id => pv_ledger_dim_id);
5856 
5857       IF (v_dim_name IS NULL)
5858       THEN
5859         v_dim_name := 'Ledger';
5860       END IF;
5861 
5862       IF pv_attr_label IS NOT NULL
5863      THEN
5864        -- Failed to retrieve ledger attribute
5865        -- Get the attribute name
5866         v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
5867                          (p_dim_id     => pv_ledger_dim_id,
5868                           p_attr_label => pv_attr_label);
5869 
5870       IF v_attr_name IS NULL
5871         THEN
5872           v_attr_name := pv_attr_label;
5873         END IF;
5874 
5875         FEM_ENGINES_PKG.Tech_Message
5876           (p_severity => pc_log_level_error,
5877            p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5878            p_app_name => 'FEM',
5879            p_msg_name => 'FEM_INTG_BAL_LG_ATTR_ERR',
5880            p_token1   => 'ATTR_NAME',
5881            p_value1   => v_attr_name,
5882            p_token2   => 'LEDGER_NAME',
5883            p_value2   => pv_ledger_name,
5884            p_token3  => 'LEDGER_DIM',
5885            p_value3   => v_dim_name);
5886         FEM_ENGINES_PKG.User_Message
5887           (p_app_name => 'FEM',
5888            p_msg_name => 'FEM_INTG_BAL_LG_ATTR_ERR',
5889            p_token1   => 'ATTR_NAME',
5890            p_value1   => v_attr_name,
5891            p_token2   => 'LEDGER_NAME',
5895 
5892            p_value2   => pv_ledger_name,
5893            p_token3  => 'LEDGER_DIM',
5894            p_value3   => v_dim_name);
5896       ELSE
5897        -- The Ledger cannot be found in FEM Ledger Dimension
5898         FEM_ENGINES_PKG.Tech_Message
5899           (p_severity => pc_log_level_error,
5900            p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5901            p_app_name => 'FEM',
5902            p_msg_name => 'FEM_INTG_BAL_LG_ERR',
5903            p_token1   => 'LEDGER_NAME',
5904            p_value1   => pv_ledger_name,
5905            p_token2   => 'LEDGER_DIM',
5906            p_value2   => v_dim_name);
5907         FEM_ENGINES_PKG.User_Message
5908           (p_app_name => 'FEM',
5909            p_msg_name => 'FEM_INTG_BAL_LG_ERR',
5910            p_token1   => 'LEDGER_NAME',
5911            p_value1   => pv_ledger_name,
5912            p_token2   => 'LEDGER_DIM',
5913            p_value2   => v_dim_name);
5914 
5915       END IF; -- IF pv_attr_label IS NOT NULL
5916 
5917       -- Log the function exit time to FND_LOG (with error)
5918       FEM_ENGINES_PKG.Tech_Message
5919         (p_severity => pc_log_level_procedure,
5920          p_module   => v_module,
5921          p_app_name => 'FEM',
5922          p_msg_name => 'FEM_GL_POST_203',
5923          p_token1   => 'FUNC_NAME',
5924          p_value1   => v_func_name,
5925          p_token2   => 'TIME',
5926          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5927 
5928     WHEN OGLEngParam_FatalErr THEN
5929       -- <<< Fatal error >>>
5930       x_completion_code := 2; -- Indicating fatal error
5931 
5932      -- The error messages were printed, so just need to log the function exit
5933      -- time to FND_LOG (with error)
5934       FEM_ENGINES_PKG.Tech_Message
5935         (p_severity => pc_log_level_procedure,
5936          p_module   => v_module,
5937          p_app_name => 'FEM',
5938          p_msg_name => 'FEM_GL_POST_203',
5939          p_token1   => 'FUNC_NAME',
5940          p_value1   => v_func_name,
5941          p_token2   => 'TIME',
5942          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5943 
5944     WHEN Others THEN
5945       -- <<< Unexpected database exceptions >>>
5946       x_completion_code := 2; -- Indicating fatal error
5947 
5948       IF pv_proc_name = 'validate_ogl_eng_parameters'
5949      THEN
5950         pv_sqlerrm   := SQLERRM;
5951         pv_callstack := dbms_utility.format_call_stack;
5952       END IF;
5953 
5954       -- Log the call stack and the Oracle error message to
5955       -- FND_LOG with the "unexpected exception" severity level.
5956       FEM_ENGINES_PKG.Tech_Message
5957         (p_severity => pc_log_level_unexpected,
5958          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5959        p_msg_text => pv_sqlerrm);
5960       FEM_ENGINES_PKG.Tech_Message
5961         (p_severity => pc_log_level_unexpected,
5962          p_module   => 'fem.plsql.fem_gl_post_process_pkg.' || pv_proc_name,
5963        p_msg_text => pv_callstack);
5964 
5965       -- Log the Oracle error message to the Concurrent Request Log
5966       FEM_ENGINES_PKG.User_Message
5967         (p_app_name => 'FEM',
5968          p_msg_text => pv_sqlerrm);
5969 
5970       -- Log the function exit time to FND_LOG (with error)
5971       FEM_ENGINES_PKG.Tech_Message
5972         (p_severity => pc_log_level_procedure,
5973          p_module   => v_module,
5974          p_app_name => 'FEM',
5975          p_msg_name => 'FEM_GL_POST_203',
5976          p_token1   => 'FUNC_NAME',
5977          p_value1   => v_func_name,
5978          p_token2   => 'TIME',
5979          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
5980 
5981   END Validate_OGL_Eng_Parameters;
5982 -- =======================================================================
5983 
5984 -- =======================================================================
5985   PROCEDURE Register_OGL_Process_Execution
5986                (x_completion_code OUT NOCOPY NUMBER) IS
5987 -- =======================================================================
5988 -- Purpose
5989 --    Validate the FEM-OGL Integration Balances Rule execution and perform
5990 --    initial process execution registration in FEM processing architecture
5991 -- History
5992 --    11-29-04  L Poon  Created
5993 --    02-07-05  L Poon  Bug fix 4170124: The period gap check is changed to
5994 --                      maintain at ledger level for actual balance type
5995 --                      instead of ledger/dataset level
5996 -- Arguments
5997 --    x_completion_code returns 0 for success, 1 for warning, 2 for failure.
5998 -- Notes
5999 --    Called by FEM_INTG_BAL_RULE_ENG_PKG.Main before loading balances
6000 -- =======================================================================
6001 
6002     v_module        VARCHAR2(100);
6003     v_func_name     VARCHAR2(80);
6004 
6005     v_msg_count     NUMBER;
6006     v_msg_data      VARCHAR2(2000);
6007     i               PLS_INTEGER;
6008     v_return_status VARCHAR2(1);
6009 
6010     CURSOR ds_cur IS
6011      SELECT DISTINCT OUTPUT_DATASET_CODE
6012      FROM FEM_INTG_EXEC_PARAMS_GT
6013      WHERE ERROR_CODE IS NULL;
6014 
6015     -- Bug fix 4285337: Get the end date for each period in order to populate
6016     -- it in FEM_PL_REQUESTS.EFFECTIVE_DATE
6017     CURSOR cp_cur (p_dataset_code IN VARCHAR2) IS
6018       SELECT gt.CAL_PERIOD_ID
6022            , per.END_DATE
6019            , gt.LOAD_METHOD_CODE
6020            , gt.PERIOD_NAME
6021            , gt.EFFECTIVE_PERIOD_NUM
6023       FROM FEM_INTG_EXEC_PARAMS_GT gt
6024          , GL_PERIOD_STATUSES per
6025       WHERE gt.ERROR_CODE IS NULL
6026       AND gt.OUTPUT_DATASET_CODE = p_dataset_code
6027       AND per.PERIOD_NAME = gt.PERIOD_NAME
6028       AND per.APPLICATION_ID = 101
6029       AND per.LEDGER_ID = pv_ledger_id
6030       ORDER BY gt.EFFECTIVE_PERIOD_NUM;
6031 
6032     CURSOR req_cur IS
6033       SELECT REQUEST_ID
6034       FROM FEM_INTG_EXEC_PARAMS_GT
6035       WHERE ERROR_CODE IS NULL
6036       AND REQUEST_ID IS NOT NULL;
6037 
6038     v_first_load_cal_per_id  fem_pl_requests.cal_period_id%TYPE;
6039     v_last_load_cal_per_id   fem_pl_requests.cal_period_id%TYPE;
6040     v_cal_per_name           fem_cal_periods_tl.cal_period_name%TYPE;
6041     v_cal_per_num            fem_cal_periods_attr.number_assign_value%TYPE;
6042     v_cal_per_year           fem_cal_periods_attr.number_assign_value%TYPE;
6043     v_first_load_eff_per_num gl_period_statuses.effective_period_num%TYPE;
6044     v_last_load_eff_per_num  gl_period_statuses.effective_period_num%TYPE;
6045     v_first_reg_eff_per_num  gl_period_statuses.effective_period_num%TYPE;
6046     v_last_reg_eff_per_num   gl_period_statuses.effective_period_num%TYPE;
6047     v_min_valid_eff_per_num  gl_period_statuses.effective_period_num%TYPE;
6048     v_max_valid_eff_per_num  gl_period_statuses.effective_period_num%TYPE;
6049     v_any_period_gap         VARCHAR2(1);
6050 
6051     v_load_method fem_intg_exec_params_gt.load_method_code%TYPE;
6052     v_dummy_flag  VARCHAR2(1);
6053     v_req_id      NUMBER;
6054 
6055     v_dim_name    fem_dimensions_tl.dimension_name%TYPE;
6056     v_attr_name   fem_dim_attributes_tl.attribute_name%TYPE;
6057 
6058     OGLRegProc_FatalErr EXCEPTION;
6059 
6060   BEGIN
6061     v_module    := 'fem.plsql.fem_gl_post_process_pkg.register_ogl_process_execution';
6062     v_func_name := 'FEM_GL_POST_PROCESS_PKG.Register_OGL_Process_Execution';
6063 
6064     -- Log the function entry time to FND_LOG
6065     FEM_ENGINES_PKG.Tech_Message
6066       (p_severity => pc_log_level_procedure,
6067        p_module   => v_module,
6068        p_app_name => 'FEM',
6069        p_msg_name => 'FEM_GL_POST_201',
6070        p_token1   => 'FUNC_NAME',
6071        p_value1   => v_func_name,
6072        p_token2   => 'TIME',
6073        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
6074 
6075     -- -------------------------------------------------------
6076     -- Loop for each Output Dataset in FEM_INTG_EXEC_PARAMS_GT
6077     -- -------------------------------------------------------
6078     FOR v_ds IN ds_cur LOOP
6079       -- Log the current Dataset Code
6080       FEM_ENGINES_PKG.Tech_Message
6081         (p_severity => pc_log_level_statement,
6082          p_module   => v_module,
6083          p_app_name => 'FEM',
6084          p_msg_name => 'FEM_GL_POST_204',
6085          p_token1   => 'VAR_NAME',
6086          p_value1   => 'v_ds.output_dataset_code',
6087          p_token2   => 'VAR_VAL',
6088          p_value2   => v_ds.output_dataset_code);
6089 
6090       -- Initailze the local variables for this Dataset
6091       v_cal_per_name           := '';
6092       v_first_load_eff_per_num := -1;
6093       v_last_load_eff_per_num  := -1;
6094       v_first_reg_eff_per_num  := -1;
6095       v_last_reg_eff_per_num   := -1;
6096       v_any_period_gap         := 'N';
6097 
6098       -- Get the first and last valid periods for this Dataset
6099       SELECT NVL(min(EFFECTIVE_PERIOD_NUM), -1)
6100           , NVL(max(EFFECTIVE_PERIOD_NUM), -1)
6101         INTO v_min_valid_eff_per_num,
6102              v_max_valid_eff_per_num
6103         FROM FEM_INTG_EXEC_PARAMS_GT
6104        WHERE ERROR_CODE IS NULL
6105          AND OUTPUT_DATASET_CODE = v_ds.output_dataset_code;
6106 
6107       FEM_ENGINES_PKG.Tech_Message
6108         (p_severity => pc_log_level_statement,
6109          p_module   => v_module,
6110          p_app_name => 'FEM',
6111          p_msg_name => 'FEM_GL_POST_204',
6112          p_token1   => 'VAR_NAME',
6113          p_value1   => 'v_min_valid_eff_per_num',
6114          p_token2   => 'VAR_VAL',
6115          p_value2   => TO_CHAR(v_min_valid_eff_per_num));
6116       FEM_ENGINES_PKG.Tech_Message
6117         (p_severity => pc_log_level_statement,
6118          p_module   => v_module,
6119          p_app_name => 'FEM',
6120          p_msg_name => 'FEM_GL_POST_204',
6121          p_token1   => 'VAR_NAME',
6122          p_value1   => 'v_max_valid_eff_per_num',
6123          p_token2   => 'VAR_VAL',
6124          p_value2   => TO_CHAR(v_max_valid_eff_per_num));
6125 
6126       -- Only process this Dataset if at least one valid periods exist
6127       IF (v_min_valid_eff_per_num <> -1)
6128       THEN
6129 
6130         -- -------------------------------------------------------------------
6131         -- 1. Initialize the First and Last Load Cal Period ID for this Ledger
6132         --    Actual Balances or this Budget/Encumbrance Type Output Dataset
6133         -- -------------------------------------------------------------------
6134 
6135         -- If it is Actual balance type, get the first and last load cal periods
6136       -- of all Actual Balances loads for this ledger regardless the dataset.
6137       -- For other balance types, get these for this Ledger/Dataset.
6138         SELECT NVL(min(CAL_PERIOD_ID), -1)
6139            , NVL(max(CAL_PERIOD_ID), -1)
6143       -- 04-26-05: Changed to check balance_type_code only when the dataset
6140         INTO v_first_load_cal_per_id, v_last_load_cal_per_id
6141         FROM FEM_DL_DIMENSIONS
6142         WHERE LEDGER_ID = pv_ledger_id
6144       --           balance type is ACTUAL
6145         AND (   (pv_ds_balance_type_cd = 'ACTUAL'
6146                AND BALANCE_TYPE_CODE = pv_ds_balance_type_cd)
6147             OR (DATASET_CODE = v_ds.output_dataset_code))
6148         AND SOURCE_SYSTEM_CODE = pv_gl_source_system_code
6149         AND TABLE_NAME = 'FEM_BALANCES';
6150 
6151         FEM_ENGINES_PKG.Tech_Message
6152           (p_severity => pc_log_level_statement,
6153            p_module   => v_module,
6154            p_app_name => 'FEM',
6155            p_msg_name => 'FEM_GL_POST_204',
6156            p_token1   => 'VAR_NAME',
6157            p_value1   => 'v_first_load_cal_per_id',
6158            p_token2   => 'VAR_VAL',
6159            p_value2   => TO_CHAR(v_first_load_cal_per_id));
6160 
6161         FEM_ENGINES_PKG.Tech_Message
6162           (p_severity => pc_log_level_statement,
6163            p_module   => v_module,
6164            p_app_name => 'FEM',
6165            p_msg_name => 'FEM_GL_POST_204',
6166            p_token1   => 'VAR_NAME',
6167            p_value1   => 'v_last_load_cal_per_id',
6168            p_token2   => 'VAR_VAL',
6169            p_value2   => TO_CHAR(v_last_load_cal_per_id));
6170 
6171         IF (v_first_load_cal_per_id <> -1)
6172         THEN
6173           -- The First Load Cal Period exists for this Dataset, so find its
6174         -- name, GL period number and period year
6175 
6176           -- Find the Cal Period Name
6177           SELECT CAL_PERIOD_NAME
6178           INTO v_cal_per_name
6179           FROM FEM_CAL_PERIODS_TL
6180           WHERE CAL_PERIOD_ID = v_first_load_cal_per_id
6181           AND LANGUAGE = USERENV('LANG');
6182 
6183           BEGIN
6184             -- Retrieve the First Load Cal Period GL_PERIOD_NUM attribute
6185             fem_dimension_util_pkg.get_dim_attr_id_ver_id
6186               (x_err_code    => pv_API_return_code,
6187                x_attr_id     => pv_dim_attr_id,
6188                x_ver_id      => pv_dim_attr_ver_id,
6189                p_dim_id      => pv_cal_per_dim_id,
6190                p_attr_label  => 'GL_PERIOD_NUM');
6191 
6192             IF pv_API_return_code > 0
6193             THEN
6194               -- Fail to find the attribute version
6195               FEM_ENGINES_PKG.Tech_Message
6196                 (p_severity => pc_log_level_exception,
6197                  p_module   => v_module,
6198                  p_msg_text => 'raising Invalid_Cal_Period_ID when getting period num');
6199               pv_attr_label := 'GL_PERIOD_NUM';
6200               RAISE Invalid_Cal_Period_ID;
6201             END IF;
6202 
6203             SELECT number_assign_value
6204               INTO v_cal_per_num
6205               FROM fem_cal_periods_attr
6206              WHERE attribute_id  = pv_dim_attr_id
6207                AND version_id    = pv_dim_attr_ver_id
6208                AND cal_period_id = v_first_load_cal_per_id;
6209 
6210             FEM_ENGINES_PKG.Tech_Message
6211              (p_severity => pc_log_level_statement,
6212               p_module   => v_module,
6213               p_app_name => 'FEM',
6214               p_msg_name => 'FEM_GL_POST_204',
6215               p_token1   => 'VAR_NAME',
6216               p_value1   => 'v_cal_per_num',
6217               p_token2   => 'VAR_VAL',
6218               p_value2   => TO_CHAR(v_cal_per_num));
6219 
6220           EXCEPTION
6221             WHEN NO_DATA_FOUND THEN
6222               -- Fail to retrieve the First Load Cal Peroid Number
6223               FEM_ENGINES_PKG.Tech_Message
6224                 (p_severity => pc_log_level_exception,
6225                  p_module   => v_module,
6226                  p_msg_text => 'raising Invalid_Cal_Period_ID when getting period num');
6227               pv_attr_label := 'GL_PERIOD_NUM';
6228               RAISE Invalid_Cal_Period_ID;
6229           END;
6230 
6231           BEGIN
6232             -- Retrieve the First Load Cal Period ACCOUNTING_YEAR attribute
6233             fem_dimension_util_pkg.get_dim_attr_id_ver_id
6234               (x_err_code    => pv_API_return_code,
6235                x_attr_id     => pv_dim_attr_id,
6236                x_ver_id      => pv_dim_attr_ver_id,
6237                p_dim_id      => pv_cal_per_dim_id,
6238                p_attr_label  => 'ACCOUNTING_YEAR');
6239 
6240             IF pv_API_return_code > 0
6241             THEN
6242               -- Fail to find the attribute version
6243               FEM_ENGINES_PKG.Tech_Message
6244                 (p_severity => pc_log_level_exception,
6245                  p_module   => v_module,
6246                  p_msg_text => 'raising Invalid_Cal_Period_ID when getting year');
6247               pv_attr_label := 'ACCOUNTING_YEAR';
6248               RAISE Invalid_Cal_Period_ID;
6249             END IF;
6250 
6251             SELECT number_assign_value
6252               INTO v_cal_per_year
6253               FROM fem_cal_periods_attr
6254              WHERE attribute_id  = pv_dim_attr_id
6255                AND version_id    = pv_dim_attr_ver_id
6256                AND cal_period_id = v_first_load_cal_per_id;
6257 
6258             FEM_ENGINES_PKG.Tech_Message
6259              (p_severity => pc_log_level_statement,
6260               p_module   => v_module,
6261               p_app_name => 'FEM',
6262               p_msg_name => 'FEM_GL_POST_204',
6266               p_value2   => TO_CHAR(v_cal_per_year));
6263               p_token1   => 'VAR_NAME',
6264               p_value1   => 'v_cal_per_year',
6265               p_token2   => 'VAR_VAL',
6267 
6268           EXCEPTION
6269             WHEN NO_DATA_FOUND THEN
6270               -- Fail to retrieve the First Load Cal Period Accounting Year
6271               FEM_ENGINES_PKG.Tech_Message
6272                 (p_severity => pc_log_level_exception,
6273                  p_module   => v_module,
6274                  p_msg_text => 'raising Invalid_Cal_Period_ID when getting year');
6275               pv_attr_label := 'ACCOUNTING_YEAR';
6276               RAISE Invalid_Cal_Period_ID;
6277           END;
6278 
6279           -- Find the corresponding GL Effective Period Number
6280           SELECT effective_period_num
6281             INTO v_first_load_eff_per_num
6282             FROM GL_PERIOD_STATUSES
6283            WHERE APPLICATION_ID = 101
6284              AND LEDGER_ID = pv_ledger_id
6285              AND PERIOD_YEAR = v_cal_per_year
6286              AND PERIOD_NUM = v_cal_per_num;
6287 
6288           FEM_ENGINES_PKG.Tech_Message
6289             (p_severity => pc_log_level_statement,
6290              p_module   => v_module,
6291              p_app_name => 'FEM',
6292              p_msg_name => 'FEM_GL_POST_204',
6293              p_token1   => 'VAR_NAME',
6294              p_value1   => 'v_first_load_eff_per_num',
6295              p_token2   => 'VAR_VAL',
6296              p_value2   => TO_CHAR(v_first_load_eff_per_num));
6297 
6298           IF (v_last_load_cal_per_id <> v_first_load_cal_per_id)
6299           THEN
6300             -- The Last Load Cal Period is different with the First Load Cal
6301             -- Period, so find its name, GL period number and period year
6302 
6303             -- Find the Cal Period Name
6304             SELECT CAL_PERIOD_NAME
6305             INTO v_cal_per_name
6306             FROM FEM_CAL_PERIODS_TL
6307             WHERE CAL_PERIOD_ID = v_last_load_cal_per_id
6308             AND LANGUAGE = USERENV('LANG');
6309 
6310             BEGIN
6311               -- Retrieve the Last Load Cal Period GL_PERIOD_NUM attribute
6312               fem_dimension_util_pkg.get_dim_attr_id_ver_id
6313                 (x_err_code    => pv_API_return_code,
6314                  x_attr_id     => pv_dim_attr_id,
6315                  x_ver_id      => pv_dim_attr_ver_id,
6316                  p_dim_id      => pv_cal_per_dim_id,
6317               p_attr_label  => 'GL_PERIOD_NUM');
6318 
6319               IF pv_API_return_code > 0
6320               THEN
6321                 -- Fail to find the attribute version
6322                 FEM_ENGINES_PKG.Tech_Message
6323                   (p_severity => pc_log_level_exception,
6324                    p_module   => v_module,
6325                    p_msg_text => 'raising Invalid_Cal_Period_ID when getting period num');
6326                 pv_attr_label := 'GL_PERIOD_NUM';
6327                 RAISE Invalid_Cal_Period_ID;
6328               END IF;
6329 
6330               SELECT number_assign_value
6331                 INTO v_cal_per_num
6332                 FROM fem_cal_periods_attr
6333                WHERE attribute_id  = pv_dim_attr_id
6334                  AND version_id    = pv_dim_attr_ver_id
6335                  AND cal_period_id = v_last_load_cal_per_id;
6336 
6337               FEM_ENGINES_PKG.Tech_Message
6338                (p_severity => pc_log_level_statement,
6339                 p_module   => v_module,
6340                 p_app_name => 'FEM',
6341                 p_msg_name => 'FEM_GL_POST_204',
6342                 p_token1   => 'VAR_NAME',
6343                 p_value1   => 'v_cal_per_num',
6344                 p_token2   => 'VAR_VAL',
6345                 p_value2   => TO_CHAR(v_cal_per_num));
6346 
6347             EXCEPTION
6348               WHEN NO_DATA_FOUND THEN
6349                 -- Fail to retrieve the Last Load Cal Peroid Number
6350                 FEM_ENGINES_PKG.Tech_Message
6351                   (p_severity => pc_log_level_exception,
6352                    p_module   => v_module,
6353                    p_msg_text => 'raising Invalid_Cal_Period_ID when getting period num');
6354                    pv_attr_label := 'GL_PERIOD_NUM';
6355                 RAISE Invalid_Cal_Period_ID;
6356             END;
6357 
6358             BEGIN
6359               -- Retrieve the Last Load Cal Period ACCOUNTING_YEAR attribute
6360               fem_dimension_util_pkg.get_dim_attr_id_ver_id
6361                 (x_err_code    => pv_API_return_code,
6362                  x_attr_id     => pv_dim_attr_id,
6363                  x_ver_id      => pv_dim_attr_ver_id,
6364                  p_dim_id      => pv_cal_per_dim_id,
6365                  p_attr_label  => 'ACCOUNTING_YEAR');
6366 
6367               IF pv_API_return_code > 0
6368               THEN
6369                 -- Fail to find the attribute version
6370                 FEM_ENGINES_PKG.Tech_Message
6371                   (p_severity => pc_log_level_exception,
6372                    p_module   => v_module,
6373                    p_msg_text => 'raising Invalid_Cal_Period_ID when getting year');
6374                 pv_attr_label := 'ACCOUNTING_YEAR';
6375                 RAISE Invalid_Cal_Period_ID;
6376               END IF;
6377 
6378               SELECT number_assign_value
6379                 INTO v_cal_per_year
6380                 FROM fem_cal_periods_attr
6381                WHERE attribute_id  = pv_dim_attr_id
6382                  AND version_id    = pv_dim_attr_ver_id
6383                  AND cal_period_id = v_last_load_cal_per_id;
6387                 p_module   => v_module,
6384 
6385               FEM_ENGINES_PKG.Tech_Message
6386                (p_severity => pc_log_level_statement,
6388                 p_app_name => 'FEM',
6389                 p_msg_name => 'FEM_GL_POST_204',
6390                 p_token1   => 'VAR_NAME',
6391                 p_value1   => 'v_cal_per_year',
6392                 p_token2   => 'VAR_VAL',
6393                 p_value2   => TO_CHAR(v_cal_per_year));
6394 
6395             EXCEPTION
6396               WHEN NO_DATA_FOUND THEN
6397                 -- Fail to retrieve the Last Load Cal Period Accounting Year
6398                 FEM_ENGINES_PKG.Tech_Message
6399                   (p_severity => pc_log_level_exception,
6400                    p_module   => v_module,
6401                    p_msg_text => 'raising Invalid_Cal_Period_ID when getting year');
6402                 pv_attr_label := 'ACCOUNTING_YEAR';
6403                 RAISE Invalid_Cal_Period_ID;
6404             END;
6405 
6406             -- Find the corresponding GL Effective Period Number
6407             SELECT effective_period_num
6408               INTO v_last_load_eff_per_num
6409               FROM GL_PERIOD_STATUSES
6410              WHERE APPLICATION_ID = 101
6411                AND LEDGER_ID = pv_ledger_id
6412                AND PERIOD_YEAR = v_cal_per_year
6413                AND PERIOD_NUM = v_cal_per_num;
6414 
6415           ELSE
6416             -- The Last Load Cal Period is same as the First Load Cal Period
6417             v_last_load_eff_per_num := v_first_load_eff_per_num;
6418 
6419           END IF; -- IF (v_last_load_cal_per_id <> v_first_load_cal_per_id)
6420 
6421           FEM_ENGINES_PKG.Tech_Message
6422             (p_severity => pc_log_level_statement,
6423              p_module   => v_module,
6424              p_app_name => 'FEM',
6425              p_msg_name => 'FEM_GL_POST_204',
6426              p_token1   => 'VAR_NAME',
6427              p_value1   => 'v_last_load_eff_per_num',
6428              p_token2   => 'VAR_VAL',
6429              p_value2   => TO_CHAR(v_last_load_eff_per_num));
6430 
6431           BEGIN
6432             SELECT 'Y'
6433             INTO v_any_period_gap
6434             FROM DUAL
6435             WHERE EXISTS
6436                   (SELECT 'Period gap exists'
6437                      FROM GL_PERIOD_STATUSES
6438                     WHERE LEDGER_ID = pv_ledger_id
6439                       AND APPLICATION_ID = 101
6440                       AND ((v_first_load_eff_per_num > v_max_valid_eff_per_num
6441                        AND EFFECTIVE_PERIOD_NUM > v_max_valid_eff_per_num
6442                             AND EFFECTIVE_PERIOD_NUM < v_first_load_eff_per_num)
6443                            OR
6444                            (v_min_valid_eff_per_num  > v_last_load_eff_per_num
6445                       AND EFFECTIVE_PERIOD_NUM > v_last_load_eff_per_num
6446                             AND EFFECTIVE_PERIOD_NUM < v_min_valid_eff_per_num)));
6447           EXCEPTION
6448             WHEN NO_DATA_FOUND THEN
6449               v_any_period_gap := 'N';
6450           END;
6451 
6452         END IF; -- IF (v_first_load_cal_per_id <> -1)
6453 
6454         FEM_ENGINES_PKG.Tech_Message
6455           (p_severity => pc_log_level_statement,
6456            p_module   => v_module,
6457            p_app_name => 'FEM',
6458            p_msg_name => 'FEM_GL_POST_204',
6459            p_token1   => 'VAR_NAME',
6460            p_value1   => 'v_any_period_gap',
6461            p_token2   => 'VAR_VAL',
6462            p_value2   => v_any_period_gap);
6463 
6464         IF (v_any_period_gap = 'N')
6465         THEN
6466           -- No period gap exists between the loaded period range and the valid
6467         -- period range, so start to register the valid periods
6468 
6469           -- ------------------------------------------------------------------
6470           -- Loop for each valid Cal Period in FEM_INTG_EXEC_PARAMS_GT for this
6471           -- Output Dataset
6472           -- ------------------------------------------------------------------
6473           FOR v_cp IN cp_cur(v_ds.output_dataset_code) LOOP
6474             -- Log the current Period Name, Cal Period ID, and Load Method Code
6475             FEM_ENGINES_PKG.Tech_Message
6476               (p_severity => pc_log_level_statement,
6477                p_module   => v_module,
6478                p_app_name => 'FEM',
6479                p_msg_name => 'FEM_GL_POST_204',
6480                p_token1   => 'VAR_NAME',
6481                p_value1   => 'v_cp.period_name',
6482                p_token2   => 'VAR_VAL',
6483                p_value2   => v_cp.period_name);
6484             FEM_ENGINES_PKG.Tech_Message
6485               (p_severity => pc_log_level_statement,
6486                p_module   => v_module,
6487                p_app_name => 'FEM',
6488                p_msg_name => 'FEM_GL_POST_204',
6489                p_token1   => 'VAR_NAME',
6490                p_value1   => 'v_cp.cal_period_id',
6491                p_token2   => 'VAR_VAL',
6492                p_value2   => TO_CHAR(v_cp.cal_period_id));
6493            FEM_ENGINES_PKG.Tech_Message
6494               (p_severity => pc_log_level_statement,
6495                p_module   => v_module,
6496                p_app_name => 'FEM',
6497                p_msg_name => 'FEM_GL_POST_204',
6498                p_token1   => 'VAR_NAME',
6499                p_value1   => 'v_cp.effective_period_num',
6500                p_token2   => 'VAR_VAL',
6501                p_value2   => TO_CHAR(v_cp.effective_period_num));
6502             FEM_ENGINES_PKG.Tech_Message
6506                p_msg_name => 'FEM_GL_POST_204',
6503               (p_severity => pc_log_level_statement,
6504                p_module   => v_module,
6505                p_app_name => 'FEM',
6507                p_token1   => 'VAR_NAME',
6508                p_value1   => 'v_cp.load_method_code',
6509                p_token2   => 'VAR_VAL',
6510                p_value2   => v_cp.load_method_code);
6511             -- Bug fix 4285337: Print the end date for each period
6512             FEM_ENGINES_PKG.Tech_Message
6513               (p_severity => pc_log_level_statement,
6514                p_module   => v_module,
6515                p_app_name => 'FEM',
6516                p_msg_name => 'FEM_GL_POST_204',
6517                p_token1   => 'VAR_NAME',
6518                p_value1   => 'v_cp.end_date',
6519                p_token2   => 'VAR_VAL',
6520                p_value2   => v_cp.end_date);
6521 
6522             -- ------------------------------------------------------------------
6523             -- 2. If the load method is Incremental, check whether it is required
6524             --    to set the load method as Snapshot
6525             -- ------------------------------------------------------------------
6526             v_load_method := v_cp.load_method_code;
6527             IF (v_load_method = 'I')
6528             THEN
6529               IF (v_first_load_cal_per_id = -1)
6530               THEN
6531                 -- Since no balances have ever been loaded before for this
6532             -- Ledger/Output Dataset, always set the load method as Snapshot
6533                 v_load_method := 'S';
6534               ELSE
6535                 -- Balances have been loaded before for this Ledger/Output
6536                 -- Dataset, so we need to check if any balances have been loaded
6537                 -- for this Ledger/Output Dataset/Cal Period
6538                 BEGIN
6539                   -- Bug fix 4170124: Changed to check FEM_DL_DIMENSIONS instead
6540                   -- of FEM_PL_REQUESTS
6541                   SELECT 'Y'
6542                   INTO v_dummy_flag
6543                   FROM DUAL
6544                   WHERE EXISTS
6545                      (SELECT 'Loaded'
6546                             FROM FEM_DL_DIMENSIONS
6547                            WHERE LEDGER_ID = pv_ledger_id
6548                              AND CAL_PERIOD_ID = v_cp.cal_period_id
6549                              AND DATASET_CODE = v_ds.output_dataset_code
6550                              AND SOURCE_SYSTEM_CODE = pv_gl_source_system_code
6551                              AND TABLE_NAME = 'FEM_BALANCES');
6552                 EXCEPTION
6553                   WHEN NO_DATA_FOUND THEN
6554                     -- No balances have been loaded for this Ledger/Output
6555                     -- Dataset/Cal Period, so set the load method as Snapshot
6556                     v_load_method := 'S';
6557                 END;
6558               END IF; -- IF (v_first_load_cal_period_id = -1)
6559             END IF; -- IF (v_cp.load_method_code = 'I')
6560 
6561             FEM_ENGINES_PKG.Tech_Message
6562               (p_severity => pc_log_level_statement,
6563                p_module   => v_module,
6564                p_app_name => 'FEM',
6565                p_msg_name => 'FEM_GL_POST_204',
6566                p_token1   => 'VAR_NAME',
6567                p_value1   => 'v_load_method',
6568                p_token2   => 'VAR_VAL',
6569                p_value2   => v_load_method);
6570 
6571             -- -------------------------------------------------------------
6572             -- 3. Register request for this Ledger/Output Dataset/Cal Period
6573             -- -------------------------------------------------------------
6574 
6575             -- Get a new request ID to register
6576             SELECT FND_CONCURRENT_REQUESTS_S.nextval
6577             INTO v_req_id
6578             FROM DUAL;
6579 
6580             -- Print the request ID to FND Log
6581             FEM_ENGINES_PKG.Tech_Message
6582               (p_severity => pc_log_level_statement,
6583                p_module   => v_module,
6584                p_app_name => 'FEM',
6585                p_msg_name => 'FEM_GL_POST_204',
6586                p_token1   => 'VAR_NAME',
6587                p_value1   => 'v_req_id',
6588                p_token2   => 'VAR_VAL',
6589                p_value2   => TO_CHAR(v_req_id));
6590 
6591             -- Initialize the FND Message API
6592             FND_MSG_PUB.Initialize;
6593             -- Register the concurrent request in FEM_PL_REQUESTS
6594             -- Bug fix 4285337: Pass the end date of each period when
6595          -- registering the request
6596             FEM_PL_PKG.Register_Request
6597               (P_API_VERSION            => pc_API_version,
6598                P_COMMIT                 => 'T',
6599                P_CAL_PERIOD_ID          => v_cp.cal_period_id,
6600                P_LEDGER_ID              => pv_ledger_id,
6601                P_OUTPUT_DATASET_CODE    => v_ds.output_dataset_code,
6602                P_EFFECTIVE_DATE         => v_cp.end_date,
6603                P_REQUEST_ID             => v_req_id,
6604                P_USER_ID                => pv_user_id,
6605                P_LAST_UPDATE_LOGIN      => pv_login_id,
6606                P_PROGRAM_ID             => pv_pgm_id,
6607                P_PROGRAM_LOGIN_ID       => pv_login_id,
6608                P_PROGRAM_APPLICATION_ID => pv_pgm_app_id,
6609                P_EXEC_MODE_CODE         => v_load_method,
6610                X_MSG_COUNT              => v_msg_count,
6611                X_MSG_DATA               => v_msg_data,
6612                X_RETURN_STATUS          => v_return_status);
6613 
6617               FEM_ENGINES_PKG.Tech_Message
6614             IF (v_return_status <> 'S')
6615             THEN
6616               -- Incompatible API or unexpected database error
6618                 (p_severity => pc_log_level_statement,
6619                  p_module   => v_module,
6620                  p_msg_text => 'Raising OGLRegProc_FatalErr after calling Register_Request');
6621               RAISE OGLRegProc_FatalErr;
6622             END IF; -- IF (v_return_status <> 'S')
6623 
6624             -- ---------------------------------------------------------------
6625             -- 4. Register execution for this Ledger/Output Dataset/Cal Period
6626             -- ---------------------------------------------------------------
6627 
6628             -- Initialize the FND Message API
6629             FND_MSG_PUB.Initialize;
6630             -- Check for process locks and process overlaps, validate the execution
6631             -- mode parameter, validate the period(s), and register the execution in
6632             -- FEM_PL_OBJECT_EXECUTIONS
6633             FEM_PL_PKG.Register_Object_Execution
6634               (P_API_VERSION               => pc_API_version,
6635                P_COMMIT                    => 'T',
6636                P_REQUEST_ID                => v_req_id,
6637                P_OBJECT_ID                 => pv_rule_obj_id,
6638                P_EXEC_OBJECT_DEFINITION_ID => pv_rule_obj_def_id,
6639                P_USER_ID                   => pv_user_id,
6640                P_LAST_UPDATE_LOGIN         => pv_login_id,
6641                P_EXEC_MODE_CODE            => v_load_method,
6642                X_EXEC_STATE                => pv_exec_state,
6643                X_PREV_REQUEST_ID           => pv_prev_req_id,
6644                X_MSG_COUNT                 => v_msg_count,
6645                X_MSG_DATA                  => v_msg_data,
6646                X_RETURN_STATUS             => v_return_status);
6647 
6648             IF v_return_status = 'E'
6649             THEN
6650               -- The execution lock exists for this Output Dataset/Cal Period
6651               FEM_ENGINES_PKG.Tech_Message
6652                 (p_severity => pc_log_level_exception,
6653                  p_module   => v_module,
6654                  p_app_name => 'FEM',
6655                  p_msg_name => 'FEM_INTG_BAL_REGISTER_FAIL',
6656                  p_token1   => 'DS_CODE',
6657                  p_value1   => v_ds.output_dataset_code,
6658                  p_token2   => 'PER_NAME',
6659                  p_value2   => v_cp.PERIOD_NAME);
6660               FEM_ENGINES_PKG.User_Message
6661                 (p_app_name => 'FEM',
6662                  p_msg_name => 'FEM_INTG_BAL_REGISTER_FAIL',
6663                  p_token1   => 'DS_CODE',
6664                  p_value1   => v_ds.output_dataset_code,
6665                  p_token2   => 'PER_NAME',
6666                  p_value2   => v_cp.PERIOD_NAME);
6667 
6668               -- Log the user message(s) returned by Register_Object_Execution()
6669               IF v_msg_count = 1
6670               THEN
6671                 -- Only one message
6672                 FEM_ENGINES_PKG.User_Message
6673                   (p_app_name => 'FEM',
6674                    p_msg_text => v_msg_data);
6675 
6676               ELSIF v_msg_count > 1
6677               THEN
6678                 -- More than one messages
6679                 FOR i IN 1 .. v_msg_count LOOP
6680                   v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
6681                   FEM_ENGINES_PKG.User_Message
6682                     (p_app_name => 'FEM',
6683                      p_msg_text => v_msg_data);
6684                 END LOOP;
6685 
6686               END IF; -- IF v_msg_count = 1
6687 
6688               -- Update the load method code and error code of
6689               -- FEM_INTG_EXEC_PARAMS_GT for this Output Dataset/Cal Period
6690               UPDATE FEM_INTG_EXEC_PARAMS_GT
6691               SET LOAD_METHOD_CODE = v_load_method
6692                 , ERROR_CODE = 'EXEC_LOCK_EXISTS'
6693               WHERE CAL_PERIOD_ID = v_cp.cal_period_id
6694               AND OUTPUT_DATASET_CODE = v_ds.output_dataset_code;
6695 
6696               -- Initialize the FND Message API
6697               FND_MSG_PUB.Initialize;
6698               -- Unregister the request for this Cal Period/Output Dataset
6699               FEM_PL_PKG.Unregister_Request
6700                 (P_API_VERSION   => pc_API_version,
6701                  P_COMMIT        => 'T',
6702                  P_REQUEST_ID    => v_req_id,
6703                  X_MSG_COUNT     => v_msg_count,
6704                  X_MSG_DATA      => v_msg_data,
6705                  X_RETURN_STATUS => v_return_status);
6706 
6707               -- Log the user message(s) returned by Unregister_Request()
6708               IF v_msg_count = 1
6709               THEN
6710                 -- Only one message
6711                 FEM_ENGINES_PKG.User_Message
6712                   (p_app_name => 'FEM',
6713                    p_msg_text => v_msg_data);
6714 
6715               ELSIF v_msg_count > 1
6716               THEN
6717                 -- More than one messages
6718                 FOR i IN 1 .. v_msg_count LOOP
6719                   v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
6720                   FEM_ENGINES_PKG.User_Message
6721                     (p_app_name => 'FEM',
6722                      p_msg_text => v_msg_data);
6723                 END LOOP;
6724               END IF; -- IF v_msg_count = 1
6725 
6726               x_completion_code := 1; -- Indicating warning
6730             THEN
6727               EXIT; -- Exit the cp_cur loop
6728 
6729             ELSIF v_return_status = 'U'
6731               -- Unexpected database error
6732               FEM_ENGINES_PKG.Tech_Message
6733                 (p_severity => pc_log_level_exception,
6734                  p_module   => v_module,
6735                  p_app_name => 'FEM',
6736                  p_msg_name => 'FEM_INTG_BAL_REGISTER_FAIL',
6737                  p_token1   => 'DS_CODE',
6738                  p_value1   => v_ds.output_dataset_code,
6739                  p_token2   => 'PER_NAME',
6740                  p_value2   => v_cp.PERIOD_NAME);
6741               FEM_ENGINES_PKG.User_Message
6742                 (p_app_name => 'FEM',
6743                  p_msg_name => 'FEM_INTG_BAL_REGISTER_FAIL',
6744                  p_token1   => 'DS_CODE',
6745                  p_value1   => v_ds.output_dataset_code,
6746                  p_token2   => 'PER_NAME',
6747                  p_value2   => v_cp.PERIOD_NAME);
6748 
6749               FEM_ENGINES_PKG.Tech_Message
6750                 (p_severity => pc_log_level_exception,
6751                  p_module   => v_module,
6752                  p_msg_text => 'Raising OGLRegProc_FatalErr after calling Register_Object_Execution');
6753               RAISE OGLRegProc_FatalErr;
6754 
6755             ELSE
6756               -- Succeed to register execution for this Cal Period/Output Dataset
6757               FEM_ENGINES_PKG.Tech_Message
6758                 (p_severity => pc_log_level_event,
6759                  p_module   => v_module,
6760                  p_app_name => 'FEM',
6761                  p_msg_name => 'FEM_INTG_BAL_REGISTER_SUCC',
6762                  p_token1   => 'DS_CODE',
6763                  p_value1   => v_ds.output_dataset_code,
6764                  p_token2   => 'PER_NAME',
6765                  p_value2   => v_cp.PERIOD_NAME);
6766               FEM_ENGINES_PKG.User_Message
6767                 (p_app_name => 'FEM',
6768                  p_msg_name => 'FEM_INTG_BAL_REGISTER_SUCC',
6769                  p_token1   => 'DS_CODE',
6770                  p_value1   => v_ds.output_dataset_code,
6771                  p_token2   => 'PER_NAME',
6772                  p_value2   => v_cp.PERIOD_NAME);
6773 
6774               UPDATE FEM_INTG_EXEC_PARAMS_GT
6775               SET REQUEST_ID = v_req_id
6776                 , LOAD_METHOD_CODE = v_load_method
6777               WHERE CAL_PERIOD_ID = v_cp.cal_period_id
6778               AND OUTPUT_DATASET_CODE = v_ds.output_dataset_code;
6779 
6780               -- Set the First Registered Effective Period Number as the current
6781               -- Effective Period Number of this Cal Period if this is the first
6782               -- period registered successfully for this Dataset
6783               IF (v_first_reg_eff_per_num = -1)
6784               THEN
6785                 v_first_reg_eff_per_num := v_cp.effective_period_num;
6786               END IF;
6787 
6788               -- Set the Last Registered Effective Period Number as the current
6789               -- Effective Period Number of this Cal Period
6790               v_last_reg_eff_per_num := v_cp.effective_period_num;
6791 
6792             END IF; -- IF v_return_status = 'E'
6793 
6794           END LOOP; -- cp_cur LOOP
6795 
6796           FEM_ENGINES_PKG.Tech_Message
6797             (p_severity => pc_log_level_statement,
6798              p_module   => v_module,
6799              p_app_name => 'FEM',
6800              p_msg_name => 'FEM_GL_POST_204',
6801              p_token1   => 'VAR_NAME',
6802              p_value1   => 'v_first_reg_eff_per_num',
6803              p_token2   => 'VAR_VAL',
6804              p_value2   => TO_CHAR(v_first_reg_eff_per_num));
6805           FEM_ENGINES_PKG.Tech_Message
6806             (p_severity => pc_log_level_statement,
6807              p_module   => v_module,
6808              p_app_name => 'FEM',
6809              p_msg_name => 'FEM_GL_POST_204',
6810              p_token1   => 'VAR_NAME',
6811              p_value1   => 'v_last_reg_eff_per_num',
6812              p_token2   => 'VAR_VAL',
6813              p_value2   => TO_CHAR(v_last_reg_eff_per_num));
6814 
6815           IF (v_first_load_eff_per_num <> -1)
6816           THEN
6817             BEGIN
6818               SELECT 'Y'
6819               INTO v_any_period_gap
6820               FROM DUAL
6821               WHERE EXISTS
6822                     (SELECT 'Period gap exists'
6823                        FROM GL_PERIOD_STATUSES
6824                       WHERE LEDGER_ID = pv_ledger_id
6825                         AND APPLICATION_ID = 101
6826                         AND ((v_first_load_eff_per_num > v_last_reg_eff_per_num
6827                               AND EFFECTIVE_PERIOD_NUM > v_last_reg_eff_per_num
6828                               AND EFFECTIVE_PERIOD_NUM < v_first_load_eff_per_num)
6829                              OR
6830                              (v_first_reg_eff_per_num  > v_last_load_eff_per_num
6831                         AND EFFECTIVE_PERIOD_NUM > v_last_load_eff_per_num
6832                               AND EFFECTIVE_PERIOD_NUM < v_first_reg_eff_per_num)));
6833 
6834             EXCEPTION
6835               WHEN NO_DATA_FOUND THEN
6836                 v_any_period_gap := 'N';
6837             END;
6838           END IF; -- IF (v_first_load_eff_per_num <> -1)
6839 
6840           FEM_ENGINES_PKG.Tech_Message
6841             (p_severity => pc_log_level_statement,
6842              p_module   => v_module,
6843              p_app_name => 'FEM',
6844              p_msg_name => 'FEM_GL_POST_204',
6845              p_token1   => 'VAR_NAME',
6849 
6846              p_value1   => 'v_any_period_gap',
6847              p_token2   => 'VAR_VAL',
6848              p_value2   => v_any_period_gap);
6850         END IF; -- IF (v_any_period_gap = 'N')
6851 
6852         IF (v_any_period_gap = 'Y')
6853         THEN
6854           -- Period gap exists between the loaded period range and the valid
6855           -- period range/registered period range, so no periods can be
6856           -- processed
6857 
6858           -- Log the warning messages
6859           FEM_ENGINES_PKG.Tech_Message
6860             (p_severity => pc_log_level_exception,
6861              p_module   => v_module,
6862              p_app_name => 'FEM',
6863              p_msg_name => 'FEM_INTG_BAL_PERIOD_GAP',
6864              p_token1   => 'DS_CODE',
6865              p_value1   => v_ds.output_dataset_code);
6866           FEM_ENGINES_PKG.User_Message
6867             (p_app_name => 'FEM',
6868              p_msg_name => 'FEM_INTG_BAL_PERIOD_GAP',
6869              p_token1   => 'DS_CODE',
6870              p_value1   => v_ds.output_dataset_code);
6871 
6872           -- Populate the error code PERIOD_GAP_EXISTS for all Cal Periods for
6873           -- this Output Dataset
6874           UPDATE FEM_INTG_EXEC_PARAMS_GT
6875           SET ERROR_CODE = 'PERIOD_GAP_EXISTS'
6876           WHERE OUTPUT_DATASET_CODE = v_ds.output_dataset_code
6877           AND ERROR_CODE IS NULL;
6878 
6879           x_completion_code := 1; -- Indicating warning
6880 
6881         END IF; -- IF (v_any_period_gap = 'Y')
6882 
6883       END IF; -- IF (v_min_valid_eff_per_num <> -1)
6884 
6885     END LOOP; -- ds_cur LOOP
6886 
6887     -- ------------------------------------------------------------------
6888     -- 5. Determine the statment type performed on FEM_BALANCES and which
6889     --    tables the balances will be loaded from
6890     -- ------------------------------------------------------------------
6891 
6892     BEGIN
6893       SELECT DISTINCT LOAD_METHOD_CODE
6894       INTO v_load_method
6895       FROM FEM_INTG_EXEC_PARAMS_GT
6896       WHERE ERROR_CODE IS NULL
6897       AND REQUEST_ID IS NOT NULL;
6898     EXCEPTION
6899       WHEN NO_DATA_FOUND THEN
6900         -- There are no valid execution parameters
6901         FEM_ENGINES_PKG.Tech_Message
6902           (p_severity => pc_log_level_error,
6903            p_module   => v_module,
6904            p_app_name => 'FEM',
6905            p_msg_name => 'FEM_INTG_BAL_NO_VALID_EXEC');
6906         FEM_ENGINES_PKG.User_Message
6907           (p_app_name => 'FEM',
6908            p_msg_name => 'FEM_INTG_BAL_NO_VALID_EXEC');
6909         RAISE OGLRegProc_FatalErr;
6910 
6911       WHEN TOO_MANY_ROWS THEN
6912         v_load_method := 'B'; -- indicating both 'S' and 'I' exists
6913     END;
6914 
6915     -- Set the pv_stmt_type
6916     IF (v_load_method = 'S')
6917     THEN
6918       -- All load method codes are Snapshot
6919       pv_stmt_type := 'INSERT';
6920 
6921       IF (pv_exec_mode = 'I')
6922       THEN
6923         -- The original execution mode is Incremental, so log a message to
6924         -- inform users that it's been changed to Snapshot mode
6925         FEM_ENGINES_PKG.Tech_Message
6926           (p_severity => pc_log_level_event,
6927            p_module   => v_module,
6928            p_app_name => 'FEM',
6929            p_msg_name => 'FEM_INTG_BAL_CHANGE_TO_SNAP');
6930         FEM_ENGINES_PKG.User_Message
6931           (p_app_name => 'FEM',
6932            p_msg_name => 'FEM_INTG_BAL_CHANGE_TO_SNAP');
6933       END IF;
6934 
6935     ELSE
6936       -- All load method codes are Incremental or both codes exist
6937       pv_stmt_type := 'MERGE';
6938 
6939     END IF; -- IF (v_load_method = 'S')
6940 
6941     FEM_ENGINES_PKG.Tech_Message
6942       (p_severity => pc_log_level_statement,
6943        p_module   => v_module,
6944        p_app_name => 'FEM',
6945        p_msg_name => 'FEM_GL_POST_204',
6946        p_token1   => 'VAR_NAME',
6947        p_value1   => 'pv_stmt_type',
6948        p_token2   => 'VAR_VAL',
6949        p_value2   => pv_stmt_type);
6950 
6951     -- Set the pv_from_gl_bal_flag and pv_from_gl_delta_flag
6952     IF (pv_ds_balance_type_cd = 'BUDGET' OR v_load_method = 'S')
6953     THEN
6954       -- The balance type is Budget or all load method codes are 'Snapshot', so
6955       -- it'll only load balances from GL_BALANCES
6956       pv_from_gl_bal_flag := 'Y';
6957       pv_from_gl_delta_flag := 'N';
6958 
6959     ELSIF (v_load_method = 'I')
6960     THEN
6961       -- All load method codes are 'Incremental' and the balance type is Actual
6962       -- or Encumbrance Type, so it'll only load balances from GL_BALANCES_DELTA
6963       pv_from_gl_bal_flag := 'N';
6964       pv_from_gl_delta_flag := 'Y';
6965 
6966     ELSE
6967       -- Both codes exist and the balance type is Actual or Encumbrance Type, so
6968       -- it'll load balances from both GL_BALANCES and GL_BALANCES_DELTA
6969       pv_from_gl_bal_flag := 'Y';
6970       pv_from_gl_delta_flag := 'Y';
6971 
6972     END IF; -- IF (pv_ds_balance_type_cd = 'BALANCE' OR v_load_method = 'S')
6973 
6974     FEM_ENGINES_PKG.Tech_Message
6975       (p_severity => pc_log_level_statement,
6976        p_module   => v_module,
6977        p_app_name => 'FEM',
6978        p_msg_name => 'FEM_GL_POST_204',
6979        p_token1   => 'VAR_NAME',
6980        p_value1   => 'pv_from_gl_bal_flag',
6981        p_token2   => 'VAR_VAL',
6982        p_value2   => pv_from_gl_bal_flag);
6983 
6987        p_app_name => 'FEM',
6984     FEM_ENGINES_PKG.Tech_Message
6985       (p_severity => pc_log_level_statement,
6986        p_module   => v_module,
6988        p_msg_name => 'FEM_GL_POST_204',
6989        p_token1   => 'VAR_NAME',
6990        p_value1   => 'pv_from_gl_delta_flag',
6991        p_token2   => 'VAR_VAL',
6992        p_value2   => pv_from_gl_delta_flag);
6993 
6994     -- -----------------------------------------------------
6995     -- 6. Register table information for registered requests
6996     -- -----------------------------------------------------
6997     FOR v_req IN req_cur LOOP
6998       -- Initialize the FND Message API
6999       FND_MSG_PUB.Initialize;
7000       -- Log Undo information for this Request, which will insert/update the
7001       -- table FEM_BALANCES; pass pv_stmt_type as the statement type
7002       FEM_PL_PKG.Register_Table
7003         (P_API_VERSION        => pc_API_version,
7004          P_COMMIT             => 'T',
7005          P_REQUEST_ID         => v_req.request_id,
7006          P_OBJECT_ID          => pv_rule_obj_id,
7007          P_TABLE_NAME         => 'FEM_BALANCES',
7008          P_STATEMENT_TYPE     => pv_stmt_type,
7009          P_NUM_OF_OUTPUT_ROWS => 0,
7010          P_USER_ID            => pv_user_id,
7011          P_LAST_UPDATE_LOGIN  => pv_login_id,
7012          X_MSG_COUNT          => v_msg_count,
7013          X_MSG_DATA           => v_msg_data,
7014          X_RETURN_STATUS      => v_return_status);
7015 
7016       IF v_return_status <> 'S'
7017       THEN
7018         FEM_ENGINES_PKG.Tech_Message
7019           (p_severity => pc_log_level_exception,
7020            p_module   => v_module,
7021            p_msg_text => 'Raising OGLRegProc_FatalErr after calling Register_Table');
7022         RAISE OGLRegProc_FatalErr;
7023       END IF; -- IF v_return_status <> 'S'
7024 
7025     END LOOP; -- req_cur LOOP
7026 
7027     -- ----------------------------
7028     -- 7. Exit with success/warning
7029     -- ----------------------------
7030 
7031     -- Log the function exit time to FND_LOG (successful completion)
7032     FEM_ENGINES_PKG.Tech_Message
7033       (p_severity => pc_log_level_procedure,
7034        p_module   => v_module,
7035        p_app_name => 'FEM',
7036        p_msg_name => 'FEM_GL_POST_202',
7037        p_token1   => 'FUNC_NAME',
7038        p_value1   => v_func_name,
7039        p_token2   => 'TIME',
7040        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7041 
7042   EXCEPTION
7043     WHEN Invalid_Cal_Period_ID THEN
7044       -- <<< Cal Period attributes not set >>>
7045       x_completion_code := 2; -- Indicating fatal error
7046 
7047       -- Get the name for Calendar Period dimension
7048       v_dim_name := FEM_DIMENSION_UTIL_PKG.Get_Dimension_Name
7049                       (p_dim_id => pv_cal_per_dim_id);
7050 
7051       IF (v_dim_name IS NULL)
7052       THEN
7053         v_dim_name := 'Calendar Period';
7054       END IF;
7055 
7056      -- Get the attribute name
7057      IF (pv_attr_label IS NOT NULL)
7058      THEN
7059         v_attr_name := FEM_DIMENSION_UTIL_PKG.Get_Dim_Attr_Name
7060                          (p_dim_id     => pv_cal_per_dim_id,
7061                           p_attr_label => pv_attr_label);
7062 
7063           IF v_attr_name IS NULL
7064         THEN
7065           v_attr_name := pv_attr_label;
7066         END IF;
7067 
7068       END IF; -- IF (pv_attr_label IS NOT NULL)
7069 
7070       -- Log the error message
7071       FEM_ENGINES_PKG.Tech_Message
7072         (p_severity => pc_log_level_error,
7073          p_module   => v_module,
7074          p_app_name => 'FEM',
7075          p_msg_name => 'FEM_INTG_BAL_DIM_ATTR_ERR',
7076          p_token1   => 'ATTR_NAME',
7077          p_value1   => v_attr_name,
7078          p_token2   => 'PER_NAME',
7079          p_value2   => v_cal_per_name,
7080          p_token3  => 'DIM_NAME',
7081          p_value3   => v_dim_name);
7082       FEM_ENGINES_PKG.User_Message
7083         (p_app_name => 'FEM',
7084          p_msg_name => 'FEM_INTG_BAL_PER_ATTR_ERR',
7085          p_token1   => 'ATTR_NAME',
7086          p_value1   => v_attr_name,
7087          p_token2   => 'PER_NAME',
7088          p_value2   => v_cal_per_name,
7089          p_token3  => 'DIM_NAME',
7090          p_value3   => v_dim_name);
7091 
7092      -- Log the function exit time to FND_LOG (with error)
7093       FEM_ENGINES_PKG.Tech_Message
7094         (p_severity => pc_log_level_procedure,
7095          p_module   => v_module,
7096          p_app_name => 'FEM',
7097          p_msg_name => 'FEM_GL_POST_203',
7098          p_token1   => 'FUNC_NAME',
7099          p_value1   => v_func_name,
7100          p_token2   => 'TIME',
7101          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7102 
7103     WHEN OGLRegProc_FatalErr THEN
7104       -- <<< Fatal error >>>
7105       x_completion_code := 2; -- Indicating fatal error
7106 
7107       -- Log the user message(s) returned by the API being called
7108       IF v_msg_count = 1
7109      THEN
7110        -- Only one message
7111         FEM_ENGINES_PKG.User_Message
7112           (p_app_name => 'FEM',
7113            p_msg_text => v_msg_data);
7114 
7115       ELSIF v_msg_count > 1
7116      THEN
7117        -- More than one messages
7118         FOR i IN 1 .. v_msg_count LOOP
7119           v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
7120           FEM_ENGINES_PKG.User_Message
7124 
7121             (p_app_name => 'FEM',
7122              p_msg_text => v_msg_data);
7123         END LOOP;
7125       END IF; -- IF v_msg_count = 1
7126 
7127      -- Log the function exit time to FND_LOG (with error)
7128       FEM_ENGINES_PKG.Tech_Message
7129         (p_severity => pc_log_level_procedure,
7130          p_module   => v_module,
7131          p_app_name => 'FEM',
7132          p_msg_name => 'FEM_GL_POST_203',
7133          p_token1   => 'FUNC_NAME',
7134          p_value1   => v_func_name,
7135          p_token2   => 'TIME',
7136          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7137 
7138     WHEN OTHERS THEN
7139       -- <<< Unexpected database exceptions >>>
7140       x_completion_code := 2; -- Indicating fatal error
7141 
7142       pv_sqlerrm   := SQLERRM;
7143       pv_callstack := dbms_utility.format_call_stack;
7144 
7145       -- Log the call stack and the Oracle error message to
7146       -- FND_LOG with the "unexpected exception" severity level.
7147       FEM_ENGINES_PKG.Tech_Message
7148         (p_severity => pc_log_level_unexpected,
7149          p_module   => v_module,
7150        p_msg_text => pv_sqlerrm);
7151       FEM_ENGINES_PKG.Tech_Message
7152         (p_severity => pc_log_level_unexpected,
7153          p_module   => v_module,
7154        p_msg_text => pv_callstack);
7155 
7156       -- Log the Oracle error message to the Concurrent Request Log
7157       FEM_ENGINES_PKG.User_Message
7158         (p_app_name => 'FEM',
7159          p_msg_text => pv_sqlerrm);
7160 
7161       -- Log the function exit time to FND_LOG (with error)
7162       FEM_ENGINES_PKG.Tech_Message
7163         (p_severity => pc_log_level_procedure,
7164          p_module   => v_module,
7165          p_app_name => 'FEM',
7166          p_msg_name => 'FEM_GL_POST_203',
7167          p_token1   => 'FUNC_NAME',
7168          p_value1   => v_func_name,
7169          p_token2   => 'TIME',
7170          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7171 
7172   END Register_OGL_Process_Execution;
7173 -- =======================================================================
7174 
7175 -- =======================================================================
7176   PROCEDURE Final_OGL_Process_Logging
7177                 (p_exec_status             IN     VARCHAR2,
7178                  p_final_message_name      IN     VARCHAR2) IS
7179 -- =======================================================================
7180 -- Purpose
7181 --    Performs final process logging after FEM-OGL Integration Balances
7182 --    Rule execution
7183 -- History
7184 --    12-01-2004  L Poon  Created
7185 --    01-25-2005  L Poon  Bug fix 4143603 - Uptake latest changes for the API
7186 --                        register_data_location()
7187 -- Arguments
7188 --    p_exec_status        The final completion status: SUCCESS or
7189 --                         ERROR_RERUN
7190 --    p_final_message_name The name of the final message to be logged for
7191 --                         the engine
7192 -- Notes
7193 --    Called by FEM_INTG_BAL_RULE_ENG_PKG.Main after process completion
7194 -- =======================================================================
7195 
7196     v_module        VARCHAR2(100);
7197     v_func_name     VARCHAR2(80);
7198 
7199     v_msg_count     NUMBER;
7200     v_msg_data      VARCHAR2(2000);
7201     i               PLS_INTEGER;
7202     v_return_status VARCHAR2(1);
7203 
7204     v_exec_status   VARCHAR2(30);
7205     v_load_status   VARCHAR2(30);
7206 
7207     v_xlated_curr_ds_code    FEM_BAL_POST_INTERIM_GT.DATASET_CODE%TYPE;
7208     v_xlated_curr_cal_per_id FEM_BAL_POST_INTERIM_GT.CAL_PERIOD_ID%TYPE;
7209     v_xlated_curr_code       FEM_BAL_POST_INTERIM_GT.CURRENCY_CODE%TYPE;
7210     v_xlated_curr_found      BOOLEAN;
7211 
7212     CURSOR xlated_curr_cur IS
7213       SELECT DISTINCT bpi.DATASET_CODE
7214                     , bpi.CAL_PERIOD_ID
7215                    , bpi.CURRENCY_CODE
7216       FROM FEM_BAL_POST_INTERIM_GT bpi
7217       WHERE bpi.CURRENCY_TYPE_CODE = 'TRANSLATED'
7218       AND bpi.POSTING_ERROR_FLAG = 'N'
7219      AND NOT EXISTS
7220            (SELECT 'Invalid Delta Load'
7221               FROM FEM_INTG_DELTA_LOADS dl
7222              WHERE dl.LEDGER_ID = bpi.LEDGER_ID
7223                AND dl.DATASET_CODE = bpi.DATASET_CODE
7224                AND dl.CAL_PERIOD_ID = bpi.CAL_PERIOD_ID
7225                AND dl.DELTA_RUN_ID = bpi.DELTA_RUN_ID
7226                AND dl.LOADED_FLAG = 'N')
7227       ORDER BY bpi.DATASET_CODE, bpi.CAL_PERIOD_ID, bpi.CURRENCY_CODE;
7228 
7229     CURSOR req_cur IS
7230       SELECT REQUEST_ID
7231            , OUTPUT_DATASET_CODE
7232            , PERIOD_NAME
7233            , CAL_PERIOD_ID
7234            , NUM_OF_ROWS_SELECTED
7235            , NUM_OF_ROWS_POSTED
7236            , ERROR_CODE
7237       FROM FEM_INTG_EXEC_PARAMS_GT
7238       WHERE REQUEST_ID IS NOT NULL
7239      ORDER BY OUTPUT_DATASET_CODE, CAL_PERIOD_ID;
7240 
7241   BEGIN
7242     v_module    := 'fem.plsql.fem_gl_post_process_pkg.final_ogl_process_logging';
7243     v_func_name := 'FEM_GL_POST_PROCESS_PKG.Final_OGL_Process_Logging';
7244 
7245     -- Log the function entry time to FND_LOG
7246     FEM_ENGINES_PKG.Tech_Message
7247       (p_severity => pc_log_level_procedure,
7248        p_module   => v_module,
7249        p_app_name => 'FEM',
7250        p_msg_name => 'FEM_GL_POST_201',
7254        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7251        p_token1   => 'FUNC_NAME',
7252        p_value1   => v_func_name,
7253        p_token2   => 'TIME',
7255 
7256     -- List the IN parameters to FND_LOG
7257     FEM_ENGINES_PKG.Tech_Message
7258       (p_severity => pc_log_level_statement,
7259        p_module   => v_module,
7260        p_app_name => 'FEM',
7261        p_msg_name => 'FEM_GL_POST_204',
7262        p_token1   => 'VAR_NAME',
7263        p_value1   => 'p_exec_status',
7264        p_token2   => 'VAR_VAL',
7265        p_value2   => p_exec_status);
7266     FEM_ENGINES_PKG.Tech_Message
7267       (p_severity => pc_log_level_statement,
7268        p_module   => v_module,
7269        p_app_name => 'FEM',
7270        p_msg_name => 'FEM_GL_POST_204',
7271        p_token1   => 'VAR_NAME',
7272        p_value1   => 'p_final_message_name',
7273        p_token2   => 'VAR_VAL',
7274        p_value2   => p_final_message_name);
7275 
7276     -- Initialize local variables
7277     v_xlated_curr_found      := FALSE;
7278     v_xlated_curr_ds_code    := NULL;
7279     v_xlated_curr_cal_per_id := NULL;
7280     v_xlated_curr_code       := NULL;
7281 
7282     -- If the translated balances are included, open translated currency cursor
7283     IF (pv_xlated_bal_option <> 'NONE')
7284     THEN
7285       OPEN xlated_curr_cur;
7286       FETCH xlated_curr_cur INTO v_xlated_curr_ds_code,
7287                                 v_xlated_curr_cal_per_id,
7288                           v_xlated_curr_code;
7289       IF (xlated_curr_cur%FOUND)
7290       THEN
7291        -- A translated currency is found
7292        v_xlated_curr_found := TRUE;
7293         -- Log the values retrieved from the translated currency cursor
7294         FEM_ENGINES_PKG.Tech_Message
7295           (p_severity => pc_log_level_statement,
7296            p_module   => v_module,
7297            p_app_name => 'FEM',
7298            p_msg_name => 'FEM_GL_POST_204',
7299            p_token1   => 'VAR_NAME',
7300            p_value1   => 'v_xlated_curr_ds_code',
7301            p_token2   => 'VAR_VAL',
7302            p_value2   => TO_CHAR(v_xlated_curr_ds_code));
7303         FEM_ENGINES_PKG.Tech_Message
7304           (p_severity => pc_log_level_statement,
7305            p_module   => v_module,
7306            p_app_name => 'FEM',
7307            p_msg_name => 'FEM_GL_POST_204',
7308            p_token1   => 'VAR_NAME',
7309            p_value1   => 'v_xlated_curr_cal_per_id',
7310            p_token2   => 'VAR_VAL',
7311            p_value2   => TO_CHAR(v_xlated_curr_cal_per_id));
7312         FEM_ENGINES_PKG.Tech_Message
7313           (p_severity => pc_log_level_statement,
7314            p_module   => v_module,
7315            p_app_name => 'FEM',
7316            p_msg_name => 'FEM_GL_POST_204',
7317            p_token1   => 'VAR_NAME',
7318            p_value1   => 'v_xlated_curr_code',
7319            p_token2   => 'VAR_VAL',
7320            p_value2   => v_xlated_curr_code);
7321       END IF; -- IF (xlated_curr_cur%FOUND)
7322     END IF; -- IF (pv_xlated_bal_option <> 'NONE')
7323 
7324     -- Loop for each request to perform final process logging
7325     FOR v_req IN req_cur LOOP
7326 
7327       -- Log the values retrieved from the request cursor for this Request
7328       FEM_ENGINES_PKG.Tech_Message
7329         (p_severity => pc_log_level_statement,
7330          p_module   => v_module,
7331          p_app_name => 'FEM',
7332          p_msg_name => 'FEM_GL_POST_204',
7333          p_token1   => 'VAR_NAME',
7334          p_value1   => 'v_req.request_id',
7335          p_token2   => 'VAR_VAL',
7336          p_value2   => TO_CHAR(v_req.request_id));
7337       FEM_ENGINES_PKG.Tech_Message
7338         (p_severity => pc_log_level_statement,
7339          p_module   => v_module,
7340          p_app_name => 'FEM',
7341          p_msg_name => 'FEM_GL_POST_204',
7342          p_token1   => 'VAR_NAME',
7343          p_value1   => 'v_req.output_dataset_code',
7344          p_token2   => 'VAR_VAL',
7345          p_value2   => v_req.output_dataset_code);
7346       FEM_ENGINES_PKG.Tech_Message
7347         (p_severity => pc_log_level_statement,
7348          p_module   => v_module,
7349          p_app_name => 'FEM',
7350          p_msg_name => 'FEM_GL_POST_204',
7351          p_token1   => 'VAR_NAME',
7352          p_value1   => 'v_req.period_name',
7353          p_token2   => 'VAR_VAL',
7354          p_value2   => v_req.period_name);
7355       FEM_ENGINES_PKG.Tech_Message
7356         (p_severity => pc_log_level_statement,
7357          p_module   => v_module,
7358          p_app_name => 'FEM',
7359          p_msg_name => 'FEM_GL_POST_204',
7360          p_token1   => 'VAR_NAME',
7361          p_value1   => 'v_req.cal_period_id',
7362          p_token2   => 'VAR_VAL',
7363          p_value2   => TO_CHAR(v_req.cal_period_id));
7364       FEM_ENGINES_PKG.Tech_Message
7365         (p_severity => pc_log_level_statement,
7366          p_module   => v_module,
7367          p_app_name => 'FEM',
7368          p_msg_name => 'FEM_GL_POST_204',
7369          p_token1   => 'VAR_NAME',
7370          p_value1   => 'v_req.num_of_rows_selected',
7371          p_token2   => 'VAR_VAL',
7372          p_value2   => TO_CHAR(v_req.num_of_rows_selected));
7373       FEM_ENGINES_PKG.Tech_Message
7374         (p_severity => pc_log_level_statement,
7375          p_module   => v_module,
7376          p_app_name => 'FEM',
7377          p_msg_name => 'FEM_GL_POST_204',
7378          p_token1   => 'VAR_NAME',
7382       FEM_ENGINES_PKG.Tech_Message
7379          p_value1   => 'v_req.num_of_rows_posted',
7380          p_token2   => 'VAR_VAL',
7381          p_value2   => TO_CHAR(v_req.num_of_rows_posted));
7383         (p_severity => pc_log_level_statement,
7384          p_module   => v_module,
7385          p_app_name => 'FEM',
7386          p_msg_name => 'FEM_GL_POST_204',
7387          p_token1   => 'VAR_NAME',
7388          p_value1   => 'v_req.error_code',
7389          p_token2   => 'VAR_VAL',
7390          p_value2   => NVL(v_req.error_code, ''));
7391 
7392       -- ---------------------------------------------------------------------
7393       -- 1. Update the number of rows posted into FEM_BALANCES by this Request
7394       --    if there are any for this Output Dataset/Cal Period and the
7395       --    Execution Status is SUCCESS
7396       -- ---------------------------------------------------------------------
7397       IF (v_req.num_of_rows_posted > 0 AND p_exec_status = 'SUCCESS')
7398       THEN
7399         -- Initialize the FND Message API
7400         FND_MSG_PUB.Initialize;
7401         -- Update the number of output rows in FEM_PL_TABLES for this Request
7402         FEM_PL_PKG.Update_Num_of_Output_Rows
7403           (P_API_VERSION        => pc_API_version,
7404            P_COMMIT             => 'T',
7405            P_REQUEST_ID         => v_req.request_id,
7406            P_OBJECT_ID          => pv_rule_obj_id,
7407            P_TABLE_NAME         => 'FEM_BALANCES',
7408            P_STATEMENT_TYPE     => pv_stmt_type,
7409            P_NUM_OF_OUTPUT_ROWS => v_req.num_of_rows_posted,
7410            P_USER_ID            => pv_user_id,
7411            P_LAST_UPDATE_LOGIN  => pv_login_id,
7412            X_MSG_COUNT          => v_msg_count,
7413            X_MSG_DATA           => v_msg_data,
7414            X_RETURN_STATUS      => v_return_status);
7415 
7416         -- Log the user message(s) returned by the API
7417         IF v_msg_count = 1
7418         THEN
7419          -- Only one message
7420           FEM_ENGINES_PKG.User_Message
7421             (p_app_name => 'FEM',
7422              p_msg_text => v_msg_data);
7423 
7424         ELSIF v_msg_count > 1
7425         THEN
7426          -- More than one messages
7427           FOR i IN 1 .. v_msg_count LOOP
7428             v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
7429             FEM_ENGINES_PKG.User_Message
7430               (p_app_name => 'FEM',
7431                p_msg_text => v_msg_data);
7432           END LOOP;
7433         END IF; -- IF v_msg_count = 1
7434 
7435       END IF; -- IF (v_req.num_of_rows_posted > 0 AND p_exec_status = 'SUCCESS')
7436 
7437       -- ---------------------------------------------------------------------
7438       -- 2. Update the number of rows not posted into FEM_BALANCES for this
7439       --    Request if the number of rows posted is smaller than the number of
7440       --    rows selected for this Output Dataset/Cal Period
7441       -- ---------------------------------------------------------------------
7442       IF (v_req.num_of_rows_selected > v_req.num_of_rows_posted)
7443       THEN
7444         -- Initialize the FND Message API
7445         FND_MSG_PUB.Initialize;
7446         -- Update the number of data errors in FEM_PL_OBJECT_EXECUTIONS for
7447         -- this Request
7448         FEM_PL_PKG.Update_Obj_Exec_Errors
7449           (P_API_VERSION        => pc_API_version,
7450            P_COMMIT             => 'T',
7451            P_REQUEST_ID         => v_req.request_id,
7452            P_OBJECT_ID          => pv_rule_obj_id,
7453            P_ERRORS_REPORTED    => (v_req.num_of_rows_selected
7454                                    - v_req.num_of_rows_posted),
7455            P_ERRORS_REPROCESSED => 0,
7456            P_USER_ID            => pv_user_id,
7457            P_LAST_UPDATE_LOGIN  => pv_login_id,
7458            X_MSG_COUNT          => v_msg_count,
7459            X_MSG_DATA           => v_msg_data,
7460            X_RETURN_STATUS      => v_return_status);
7461 
7462         -- Log the user message(s) returned by the API
7463         IF v_msg_count = 1
7464         THEN
7465           -- Only one message
7466           FEM_ENGINES_PKG.User_Message
7467             (p_app_name => 'FEM',
7468              p_msg_text => v_msg_data);
7469 
7470         ELSIF v_msg_count > 1
7471         THEN
7472           -- More than one messages
7473           FOR i IN 1 .. v_msg_count LOOP
7474             v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
7475             FEM_ENGINES_PKG.User_Message
7476               (p_app_name => 'FEM',
7477                p_msg_text => v_msg_data);
7478           END LOOP;
7479         END IF; -- IF v_msg_count = 1
7480 
7481       END IF; -- IF (v_req.num_of_rows_selected > v_req.num_of_rows_posted)
7482 
7483       -- --------------------------------------------------
7484       -- 3. Determine the execution status for this Request
7485       -- --------------------------------------------------
7486       IF (   (p_exec_status = 'ERROR_RERUN')
7487           OR (v_req.num_of_rows_posted = 0 AND v_req.num_of_rows_selected > 0)
7488           OR (v_req.error_code IS NOT NULL))
7489       THEN
7490         -- Set the execution status to ERROR_RERUN when:
7491         --  * The passed Execution Status is ERROR_RERUN
7492         --  * OR there are rows selected but none of them can be posted
7493         --  * OR the error code of this Request is populated i.e. the possible
7494         --       error code will be PERIOD_GAP_EXIST
7495         v_exec_status := 'ERROR_RERUN';
7499       END IF;
7496       ELSE
7497         -- For other cases, set the execution status to SUCCESS
7498         v_exec_status := 'SUCCESS';
7500       -- Log the execution status of this Request
7501       FEM_ENGINES_PKG.Tech_Message
7502         (p_severity => pc_log_level_statement,
7503          p_module   => v_module,
7504          p_app_name => 'FEM',
7505          p_msg_name => 'FEM_GL_POST_204',
7506          p_token1   => 'VAR_NAME',
7507          p_value1   => 'v_exec_status',
7508          p_token2   => 'VAR_VAL',
7509          p_value2   => v_exec_status);
7510 
7511       -- ------------------------------------------------------------
7512       -- 4. Update the object execution status to ERROR_RERUN/SUCCESS
7513       -- ------------------------------------------------------------
7514       -- Initialize the FND Message API
7515       FND_MSG_PUB.Initialize;
7516       -- Update the object execution status
7517       FEM_PL_PKG.Update_Obj_Exec_Status
7518         (P_API_VERSION        => pc_API_version,
7519          P_COMMIT             => 'T',
7520          P_REQUEST_ID         => v_req.request_id,
7521          P_OBJECT_ID          => pv_rule_obj_id,
7522          P_EXEC_STATUS_CODE   => v_exec_status,
7523          P_USER_ID            => pv_user_id,
7524          P_LAST_UPDATE_LOGIN  => pv_login_id,
7525          X_MSG_COUNT          => v_msg_count,
7526          X_MSG_DATA           => v_msg_data,
7527          X_RETURN_STATUS      => v_return_status);
7528 
7529       -- Log the user message(s) returned by the API
7530       IF v_msg_count = 1
7531       THEN
7532         -- Only one message
7533         FEM_ENGINES_PKG.User_Message
7534           (p_app_name => 'FEM',
7535            p_msg_text => v_msg_data);
7536 
7537       ELSIF v_msg_count > 1
7538       THEN
7539         -- More than one messages
7540         FOR i IN 1 .. v_msg_count LOOP
7541           v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
7542           FEM_ENGINES_PKG.User_Message
7543             (p_app_name => 'FEM',
7544              p_msg_text => v_msg_data);
7545         END LOOP;
7546       END IF; -- IF v_msg_count = 1
7547 
7548       -- -------------------------------------------------------------
7549       -- 5. Update the request execution status to ERROR_RERUN/SUCCESS
7550       -- -------------------------------------------------------------
7551       -- Initialize the FND Message API
7552       FND_MSG_PUB.Initialize;
7553       -- Update the request execution status
7554       FEM_PL_PKG.Update_Request_Status
7555         (P_API_VERSION        => pc_API_version,
7556          P_COMMIT             => 'T',
7557          P_REQUEST_ID         => v_req.request_id,
7558          P_EXEC_STATUS_CODE   => v_exec_status,
7559          P_USER_ID            => pv_user_id,
7560          P_LAST_UPDATE_LOGIN  => pv_login_id,
7561          X_MSG_COUNT          => v_msg_count,
7562          X_MSG_DATA           => v_msg_data,
7563          X_RETURN_STATUS      => v_return_status);
7564 
7565       -- Log the user message(s) returned by the API
7566       IF v_msg_count = 1
7567       THEN
7568         -- Only one message
7569         FEM_ENGINES_PKG.User_Message
7570           (p_app_name => 'FEM',
7571            p_msg_text => v_msg_data);
7572 
7573       ELSIF v_msg_count > 1
7574       THEN
7575         -- More than one messages
7576         FOR i IN 1 .. v_msg_count LOOP
7577           v_msg_data := FND_MSG_PUB.Get(p_msg_index => i, p_encoded => 'F');
7578           FEM_ENGINES_PKG.User_Message
7579             (p_app_name => 'FEM',
7580              p_msg_text => v_msg_data);
7581         END LOOP;
7582       END IF; -- IF v_msg_count = 1
7583 
7584       -- -------------------------------------------------------------------
7585       -- 6. Register a data location entry for this Request if the execution
7586       --    status of this Request is SUCCESS
7587       -- -------------------------------------------------------------------
7588       -- Bug fix 4330346: Changed to register the data location if the execution
7589       --                  status of this Request is SUCCESS regardless any
7590       --                  balances are posted to FEM
7591       IF (v_exec_status = 'SUCCESS')
7592       THEN
7593         -- Determine the load status i.e. COMPLETE or INCOMPLETE
7594         IF (v_req.num_of_rows_selected = v_req.num_of_rows_posted)
7595         THEN
7596           -- All rows are posted, so set the load status to COMPLETE
7597           v_load_status := 'COMPLETE';
7598 
7599         ELSE
7600           -- Only some rows are posted so set the load status to INCOMPLETE
7601           v_load_status := 'INCOMPLETE';
7602 
7603         END IF; -- IF (v_req.num_of_rows_selected = v_req.num_of_rows_posted)
7604 
7605         IF (v_xlated_curr_found
7606             AND v_req.output_dataset_code = v_xlated_curr_ds_code
7607             AND v_req.cal_period_id = v_xlated_curr_cal_per_id)
7608         THEN
7609           -- This translated currency is for this Request, so register the data
7610           -- location for each translated currency found
7611           LOOP
7612             -- Register the data location for a translated currency
7613             FEM_DIMENSION_UTIL_PKG.Register_Data_Location
7614               (P_REQUEST_ID   => v_req.request_id,
7615                P_OBJECT_ID    => pv_rule_obj_id,
7616                P_TABLE_NAME   => 'FEM_BALANCES',
7617                P_LEDGER_ID    => pv_ledger_id,
7618                P_CAL_PER_ID   => v_req.cal_period_id,
7622                P_AVG_BAL_FLAG => pv_include_avg_bal,
7619                P_DATASET_CD   => v_req.output_dataset_code,
7620                P_SOURCE_CD    => pv_gl_source_system_code,
7621                P_LOAD_STATUS  => v_load_status,
7623                P_TRANS_CURR   => v_xlated_curr_code);
7624 
7625             -- Get next translated currency
7626             FETCH xlated_curr_cur INTO v_xlated_curr_ds_code,
7627                                        v_xlated_curr_cal_per_id,
7628                                        v_xlated_curr_code;
7629             IF (xlated_curr_cur%NOTFOUND)
7630             THEN
7631               -- No more translated currency is found, so exit
7632               v_xlated_curr_found := FALSE;
7633               EXIT;
7634             ELSE
7635               -- A translated currency is found
7636               IF (v_xlated_curr_ds_code <> v_req.output_dataset_code
7637                   OR v_xlated_curr_cal_per_id <> v_req.cal_period_id)
7638               THEN
7639                 -- This translated currency is for another request, so exit
7640                 EXIT;
7641               END IF; -- IF (v_xlated_curr_ds_code <> v_req.output_dataset_code
7642             END IF; -- IF (xlated_curr_cur%NOTFOUND)
7643 
7644           END LOOP;
7645 
7646         ELSE
7647           -- No translated currency is found for the output dataset code and
7648           -- cal period of this Request, so register the data location without
7649           -- passing any translated currency code
7650           FEM_DIMENSION_UTIL_PKG.Register_Data_Location
7651             (P_REQUEST_ID   => v_req.request_id,
7652              P_OBJECT_ID    => pv_rule_obj_id,
7653              P_TABLE_NAME   => 'FEM_BALANCES',
7654              P_LEDGER_ID    => pv_ledger_id,
7655              P_CAL_PER_ID   => v_req.cal_period_id,
7656              P_DATASET_CD   => v_req.output_dataset_code,
7657              P_SOURCE_CD    => pv_gl_source_system_code,
7658              P_LOAD_STATUS  => v_load_status,
7659              P_AVG_BAL_FLAG => pv_include_avg_bal);
7660 
7661         END IF; -- IF (v_xlated_curr_found ...
7662 
7663       END IF; -- IF (v_exec_status = 'SUCCESS' AND v_req.num_of_rows_posted > 0)
7664 
7665     END LOOP; -- req_cur Loop
7666 
7667     -- If the translated balances are included, close translated currency cursor
7668     IF (pv_xlated_bal_option <> 'NONE')
7669     THEN
7670       CLOSE xlated_curr_cur;
7671     END IF; -- IF (pv_xlated_bal_option <> 'NONE')
7672 
7673     -- ---------------------------------------------
7674     -- 7. Log the passed Final Message and then exit
7675     -- ---------------------------------------------
7676     FEM_ENGINES_PKG.Tech_Message
7677       (P_SEVERITY => pc_log_level_event,
7678        P_MODULE   => v_module,
7679        P_APP_NAME => 'FEM',
7680        P_MSG_NAME => p_final_message_name);
7681     FEM_ENGINES_PKG.User_Message
7682       (P_APP_NAME => 'FEM',
7683        P_MSG_NAME => p_final_message_name);
7684 
7685     -- Log the function exit time to FND_LOG (successful completion)
7686     FEM_ENGINES_PKG.Tech_Message
7687       (p_severity => pc_log_level_procedure,
7688        p_module   => v_module,
7689        p_app_name => 'FEM',
7690        p_msg_name => 'FEM_GL_POST_202',
7691        p_token1   => 'FUNC_NAME',
7692        p_value1   => v_func_name,
7693        p_token2   => 'TIME',
7694        p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7695 
7696   EXCEPTION
7697     WHEN OTHERS THEN
7698       -- <<< Unexpected database exceptions >>>
7699       pv_sqlerrm   := SQLERRM;
7700       pv_callstack := dbms_utility.format_call_stack;
7701 
7702       -- Log the call stack and the Oracle error message to
7703       -- FND_LOG with the "unexpected exception" severity level.
7704       FEM_ENGINES_PKG.Tech_Message
7705         (p_severity => pc_log_level_unexpected,
7706          p_module   => v_module,
7707        p_msg_text => pv_sqlerrm);
7708       FEM_ENGINES_PKG.Tech_Message
7709         (p_severity => pc_log_level_unexpected,
7710          p_module   => v_module,
7711        p_msg_text => pv_callstack);
7712 
7713       -- Log the Oracle error message to the Concurrent Request Log
7714       FEM_ENGINES_PKG.User_Message
7715         (p_app_name => 'FEM',
7716          p_msg_text => pv_sqlerrm);
7717 
7718       -- Log the function exit time to FND_LOG (with error)
7719       FEM_ENGINES_PKG.Tech_Message
7720         (p_severity => pc_log_level_procedure,
7721          p_module   => v_module,
7722          p_app_name => 'FEM',
7723          p_msg_name => 'FEM_GL_POST_203',
7724          p_token1   => 'FUNC_NAME',
7725          p_value1   => v_func_name,
7726          p_token2   => 'TIME',
7727          p_value2   => TO_CHAR(SYSDATE)||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'));
7728 
7729   END Final_OGL_Process_Logging;
7730 -- =======================================================================
7731 
7732 END FEM_GL_POST_PROCESS_PKG;