DBA Data[Home] [Help]

PACKAGE BODY: APPS.FEM_RULE_SET_MANAGER

Source


1 package body FEM_RULE_SET_MANAGER AS
2 --$Header: FEMRSMANB.pls 120.5.12010000.3 2008/12/18 22:56:06 huli ship $
3 
4    z_global_counter        NUMBER := 0;
5    z_conc_request_id       NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
6    z_user_id               NUMBER := FND_GLOBAL.USER_ID;
7    z_login_id              NUMBER := FND_GLOBAL.LOGIN_ID;
8    z_local_vs_for_session  NUMBER ;
9    z_Err_Code              NUMBER := NULL;
10    z_Err_Msg               VARCHAR2(30) := NULL;
11    z_continue_on_error     BOOLEAN := TRUE;
12    z_dataset_error         BOOLEAN := FALSE;
13 
14    g_max_rule_set_depth NUMBER := FND_PROFILE.VALUE('FEM_RULE_SET_DEPTH');
15 
16    --   TECH MESSAGE FORMAT (debugging oriented)
17    --   procedure/function definition for I/F
18    --   l_module_name VARCHAR2(70) := G_MODULE_NAME || 'Mem_Obj_Prev_Processed';
19    --   fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
20    --                                p_module=> l_module_name,
21    --                                p_msg_text=> 'something happened here msg');
22    --   fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
23    --                                p_module=> l_module_name,
24    --                                p_msg_text=> 'something happened here msg');
25    G_LOG_STATEMENT   CONSTANT NUMBER := fnd_log.level_statement;
26    G_LOG_PROCEDURE   CONSTANT NUMBER := fnd_log.level_procedure;
27    G_LOG_EVENT       CONSTANT NUMBER := fnd_log.level_event;
28    G_LOG_EXCEPTION   CONSTANT NUMBER := fnd_log.level_exception;
29    G_LOG_ERROR       CONSTANT NUMBER := fnd_log.level_error;
30    G_LOG_UNEXPECTED  CONSTANT NUMBER := fnd_log.level_unexpected;
31    --                                          000000000111111111122222222223333333333444444444455555555556
32    --                                          123456789012345678901234567890123456789012345678901234567890
33    G_APP_NAME        CONSTANT VARCHAR2(4)  := 'FEM';
34    G_PKG_NAME        CONSTANT VARCHAR2(25) := 'fem_rule_set_manager';
35    G_MODULE_NAME     CONSTANT VARCHAR2(40) := 'fem.plsql.' || G_PKG_NAME  ||  '.';
36 
37    z_master_err_state      NUMBER          := FEM_UTILS.G_RSM_NO_ERR;
38 
39 
40 
41    -- error messages and their macro replacement strings
42    --                                                         000000000111111111122222222223333333333444444444455555555556
43    --                                                         123456789012345678901234567890123456789012345678901234567890
44    G_FEMRSM_NOVALID_DEP_DEF         CONSTANT VARCHAR2(40) := 'FEM_RSM_NOVALID_DEP_DEFINITION';
45    G_ERRMSG_NO_VALID_DEFINITION     CONSTANT varchar2(40) := 'FEM_RSM_NO_VALID_DEFINITION';
46    G_ERRMSG_UNEXPECTED_SQLERROR     CONSTANT varchar2(40) := 'FEM_RSM_UNEXPECTED_SQLERROR';
47    G_ERRMSG_DUP_RULE_OCC            CONSTANT varchar2(40) := 'FEM_RSM_DUP_RULE_OCC';
48    G_ERRMSG_DUPLICATE_OCCURRENCE    CONSTANT varchar2(40) := 'FEM_RSM_DUPLICATE_OCCURRENCE';
49    G_ERRMSG_DEPTH_CHECK_FAILURE     CONSTANT varchar2(40) := 'FEM_RSM_DEPTH_CHECK_FAILURE';
50    G_ERRMSG_NO_VALID_VALSETS        CONSTANT varchar2(40) := 'FEM_RSM_NO_VALID_VALSETS';
51    G_ERRMSG_DEFN_NOT_APPROVED       CONSTANT varchar2(40) := 'FEM_RSM_DEFN_NOT_APPROVED';
52    G_ERRMSG_DSGRP_NOT_FOUND         CONSTANT varchar2(40) := 'FEM_RSM_DATASETGROUP_NOT_FOUND';
53    G_ERRMSG_NO_DSG_FOR_LID          CONSTANT varchar2(40) := 'FEM_RSM_NO_DSG_FOR_LID';
54    G_ERRMSG_NO_ODS                  CONSTANT varchar2(40) := 'FEM_RSM_NO_ODS';
55    G_ERRMSG_NO_ODSPRODFLAG          CONSTANT varchar2(40) := 'FEM_RSM_NO_PRODFLAG_FOR_ODS';
56    G_ERRMSG_INVALID_ODS_PRODFLAG    CONSTANT varchar2(40) := 'FEM_RSM_INVALID_ODS_PRODFLAG';
57 
58    G_ERRMAC_ROUTINE_NAME            CONSTANT varchar2(40) := 'ROUTINE_NAME';
59    G_ERRMAC_SQL_ERROR               CONSTANT varchar2(40) := 'SQL_ERROR';
60    G_ERRMAC_RULE_SET                CONSTANT varchar2(40) := 'RULE_SET';
61    G_ERRMAC_RULE_NAME               CONSTANT varchar2(40) := 'RULE_NAME';
62    G_ERRMAC_DUP_RS                  CONSTANT varchar2(40) := 'DUP_RS';
63    G_ERRMAC_CONTAIN_RS              CONSTANT varchar2(40) := 'CONTAIN_RS';
64    G_ERRMAC_VALUE                   CONSTANT varchar2(40) := 'VALUE';
65 
66 
67    Function getProcedureVersionFromDB RETURN VARCHAR2
68       IS
69       l_revString       VARCHAR2(100);
70       l_start_of_string NUMBER;
71       l_charcount       NUMBER;
72 
73    Begin
74       -- return the current version of this file...
75       l_revString := '$Revision: 120.5.12010000.3 $';
76       l_start_of_string := instr(l_revString,':') + 1;
77       l_charcount := instr(l_revString,'$',-1) - l_start_of_string;
78 
79       RETURN substr(l_revString,l_start_of_string,l_charcount);
80 
81    End getProcedureVersionFromDB;
82 
83 
84    Procedure Get_ValidDefinition_Priv(p_Object_ID IN DEF_OBJECT_ID%TYPE
85                                      ,p_Rule_Effective_Date IN DATE
86                                      ,x_Object_Definition_ID OUT NOCOPY DEF_OBJECT_DEFINITION_ID%TYPE
87                                      ,x_Approval_Status_Code OUT NOCOPY DEF_APPROVAL_STATUS_CODE%TYPE
88                                      ) IS
89 
90       l_Object_Definition_ID DEF_OBJECT_DEFINITION_ID%TYPE;
91       l_Approval_Status_Code DEF_APPROVAL_STATUS_CODE%TYPE;
92       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Get_ValidDefinition_Priv';
93 
94    BEGIN
95       -- *******************************************************************************************
96       -- name        :  Get_ValidDefinition_Priv
97       -- Function    :  retrieve a valid object_definition_id using the passed
98       --                object_id and effective_date
99       -- Parameters
100       -- IN
101       --                p_Object_ID IN DEF_OBJECT_ID%TYPE
102       --                   -  the object_id to convert to an object_definition_id
103       --                p_Rule_Effective_Date IN DATE
104       --                   -  the effective date to use during the conversion
105       --
106       --
107       -- OUT
108       --                x_Object_Definition_ID OUT DEF_OBJECT_DEFINITION_ID%TYPE
109       --                   -  set to either a valid object_definition_id, or -1 if none found
110       --                x_Approval_Status_Code OUT DEF_APPROVAL_STATUS_CODE%TYPE
111       --                   -  set to the value of the same named column in fem_object_definition_vl
112       --                      if we found a valid definition, NULL otherwise
113       --
114       -- HISTORY
115       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
116       --
117       -- *******************************************************************************************
118 
119       -- retrieve a valid object-definition-id for the passed object-id
120       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
121                                    p_module=> l_module_name,
122                                    p_msg_text=> 'ENTRY');
123 
124 
125       open getValidDefForObject(  p_Object_ID
126                                  ,p_Rule_Effective_Date);
127       FETCH getValidDefForObject
128       INTO
129           l_Object_Definition_ID
130          ,l_Approval_Status_Code;
131 
132       -- return -1 if we didn't find any valid definition for the current
133       -- effective date.
134       If getValidDefForObject%NOTFOUND then
135          x_Object_Definition_ID := -1;
136          x_Approval_Status_Code := NULL;
137       Else
138          x_Object_Definition_ID := l_Object_Definition_ID;
139          x_Approval_Status_Code := l_Approval_Status_Code;
140       End If;
141 
142       CLOSE getValidDefForObject;
143 
144 
145       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
146                                    p_module=> l_module_name,
147                                    p_msg_text=> 'EXIT');
148    End Get_ValidDefinition_Priv;
149 
150 
151 
152 
153 
154    -- *******************************************************************************************
155    -- name        :  reset_master_err_state
156    -- Function    :  set master_err_state to no error on entry to master API calls.
157    -- Parameters
158    --
159    -- HISTORY
160    --    22-Apr-2004    rjking   created
161    --
162    -- *******************************************************************************************
163    PROCEDURE reset_master_err_state IS
164    BEGIN
165       z_master_err_state := FEM_UTILS.G_RSM_NO_ERR;
166    END reset_master_err_state;
167 
168 
169 
170    Function GetObjectDisplayName(p_Obj_ID IN DEF_OBJECT_ID%TYPE) RETURN VARCHAR2 IS
171 
172       l_Object_Display_Name DEF_OBJECT_DISPLAY_NAME%TYPE;
173       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'GetObjectDisplayName';
174 
175       Cursor getObjectDisplayName(p_Obj_ID IN DEF_OBJECT_ID%TYPE) IS
176          select   o.object_name
177             from  fem_object_catalog_vl o
178             where o.object_id = p_Obj_ID;
179 
180    Begin
181       -- *******************************************************************************************
182       -- name        :  GetObjectDisplayName
183       -- Function    :  lookup the display name for a passed object_id
184       -- Parameters
185       -- IN
186       --                p_Obj_ID
187       --                   -  the object_id for the name we are looking up
188       --
189       -- OUT
190       --                none
191       --
192       -- Return value
193       --                the display name for the object.
194       --
195       -- HISTORY
196       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
197       --
198       -- *******************************************************************************************
199 
200       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
201                              p_module=> l_module_name,
202                              p_msg_text=> 'ENTRY');
203 
204       OPEN getObjectDisplayName(p_Obj_ID);
205       FETCH getObjectDisplayName
206          INTO l_Object_Display_Name;
207 
208       -- Bug 6972946: Instead of showing a hard coded string of "Not Valid
209       -- Object" (which is a translation issue anyway), we should just
210       -- show the actual missing Object ID.
211       If getObjectDisplayName%NOTFOUND then
212          -- l_Object_Display_Name := '[Not Valid Object]';
213          l_Object_Display_Name := '['||p_Obj_ID||']';
214       End If;
215 
216       CLOSE getObjectDisplayName;
217 
218       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
219                                    p_module=> l_module_name,
220                                    p_msg_text=> 'EXIT');
221 
222       RETURN l_Object_Display_Name;
223 
224       EXCEPTION
225          WHEN OTHERS THEN
226             FEM_UTILS.set_master_err_state( z_master_err_state,
227                                                 FEM_UTILS.G_RSM_FATAL_ERR,
228                                                 G_APP_NAME,
229                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
230                                                 G_ERRMAC_ROUTINE_NAME,
231                                                 l_module_name,
232                                                 NULL,
233                                                 G_ERRMAC_SQL_ERROR,
234                                                 SQLERRM);
235             RAISE;
236 
237    End GetObjectDisplayName;
238 
239 
240 
241 
242 
243    Procedure Get_ValidDefinition_Pub(p_Object_ID IN DEF_OBJECT_ID%TYPE
244                                     ,p_Rule_Effective_Date IN VARCHAR2
245                                     ,x_Object_Definition_ID OUT NOCOPY FEM_OBJECT_DEFINITION_B.OBJECT_DEFINITION_ID%TYPE
246                                     ,x_Err_Code OUT NOCOPY NUMBER
247                                     ,x_Err_Msg  OUT NOCOPY VARCHAR2) IS
248       l_Rule_Effective_Date DATE;
249       l_Approval_Status_Code DEF_APPROVAL_STATUS_CODE%TYPE;
250       l_module_name VARCHAR2(70) := G_MODULE_NAME || 'Get_ValidDefinition_Pub';
251 
252    Begin
253       -- *******************************************************************************************
254       -- name        :  Get_ValidDefinition_Pub
255       -- Function    :  retrieve a valid object_definition_id using the passed
256       --                object_id and effective_date
257       -- Parameters
258       -- IN
259       --                p_Object_ID IN DEF_OBJECT_ID%TYPE
260       --                   -  the object_id to convert to an object_definition_id
261       --                p_Rule_Effective_Date IN DATE
262       --                   -  the effective date to use during the conversion
263       --
264       --
265       -- OUT
266       --                x_Object_Definition_ID OUT DEF_OBJECT_DEFINITION_ID%TYPE
267       --                   -  set to either a valid object_definition_id, or -1 if none found
268       --                x_Approval_Status_Code OUT DEF_APPROVAL_STATUS_CODE%TYPE
269       --                   -  set to the value of the same named column in fem_object_definition_vl
270       --                      if we found a valid definition, NULL otherwise
271       --
272       -- HISTORY
273       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
274       --
275       -- *******************************************************************************************
276 
277 
278       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
279                                    p_module=> l_module_name,
280                                    p_msg_text=> 'ENTRY: p_Object_ID = '||p_Object_ID||'; p_Rule_Effective_Date = '||p_Rule_Effective_Date);
281 
282       l_Rule_Effective_Date := FND_DATE.CANONICAL_TO_DATE(p_Rule_Effective_Date);
283 
284       Get_ValidDefinition_Priv(p_Object_ID
285                               ,l_Rule_Effective_Date
286                               ,x_Object_Definition_ID
287                               ,l_Approval_Status_Code);
288 
289       -- remember, -1 means 'no valid definition'..
290       If (x_Object_Definition_ID = -1) then
291          -- we had an error.. no valid object_definition for p_Object_ID
292          -- error codes maintained right now for backwards compatibility..
293          z_Err_Code := 1;
294          -- todo:: setup error message here..
295          FEM_UTILS.set_master_err_state( z_master_err_state,
296                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
297                                              G_APP_NAME,
298                                              G_ERRMSG_NO_VALID_DEFINITION ,
299                                              G_ERRMAC_RULE_NAME,
300                                              GetObjectDisplayName(p_Object_ID));
301       Else
302          z_Err_Code := 0;
303       End If;
304 
305 
306       x_Err_Code := z_Err_Code;
307       x_Err_Msg  := z_Err_Msg ;
308 
309       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
310                                    p_module=> l_module_name,
311                                    p_msg_text=> 'EXIT');
312       EXCEPTION
313          WHEN OTHERS THEN
314             FEM_UTILS.set_master_err_state( z_master_err_state,
315                                                 FEM_UTILS.G_RSM_FATAL_ERR,
316                                                 G_APP_NAME,
317                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
318                                                 G_ERRMAC_ROUTINE_NAME,
319                                                 l_module_name,
320                                                 NULL,
321                                                 G_ERRMAC_SQL_ERROR,
322                                                 SQLERRM);
323             RAISE;
324 
325    End Get_ValidDefinition_Pub;
326 
327 
328    Function GetErrMsgText(p_Msg_Name IN VARCHAR2
329                          ,p_Token_Name IN VARCHAR2 DEFAULT NULL
330                          ,p_Token_Value IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
331       x_Msg_Text VARCHAR2(2000);
332       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'GetErrMsgText';
333    Begin
334       -- *******************************************************************************************
335       -- name        :  GetErrMsgText
336       -- Function    :  Do simple lookup of message.  Support for one token only
337       -- Parameters
338       -- IN
339       --                p_Msg_Name
340       --                   -  Name of message to look up
341       --                p_Token_Name
342       --                   -  either token name, or NULL if no token
343       --                p_Token_Value
344       --                   -  value for token.
345       --
346       -- OUT
347       --                none
348       --
349       -- Return value
350       --                set to message text
351       --
352       -- HISTORY
353       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
354       --
355       -- *******************************************************************************************
356 
357       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
358                              p_module=> l_module_name,
359                              p_msg_text=> 'ENTRY');
360 
361 
362       FND_MESSAGE.SET_NAME('FEM',p_Msg_Name);
363 
364       If (p_Token_Name IS NOT NULL) then
365          FND_MESSAGE.SET_TOKEN(p_Token_Name,p_Token_Value );
366       End If;
367 
368       x_Msg_Text := FND_MESSAGE.GET();
369 
370       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
371                                    p_module=> l_module_name,
372                                    p_msg_text=> 'EXIT');
373       RETURN x_Msg_Text;
374 
375       EXCEPTION
376          WHEN OTHERS THEN
377             FEM_UTILS.set_master_err_state( z_master_err_state,
378                                                 FEM_UTILS.G_RSM_FATAL_ERR,
379                                                 G_APP_NAME,
380                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
381                                                 G_ERRMAC_ROUTINE_NAME,
382                                                 l_module_name,
383                                                 NULL,
384                                                 G_ERRMAC_SQL_ERROR,
385                                                 SQLERRM);
386             RAISE;
387    End GetErrMsgText;
388 
389 
390    Function GetObjectIDFromDefID(p_Obj_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE) RETURN NUMBER IS
391       l_Object_ID DEF_OBJECT_ID%TYPE;
392       l_module_name VARCHAR2(70) := G_MODULE_NAME || 'GetObjectIDFromDefID';
393 
394       Cursor getObjectID(p_Obj_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE) IS
395          SELECT o.object_id
396             from   fem_object_catalog_b o
397                   ,fem_object_definition_b od
398             where       o.object_id = od.object_id
399                   and   od.object_definition_id = p_Obj_Def_ID;
400 
401    Begin
402       -- *******************************************************************************************
403       -- name        :  GetObjectIDFromDefID
404       -- Function    :  Lookup an object_id from the passed object_definition_id
405       -- Parameters
406       -- IN
407       --                p_Obj_Def_ID
408       --                   -  the object_definition_id to lookup
409       --
410       -- OUT
411       --                none
412       --
413       -- Return value
414       --                the object_id_found
415       --
416       -- HISTORY
417       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
418       --
419       -- *******************************************************************************************
420       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
421                                    p_module=> l_module_name,
422                                    p_msg_text=> 'ENTRY');
423 
424       OPEN getObjectID(p_Obj_Def_ID);
425       FETCH getObjectID
426          INTO l_Object_ID;
427       CLOSE getObjectID;
428 
429       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
430                                    p_module=> l_module_name,
431                                    p_msg_text=> 'EXIT');
432       RETURN l_Object_ID;
433 
434       EXCEPTION
435          WHEN OTHERS THEN
436             FEM_UTILS.set_master_err_state( z_master_err_state,
437                                                 FEM_UTILS.G_RSM_FATAL_ERR,
438                                                 G_APP_NAME,
439                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
440                                                 G_ERRMAC_ROUTINE_NAME,
441                                                 l_module_name,
442                                                 NULL,
443                                                 G_ERRMAC_SQL_ERROR,
444                                                 SQLERRM);
445             RAISE;
446    End GetObjectIDFromDefID;
447 
448 
449 
450    Procedure GetObjectDisplayNameandFolder(p_Obj_ID IN DEF_OBJECT_ID%TYPE
451                                           ,l_Object_Display_Name OUT NOCOPY DEF_OBJECT_DISPLAY_NAME%TYPE
452                                           ,l_Object_Folder_Name  OUT NOCOPY DEF_FOLDER_NAME%TYPE) IS
453 
454       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'GetObjectDisplayNameandFolder';
455 
456       Cursor getNameAndFolder(p_Obj_ID IN DEF_OBJECT_ID%TYPE) IS
457          select    o.object_name
458                   ,f.folder_name
459             from   fem_object_catalog_vl o
460                   ,fem_folders_vl f
461             where       o.object_id = p_Obj_ID
462                   and   f.folder_id = o.folder_id;
463 
464    Begin
465       -- *******************************************************************************************
466       -- name        :  GetObjectDisplayNameandFolder
467       -- Function    :  lookup the display name and folder name
468       --                for a passed object_id
469       -- Parameters
470       -- IN
471       --                p_Obj_ID
472       --                   -  the object_id for the name we are looking up
473       --
474       -- OUT
475       --                l_Object_Display_Name OUT DEF_OBJECT_DISPLAY_NAME%TYPE
476       --                   -  the display name found.
477       --                l_Object_Folder_Name  OUT DEF_FOLDER_NAME%TYPE) IS
478       --                   -  the folder name found.
479       --
480       --
481       -- HISTORY
482       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
483       --
484       -- *******************************************************************************************
485       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
486                              p_module=> l_module_name,
487                              p_msg_text=> 'ENTRY');
488 
489       OPEN getNameAndFolder(p_Obj_ID);
490       FETCH getNameAndFolder
491           INTO     l_Object_Display_Name
492                   ,l_Object_Folder_Name;
493 
494       If getNameAndFolder%NOTFOUND then
495          l_Object_Display_Name := '[Not Valid Object]';
496          l_Object_Folder_Name  := '[*****]';
497       End If;
498 
499       CLOSE getNameAndFolder;
500 
501       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
502                                    p_module=> l_module_name,
503                                    p_msg_text=> 'EXIT');
504       EXCEPTION
505          WHEN OTHERS THEN
506             FEM_UTILS.set_master_err_state( z_master_err_state,
507                                                 FEM_UTILS.G_RSM_FATAL_ERR,
508                                                 G_APP_NAME,
509                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
510                                                 G_ERRMAC_ROUTINE_NAME,
511                                                 l_module_name,
512                                                 NULL,
513                                                 G_ERRMAC_SQL_ERROR,
514                                                 SQLERRM);
515             RAISE;
516 
517    End GetObjectDisplayNameandFolder;
518 
519 
520    Procedure Pop_Invalid_MmbrFlags_Tbl
521                            (p_Member_Flags_Tab IN OUT NOCOPY Members_Validation_Status_Tab
522                             ,p_Member_Flags_Count IN OUT NOCOPY BINARY_INTEGER
523                             ,p_Folder_Name_Of_Member IN VARCHAR2
524                             ,p_Owning_RS_Name_Of_Member IN VARCHAR2
525                             ,p_Member_Object_ID IN DEF_OBJECT_ID%TYPE
526                             ,p_Member_Name IN VARCHAR2
527                             ,p_Member_Type IN VARCHAR2
528                             ,p_Valid_Member_Enabled_Status IN VARCHAR2
529                             ,p_Valid_Rule_Def_Status IN VARCHAR2
530                             ,p_Valid_Lock_Status IN  VARCHAR2
531                             ,p_Valid_Approval_Status IN VARCHAR2
532                             ,p_Valid_Dep_Obj_Status IN VARCHAR2
533                             ,p_Valid_Local_VS_Status IN VARCHAR2
534                             ,p_Other_Error_Status IN VARCHAR2) IS
535       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Pop_Invalid_MmbrFlags_Tbl';
536    Begin
537       -- *******************************************************************************************
538       -- name        :  Pop_Invalid_MmbrFlags_Tbl
539       -- Function    :  Initialize entry in p_Member_Flags_Tab that is
540       --                pointed to by p_Member_Flags_Count.
541       -- Parameters
542       -- IN
543       --                p_Folder_Name_Of_Member
544       --                   -  folder where member is stored..
545       --                p_Owning_RS_Name_Of_Member
546       --                   -  rule set that owns this rule entry
547       --                p_Member_Object_ID
548       --                   -  object of this rule entry
549       --                p_Member_Name
550       --                   -  display name of this rule entry
551       --                p_Member_Type
552       --                   -  type of this rule entry (i.e. 'MAPPING_RULE')
553       --                p_Valid_Member_Enabled_Status
554       --                   -  valid values:?
555       --                p_Valid_Rule_Def_Status
556       --                   -  ?
557       --                p_Valid_Lock_Status
558       --                   -  ?
559       --                p_Valid_Approval_Status
560       --                   -  ?
561       --                p_Valid_Dep_Obj_Status
562       --                   -  ?
563       --                p_Valid_Local_VS_Status
564       --                   -  ?
565       --                p_Other_Error_Status
566       --                   -  ?
567       --
568       -- OUT
569       --                none.
570       --
571       -- In Out
572       --                p_Member_Flags_Tab
573       --                   -  the table containing the current members (processed?)
574       --                p_Member_Flags_Count
575       --                   -  current index into p_Member_Flags_Tab
576       --
577       -- HISTORY
578       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
579       --
580       -- *******************************************************************************************
581       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
582                                    p_module=> l_module_name,
583                                    p_msg_text=> 'ENTRY');
584 
585       p_Member_Flags_Tab(p_Member_Flags_Count).Folder_Name                       := p_Folder_Name_Of_Member;
586       p_Member_Flags_Tab(p_Member_Flags_Count).Owning_RuleSet_Name         := p_Owning_RS_Name_Of_Member;
587       p_Member_Flags_Tab(p_Member_Flags_Count).Object_Name                       := p_Member_Name;
588       p_Member_Flags_Tab(p_Member_Flags_Count).Object_Type                      := p_Member_Type;
589       p_Member_Flags_Tab(p_Member_Flags_Count).Object_ID                         := p_Member_Object_ID;
590 
591       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Member_Enabled_Status = ' ')
592             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Member_Enabled_Status IS NULL) ) then
593          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Member_Enabled_Status := p_Valid_Member_Enabled_Status;
594       End If;
595 
596       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Rule_Def_Status = ' ')
597             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Rule_Def_Status IS NULL) ) then
598          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Rule_Def_Status       := p_Valid_Rule_Def_Status;
599       End If;
600 
601       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Lock_Status = ' ')
602             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Lock_Status IS NULL) ) then
603          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Lock_Status           := p_Valid_Lock_Status;
604       End If;
605 
606       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Approval_Status = ' ')
607             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Approval_Status IS NULL) ) then
608          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Approval_Status       := p_Valid_Approval_Status;
609       End If;
610 
611       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Dep_Obj_Status = ' ')
612             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Dep_Obj_Status IS NULL) ) then
613          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Dep_Obj_Status        := p_Valid_Dep_Obj_Status;
614       End If;
615 
616       If (     (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Local_VS_Status = ' ')
617             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Local_VS_Status IS NULL) ) then
618          p_Member_Flags_Tab(p_Member_Flags_Count).Valid_Local_VS_Status := p_Valid_Local_VS_Status;
619       End If;
620 
621       IF (     (p_Member_Flags_Tab(p_Member_Flags_Count).Other_Error_Status = ' ')
622             OR (p_Member_Flags_Tab(p_Member_Flags_Count).Other_Error_Status IS NULL) ) then
623          p_Member_Flags_Tab(p_Member_Flags_Count).Other_Error_Status          := p_Other_Error_Status;
624       End If;
625 
626       -- move pointer to next free cell.
627       p_Member_Flags_Count := p_Member_Flags_Count + 1;
628 
629       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
630                                    p_module=> l_module_name,
631                                    p_msg_text=> 'EXIT');
632       EXCEPTION
633          WHEN OTHERS THEN
634             -- todo:: useful?? z_Err_Code := -1;
635             FEM_UTILS.set_master_err_state( z_master_err_state,
636                                                 FEM_UTILS.G_RSM_FATAL_ERR,
637                                                 G_APP_NAME,
638                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
639                                                 G_ERRMAC_ROUTINE_NAME,
640                                                 l_module_name,
641                                                 NULL,
642                                                 G_ERRMAC_SQL_ERROR,
643                                                 SQLERRM);
644             RAISE;
645 
646    End Pop_Invalid_MmbrFlags_Tbl;
647 
648 
649    Procedure Populate_Valid_Member_Tab(p_Valid_Invalid_Members_Tab IN OUT NOCOPY Valid_Invalid_Members_Inst_Tab
650                                        ,p_Valid_Invalid_Members_Count IN OUT  NOCOPY BINARY_INTEGER
651                                        ,p_Folder_Name_Of_Member IN VARCHAR2
652                                        ,p_Owning_RS_Name_Of_Member IN VARCHAR2
653                                        ,p_Member_Object_ID IN DEF_OBJECT_ID%TYPE
654                                        ,p_Member_Name IN VARCHAR2
655                                        ,p_Member_Type IN VARCHAR2
656                                        ,p_Member_Status IN VARCHAR2) IS
657       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Populate_Valid_Member_Tab';
658    Begin
659       -- *******************************************************************************************
660       -- name        :  Populate_Valid_Member_Tab
661       -- Function    :  Initialize entry in p_Valid_Invalid_Members_Tab that is
662       --                pointed to by p_Valid_Invalid_Members_Count.
663       -- Parameters
664       -- IN
665       --                p_Folder_Name_Of_Member
666       --                   -  folder name of current object pointed to by p_Valid_Invalid_Members_Count
667       --                p_Owning_RS_Name_Of_Member
668       --                   -  owning rule set of current object pointed to by p_Valid_Invalid_Members_Count
669       --                p_Member_Object_ID
670       --                   -  object_id of current object pointed to by p_Valid_Invalid_Members_Count
671       --                p_Member_Name
672       --                   -  display name of current object pointed to by p_Valid_Invalid_Members_Count
673       --                p_Member_Type
674       --                   -  type of current object (i.e. 'MAPPING_RULE') pointed to by p_Valid_Invalid_Members_Count
675       --                p_Member_Status
676       --                   -  ?
677       --
678       -- OUT
679       --                none.
680       --
681       -- In Out
682       --                p_Valid_Invalid_Members_Tab
683       --                   - ?
684       --                p_Valid_Invalid_Members_Count
685       --                   -  current indext into p_Valid_Invalid_Members_Tab
686       --
687       --
688       -- HISTORY
689       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
690       --
691       -- *******************************************************************************************
692       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
693                                    p_module=> l_module_name,
694                                    p_msg_text=> 'ENTRY');
695 
696       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Folder_Name := p_Folder_Name_Of_Member;
697       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Owning_RuleSet_Name := p_Owning_RS_Name_Of_Member;
698       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Object_ID := p_Member_Object_ID;
699       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Object_Name := p_Member_Name;
700       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Object_Type := p_Member_Type;
701       p_Valid_Invalid_Members_Tab(p_Valid_Invalid_Members_Count).Validation_Status := p_Member_Status;
702 
703       -- move pointer to next free cell.
704       p_Valid_Invalid_Members_Count := p_Valid_Invalid_Members_Count +1;
705 
706       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
707                                    p_module=> l_module_name,
708                                    p_msg_text=> 'EXIT');
709       EXCEPTION
710          WHEN OTHERS THEN
711             -- todo:: useful? z_Err_Code := -1;
712             FEM_UTILS.set_master_err_state( z_master_err_state,
713                                                 FEM_UTILS.G_RSM_FATAL_ERR,
714                                                 G_APP_NAME,
715                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
716                                                 G_ERRMAC_ROUTINE_NAME,
717                                                 l_module_name,
718                                                 NULL,
719                                                 G_ERRMAC_SQL_ERROR,
720                                                 SQLERRM);
721             RAISE;
722 
723 
724    End Populate_Valid_Member_Tab;
725 
726 
727    Procedure Log_Dependent_Object_Status(p_Parent_Object_ID IN DEF_OBJECT_ID%TYPE
728                                         ,p_Dependent_Objects_Tab IN Dependent_Objects_Tab
729                                         ,p_Dependent_Objects_Count IN BINARY_INTEGER) IS
730       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Log_Dependent_Object_Status';
731    Begin
732       -- *******************************************************************************************
733       -- name        :  Log_Dependent_Object_Status
734       -- Function    :  Log dependent object status to the fnd_file output file.
735       --                ?? this may be where we output invalid rules found in rulesets rjk ??
736       -- Parameters
737       -- IN
738       --                p_Parent_Object_ID
739       --                   -  object_id of owning object
740       --                p_Dependent_Objects_Tab
741       --                   -  table of dependent objects??
742       --                p_Dependent_Objects_Count
743       --                   -  count of object in table.
744       --
745       -- OUT
746       --                none.
747       --
748       --
749 
750       --
751       -- HISTORY
752       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
753       --
754       -- *******************************************************************************************
755       -- implemented as linear search.
756       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
757                                    p_module=> l_module_name,
758                                    p_msg_text=> 'ENTRY');
759 
760       For i in 0..p_Dependent_Objects_Count-1 LOOP
761          if (p_Dependent_Objects_Tab(i).Parent_Object_ID = p_Parent_Object_ID) then
762 
763             fnd_file.put_line(FND_FILE.OUTPUT,
764                                  '=>'
765                               || RPAD(p_Dependent_Objects_Tab(i).Dependent_Object_Display_Name,40,' ')
766                               || RPAD(p_Dependent_Objects_Tab(i).Dependent_Object_Type_Code,32,' ')
767                               || RPAD(p_Dependent_Objects_Tab(i).Dependent_Object_Folder_Name,32,' ')
768                               || RPAD('***',42,' ')
769                               || RPAD('***',16,' ')
770                               || RPAD('***',22,' ')
771                               || RPAD(G_RSM_NO_VALID_DEFN,12,' ')
772                               || RPAD('***',13,' ')
773                               || RPAD('***',17,' ')
774                               || RPAD('***',18,' ')
775                              );
776          end if;
777       End LOOP;
778 
779       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
780                                    p_module=> l_module_name,
781                                    p_msg_text=> 'EXIT');
782    End Log_Dependent_Object_Status;
783 
784 
785    Procedure Log_Dep_Status_For_Single_Rule(p_Parent_Object_ID IN DEF_OBJECT_ID%TYPE
786                                            ,p_Dependent_Objects_Tab IN Dependent_Objects_Tab
787                                            ,p_Dependent_Objects_Count IN BINARY_INTEGER) IS
788       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Log_Dep_Status_For_Single_Rule';
789    Begin
790       -- *******************************************************************************************
791       -- name        :  Log_Dep_Status_For_Single_Rule
792       -- Function    :  Log dependent object status to the fnd_file output file.
793       --                ?? this may be where we output invalid rules found in rulesets rjk ??
794       -- Parameters
795       -- IN
796       --                p_Parent_Object_ID
797       --                   -  object_id of owning object
798       --                p_Dependent_Objects_Tab
799       --                   -  table of dependent objects??
800       --                p_Dependent_Objects_Count
801       --                   -  count of object in table.
802       --
803       -- OUT
804       --                none.
805       --
806       -- HISTORY
807       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
808       --
809       -- *******************************************************************************************
810 
811       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
812                                    p_module=> l_module_name,
813                                    p_msg_text=> 'ENTRY');
814 
815 
816       -- implemented as linear search
817       For i in 0..p_Dependent_Objects_Count-1 LOOP
818          if (p_Dependent_Objects_Tab(i).Parent_Object_ID = p_Parent_Object_ID) then
819 
820             fnd_file.put_line(FND_FILE.OUTPUT,
821                               '=>'
822                               || RPAD(p_Dependent_Objects_Tab(i).Dependent_Object_Display_Name,40,' ')
823                               || RPAD(p_Dependent_Objects_Tab(i).Dependent_Object_Folder_Name,32,' ')
824                               || RPAD(G_RSM_NO_VALID_DEFN,32,' ')
825                               || RPAD('***',13,' ')
826                               || RPAD('***',17,' ')
827                               || RPAD('***',18,' ')
828                              );
829 
830          end if;
831       End LOOP;
832 
833       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
834                                    p_module=> l_module_name,
835                                    p_msg_text=> 'EXIT');
836 
837    End Log_Dep_Status_For_Single_Rule;
838 
839 
840 
841    Procedure Write_Flagged_Members_Output( p_Flagged_Members_Tab IN OUT NOCOPY Members_Validation_Status_Tab
842                                           ,p_Flagged_Members_Count IN OUT NOCOPY BINARY_INTEGER
843                                           ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab
844                                           ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER) IS
845       s_Err_Msg_Text VARCHAR2(2000);
846       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Write_Flagged_Members_Output';
847 
848    Begin
849       -- *******************************************************************************************
850       -- name        :  Write_Flagged_Members_Output
851       -- Function    :  Log entire contents of p_Flagged_Members_Tab table.  Also log
852       --                dependent objects entries if the status of the current entry is
853       --                'G_RSM_DEP_OBJECTS_INVALID'
854       -- Parameters
855       -- IN
856       --                p_Flagged_Members_Tab
857       --                   -  table to log..
858       --                p_Flagged_Members_Count
859       --                   -  count of entries in p_Flagged_Members_Tab
860       --                p_Dependent_Objects_Tab
861       --                   -  table containing objects that are dependent objects of objects in p_Flagged_Members_Tab
862       --                p_Dependent_Objects_Count
863       --                   -  count of entries in p_Dependent_Objects_Tab
864       --
865       -- OUT
866       --                none.
867       --
868       --
869       -- HISTORY
870       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
871       --
872       -- *******************************************************************************************
873       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
874                                    p_module=> l_module_name,
875                                    p_msg_text=> 'ENTRY');
876 
877       For i in 0..p_Flagged_Members_Count -1 LOOP
878 
879          fnd_file.put_line(FND_FILE.OUTPUT,
880                               RPAD(p_Flagged_Members_Tab(i).Object_Name,42,' ')
881                            || RPAD(p_Flagged_Members_Tab(i).Object_Type,32,' ')
882                            || RPAD(p_Flagged_Members_Tab(i).Folder_Name,32,' ')
883                            || RPAD(p_Flagged_Members_Tab(i).Owning_RuleSet_Name,42,' ')
884                            || RPAD(p_Flagged_Members_Tab(i).Valid_Member_Enabled_Status,16,' ')
885                            || RPAD(p_Flagged_Members_Tab(i).Other_Error_Status,22,' ')
886                            || RPAD(p_Flagged_Members_Tab(i).Valid_Rule_Def_Status,12,' ')
887                            || RPAD(p_Flagged_Members_Tab(i).Valid_Lock_Status,13,' ')
888                            || RPAD(p_Flagged_Members_Tab(i).Valid_Local_VS_Status,17,' ')
889                            || RPAD(p_Flagged_Members_Tab(i).Valid_Approval_Status,17,' ')
890                            || RPAD(p_Flagged_Members_Tab(i).Valid_Dep_Obj_Status,18,' ')
891                       );
892 
893          If (p_Flagged_Members_Tab(i).Valid_Dep_Obj_Status = G_RSM_DEP_OBJECTS_INVALID) then
894             Log_Dependent_Object_Status(p_Flagged_Members_Tab(i).Object_ID
895                                        ,p_Dependent_Objects_Tab
896                                        ,p_Dependent_Objects_Count);
897 
898          End If;
899     End LOOP;
900     fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
901                                  p_module=> l_module_name,
902                                  p_msg_text=> 'EXIT');
903 
904    End Write_Flagged_Members_Output;
905 
906 
907 
908    Procedure Write_Valid_Invalid_Mem_Output(p_Valid_Invalid_Members_Tab IN OUT NOCOPY Valid_Invalid_Members_Inst_Tab
909                                            ,p_Valid_Invalid_Members_Count IN OUT NOCOPY  BINARY_INTEGER
910                                            ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab  -- looks dead..
911                                            ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER) IS   -- looks dead..
912       s_Err_Msg_Text VARCHAR2(2000);
913       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Write_Valid_Invalid_Mem_Output';
914 
915    Begin
916       -- *******************************************************************************************
917       -- name        :  Write_Valid_Invalid_Mem_Output
918       -- Function    :  Log entire contents of p_Valid_Invalid_Members_Tab table.
919       --
920       -- Parameters
921       -- IN
922       --                p_Valid_Invalid_Members_Tab
923       --                   -  table to log..
924       --                p_Valid_Invalid_Members_Count
925       --                   -  count of entries in p_Valid_Invalid_Members_Tab
926       --
927       --              -----------the two parameters below appear to be deprecated------------
928       --                p_Dependent_Objects_Tab
929       --                   -  table containing objects that are dependent objects of objects in p_Flagged_Members_Tab
930       --                p_Dependent_Objects_Count
931       --                   -  count of entries in p_Dependent_Objects_Tab
932       --
933       -- OUT
934       --                none.
935       --
936       --
937       --
938       -- HISTORY
939       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
940       --
941       -- *******************************************************************************************
942       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
943                                    p_module=> l_module_name,
944                                    p_msg_text=> 'ENTRY');
945 
946 
947       For i in 0..p_Valid_Invalid_Members_Count-1 LOOP
948          fnd_file.put_line(FND_FILE.OUTPUT,
949                               RPAD(p_Valid_Invalid_Members_Tab(i).Object_Name,40,' ')
950                            || RPAD(p_Valid_Invalid_Members_Tab(i).Object_Type,30,' ')
951                            || RPAD(p_Valid_Invalid_Members_Tab(i).Folder_Name,30,' ')
952                            || RPAD(p_Valid_Invalid_Members_Tab(i).Owning_RuleSet_Name,40,' ')
953                            || RPAD(p_Valid_Invalid_Members_Tab(i).Validation_Status,12,' ')
954                           );
955 
956       End LOOP;
957 
958       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
959                                    p_module=> l_module_name,
960                                    p_msg_text=> 'EXIT');
961       EXCEPTION
962          WHEN OTHERS THEN
963             -- todo:: useful? z_Err_Code := -1;
964             FEM_UTILS.set_master_err_state( z_master_err_state,
965                                                 FEM_UTILS.G_RSM_FATAL_ERR,
966                                                 G_APP_NAME,
967                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
968                                                 G_ERRMAC_ROUTINE_NAME,
969                                                 l_module_name,
970                                                 NULL,
971                                                 G_ERRMAC_SQL_ERROR,
972                                                 SQLERRM);
973             RAISE;
974 
975    End Write_Valid_Invalid_Mem_Output;
976 
977 
978    Procedure Write_Output(p_Valid_Members_Tab IN OUT NOCOPY Valid_Invalid_Members_Inst_Tab
979                          ,p_Valid_Members_Count IN OUT NOCOPY BINARY_INTEGER
980                          ,p_Flagged_Members_Tab IN OUT NOCOPY Members_Validation_Status_Tab
981                          ,p_Flagged_Members_Count IN OUT NOCOPY BINARY_INTEGER
982                          ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab
983                          ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER
984                          ,p_Orig_RuleSet_Object_ID IN NUMBER
985                          ,p_Rule_Effective_Date IN DATE
986                          ,p_Output_Dataset_Name IN VARCHAR2
987                          ,p_IsProductionODS IN BOOLEAN
988                          ,p_Execution_Mode IN VARCHAR2) IS
989       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Write_Output';
990       l_IsProductionODSstr   VARCHAR2(6)  := NULL;
991    Begin
992       -- *******************************************************************************************
993       -- name        :  Write_Output
994       -- Function    :  write a report to the fnd_file output file.
995       --
996       -- Parameters
997       -- IN
998       --
999       -- OUT
1000       --                none.
1001       --
1002       --
1003       --
1004       -- HISTORY
1005       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1006       --
1007       -- *******************************************************************************************
1008       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1009                                    p_module=> l_module_name,
1010                                    p_msg_text=> 'ENTRY');
1011 
1012 
1013       fnd_file.put_line(FND_FILE.OUTPUT,'Procedure Name    : Fem_Rule_Set_Manager.Preprocess_RuleSet');
1014       fnd_file.put_line(FND_FILE.OUTPUT,'Package Version');
1015       fnd_file.put_line(FND_FILE.OUTPUT,'                  : '||getProcedureVersionFromDB);
1016       fnd_file.put_line(FND_FILE.OUTPUT,'Run Date          : '||to_char(sysdate,'DD-MON-YYYY HH:MI:SS'));
1017       fnd_file.put_line(FND_FILE.OUTPUT,'----------------------------------------------------------');
1018 
1019       fnd_file.put_line(FND_FILE.OUTPUT
1020                        ,'Rule Set being validated    : '||GetObjectDisplayName(p_Orig_RuleSet_Object_ID));
1021 
1022       fnd_file.put_line(FND_FILE.OUTPUT
1023                        ,'Rule Effective Date         : '||p_Rule_Effective_Date);
1024 
1025       fnd_file.put_line(FND_FILE.OUTPUT
1026                        ,'Output Dataset              : '||p_Output_Dataset_Name);
1027 
1028       IF p_IsProductionODS THEN
1029          l_IsProductionODSstr := 'Y';
1030       ELSE
1031          l_IsProductionODSstr := 'N';
1032       END IF;
1033 
1034       fnd_file.put_line(FND_FILE.OUTPUT
1035                        ,'Is Output Dataset Production: '||l_IsProductionODSstr);
1036 
1037       fnd_file.put_line(FND_FILE.OUTPUT,'----------------------------------------------------------');
1038 
1039       If (NOT z_dataset_error) then
1040 
1041          --***********************************************************************
1042          -- p_Execution_Mode valid values......................
1043          -- E=Engine Execution Mode (used by engines only)
1044          -- A=All Rules     (report on all rules whether they are valid or not)
1045          -- I=Invalid Rules (report on invalid rules only)
1046          -- V=Valid Rules   (report on valid rules only)
1047          --***********************************************************************
1048          If (p_Execution_Mode = 'V' OR p_Execution_Mode = 'A' OR p_Execution_Mode = 'E') then
1049             fnd_file.put_line(FND_FILE.OUTPUT,' ');
1050             fnd_file.put_line(FND_FILE.OUTPUT,'Valid Rules/Rule Sets');
1051             fnd_file.put_line(FND_FILE.OUTPUT,'=====================');
1052             fnd_file.put_line(FND_FILE.OUTPUT,
1053                                  RPAD('Rule Name',40,' ')
1054                               || RPAD('Type',30,' ')
1055                               || RPAD('Folder',30,' ')
1056                               || RPAD('Owning RuleSet',40,' ')
1057                               || RPAD('Status',12,' ')
1058                              );
1059             fnd_file.put_line(FND_FILE.OUTPUT,
1060                                  RPAD('---------',40,' ')
1061                               || RPAD('----',30,' ')
1062                               || RPAD('------',30,' ')
1063                               || RPAD('--------------',40,' ')
1064                               || RPAD('------',12,' ')
1065                              );
1066 
1067             Write_Valid_Invalid_Mem_Output(p_Valid_Members_Tab
1068                                           ,p_Valid_Members_Count
1069                                           ,p_Dependent_Objects_Tab
1070                                           ,p_Dependent_Objects_Count);
1071               --If (z_Err_Code = -1) then
1072               --        RETURN;
1073               -- End If;
1074 
1075          End If;
1076 
1077          --***********************************************************************
1078          -- p_Execution_Mode valid values......................
1079          -- E=Engine Execution Mode (used by engines only)
1080          -- A=All Rules     (report on all rules whether they are valid or not)
1081          -- I=Invalid Rules (report on invalid rules only)
1082          -- V=Valid Rules   (report on valid rules only)
1083          --***********************************************************************
1084          If (     p_Execution_Mode = 'I'
1085              OR   p_Execution_Mode = 'A'
1086              OR   p_Execution_Mode = 'E') then
1087             fnd_file.put_line(FND_FILE.OUTPUT,' ');
1088             fnd_file.put_line(FND_FILE.OUTPUT,'Invalid Rules/Rule Sets');
1089             fnd_file.put_line(FND_FILE.OUTPUT,'=======================');
1090 
1091             fnd_file.put_line(FND_FILE.OUTPUT,
1092                                  RPAD('Rule Name',42,' ')
1093                               || RPAD('Type',32,' ')
1094                               || RPAD('Folder',32,' ')
1095                               || RPAD('Owning RuleSet',42,' ')
1096                               || RPAD('Enabled Status',16,' ')
1097                               || RPAD('Other Error',22,' ')
1098                               || RPAD('Rule Def',12,' ')
1099                               || RPAD('Lock Status',13,' ')
1100                               || RPAD('Local VS Status',17,' ')
1101                               || RPAD('Approval Status',17,' ')
1102                               || RPAD('Dependent Status',18,' ')
1103                              );
1104 
1105             fnd_file.put_line(FND_FILE.OUTPUT,
1106                                  RPAD('---------',42,' ')
1107                               || RPAD('----',32,' ')
1108                               || RPAD('------',32,' ')
1109                               || RPAD('--------------',42,' ')
1110                               || RPAD('--------------',16,' ')
1111                               || RPAD('----------',22,' ')
1112                               || RPAD('--------',12,' ')
1113                               || RPAD('-----------',13,' ')
1114                               || RPAD('---------------',17,' ')
1115                               || RPAD('---------------',17,' ')
1116                               || RPAD('----------------',18,' ')
1117                              );
1118 
1119             Write_Flagged_Members_Output( p_Flagged_Members_Tab
1120                                         ,p_Flagged_Members_Count
1121                                         ,p_Dependent_Objects_Tab
1122                                         ,p_Dependent_Objects_Count);
1123 
1124          End If;
1125 
1126       End If;
1127 
1128       fnd_file.put_line(FND_FILE.OUTPUT,' ');
1129       fnd_file.put_line(FND_FILE.OUTPUT,'                    -----------------End of Report-----------------');
1130 
1131       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1132                                    p_module=> l_module_name,
1133                                    p_msg_text=> 'EXIT');
1134 
1135       EXCEPTION
1136       WHEN OTHERS THEN
1137          -- todo:: useful? z_Err_Code := -1;
1138          FEM_UTILS.set_master_err_state( z_master_err_state,
1139                                              FEM_UTILS.G_RSM_FATAL_ERR,
1140                                              G_APP_NAME,
1141                                              G_ERRMSG_UNEXPECTED_SQLERROR,
1142                                              G_ERRMAC_ROUTINE_NAME,
1143                                              l_module_name,
1144                                              NULL,
1145                                              G_ERRMAC_SQL_ERROR,
1146                                              SQLERRM);
1147          RAISE;
1148 
1149    End Write_Output;
1150 
1151 
1152    FUNCTION Mem_Obj_Prev_Processed(p_currRuleSet IN Rule_Set_Instance_Rec
1153                                   ,p_Child_Object_ID IN DEF_OBJECT_ID%TYPE
1154                                   ,p_Child_Folder_Name IN DEF_FOLDER_NAME%TYPE
1155                                   ,p_Child_Object_Name IN DEF_OBJECT_DISPLAY_NAME%TYPE
1156                                   ,x_Members_Processed_Tab IN OUT NOCOPY Members_Processed_Instance_Tab
1157                                   ,x_Members_Processed_Count IN OUT NOCOPY BINARY_INTEGER
1158                                   ,p_Child_Object_Type_Code IN DEF_OBJECT_TYPE_CODE%TYPE) RETURN BOOLEAN IS
1159 
1160       --                                              000000000111111111122222222223333333333444444444455555555556
1161       --                                              123456789012345678901234567890123456789012345678901234567890
1162       l_module_name           VARCHAR2(70) := G_MODULE_NAME || 'Mem_Obj_Prev_Processed';
1163       l_found_error           BOOLEAN      := FALSE;
1164 
1165    BEGIN
1166       -- *******************************************************************************************
1167       -- name        :  Mem_Obj_Prev_Processed
1168       -- Function    :  Search for a previously processed Object_ID in the x_Members_Processed_Tab table.
1169       --                If it was previously processed, raise a user exception and return TRUE..
1170       --                Otherwise add the current member to the x_Members_Processed_Tab and return FALSE
1171       --
1172       -- Parameters
1173       -- IN
1174       --                p_Child_Object_ID
1175       --                   -  The OBJECT_ID we are searching for in the x_Members_Processed_Tab table.
1176       --                p_Child_Folder_Name IN DEF_FOLDER_NAME%TYPE
1177       --                   -  The Folder name associated with p_Child_Object_ID
1178       --                p_Child_Object_Name IN DEF_OBJECT_DISPLAY_NAME%TYPE
1179       --                   -  The Display name associated with p_Child_Object_ID
1180       -- In OUT
1181       --                x_Members_Processed_Tab
1182       --                   -  The previously processed member table.
1183       --                x_Members_Processed_Count
1184       --                   -  The count of entries stored in the x_Members_Processed_Tab table
1185       --
1186       -- returns
1187       --                TRUE -  we found the object ID, this may be bad...
1188       --                FALSE - object ID not found, things are normal (no error)...
1189       --
1190       -- HISTORY
1191       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1192       --
1193       -- *******************************************************************************************
1194       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1195                                    p_module=> l_module_name,
1196                                    p_msg_text=> 'ENTRY');
1197 
1198       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1199                                    p_module=> l_module_name,
1200                                    p_msg_text=> 'p_Child_Object_ID->' || p_Child_Object_ID);
1201       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1202                                    p_module=> l_module_name,
1203                                    p_msg_text=> 'p_Child_Folder_Name->' || p_Child_Folder_Name);
1204       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1205                                    p_module=> l_module_name,
1206                                    p_msg_text=> 'p_Child_Object_Name->' || p_Child_Object_Name);
1207       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1208                                    p_module=> l_module_name,
1209                                    p_msg_text=> 'p_currRuleSet.RuleSet_Object_Name->' || p_currRuleSet.RuleSet_Object_Name);
1210 
1211       If (x_Members_Processed_Count > 0) then
1212          For l_current_member in 0..x_Members_Processed_Count - 1 LOOP
1213 
1214             If (x_Members_Processed_Tab(l_current_member).Member_Object_ID = p_Child_Object_ID) then
1215 
1216                fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1217                                             p_module=> l_module_name,
1218                                             p_msg_text=> 'match found.. failing');
1219                z_Err_Code := 4;
1220                -- todo:: fix to new standards..
1221                IF p_Child_Object_Type_Code  = 'RULE_SET' THEN
1222 
1223                   FEM_UTILS.set_master_err_state( z_master_err_state,
1224                                                       FEM_UTILS.G_RSM_NONFATAL_ERR,
1225                                                       G_APP_NAME,
1226                                                       G_ERRMSG_DUPLICATE_OCCURRENCE,
1227                                                       G_ERRMAC_DUP_RS,
1228                                                       p_Child_Object_Name,
1229                                                       NULL,
1230                                                       G_ERRMAC_CONTAIN_RS,
1231                                                       p_currRuleSet.RuleSet_Object_Name
1232                                                       );
1233                ELSE
1234 
1235                   FEM_UTILS.set_master_err_state( z_master_err_state,
1236                                                       FEM_UTILS.G_RSM_NONFATAL_ERR,
1237                                                       G_APP_NAME,
1238                                                       G_ERRMSG_DUP_RULE_OCC,
1239                                                       G_ERRMAC_RULE_SET,
1240                                                       p_currRuleSet.RuleSet_Object_Name,
1241                                                       NULL,
1242                                                       G_ERRMAC_RULE_NAME,
1243                                                       p_Child_Object_Name
1244                                                       );
1245                END IF;
1246                l_found_error := TRUE;
1247             End If;
1248 
1249          End LOOP;
1250       End If; /* If (x_Members_Processed_Count > 0) */
1251 
1252       IF NOT l_found_error THEN
1253          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1254                                       p_module=> l_module_name,
1255                                       p_msg_text=> 'match NOT found.. adding to list');
1256          /****Adding Member to Members_Processed_Tab*****/
1257          -- add it.
1258          x_Members_Processed_Tab(x_Members_Processed_Count).Member_Object_ID := p_Child_Object_ID;
1259          -- increment the entry count..
1260          x_Members_Processed_Count := x_Members_Processed_Count + 1;
1261 
1262          /****************************************************/
1263          fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1264                                       p_module=> l_module_name,
1265                                       p_msg_text=> 'NORMAL EXIT');
1266       END IF;
1267 
1268       RETURN l_found_error;
1269 
1270 
1271       EXCEPTION
1272          WHEN OTHERS THEN
1273             -- todo:: useful? z_Err_Code := -1;
1274             FEM_UTILS.set_master_err_state( z_master_err_state,
1275                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1276                                                 G_APP_NAME,
1277                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
1278                                                 G_ERRMAC_ROUTINE_NAME,
1279                                                 l_module_name,
1280                                                 NULL,
1281                                                 G_ERRMAC_SQL_ERROR,
1282                                                 SQLERRM);
1283             RAISE;
1284 
1285    End Mem_Obj_Prev_Processed;
1286 
1287 
1288    FUNCTION RS_Cyclical_And_Depth_Check(
1289                             p_Child_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE
1290                            ,p_Child_Object_Display_Name  IN  DEF_OBJECT_DISPLAY_NAME%TYPE
1291                            ,x_Rule_Set_Level IN OUT NOCOPY NUMBER
1292                            ,x_Rule_Set_Count IN OUT NOCOPY BINARY_INTEGER
1293                            ,x_Rule_Set_Instance_Tab IN OUT NOCOPY Rule_Set_Instance_Tab
1294                            ,p_Other_Error_Status IN OUT NOCOPY VARCHAR2) RETURN BOOLEAN IS
1295 
1296       l_module_name           VARCHAR2(70)   := G_MODULE_NAME || 'RS_Cyclical_And_Depth_Check';
1297       l_ruleset_already_used  BOOLEAN        := FALSE;
1298 
1299    Begin
1300       -- *******************************************************************************************
1301       -- name        :  RS_Cyclical_And_Depth_Check
1302       -- Function    :  Search for a previously used Ruleset in the x_Rule_Set_Instance_Tab, and also check
1303       --                for max-depth of ruleset nesting.  If the ruleset was not found
1304       --                put its object_id into the x_Rule_Set_Instance_Tab.  If it was, return an error.  If max-nesting was
1305       --                exceeded, return an error.
1306       --
1307       -- Parameters
1308       -- IN
1309       --                p_Child_RuleSet_Object_ID
1310       --                   -  ruleset to search for..
1311       -- IN OUT
1312       --                x_Rule_Set_Level
1313       --                   -  current nesting level.
1314       --                x_Rule_Set_Count
1315       --                   -  count of rulesets we have processed.
1316       --                x_Rule_Set_Instance_Tab
1317       --                   -  table of previously used rulesets..
1318       --                p_Other_Error_Status
1319       --                   -  separate place to return an error (!)
1320       -- returns
1321       --                TRUE -  If we found a previous usage of this Ruleset object_id
1322       --                         *OR* we exceeded the maximum level for ruleset nesting.
1323       --                FALSE - If things went ok (no previous usage found)
1324       --
1325       -- HISTORY
1326       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1327       --
1328       -- *******************************************************************************************
1329       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1330                                    p_module=> l_module_name,
1331                                    p_msg_text=> 'ENTRY');
1332 
1333 
1334       /*************Cyclical check***********************/
1335       If (x_Rule_Set_Count > 0) then
1336 
1337          For i in 0..x_Rule_Set_Count LOOP
1338 
1339             If (x_Rule_Set_Instance_Tab(i).RuleSet_Object_ID = p_Child_RuleSet_Object_ID) then
1340                -- todo:: remove err code??
1341                z_Err_Code := 2;
1342                FEM_UTILS.set_master_err_state( z_master_err_state,
1343                                                    FEM_UTILS.G_RSM_NONFATAL_ERR,
1344                                                    G_APP_NAME,
1345                                                    G_ERRMSG_DUPLICATE_OCCURRENCE,
1346                                                    G_ERRMAC_DUP_RS,
1347                                                    p_Child_Object_Display_Name,
1348                                                    NULL,
1349                                                    G_ERRMAC_CONTAIN_RS,
1350                                                    x_Rule_Set_Instance_Tab(x_Rule_Set_Count).RuleSet_Object_Name
1351                                                    );
1352 
1353 
1354 
1355                p_Other_Error_Status := G_RSM_CYCLICAL_FAILURE;
1356                -- soft error..
1357                l_ruleset_already_used := TRUE;
1358             End If;
1359 
1360          End LOOP;
1361       End If;
1362 
1363       IF NOT l_ruleset_already_used THEN
1364          /******Adding Rule Set to Rule_Set_Instance_Tab******/
1365          x_Rule_Set_Count := X_Rule_Set_Count +1;
1366          x_Rule_Set_Instance_Tab(X_Rule_Set_Count).RuleSet_Object_ID    := p_Child_RuleSet_Object_ID;
1367          x_Rule_Set_Instance_Tab(X_Rule_Set_Count).RuleSet_Object_Name  := p_Child_Object_Display_Name;
1368          x_Rule_Set_Instance_Tab(X_Rule_Set_Count).Owning_RuleSet_Name  := x_Rule_Set_Instance_Tab(X_Rule_Set_Count - 1).RuleSet_Object_Name;
1369 
1370          x_Rule_Set_Level := x_Rule_Set_Level +1;
1371 
1372          /***Level Check***/
1373          If (x_Rule_Set_Level > g_max_rule_set_depth) then
1374             -- todo:: fix to new standards..
1375             z_Err_Code := 3;
1376             FEM_UTILS.set_master_err_state( z_master_err_state,
1377                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1378                                                 G_APP_NAME,
1379                                                 G_ERRMSG_DEPTH_CHECK_FAILURE
1380                                                 );
1381             p_Other_Error_Status := G_RSM_DEPTH_FAILURE;
1382 
1383             -- hard error.. fail out..
1384             RAISE FND_API.G_EXC_ERROR;
1385          End If;
1386       END IF;
1387 
1388 
1389       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1390                                    p_module=> l_module_name,
1391                                    p_msg_text=> 'EXIT');
1392 
1393       RETURN l_ruleset_already_used;
1394 
1395       EXCEPTION
1396          WHEN FND_API.G_EXC_ERROR THEN
1397             -- top calling routine will handle this one.
1398             RAISE;
1399          WHEN OTHERS THEN
1400             -- todo:: useful? z_Err_Code := -1;
1401             FEM_UTILS.set_master_err_state( z_master_err_state,
1402                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1403                                                 G_APP_NAME,
1404                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
1405                                                 G_ERRMAC_ROUTINE_NAME,
1406                                                 l_module_name,
1407                                                 NULL,
1408                                                 G_ERRMAC_SQL_ERROR,
1409                                                 SQLERRM);
1410             RAISE;
1411 
1412    End RS_Cyclical_And_Depth_Check;
1413 
1414 
1415 
1416 
1417    PROCEDURE Create_RuleSet_Process_Data(p_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE
1418                                         ,p_Child_Object_ID IN DEF_OBJECT_ID%TYPE
1419                                         ,p_Child_Object_Definition_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
1420                                         ,p_Engine_Execution_Seq IN NUMBER) IS
1421       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Create_RuleSet_Process_Data';
1422    Begin
1423       -- *******************************************************************************************
1424       -- name        :  Create_RuleSet_Process_Data
1425       -- Function    :  Insert a row into the fem_ruleset_process_data table.
1426       --
1427       -- Parameters
1428       -- IN
1429       --                p_RuleSet_Object_ID
1430       --                   -  owning ruleset?  Master Ruleset?
1431       --                p_Child_Object_ID
1432       --                   -  Object ID to be run.
1433       --                p_Child_Object_Definition_ID
1434       --                   -  Object Definition ID for the Object ID to be run
1435       --                p_Engine_Execution_Seq
1436       --                   -  run sequence for the rules (parallel rules all have same sequence #)
1437       --
1438       --
1439       -- HISTORY
1440       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1441       --
1442       -- *******************************************************************************************
1443       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1444                                    p_module=> l_module_name,
1445                                    p_msg_text=> 'ENTRY');
1446 
1447       z_global_counter := z_global_counter+1;
1448       --Bug # 4283689
1449       --fnd_file.put_line(fnd_file.LOG,'Inserting row :'||GetObjectDisplayName(p_Child_Object_ID)||':'||p_RuleSet_Object_ID||':'||z_conc_request_id||':'||p_Child_Object_Definition_ID);
1450 
1451       insert into fem_ruleset_process_data
1452          (RULE_SET_OBJ_ID
1453          ,CHILD_OBJ_ID
1454          ,CHILD_OBJ_DEF_ID
1455          ,ENGINE_EXECUTION_SEQUENCE
1456          ,REQUEST_ID
1457          ,CREATION_DATE
1458          ,CREATED_BY
1459          ,LAST_UPDATE_DATE
1460          ,LAST_UPDATED_BY
1461          ,LAST_UPDATE_LOGIN
1462          )
1463          values
1464          (p_RuleSet_Object_ID
1465          ,p_Child_Object_ID
1466          ,p_Child_Object_Definition_ID
1467          ,p_Engine_Execution_Seq
1468          ,z_conc_request_id
1469          ,sysdate
1470          ,z_user_id
1471          ,sysdate
1472          ,z_user_id
1473          ,z_login_id
1474          );
1475 
1476       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1477                                    p_module=> l_module_name,
1478                                    p_msg_text=> 'EXIT');
1479 
1480       EXCEPTION
1481          WHEN OTHERS THEN
1482             -- todo:: useful? z_Err_Code := -1;
1483             FEM_UTILS.set_master_err_state( z_master_err_state,
1484                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1485                                                 G_APP_NAME,
1486                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
1487                                                 G_ERRMAC_ROUTINE_NAME,
1488                                                 l_module_name,
1489                                                 NULL,
1490                                                 G_ERRMAC_SQL_ERROR,
1491                                                 SQLERRM);
1492             RAISE;
1493 
1494    End Create_RuleSet_Process_Data;
1495 
1496 
1497 
1498 
1499    Function IsProductionODS(   p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
1500                               ,p_Output_Dataset_Name OUT NOCOPY VARCHAR2
1501                               ,p_Output_Dataset_Code OUT NOCOPY DEF_DATASET_CODE%TYPE )
1502                               RETURN BOOLEAN IS
1503 
1504       l_module_name              VARCHAR2(70) := G_MODULE_NAME || 'IsProductionODS';
1505       l_ods_found                BOOLEAN := FALSE;
1506       l_ods_prodflag_found       BOOLEAN := FALSE;
1507       x_production_flag          VARCHAR2(1) := ' ';
1508       l_isProduction             BOOLEAN := FALSE;
1509 
1510       Cursor getOutputDataset(p_DS_IO_Def_ID IN NUMBER) IS
1511          SELECT   a.dataset_name
1512                   ,b.output_dataset_code
1513             from
1514                    fem_datasets_vl a
1515                   ,fem_ds_input_output_defs b
1516             where          b.output_dataset_code = a.dataset_code
1517                      and   b.dataset_io_obj_def_id = p_DS_IO_Def_ID;
1518 
1519       Cursor getProductionFlag(p_Output_Dataset_Code IN DEF_DATASET_CODE%TYPE) Is
1520          select   a.DIM_ATTRIBUTE_VARCHAR_MEMBER
1521             from  FEM_DATASETS_ATTR a
1522                   ,FEM_DIM_ATTRIBUTES_B b
1523             where          a.DATASET_CODE = p_Output_Dataset_Code
1524                   and      b.ATTRIBUTE_ID = a.ATTRIBUTE_ID
1525                   and      b.ATTRIBUTE_VARCHAR_LABEL = 'PRODUCTION_FLAG';
1526 
1527    Begin
1528       -- *******************************************************************************************
1529       -- name        :  IsProductionODS
1530       -- Function    :
1531       --
1532       -- Parameters
1533       -- IN
1534       --                p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
1535       --                   -  Data set IO Definition object_id in question..
1536       -- OUT
1537       --                p_Output_Dataset_Name OUT NOCOPY VARCHAR2
1538       --                   -  the name of the dataset associated with p_DS_IO_Def_ID
1539       --                p_Output_Dataset_Code OUT NOCOPY DEF_DATASET_CODE%TYPE
1540       --                   -  the output dataset specified for the DS_IO_Def_ID
1541       --
1542       -- RETURNS
1543       --                TRUE - is a production DS
1544       --                FALSE - is a non-production DS
1545       --                Exceptions:
1546       --                  OTHERS:     SQL/unknown exceptions only.
1547       --
1548       -- HISTORY
1549       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1550       --
1551       -- *******************************************************************************************
1552       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1553                                    p_module=> l_module_name,
1554                                    p_msg_text=> 'ENTRY');
1555 
1556       OPEN getOutputDataset(p_DS_IO_Def_ID);
1557 
1558       FETCH getOutputDataset
1559          into  p_Output_Dataset_Name
1560                ,p_Output_Dataset_Code;
1561 
1562          If getOutputDataset%NOTFOUND then
1563             -- we have no output data set, fail now.
1564             l_ods_found := FALSE;
1565          ELSE
1566             l_ods_found := TRUE;
1567          End If;
1568 
1569       CLOSE getOutputDataset;
1570 
1571       IF NOT l_ods_found THEN
1572          FEM_UTILS.set_master_err_state( z_master_err_state,
1573                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
1574                                              G_APP_NAME,
1575                                              G_ERRMSG_NO_ODS
1576                                              );
1577          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1578                              p_module=> l_module_name,
1579                              p_msg_text=> 'failed in output dataset query');
1580          z_dataset_error := TRUE;
1581       ELSE
1582 
1583          OPEN getProductionFlag(p_Output_Dataset_Code);
1584          FETCH getProductionFlag
1585             into  x_Production_Flag;
1586 
1587             If getProductionFlag%NOTFOUND then
1588                l_ods_prodflag_found := FALSE;
1589             ELSE
1590                l_ods_prodflag_found := TRUE;
1591             End If;
1592          CLOSE getProductionFlag;
1593 
1594          -- error...
1595          IF NOT l_ods_prodflag_found THEN
1596             FEM_UTILS.set_master_err_state( z_master_err_state,
1597                                                 FEM_UTILS.G_RSM_NONFATAL_ERR,
1598                                                 G_APP_NAME,
1599                                                 G_ERRMSG_NO_ODSPRODFLAG
1600                                                 );
1601             fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1602                                 p_module=> l_module_name,
1603                                 p_msg_text=> 'failed in production flag query');
1604             z_dataset_error := TRUE;
1605          END IF;
1606       END IF;
1607 
1608 
1609       IF x_Production_Flag = 'Y' THEN
1610          l_isProduction := TRUE;
1611       ELSIF x_Production_Flag = 'N' THEN
1612          l_isProduction := FALSE;
1613       ELSE
1614          -- This case should not occur because PRODUCTION_FLAG is a
1615          -- required attribute.
1616          FEM_UTILS.set_master_err_state( z_master_err_state,
1617                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
1618                                              G_APP_NAME,
1619                                              G_ERRMSG_NO_ODSPRODFLAG,
1620                                              G_ERRMAC_VALUE,
1621                                              x_Production_Flag             );
1622          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
1623                                 p_module=> l_module_name,
1624                                 p_msg_text=> 'PRODUCTION_FLAG attribute is null');
1625          z_dataset_error := TRUE;
1626 
1627       END IF;
1628 
1629 
1630       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1631                                    p_module=> l_module_name,
1632                                    p_msg_text=> 'EXIT');
1633 
1634       RETURN l_isProduction;
1635 
1636       EXCEPTION
1637          WHEN OTHERS THEN
1638             FEM_UTILS.set_master_err_state( z_master_err_state,
1639                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1640                                                 G_APP_NAME,
1641                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
1642                                                 G_ERRMAC_ROUTINE_NAME,
1643                                                 l_module_name,
1644                                                 NULL,
1645                                                 G_ERRMAC_SQL_ERROR,
1646                                                 SQLERRM);
1647             RAISE;
1648 
1649    End IsProductionODS;
1650 
1651 
1652 
1653    Procedure Validate_Dependent_Objects_Pvt(p_Top_Object_ID IN DEF_OBJECT_ID%TYPE
1654                        ,p_Top_Obj_Def_Id IN DEF_OBJECT_DEFINITION_ID%TYPE
1655                        ,p_Parent_Obj_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
1656                        ,p_Rule_Effective_Date IN DATE
1657                        ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab
1658                        ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER
1659                        ,p_Valid_Dep_Obj_Status IN OUT NOCOPY VARCHAR2) IS
1660 
1661       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Validate_Dependent_Objects_Pvt';
1662       cursor getDepObjects(p_Parent_Obj_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE) IS
1663       select
1664              a.required_object_id
1665             ,o.object_name
1666             ,f.folder_name
1667             ,o.object_type_code
1668             ,t.OBJECT_TYPE_NAME
1669          from
1670              fem_object_dependencies a
1671             ,fem_object_catalog_vl o
1672             ,fem_folders_vl f
1673             ,fem_object_types t
1674          where       a.object_definition_id = p_Parent_Obj_Def_Id
1675                and   a.required_object_id = o.object_id
1676                and   o.folder_id = f.folder_id
1677                and   t.object_type_code = o.object_type_code;
1678 
1679       l_Dependent_Obj_ID           DEF_OBJECT_ID%TYPE;
1680       l_Dependent_Obj_Display_Name DEF_OBJECT_DISPLAY_NAME%TYPE;
1681       l_Dependent_Obj_Folder_Name  DEF_FOLDER_NAME%TYPE;
1682       l_Dependent_Obj_Type_Code    DEF_OBJECT_TYPE_CODE%TYPE;
1683 
1684 
1685       l_Dependent_Obj_Def_ID DEF_OBJECT_DEFINITION_ID%TYPE := 0;
1686       l_Approval_Status_Code DEF_APPROVAL_STATUS_CODE%TYPE := 'XX';
1687 
1688       l_Dependent_Object_Count NUMBER;
1689 
1690       l_object_type_name fem_object_types_tl.OBJECT_TYPE_NAME%TYPE;
1691 
1692    Begin
1693       -- *******************************************************************************************
1694       -- name        :  Validate_Dependent_Objects_Pvt
1695       -- Function    :  Compile a list of all dependent objects that do NOT have valid object_definition_ids
1696       --                for the current p_Rule_Effective_Date into the p_Dependent_Objects_Tab table
1697       --
1698       -- Parameters
1699       -- IN
1700       --                p_Top_Object_ID
1701       --                   -
1702       --                p_Top_Obj_Def_Id
1703       --                   -
1704       --                p_Parent_Obj_Def_ID
1705       --                   -
1706       --                p_Rule_Effective_Date
1707       --                   -  Effective date for this run.
1708       --
1709       -- IN OUT
1710       --                p_Dependent_Objects_Tab
1711       --                   -  invalid dependents..
1712       --                p_Dependent_Objects_Count
1713       --                   -  count of invalid dependents..
1714       --                p_Valid_Dep_Obj_Status
1715       --                   -
1716       --
1717       --
1718       -- HISTORY
1719       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1720       --
1721       -- *******************************************************************************************
1722       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1723                                    p_module=> l_module_name,
1724                                    p_msg_text=> 'ENTRY');
1725 
1726       Begin
1727          select count(required_object_id)
1728             into
1729                l_Dependent_Object_Count
1730             from fem_object_Dependencies
1731             where object_definition_id = p_Parent_Obj_Def_Id;
1732 
1733          If (l_Dependent_Object_Count = 0) then
1734             If (p_Valid_Dep_Obj_Status = 'NA') then
1735                p_Valid_Dep_Obj_Status := G_RSM_NO_DEP_OBJECTS;
1736             End If;
1737             -- RETURN;
1738          End If;
1739       End;
1740 
1741       If (l_Dependent_Object_Count > 0) then
1742          OPEN getDepObjects(p_Parent_Obj_Def_ID);
1743          LOOP
1744             Fetch getDepObjects
1745                into
1746                   l_Dependent_Obj_ID
1747                   ,l_Dependent_Obj_Display_Name
1748                   ,l_Dependent_Obj_Folder_Name
1749                   ,l_Dependent_Obj_Type_Code
1750                   ,l_object_type_name;
1751             EXIT WHEN getDepObjects%NOTFOUND;
1752 
1753             Begin
1754                Get_ValidDefinition_Priv(l_Dependent_Obj_ID
1755                                         ,p_Rule_Effective_Date
1756                                         ,l_Dependent_Obj_Def_ID
1757                                         ,l_Approval_Status_Code);
1758             End;
1759 
1760             If (l_Dependent_Obj_Def_ID = -1) then
1761                -- we DIDN'T find a def ID for this dependent object..
1762                -- todo:: fix to new standards
1763                z_Err_Code := 6;
1764                --FEM_UTILS.set_master_err_state( z_master_err_state,
1765                --                                    FEM_UTILS.G_RSM_NONFATAL_ERR,
1766                --                                    G_APP_NAME,
1767                --                                    G_ERRMSG_NO_VALID_DEFINITION,
1768                --                                    G_ERRMAC_RULE_NAME,
1769                --                                    l_Dependent_Obj_Display_Name);
1770                FEM_UTILS.set_master_err_state( z_master_err_state,
1771                                                    FEM_UTILS.G_RSM_NONFATAL_ERR,
1772                                                    G_APP_NAME,
1773                                                    G_FEMRSM_NOVALID_DEP_DEF,
1774                                                    'RULE_NAME',
1775                                                    l_Dependent_Obj_Display_Name,
1776                                                    NULL,
1777                                                    'OBJECT_TYPE',
1778                                                    l_object_type_name,
1779                                                    NULL,
1780                                                    'EFFECTIVE_DATE',
1781                                                    to_char(p_Rule_Effective_Date));
1782 
1783                p_Valid_Dep_Obj_Status := G_RSM_DEP_OBJECTS_INVALID;
1784 
1785                -- show it in the dependent objects table...
1786 
1787                -- this next line could very easily become invalid if the dependency graph goes deeper than 1
1788                -- rjk
1789                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Parent_Object_ID              := p_Top_Object_ID;
1790                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Dependent_Object_ID           := l_Dependent_Obj_ID;
1791                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Dependent_Object_Display_Name := l_Dependent_Obj_Display_Name;
1792                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Dependent_Object_Folder_Name  := l_Dependent_Obj_Folder_Name;
1793                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Dependent_Object_Type_Code    := l_Dependent_Obj_Type_Code;
1794                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Status                        := 'I';
1795                p_Dependent_Objects_Tab(p_Dependent_Objects_Count).Message_If_Invalid            := z_Err_Msg ;
1796 
1797 
1798                p_Dependent_Objects_Count := p_Dependent_Objects_Count + 1;
1799 
1800             Else
1801                If (p_Valid_Dep_Obj_Status = 'NA') then
1802                   p_Valid_Dep_Obj_Status := G_RSM_MEMBER_VALID;
1803                End If;
1804 
1805                -- recurse..
1806                Validate_Dependent_Objects_Pvt(  p_Top_Object_ID
1807                                                 ,p_Top_Obj_Def_Id
1808                                                 ,l_Dependent_Obj_Def_ID
1809                                                 ,p_Rule_Effective_Date
1810                                                 ,p_Dependent_Objects_Tab
1811                                                 ,p_Dependent_Objects_Count
1812                                                 ,p_Valid_Dep_Obj_Status);
1813             End If;
1814 
1815          END LOOP;
1816          CLOSE getDepObjects;
1817 
1818       End If;
1819 
1820       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1821                                    p_module=> l_module_name,
1822                                    p_msg_text=> 'EXIT');
1823 
1824       EXCEPTION
1825          WHEN OTHERS THEN
1826             -- todo:: useful? z_Err_Code := -1;
1827             FEM_UTILS.set_master_err_state( z_master_err_state,
1828                                                 FEM_UTILS.G_RSM_FATAL_ERR,
1829                                                 G_APP_NAME,
1830                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
1831                                                 G_ERRMAC_ROUTINE_NAME,
1832                                                 l_module_name,
1833                                                 NULL,
1834                                                 G_ERRMAC_SQL_ERROR,
1835                                                 SQLERRM);
1836             RAISE;
1837 
1838    End Validate_Dependent_Objects_Pvt;
1839 
1840 
1841 
1842    Procedure Validate_Rule_Private(p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
1843                        ,p_Rule_Local_VS_Combo_ID IN DEF_LOCAL_VS_COMBO_ID%TYPE
1844                        ,p_Rule_Effective_Date IN DATE
1845                        ,p_IsProductionODS IN BOOLEAN
1846                        ,p_Reference_Period_ID IN NUMBER
1847                        ,p_Ledger_ID IN NUMBER
1848                        ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab
1849                        ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER
1850                        ,p_Rule_Obj_Def_ID OUT NOCOPY DEF_OBJECT_DEFINITION_ID%TYPE
1851                        ,p_Valid_Rule_Def_Status IN OUT NOCOPY VARCHAR2
1852                        ,p_Valid_Lock_Status IN OUT NOCOPY VARCHAR2
1853                        ,p_Valid_Approval_Status IN OUT NOCOPY VARCHAR2
1854                        ,p_Valid_Dep_Obj_Status IN OUT NOCOPY VARCHAR2
1855                        ,p_Valid_Local_VS_Status IN OUT NOCOPY VARCHAR2) IS
1856 
1857       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Validate_Rule_Private';
1858       l_Rule_Obj_Def_ID           DEF_OBJECT_DEFINITION_ID%TYPE := 0;
1859       l_Rule_Approval_Status_Code DEF_APPROVAL_STATUS_CODE%TYPE := 'XX';
1860 
1861       l_Is_Rule_Locked BOOLEAN;
1862 
1863    Begin
1864       -- *******************************************************************************************
1865       -- name        :  Validate_Rule_Private
1866       -- Function    :
1867       --
1868       -- Parameters
1869       -- IN
1870       --                p_Rule_Object_ID
1871       --                   -
1872       --                p_Rule_Local_VS_Combo_ID
1873       --                   -
1874       --                p_Rule_Effective_Date
1875       --                   -
1876       --                p_Is_Output_DS_Production
1877       --                   -
1878       --                p_Reference_Period_ID
1879       --                   -
1880       --                p_Ledger_ID
1881       --                   -
1882       --
1883       -- OUT
1884       --                p_Rule_Obj_Def_ID
1885       --                   -
1886       -- IN OUT
1887       --                p_Dependent_Objects_Tab
1888       --                   -
1889       --                p_Dependent_Objects_Count
1890       --                   -
1891       --                p_Valid_Rule_Def_Status
1892       --                   -
1893       --                p_Valid_Lock_Status
1894       --                   -
1895       --                p_Valid_Approval_Status
1896       --                   -
1897       --                p_Valid_Dep_Obj_Status
1898       --                   -
1899       --                p_Valid_Local_VS_Status
1900       --                   -
1901       --
1902       --
1903       -- HISTORY
1904       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
1905       --
1906       -- *******************************************************************************************
1907       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
1908                                    p_module=> l_module_name,
1909                                    p_msg_text=> 'ENTRY');
1910 
1911       z_Err_Code := 0;
1912       z_Err_Msg  := NULL;
1913 
1914       p_Valid_Rule_Def_Status := 'NA';
1915       p_Valid_Local_VS_Status := 'NA';
1916       p_Valid_Lock_Status := 'NA';
1917       p_Valid_Approval_Status := 'NA';
1918       p_Valid_Dep_Obj_Status := 'NA';
1919 
1920       /***** Check for Valid Definition of Rule for given Effective Date *****/
1921 
1922       Begin
1923          -- will return -1 if no object_definition_id for this object_id.
1924          Get_ValidDefinition_Priv(p_Rule_Object_ID
1925                                  ,p_Rule_Effective_Date
1926                                  ,l_Rule_Obj_Def_ID
1927                                  ,l_Rule_Approval_Status_Code);
1928 
1929          p_Rule_Obj_Def_ID := l_Rule_Obj_Def_ID;
1930 
1931       End;
1932 
1933       If (p_Rule_Obj_Def_ID = -1) then
1934          -- no valid definition ID!
1935          p_Valid_Rule_Def_Status := G_RSM_NO_VALID_DEFN;
1936          -- todo:: fix to new standards ... this one may be ok
1937          z_Err_Code := 1;
1938          FEM_UTILS.set_master_err_state( z_master_err_state,
1939                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
1940                                              G_APP_NAME,
1941                                              G_ERRMSG_NO_VALID_DEFINITION,
1942                                              G_ERRMAC_RULE_NAME,
1943                                              GetObjectDisplayName(p_Rule_Object_ID)
1944                                              );
1945          RETURN;
1946       ELSE
1947          -- we are cool up to here.. continue..
1948          p_Valid_Rule_Def_Status := G_RSM_VALID_DEFN_EXISTS;
1949       End If;
1950 
1951 
1952       /****** Check for Process Locks on Object *************************/
1953 
1954       /*-----Waiting for code to be finalized---------
1955 
1956        FEM_PL_PKG.obj_execution_lock_exists
1957                   (p_request_id => z_conc_request_id
1958                   ,p_object_id => p_Rule_Object_ID
1959                   ,p_lock_exists => l_Is_Rule_Locked);
1960        If (l_Is_Rule_Locked) then
1961           p_Valid_Lock_Status := G_RSM_RULE_LOCKED;
1962           -- todo:: fix to new standards..
1963           z_Err_Code := 7;
1964           set_master_err_state(FEM_UTILS.G_RSM_NONFATAL_ERR,
1965                                G_APP_NAME,);
1966        Else
1967           p_Valid_Lock_Status := G_RSM_RULE_NOT_LOCKED;
1968        End If;
1969       --------------------------------------------------*/
1970 
1971       /******************************************************************/
1972 
1973       /*******Check the status of Local VS Combo ID on Rule *************/
1974 
1975       -- our general session LOCAL_VS must match the rule's LOCAL_VS, or we
1976       -- have SERIOUS problems (non-existant dimension values)
1977       If (p_Rule_Local_VS_Combo_ID <> z_local_vs_for_session) then
1978          p_Valid_Local_VS_Status := G_RSM_INVALID_STATUS;
1979          -- todo:: fix to new standards
1980          z_Err_Code := 8;
1981          FEM_UTILS.set_master_err_state( z_master_err_state,
1982                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
1983                                              G_APP_NAME,
1984                                              G_ERRMSG_NO_VALID_VALSETS,
1985                                              G_ERRMAC_RULE_NAME,
1986                                              GetObjectDisplayName(p_Rule_Object_ID)
1987                                              );
1988       Else
1989          p_Valid_Local_VS_Status := G_RSM_MEMBER_VALID;
1990       End If;
1991 
1992 
1993       /****** Check for Approval Status of Rule Definition **************/
1994 
1995       -- if the output data set is a production data set, then
1996       -- EVERY rule that writes to it must also be approved, otherwise
1997       -- we have a FATAL on that rule and should NOT run it.
1998       If (p_IsProductionODS) then
1999 
2000          If ((l_Rule_Approval_Status_Code <> 'APPROVED')AND(l_Rule_Approval_Status_Code <> 'XX'))  then
2001             p_Valid_Approval_Status := G_RSM_RULE_NOT_APPROVED;
2002             -- todo:: fix to new standards
2003             z_Err_Code := 5;
2004             FEM_UTILS.set_master_err_state( z_master_err_state,
2005                                                 FEM_UTILS.G_RSM_NONFATAL_ERR,
2006                                                 G_APP_NAME,
2007                                                 G_ERRMSG_DEFN_NOT_APPROVED,
2008                                                 G_ERRMAC_RULE_NAME,
2009                                                 GetObjectDisplayName(p_Rule_Object_ID)
2010                                                 );
2011          Elsif (l_Rule_Approval_Status_Code = 'APPROVED') then
2012             p_Valid_Approval_Status := G_RSM_RULE_APPROVED;
2013          End If;
2014 
2015       End If ;
2016 
2017 
2018       -- check all dependents for the rule object_id in question and
2019       -- verify that all dependents have a valid object_definition for
2020       -- this Rule_Effective_Date.
2021       Validate_Dependent_Objects_Pvt(p_Rule_Object_ID
2022                                     ,l_Rule_Obj_Def_Id
2023                                     ,l_Rule_Obj_Def_Id
2024                                     ,p_Rule_Effective_Date
2025                                     ,p_Dependent_Objects_Tab
2026                                     ,p_Dependent_Objects_Count
2027                                     ,p_Valid_Dep_Obj_Status);
2028 
2029       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2030                                    p_module=> l_module_name,
2031                                    p_msg_text=> 'EXIT');
2032       EXCEPTION
2033          WHEN OTHERS THEN
2034             FEM_UTILS.set_master_err_state( z_master_err_state,
2035                                                 FEM_UTILS.G_RSM_FATAL_ERR,
2036                                                 G_APP_NAME,
2037                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
2038                                                 G_ERRMAC_ROUTINE_NAME,
2039                                                 l_module_name,
2040                                                 NULL,
2041                                                 G_ERRMAC_SQL_ERROR,
2042                                                 SQLERRM);
2043             RAISE;
2044 
2045    End Validate_Rule_Private;
2046 
2047 
2048 
2049    PROCEDURE Process_RuleSet(  p_Orig_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE
2050                               ,p_Curr_RuleSet_Object_ID  IN DEF_OBJECT_ID%TYPE
2051                               ,x_Rule_Set_Instance_Tab IN OUT NOCOPY Rule_Set_Instance_Tab
2052                               ,x_Rule_Set_Count IN OUT NOCOPY BINARY_INTEGER
2053                               ,x_Rule_Set_Level IN OUT NOCOPY NUMBER
2054                               ,x_Members_Processed_Tab IN OUT NOCOPY Members_Processed_Instance_Tab
2055                               ,x_Members_Processed_Count IN OUT NOCOPY BINARY_INTEGER
2056                               ,p_Rule_Effective_Date IN DATE
2057                               ,p_IsProductionODS IN BOOLEAN
2058                               ,p_Engine_Execution_Sequence IN OUT NOCOPY NUMBER
2059                               ,p_Execution_Mode IN VARCHAR2
2060                               ,p_Valid_Members_Tab IN OUT NOCOPY Valid_Invalid_Members_Inst_Tab
2061                               ,p_Valid_Members_Count IN OUT NOCOPY BINARY_INTEGER
2062                               ,p_Invalid_Member_Flags_Tab IN OUT NOCOPY Members_Validation_Status_Tab
2063                               ,p_Invalid_Member_Flags_Count IN OUT NOCOPY BINARY_INTEGER
2064                               ,p_Dependent_Objects_Tab IN OUT NOCOPY Dependent_Objects_Tab
2065                               ,p_Dependent_Objects_Count IN OUT NOCOPY BINARY_INTEGER
2066                               ,p_Output_Dataset_Code IN DEF_DATASET_CODE%TYPE
2067                               ,p_Output_Period_ID IN NUMBER
2068                               ,p_Ledger_ID IN NUMBER
2069                               ,l_Maximum_Sequence IN OUT NOCOPY NUMBER
2070                               ,p_curr_RS IN Rule_Set_Instance_Rec
2071                                ) IS
2072 
2073       -- as it suggests.. get all the members for a given ruleset.
2074       CURSOR Get_Rule_Set_Members(p_Curr_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE) IS
2075          select
2076                rs.RULE_SET_OBJECT_TYPE_CODE        as Current_RuleSet_Obj_Type
2077                ,rsm.CHILD_EXECUTION_SEQUENCE       as Child_Execution_Sequence
2078                ,rsm.CHILD_OBJ_ID                   as Child_Object_ID
2079                ,cm_o.OBJECT_TYPE_CODE              as Child_Object_Type
2080                ,cm_o.OBJECT_NAME                   as Child_Object_Display_Name
2081                ,cm_f.FOLDER_NAME                   as Child_Folder_Name
2082                ,rsm.EXECUTE_CHILD_FLAG             as Execute_Child_Flag
2083                ,nvl(cm_o.LOCAL_VS_COMBO_ID,-1)     as Child_Local_VS_Combo_ID
2084             from
2085                 FEM_RULE_SET_MEMBERS rsm
2086                ,FEM_RULE_SETS rs
2087                ,FEM_OBJECT_CATALOG_VL cm_o
2088                ,FEM_OBJECT_DEFINITION_B rsm_d
2089                ,FEM_FOLDERS_VL cm_f
2090             where
2091                      rsm.RULE_SET_OBJ_DEF_ID = rsm_d.OBJECT_DEFINITION_ID
2092                and   rsm_d.OBJECT_ID = p_Curr_RuleSet_Object_ID
2093                and   rsm.RULE_SET_OBJ_DEF_ID = rs.RULE_SET_OBJ_DEF_ID
2094                --and rsm.CHILD_ENABLED_FLAG = 'Y'
2095                and   rsm.CHILD_OBJ_ID = cm_o.OBJECT_ID
2096                and   cm_f.FOLDER_ID = cm_o.FOLDER_ID
2097             order by rsm.CHILD_EXECUTION_SEQUENCE;
2098 
2099 
2100       /*--Get_Rule_Set_Members Cursor Fetch variables--*/
2101       l_Current_RuleSet_Obj_Typ_Code   DEF_RULESET_OBJECT_TYPE_CODE%TYPE;
2102       l_Child_Sequence_From_DB         DEF_CHILD_EXEC_SEQUENCE%TYPE;
2103       l_Child_Object_ID                DEF_OBJECT_ID%TYPE;
2104       l_Child_Object_Type_Code         DEF_OBJECT_TYPE_CODE%TYPE;
2105       l_Child_Object_Display_Name      DEF_OBJECT_DISPLAY_NAME%TYPE;
2106       l_Child_Folder_Name              DEF_FOLDER_NAME%TYPE;
2107       l_Execute_Child_Flag             DEF_EXECUTE_CHILD_FLAG%TYPE;
2108       l_Child_Local_VS_Combo_ID        DEF_LOCAL_VS_COMBO_ID%TYPE;
2109 
2110       /* Rule and Rule Set Flags */
2111       l_Valid_Member_Enabled_Status VARCHAR2(30); -- := 'NA';
2112       l_Other_Error_Status VARCHAR2(30); -- := 'NA';
2113 
2114       /* Rule Validation Flags */
2115       l_Valid_Rule_Def_Status VARCHAR2(30); -- := 'NA';
2116       l_Valid_Lock_Status VARCHAR2(30); -- := 'NA';
2117       l_Valid_Approval_Status VARCHAR2(30); -- := 'NA';
2118       l_Valid_Dep_Obj_Status VARCHAR2(30) ; --:= 'NA';
2119       l_Valid_Local_VS_Status VARCHAR2(30);
2120 
2121 
2122       l_Child_Object_Definition_ID    DEF_OBJECT_DEFINITION_ID%TYPE := 0;
2123 
2124       l_Current_Rule_Set_Position BINARY_INTEGER := 0;
2125 
2126       l_Current_Sequence NUMBER := 0;
2127       l_Previous_Sequence NUMBER := 0;
2128 
2129       l_Current_RuleType VARCHAR2(30) := 'XX';
2130       l_Previous_RuleType VARCHAR2(30) := 'XX';
2131 
2132       l_Starting_Seq_For_RS_Members NUMBER := 0; /* This is used to ensure that two Rule Set members
2133                                                                              having the same sequence, have their children starting
2134                                                    at the same sequence */
2135 
2136       l_Current_RuleSet_Name  FEM_OBJECT_CATALOG_TL.object_name%TYPE := 'xxx';
2137       l_module_name           VARCHAR2(70) := G_MODULE_NAME || 'Process_RuleSet';
2138 
2139       l_curr_RS               Rule_Set_Instance_Rec;
2140 
2141    Begin
2142       -- *******************************************************************************************
2143       -- name        :  Process_RuleSet
2144       -- Function    :  Master processing loop for RSM.
2145       --
2146       -- Parameters
2147       --
2148       -- IN
2149       --                p_Orig_RuleSet_Object_ID
2150       --                   -
2151       --                p_Curr_RuleSet_Object_ID
2152       --                   -
2153       --                p_Rule_Effective_Date
2154       --                   -
2155       --                p_Is_Output_DS_Production
2156       --                   -
2157       --                p_Execution_Mode
2158       --                      execution mode definitions from 'FEM_LOOKUPS' where lookup_type = 'FEM_RS_VALIDATE_TYPE_DSC'
2159       --                      CODE  UI parameter name       UI Parameter Description
2160       --                      ====  =====================   ========================================================================================
2161       --                      A     All Rules               Will Report on Valid and Invalid Rules in a Rule Set
2162       --                      E     Engine Execution Mode   Will by default report on Valid and Invalid Rules. Same as 'A' but also launches Engine
2163       --                      I     Invalid Rules           Will Report on Invalid Rules in a Rule Set
2164       --                      V     Valid Rules             Will Report on Valid Rules in a Rule Set
2165       --
2166       --                p_Output_Dataset_Code
2167       --                   -
2168       --                p_Output_Period_ID
2169       --                   -
2170       --                p_Ledger_ID
2171       --                   -
2172       --
2173       -- OUT
2174       --
2175       -- IN OUT
2176       --                l_Maximum_Sequence
2177       --                   -
2178       --                x_Rule_Set_Instance_Tab
2179       --                   -
2180       --                x_Rule_Set_Count
2181       --                   -
2182       --                x_Rule_Set_Level
2183       --                   -
2184       --                x_Members_Processed_Tab
2185       --                   -
2186       --                x_Members_Processed_Count
2187       --                   -
2188       --                p_Engine_Execution_Sequence
2189       --                   -
2190       --                p_Valid_Members_Tab
2191       --                   -
2192       --                p_Valid_Members_Count
2193       --                   -
2194       --                p_Invalid_Member_Flags_Tab
2195       --                   -
2196       --                p_Invalid_Member_Flags_Count
2197       --                   -
2198       --                p_Dependent_Objects_Tab
2199       --                   -
2200       --                p_Dependent_Objects_Count
2201       --                   -
2202       --
2203       --
2204       -- HISTORY
2205       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
2206       --
2207       -- *******************************************************************************************
2208 
2209       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2210                                    p_module=> l_module_name,
2211                                    p_msg_text=> 'ENTRY');
2212 
2213       l_Current_Rule_Set_Position := x_Rule_Set_Count;
2214 
2215       -- verify that the ruleSet Members cursor is open and read for business.
2216       If NOT Get_Rule_Set_Members%ISOPEN then
2217          OPEN Get_Rule_Set_Members(p_Curr_RuleSet_Object_ID);
2218       End If;
2219 
2220 
2221       LOOP
2222 
2223          -- ************************************************************************************
2224          -- ** loop on rule set entries..
2225          -- ** this is the master processing loop for validating/preparing rules/contained rulesets
2226          -- ** shown in the master ruleset.
2227          -- ************************************************************************************
2228          <<PROCESS_NEXT_RULESET_MEMBER>>
2229 
2230          l_Valid_Member_Enabled_Status  := 'NA';
2231          l_Other_Error_Status     := 'NA';
2232 
2233          l_Valid_Rule_Def_Status  := 'NA';
2234          l_Valid_Lock_Status      := 'NA';
2235          l_Valid_Approval_Status  := 'NA';
2236          l_Valid_Dep_Obj_Status   := 'NA';
2237          l_Valid_Local_VS_Status  := 'NA';
2238 
2239          FETCH Get_Rule_Set_Members
2240          INTO
2241              l_Current_RuleSet_Obj_Typ_Code
2242             ,l_Child_Sequence_From_DB
2243             ,l_Child_Object_ID
2244             ,l_Child_Object_Type_Code
2245             ,l_Child_Object_Display_Name
2246             ,l_Child_Folder_Name
2247             ,l_Execute_Child_Flag
2248             ,l_Child_Local_VS_Combo_ID;
2249 
2250          EXIT WHEN Get_Rule_Set_Members%NOTFOUND;
2251 
2252 
2253          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2254                                       p_module=> l_module_name,
2255                                       p_msg_text=> 'l_Current_RuleSet_Obj_Typ_Code->' || l_Current_RuleSet_Obj_Typ_Code);
2256          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2257                                       p_module=> l_module_name,
2258                                       p_msg_text=> 'l_Child_Sequence_From_DB->' || l_Child_Sequence_From_DB);
2259          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2260                                       p_module=> l_module_name,
2261                                       p_msg_text=> 'l_Child_Object_ID->' || l_Child_Object_ID);
2262          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2263                                       p_module=> l_module_name,
2264                                       p_msg_text=> 'l_Child_Object_Type_Code->' || l_Child_Object_Type_Code);
2265          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2266                                       p_module=> l_module_name,
2267                                       p_msg_text=> 'l_Child_Object_Display_Name->' || l_Child_Object_Display_Name);
2268          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2269                                       p_module=> l_module_name,
2270                                       p_msg_text=> 'l_Child_Folder_Name->' || l_Child_Folder_Name);
2271          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2272                                       p_module=> l_module_name,
2273                                       p_msg_text=> 'l_Execute_Child_Flag->' || l_Execute_Child_Flag);
2274          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
2275                                       p_module=> l_module_name,
2276                                       p_msg_text=> 'l_Child_Local_VS_Combo_ID->' || l_Child_Local_VS_Combo_ID);
2277 
2278          -- simple do NOT know why this wasn't in the original cursor.. rjk
2279          l_Current_RuleSet_Name := GetObjectDisplayName(p_Curr_RuleSet_Object_ID);
2280 
2281          -- ************************************************************************************
2282          -- ** makes sure that this rule/ruleset entry is actually enabled in the current ruleset.
2283          -- ************************************************************************************
2284          If l_Execute_Child_Flag = 'N' then
2285 
2286             l_Valid_Member_Enabled_Status := G_RSM_MEMBER_DISABLED;
2287 
2288             --***********************************************************************
2289             -- p_Execution_Mode valid values......................
2290             -- E=Engine Execution Mode (used by engines only)
2291             -- A=All Rules     (report on all rules whether they are valid or not)
2292             -- I=Invalid Rules (report on invalid rules only)
2293             -- V=Valid Rules   (report on valid rules only)
2294             --***********************************************************************
2295             If (     p_Execution_Mode = 'I'
2296                   OR p_Execution_Mode = 'A'
2297                   OR p_Execution_Mode = 'E') then
2298                -- slap this entry into the invalid member table, shown as disabled..
2299                Pop_Invalid_MmbrFlags_Tbl
2300                            ( p_Invalid_Member_Flags_Tab
2301                              ,p_Invalid_Member_Flags_Count
2302                              ,l_Child_Folder_Name
2303                              ,l_Current_RuleSet_Name
2304                              ,l_Child_Object_ID
2305                              ,l_Child_Object_Display_Name
2306                              ,l_Child_Object_Type_Code
2307                              ,l_Valid_Member_Enabled_Status
2308                              ,l_Valid_Rule_Def_Status
2309                              ,l_Valid_Lock_Status
2310                              ,l_Valid_Approval_Status
2311                              ,l_Valid_Dep_Obj_Status
2312                              ,l_Valid_Local_VS_Status
2313                              ,l_Other_Error_Status);
2314 
2315             End If;
2316             -- next member plz, since the current rule is not enabled.
2317             GOTO PROCESS_NEXT_RULESET_MEMBER;
2318          ELSE
2319             -- otherwise show it as 'enabled' and continue to next check.
2320             l_Valid_Member_Enabled_Status := G_RSM_MEMBER_ENABLED;
2321          End If;  -- If l_Execute_Child_Flag
2322 
2323          --**********************************************************************
2324          --*****Rule Set : Check for Member processed before in current run******
2325          --**********************************************************************
2326 
2327          If Mem_Obj_Prev_Processed(p_curr_RS
2328                                   ,l_Child_Object_ID
2329                                   ,l_Child_Folder_Name
2330                                   ,l_Child_Object_Display_Name
2331                                   ,x_Members_Processed_Tab
2332                                   ,x_Members_Processed_Count
2333                                   ,l_Child_Object_Type_Code   ) then
2334             l_Other_Error_Status := G_RSM_MEMBER_PREV_PROCESSED;
2335 
2336             --***********************************************************************
2337             -- p_Execution_Mode valid values......................
2338             -- E=Engine Execution Mode (used by engines only)
2339             -- A=All Rules     (report on all rules whether they are valid or not)
2340             -- I=Invalid Rules (report on invalid rules only)
2341             -- V=Valid Rules   (report on valid rules only)
2342             --***********************************************************************
2343             If (     p_Execution_Mode = 'I'
2344                 OR   p_Execution_Mode = 'A'
2345                 OR   p_Execution_Mode = 'E') then
2346 
2347                -- slap this entry into the invalid member flags table, shown as already processed..
2348                Pop_Invalid_MmbrFlags_Tbl
2349                            (p_Invalid_Member_Flags_Tab
2350                             ,p_Invalid_Member_Flags_Count
2351                             ,l_Child_Folder_Name
2352                             ,l_Current_RuleSet_Name
2353                             ,l_Child_Object_ID
2354                             ,l_Child_Object_Display_Name
2355                             ,l_Child_Object_Type_Code
2356                             ,l_Valid_Member_Enabled_Status
2357                             ,l_Valid_Rule_Def_Status
2358                             ,l_Valid_Lock_Status
2359                             ,l_Valid_Approval_Status
2360                             ,l_Valid_Dep_Obj_Status
2361                             ,l_Valid_Local_VS_Status
2362                             ,l_Other_Error_Status);
2363 
2364             End If;
2365             GOTO PROCESS_NEXT_RULESET_MEMBER;
2366          Else
2367             l_Other_Error_Status := 'NA';
2368          End If; /* If Mem_Obj_Prev_Processed */
2369 
2370          --**********************************************************************
2371          --** if we are currently processing a contained ruleset, then check:
2372          --**     1) has it been included before?
2373          --**     2) Is it the same as the master ruleset passed to us?
2374          --**     3) are we above the maximum nesting allowed?
2375          --**
2376          --** if any of the above conditions are true, show an error!
2377          --**********************************************************************
2378          If (l_Child_Object_Type_Code = 'RULE_SET') then
2379 
2380             If RS_Cyclical_And_Depth_Check(l_Child_Object_ID
2381                                           ,l_Child_Object_Display_Name
2382                                           ,x_Rule_Set_Level
2383                                           ,x_Rule_Set_Count
2384                                           ,x_Rule_Set_Instance_Tab
2385                                           ,l_Other_Error_Status) then
2386 
2387                -- l_Other_Error_Status := 'Cyclical or Depth Error';
2388 
2389                --***********************************************************************
2390                -- p_Execution_Mode valid values......................
2391                -- E=Engine Execution Mode (used by engines only)
2392                -- A=All Rules     (report on all rules whether they are valid or not)
2393                -- I=Invalid Rules (report on invalid rules only)
2394                -- V=Valid Rules   (report on valid rules only)
2395                --***********************************************************************
2396                If (     p_Execution_Mode = 'I'
2397                    OR   p_Execution_Mode = 'A'
2398                    OR   p_Execution_Mode = 'E') then
2399 
2400                   -- slap this entry into the invalid member flags table.. we either exceeded
2401                   -- nesting or this ruleset has been seen before.
2402                   Pop_Invalid_MmbrFlags_Tbl
2403                               ( p_Invalid_Member_Flags_Tab
2404                                 ,p_Invalid_Member_Flags_Count
2405                                 ,l_Child_Folder_Name
2406                                 ,l_Current_RuleSet_Name
2407                                 ,l_Child_Object_ID
2408                                 ,l_Child_Object_Display_Name
2409                                 ,l_Child_Object_Type_Code
2410                                 ,l_Valid_Member_Enabled_Status
2411                                 ,l_Valid_Rule_Def_Status
2412                                 ,l_Valid_Lock_Status
2413                                 ,l_Valid_Approval_Status
2414                                 ,l_Valid_Dep_Obj_Status
2415                                 ,l_Valid_Local_VS_Status
2416                                 ,l_Other_Error_Status);
2417 
2418 
2419                End If;
2420                --RETURN ;
2421                GOTO PROCESS_NEXT_RULESET_MEMBER;
2422             ELSE
2423                -- we are ok, continue on..
2424                l_Other_Error_Status := 'NA';
2425             End If;
2426          End If; /* If (l_Child_Object_Type_Code = 'RULE_SET') */
2427 
2428 
2429 
2430          --**********************************************************************
2431          --** this is a rule, continue with validations..
2432          --**********************************************************************
2433 
2434          If (l_Child_Object_Type_Code <> 'RULE_SET') then
2435             -- we know this rule is 'enabled', and not been processed yet.
2436             -- so validate it..
2437             Validate_Rule_Private(l_Child_Object_ID
2438                                  ,l_Child_Local_VS_Combo_ID
2439                                  ,p_Rule_Effective_Date
2440                                  ,p_IsProductionODS
2441                                  ,p_Output_Period_ID
2442                                  ,p_Ledger_ID
2443                                  ,p_Dependent_Objects_Tab
2444                                  ,p_Dependent_Objects_Count
2445                                  ,l_Child_Object_Definition_ID
2446                                  ,l_Valid_Rule_Def_Status
2447                                  ,l_Valid_Lock_Status
2448                                  ,l_Valid_Approval_Status
2449                                  ,l_Valid_Dep_Obj_Status
2450                                  ,l_Valid_Local_VS_Status);
2451 
2452             -- z_Err_Code will be non-0 if something bad happened
2453             -- in Validate_Rule_Private
2454 
2455             -- todo:: rationalize...
2456             If (z_Err_Code = 0) then
2457                --***********************************************************************
2458                -- p_Execution_Mode valid values......................
2459                -- E=Engine Execution Mode (used by engines only)
2460                -- A=All Rules     (report on all rules whether they are valid or not)
2461                -- I=Invalid Rules (report on invalid rules only)
2462                -- V=Valid Rules   (report on valid rules only)
2463                --***********************************************************************
2464                If (     p_Execution_Mode = 'V'
2465                    OR   p_Execution_Mode = 'A'
2466                    OR   p_Execution_Mode = 'E') then
2467 
2468                   -- it is valid and we should report on it ...
2469                   Populate_Valid_Member_Tab(p_Valid_Members_Tab
2470                                             ,p_Valid_Members_Count
2471                                             ,l_Child_Folder_Name
2472                                             ,l_Current_RuleSet_Name
2473                                             ,l_Child_Object_ID
2474                                             ,l_Child_Object_Display_Name
2475                                             ,l_Child_Object_Type_Code
2476                                             ,G_RSM_MEMBER_VALID);
2477                End If;
2478             Elsif (z_Err_Code <> 0) then
2479                --***********************************************************************
2480                -- p_Execution_Mode valid values......................
2481                -- E=Engine Execution Mode (used by engines only)
2482                -- A=All Rules     (report on all rules whether they are valid or not)
2483                -- I=Invalid Rules (report on invalid rules only)
2484                -- V=Valid Rules   (report on valid rules only)
2485                --***********************************************************************
2486                If (     p_Execution_Mode = 'I'
2487                     OR  p_Execution_Mode = 'A'
2488                     OR  p_Execution_Mode = 'E') then
2489                   -- slap this entry into the invalid member flags table.. we just had a
2490                   -- validation error.
2491                   Pop_Invalid_MmbrFlags_Tbl
2492                                  ( p_Invalid_Member_Flags_Tab
2493                                    ,p_Invalid_Member_Flags_Count
2494                                    ,l_Child_Folder_Name
2495                                    ,l_Current_RuleSet_Name
2496                                    ,l_Child_Object_ID
2497                                    ,l_Child_Object_Display_Name
2498                                    ,l_Child_Object_Type_Code
2499                                    ,l_Valid_Member_Enabled_Status
2500                                    ,l_Valid_Rule_Def_Status
2501                                    ,l_Valid_Lock_Status
2502                                    ,l_Valid_Approval_Status
2503                                    ,l_Valid_Dep_Obj_Status
2504                                    ,l_Valid_Local_VS_Status
2505                                    ,l_Other_Error_Status);
2506 
2507                   If z_continue_on_error then
2508                      GOTO PROCESS_NEXT_RULESET_MEMBER;
2509                   Else
2510                      RETURN;
2511                   End If;
2512                End If;
2513             End If; /* pseudo case: (z_Err_Code = 0), (z_Err_Code <> 0) */
2514 
2515          End If; /* If (l_Child_Object_Type_Code <> 'RULE_SET') */
2516 
2517 
2518          -- current ruleset member settings.
2519          l_Current_Sequence := l_Child_Sequence_From_DB;
2520          l_Current_RuleType := l_Child_Object_Type_Code;
2521 
2522 
2523          -- ??
2524          If (p_Engine_Execution_Sequence > l_Maximum_Sequence) then
2525             l_Maximum_Sequence := p_Engine_Execution_Sequence;
2526          End If;
2527 
2528 
2529          If (l_Child_Object_Type_Code = 'RULE_SET') then
2530 
2531             If (l_Current_RuleType <> l_Previous_RuleType) then
2532 
2533                -- if the previous rule member WAS NOT a rule set..
2534                l_Starting_Seq_For_RS_Members := p_Engine_Execution_Sequence;
2535 
2536             ElsIf (        (l_Current_RuleType = l_Previous_RuleType)
2537                      and   (l_Current_Sequence = l_Previous_Sequence) ) then
2538                -- if the previous rule member WAS a rule set..
2539 
2540                p_Engine_Execution_Sequence := l_Starting_Seq_For_RS_Members;
2541 
2542             End If;
2543             l_curr_RS.RuleSet_Object_ID   :=l_Child_Object_ID;
2544             l_curr_RS.Owning_RuleSet_Name :=p_curr_RS.RuleSet_Object_Name;
2545             l_curr_RS.RuleSet_Object_Name :=l_Child_Object_Display_Name;
2546 
2547             Process_RuleSet( p_Orig_RuleSet_Object_ID
2548                             ,l_Child_Object_ID
2549                             ,x_Rule_Set_Instance_Tab
2550                             ,x_Rule_Set_Count
2551                             ,x_Rule_Set_Level
2552                             ,x_Members_Processed_Tab
2553                             ,x_Members_Processed_Count
2554                             ,p_Rule_Effective_Date
2555                             ,p_IsProductionODS
2556                             ,p_Engine_Execution_Sequence
2557                             ,p_Execution_Mode
2558                             ,p_Valid_Members_Tab
2559                             ,p_Valid_Members_Count
2560                             ,p_Invalid_Member_Flags_Tab
2561                             ,p_Invalid_Member_Flags_Count
2562                             ,p_Dependent_Objects_Tab
2563                             ,p_Dependent_Objects_Count
2564                             ,p_Output_Dataset_Code
2565                             ,p_Output_Period_ID
2566                             ,p_Ledger_ID
2567                             ,l_Maximum_Sequence
2568                             ,l_curr_RS                   );
2569 
2570             --    fnd_file.put_line(FND_FILE.LOG,'Error Code after internal Process Rule Set call is : '||z_Err_Code);
2571 
2572             -- capture error state and react accordingly
2573             If (z_master_err_state = FEM_UTILS.G_RSM_FATAL_ERR ) THEN
2574                -- this is a backstop err capture routine.. we (hopefully) should never get here..
2575                RAISE FND_API.G_EXC_ERROR;
2576 
2577             Elsif (z_master_err_state = FEM_UTILS.G_RSM_NONFATAL_ERR) then
2578 
2579                If NOT z_continue_on_error then
2580                   -- if the caller wants to stop on error, we stop..
2581                   RETURN;
2582                End If;
2583 
2584             End If;
2585 
2586          End If; /* If (l_Child_Object_Type_Code = 'RULE_SET') */
2587 
2588 
2589          If (l_Child_Object_Type_Code <> 'RULE_SET') then
2590 
2591             If (l_Current_Sequence <> l_Previous_Sequence) then
2592 
2593                If (    (l_Previous_RuleType = 'RULE_SET')
2594                    and (p_Engine_Execution_Sequence < l_Maximum_Sequence)) then
2595 
2596                   p_Engine_Execution_Sequence := l_Maximum_Sequence;
2597 
2598                End If;
2599 
2600                p_Engine_Execution_Sequence := p_Engine_Execution_Sequence + 1;
2601 
2602             Elsif (l_Current_Sequence = l_Previous_Sequence) then
2603 
2604                If (l_Previous_RuleType = 'RULE_SET') then
2605                   p_Engine_Execution_Sequence := p_Engine_Execution_Sequence + 1;
2606                End If;
2607 
2608             End If;
2609 
2610             --***********************************************************************
2611             -- p_Execution_Mode valid values......................
2612             -- E=Engine Execution Mode (used by engines only)
2613             -- A=All Rules     (report on all rules whether they are valid or not)
2614             -- I=Invalid Rules (report on invalid rules only)
2615             -- V=Valid Rules   (report on valid rules only)
2616             --***********************************************************************
2617             If (p_Execution_Mode = 'E') then
2618                Create_RuleSet_Process_Data(p_Orig_RuleSet_Object_ID
2619                                           ,l_Child_Object_ID
2620                                           ,l_Child_Object_Definition_ID
2621                                           ,p_Engine_Execution_Sequence);
2622 
2623             End If;
2624 
2625          End If; /* If (l_Child_Object_Type_Code <> 'RULE_SET') */
2626          --------------------------------------------------------------------
2627 
2628          l_Previous_Sequence := l_Current_Sequence;
2629          l_Previous_RuleType := l_Current_RuleType;
2630 
2631       END LOOP;  /* exit point for loop */
2632 
2633       /* Clearing out RuleSet entry from PLSQL table once the RuleSet is processed */
2634       /* so that a second occurance of the same Rule Set as a child of a different Parent */
2635       /* Rule Set is not misinterpreted as a recursive occurrance */
2636 
2637       x_Rule_Set_Instance_Tab(l_Current_Rule_Set_Position).RuleSet_Object_ID := -1;
2638 
2639       /* Decrementing Rule_Set_Level after Rule_Set is processed so that an occurrance of */
2640       /* another Rule_Set at a higher level is not misinterpreted as a Rule Set in the same tree */
2641 
2642       x_Rule_Set_Level := x_Rule_Set_Level -1;
2643 
2644       CLOSE Get_Rule_Set_Members;
2645 
2646       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2647                                    p_module=> l_module_name,
2648                                    p_msg_text=> 'EXIT');
2649 
2650 
2651       EXCEPTION
2652          WHEN FND_API.G_EXC_ERROR THEN
2653             -- top caller will handle this one..
2654             RAISE;
2655          WHEN OTHERS THEN
2656             -- todo:: useful?? z_Err_Code := -1;
2657             FEM_UTILS.set_master_err_state( z_master_err_state,
2658                                                 FEM_UTILS.G_RSM_FATAL_ERR,
2659                                                 G_APP_NAME,
2660                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
2661                                                 G_ERRMAC_ROUTINE_NAME,
2662                                                 l_module_name,
2663                                                 NULL,
2664                                                 G_ERRMAC_SQL_ERROR,
2665                                                 SQLERRM);
2666             RAISE ;
2667 
2668    End Process_RuleSet;
2669 
2670 
2671 
2672 
2673    Procedure Log_Rule_Status(p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
2674                              ,p_Valid_Rule_Def_Status IN VARCHAR2
2675                              ,p_Valid_Lock_Status IN VARCHAR2
2676                              ,p_Valid_Local_VS_Status IN VARCHAR2
2677                              ,p_Valid_Approval_Status IN VARCHAR2
2678                              ,p_Valid_Dep_Obj_Status IN VARCHAR2
2679                              ,p_Dependent_Objects_Tab IN Dependent_Objects_Tab
2680                              ,p_Dependent_Objects_Count IN BINARY_INTEGER) IS
2681 
2682       l_Rule_Display_Name DEF_OBJECT_DISPLAY_NAME%TYPE;
2683       l_Rule_Folder_Name       DEF_FOLDER_NAME%TYPE;
2684       l_module_name          VARCHAR2(70) := G_MODULE_NAME || 'Log_Rule_Status';
2685 
2686    Begin
2687       -- *******************************************************************************************
2688       -- name        :  Log_Rule_Status
2689       -- Function    :  print report to pertinent log.
2690       --
2691       -- Parameters
2692       -- IN
2693       --
2694       --                p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
2695       --                   -
2696       --                p_Valid_Rule_Def_Status IN VARCHAR2
2697       --                   -
2698       --                p_Valid_Lock_Status IN VARCHAR2
2699       --                   -
2700       --                p_Valid_Local_VS_Status IN VARCHAR2
2701       --                   -
2702       --                p_Valid_Approval_Status IN VARCHAR2
2703       --                   -
2704       --                p_Valid_Dep_Obj_Status IN VARCHAR2
2705       --                   -
2706       --                p_Dependent_Objects_Tab IN Dependent_Objects_Tab
2707       --                   -
2708       --                p_Dependent_Objects_Count IN BINARY_INTEGER
2709       --                   -
2710       -- OUT
2711       --
2712       -- IN OUT
2713       --
2714       --
2715       --
2716       -- HISTORY
2717       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
2718       --
2719       -- *******************************************************************************************
2720       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2721                                    p_module=> l_module_name,
2722                                    p_msg_text=> 'ENTRY');
2723 
2724       GetObjectDisplayNameandFolder(p_Rule_Object_ID
2725                                    ,l_Rule_Display_Name
2726                                    ,l_Rule_Folder_Name);
2727 
2728       fnd_file.put_line(FND_FILE.OUTPUT
2729                          ,RPAD('Rule Name',42,' ')
2730                         ||RPAD('Folder',32,' ')
2731                         ||RPAD('Rule Def',32,' ')
2732                         ||RPAD('Lock Status',13,' ')
2733                         ||RPAD('Local VS Status',17,' ')
2734                         ||RPAD('Approval Status',17,' ')
2735                         ||RPAD('Dependent Status',18,' ')
2736                          );
2737 
2738       fnd_file.put_line(FND_FILE.OUTPUT
2739                          ,RPAD('---------',42,' ')
2740                         ||RPAD('------',32,' ')
2741                         ||RPAD('---------------------',32,' ')
2742                         ||RPAD('-----------',13,' ')
2743                         ||RPAD('---------------',17,' ')
2744                         ||RPAD('---------------',17,' ')
2745                         ||RPAD('----------------',18,' ')
2746                          );
2747 
2748       fnd_file.put_line(FND_FILE.OUTPUT
2749                          ,RPAD(l_Rule_Display_Name,42,' ')
2750                         ||RPAD(l_Rule_Folder_Name,32,' ')
2751                         ||RPAD(p_Valid_Rule_Def_Status,32,' ')
2752                         ||RPAD(p_Valid_Lock_Status,13,' ')
2753                         ||RPAD(p_Valid_Local_VS_Status,17,' ')
2754                         ||RPAD(p_Valid_Approval_Status,17,' ')
2755                         ||RPAD(p_Valid_Dep_Obj_Status,18,' ')
2756                          );
2757 
2758       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2759                                    p_module=> l_module_name,
2760                                    p_msg_text=> 'EXIT');
2761 
2762    End Log_Rule_Status;
2763 
2764 
2765    Procedure Validate_Rule_Public(x_Err_Code OUT NOCOPY NUMBER
2766                                  ,x_Err_Msg  OUT NOCOPY VARCHAR2
2767                                  ,p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
2768                                  ,p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
2769                                  ,p_Rule_Effective_Date IN VARCHAR2
2770                                  ,p_Reference_Period_ID IN NUMBER
2771                                  ,p_Ledger_ID IN NUMBER) IS
2772 
2773       l_module_name           VARCHAR2(70) := G_MODULE_NAME || 'Validate_Rule_Public';
2774       l_Output_Dataset_Code   NUMBER(9):= NULL;
2775       l_Output_Dataset_Name   VARCHAR2(120) := NULL;
2776 --      l_Is_Output_DS_Production VARCHAR2(1) := NULL;
2777       l_isProductionODS       BOOLEAN := FALSE;
2778 
2779       l_Dependent_Objects_Tab    Dependent_Objects_Tab;
2780       l_Dependent_Objects_Count  BINARY_INTEGER := 0;
2781 
2782       /* Rule Validation Flags */
2783       l_Valid_Rule_Def_Status VARCHAR2(30) := ' ';
2784       l_Valid_Lock_Status VARCHAR2(30) := ' ';
2785       l_Valid_Approval_Status VARCHAR2(30) := ' ';
2786       l_Valid_Dep_Obj_Status VARCHAR2(30) := ' ';
2787       l_Valid_Local_VS_Status VARCHAR2(30) := ' ';
2788 
2789       l_Rule_Obj_Def_ID DEF_OBJECT_DEFINITION_ID%TYPE;
2790 
2791       l_Rule_Local_VSCID DEF_LOCAL_VS_COMBO_ID%TYPE;
2792 
2793       l_Rule_Effective_Date   DATE;
2794       l_TEMP                  NUMBER;
2795 
2796    Begin
2797       -- *******************************************************************************************
2798       -- name        :  Validate_Rule_Public
2799       -- Function    :  Verify that:
2800       --                   1) Local VS Combo ID for LEDGER_ID matches the rule..
2801       --                   2) If the dataset in use is production, that the ruleis production.
2802       --                   3) call our internal private validation routine (Validate_Rule_Private)
2803       --                Log this via a call to Log_Rule_Status
2804       --
2805       -- Parameters
2806       --                p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
2807       --                   -
2808       --                p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
2809       --                   -
2810       --                p_Rule_Effective_Date IN VARCHAR2
2811       --                   -
2812       --                p_Reference_Period_ID IN NUMBER
2813       --                   -
2814       --                p_Ledger_ID IN NUMBER
2815       --                   -
2816       --
2817       -- OUT
2818       --
2819       --                x_Err_Code OUT NUMBER
2820       --                   -
2821       --                x_Err_Msg  OUT VARCHAR2
2822       --                   -
2823       -- IN OUT
2824       --
2825       --
2826       --
2827       -- HISTORY
2828       --    27-Jun-2006    dyung    removed 'raise' from the exception
2829       --                            handling and added a savepoint for the
2830       --                            rollback.
2831       --    05-Jan-2004    rjking   comment header added, reformatted and commented.
2832       --
2833       -- *******************************************************************************************
2834       SAVEPOINT Validate_Rule_Public_SvPt;
2835 
2836       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2837                                    p_module=> l_module_name,
2838                                    p_msg_text=> 'ENTRY: p_Rule_Object_ID = '||p_Rule_Object_ID);
2839 
2840       l_Rule_Effective_Date := FND_DATE.CANONICAL_TO_DATE(p_Rule_Effective_Date);
2841 
2842       z_Err_Code := 0;
2843 
2844       -- fetch the local value set associated with the p_Ledger_ID we were passed.
2845       Begin
2846          -- todo:: fix to new standards ??
2847          z_local_vs_for_session := fem_dimension_util_pkg.Local_VS_Combo_ID
2848                                           ( p_Ledger_ID
2849                                             , z_Err_Code
2850                                             ,l_TEMP);
2851 
2852          If (z_local_vs_for_session = -1) then
2853             -- todo:: fix to new standards..
2854             RAISE USER_EXCEPTION;
2855          End If;
2856       End;
2857 
2858 
2859       -- now compare the local value set combo ID of the rule in question with
2860       -- the fetched local value set combo ID associated with the p_Ledger_ID passed to us.
2861       Begin
2862          -- get rule's local value set combo ID
2863          select   local_vs_combo_id
2864             into  l_Rule_Local_VSCID
2865             from  Fem_Object_Catalog_B
2866             where object_id = p_Rule_Object_ID;
2867 
2868          -- if the rule's local value set id doesn't match the one for the ledger, its BAD.
2869          If (l_Rule_Local_VSCID <> z_local_vs_for_session) then
2870             z_Err_Code := 9;
2871             FEM_UTILS.set_master_err_state( z_master_err_state,
2872                                                 FEM_UTILS.G_RSM_NONFATAL_ERR,
2873                                                 G_APP_NAME,
2874                                                 G_ERRMSG_NO_VALID_VALSETS,
2875                                                 G_ERRMAC_RULE_NAME,
2876                                                 GetObjectDisplayName(p_Rule_Object_ID)
2877                                                 );
2878             z_Err_Msg  := G_INVALID_LVSCID_ON_OBJECT;
2879             -- todo:: fix to new standards..
2880             RAISE USER_EXCEPTION;
2881          End If;
2882 
2883       End;
2884 
2885       l_isProductionODS := IsProductionODS(   p_DS_IO_Def_ID
2886                                              ,l_Output_Dataset_Name
2887                                              ,l_Output_Dataset_Code  );
2888 
2889       -- if we found the output data set in question..
2890       If (NOT z_dataset_error) then
2891 
2892          -- then run further validations..
2893          Validate_Rule_Private(  p_Rule_Object_ID
2894                                  ,l_Rule_Local_VSCID
2895                                  ,l_Rule_Effective_Date
2896                                  ,l_isProductionODS
2897                                  ,p_Reference_Period_ID
2898                                  ,p_Ledger_ID
2899                                  ,l_Dependent_Objects_Tab
2900                                  ,l_Dependent_Objects_Count
2901                                  ,l_Rule_Obj_Def_ID
2902                                  ,l_Valid_Rule_Def_Status
2903                                  ,l_Valid_Lock_Status
2904                                  ,l_Valid_Approval_Status
2905                                  ,l_Valid_Dep_Obj_Status
2906                                  ,l_Valid_Local_VS_Status);
2907 
2908       Else
2909          z_Err_Code := 10;
2910          FEM_UTILS.set_master_err_state( z_master_err_state,
2911                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
2912                                              G_APP_NAME,
2913                                              G_ERRMSG_DSGRP_NOT_FOUND );
2914          z_Err_Msg  := G_INVALID_DATASET_GROUP;
2915          -- todo:: fix to new standards..
2916          RAISE USER_EXCEPTION;
2917       End If;
2918 
2919       Log_Rule_Status(  p_Rule_Object_ID
2920                         ,l_Valid_Rule_Def_Status
2921                         ,l_Valid_Lock_Status
2922                         ,l_Valid_Local_VS_Status
2923                         ,l_Valid_Approval_Status
2924                         ,l_Valid_Dep_Obj_Status
2925                         ,l_Dependent_Objects_Tab
2926                         ,l_Dependent_Objects_Count);
2927 
2928       If (l_Valid_Dep_Obj_Status = G_RSM_DEP_OBJECTS_INVALID) then
2929          Log_Dep_Status_For_Single_Rule(  p_Rule_Object_ID
2930                                           ,l_Dependent_Objects_Tab
2931                                           ,l_Dependent_Objects_Count);
2932       End If;
2933 
2934       x_Err_Code := z_Err_Code;
2935       x_Err_Msg  := z_Err_Msg;
2936 
2937       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
2938                                    p_module=> l_module_name,
2939                                    p_msg_text=> 'EXIT');
2940 
2941       EXCEPTION
2942          WHEN USER_EXCEPTION THEN
2943             x_Err_Code := z_Err_Code;
2944             x_Err_Msg  := z_Err_Msg;
2945            -- todo:: fix to new standards
2946             fem_engines_pkg.user_message(p_msg_text =>
2947 z_Err_Code||':'||z_Err_Msg);
2948             fnd_file.put_line(FND_FILE.OUTPUT,z_Err_Msg);
2949             ROLLBACK TO Validate_Rule_Public_SvPt;
2950          WHEN OTHERS THEN
2951             x_Err_Code := -1;
2952             -- todo:: this is a main I/F procedure and should conform to the 'new way of thinking'.
2953             FEM_UTILS.set_master_err_state( z_master_err_state,
2954                                                 FEM_UTILS.G_RSM_FATAL_ERR,
2955                                                 G_APP_NAME,
2956                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
2957                                                 G_ERRMAC_ROUTINE_NAME,
2958                                                 l_module_name,
2959                                                 NULL,
2960                                                 G_ERRMAC_SQL_ERROR,
2961                                                 SQLERRM);
2962 
2963    End Validate_Rule_Public;
2964 
2965 
2966 
2967    Procedure Validate_Rule_Public(p_api_version IN NUMBER
2968                                  ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
2969                                  ,p_encoded IN VARCHAR2 := FND_API.G_TRUE
2970                                  ,p_Rule_Object_ID IN DEF_OBJECT_ID%TYPE
2971                                  ,p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
2972                                  ,p_Rule_Effective_Date IN VARCHAR2
2973                                  ,p_Reference_Period_ID IN NUMBER
2974                                  ,p_Ledger_ID IN NUMBER
2975                                  ,x_return_status OUT NOCOPY VARCHAR2
2976                                  ,x_msg_count OUT NOCOPY NUMBER
2977                                  ,x_msg_data OUT NOCOPY VARCHAR2) IS
2978 
2979       l_api_name      CONSTANT VARCHAR2(30) := 'Validate_Rule_Public';
2980       l_api_version   CONSTANT NUMBER       := 1.0;
2981       l_Err_Code               NUMBER       := 0;
2982       l_Err_Msg                VARCHAR2(30) := NULL;
2983 
2984    Begin
2985       -- *******************************************************************************************
2986       -- name        :  Validate_Rule_Public
2987       -- Function    :  Standards-compliant wrapper around Validate_Rule_Public
2988       --
2989       -- HISTORY
2990       --    27-Jun-2006    dyung    initial version
2991       --
2992       -- *******************************************************************************************
2993       IF NOT FND_API.Compatible_API_Call(l_api_version
2994                                         ,p_api_version
2995                                         ,l_api_name
2996                                         ,G_PKG_NAME)
2997       THEN
2998          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2999       END IF;
3000 
3001       IF FND_API.to_Boolean(p_init_msg_list) THEN
3002          FND_MSG_PUB.Initialize;
3003       END IF;
3004 
3005       Validate_Rule_Public(l_Err_Code
3006                           ,l_Err_Msg
3007                           ,p_Rule_Object_ID
3008                           ,p_DS_IO_Def_ID
3009                           ,p_Rule_Effective_Date
3010                           ,p_Reference_Period_ID
3011                           ,p_Ledger_ID);
3012 
3013       -- any errors in Validate_Rule_Public should be on the message stack
3014       FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded, p_count => x_msg_count,
3015 p_data => x_msg_data);
3016 
3017       IF (l_Err_Code > 0) THEN
3018          x_return_status := FND_API.G_RET_STS_ERROR;
3019       ELSE
3020 	 IF (l_Err_Code = 0) THEN
3021 	    x_return_status := FND_API.G_RET_STS_SUCCESS;
3022 	 ELSE
3023             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3024 	 END IF;
3025       END IF;
3026 
3027       EXCEPTION
3028          WHEN OTHERS THEN
3029 	    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3030 	    FND_MSG_PUB.Count_And_Get(p_encoded => p_encoded, p_count => x_msg_count, p_data => x_msg_data);
3031 
3032    End Validate_Rule_Public;
3033 
3034 
3035 
3036 
3037    Procedure Preprocess_RuleSet( x_Err_Code OUT NOCOPY NUMBER
3038                                 ,x_Err_Msg OUT NOCOPY VARCHAR2
3039                                 ,p_Orig_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE
3040                                 ,p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
3041                                 ,p_Rule_Effective_Date IN VARCHAR2
3042                                 ,p_Output_Period_ID IN NUMBER
3043                                 ,p_Ledger_ID IN NUMBER
3044                                 ,p_Continue_Process_On_Err_Flg IN VARCHAR2
3045                                 ,p_Execution_Mode IN VARCHAR2
3046                                 ) IS
3047 
3048       l_Rule_Set_Instance_Tab          Rule_Set_Instance_Tab;
3049       l_Rule_Set_Count                BINARY_INTEGER := 0;
3050       l_Rule_Set_Level                NUMBER := 0;
3051 
3052       l_Members_Processed_Tab         Members_Processed_Instance_Tab;
3053       l_Members_Processed_Count       BINARY_INTEGER := 0;
3054 
3055       l_Valid_Members_Tab             Valid_Invalid_Members_Inst_Tab;
3056       l_Valid_Members_Count           BINARY_INTEGER := 0;
3057 
3058       l_Invalid_Member_Flags_Tab      Members_Validation_Status_Tab;
3059       l_Invalid_Member_Flags_Count    BINARY_INTEGER := 0;
3060 
3061       l_Dependent_Objects_Tab         Dependent_Objects_Tab;
3062       l_Dependent_Objects_Count       BINARY_INTEGER := 0;
3063 
3064       l_Engine_Execution_Sequence     NUMBER  := 0;
3065 
3066       l_Output_Dataset_Name           VARCHAR2(120) := NULL;
3067       l_Output_Dataset_Code           NUMBER(9) := NULL;
3068       l_IsProductionODS               BOOLEAN     := FALSE;
3069 
3070       l_Rule_Effective_Date           DATE;
3071       l_RuleSet_LocalVSComboID        NUMBER;
3072 
3073       l_Maximum_Sequence NUMBER := 0; /*---Keeps track of the maximum sequence of
3074                                            members of a given Rule Set member. */
3075       l_TEMP                          NUMBER;
3076 
3077       l_curr_RS                        Rule_Set_Instance_Rec;
3078    Begin
3079     -- *******************************************************************************************
3080     -- name        :  Preprocess_RuleSet
3081     -- Function    :  Entry point for RSM.
3082     --
3083     -- Parameters
3084     -- IN
3085     --                p_Orig_RuleSet_Object_ID IN DEF_OBJECT_ID%TYPE
3086     --                   -
3087     --                p_DS_IO_Def_ID IN DEF_OBJECT_DEFINITION_ID%TYPE
3088     --                   -
3089     --                p_Rule_Effective_Date IN VARCHAR2
3090     --                   -
3091     --                p_Output_Period_ID IN NUMBER
3092     --                   -
3093     --                p_Ledger_ID IN NUMBER
3094     --                   -
3095     --                p_Continue_Process_On_Err_Flg IN VARCHAR2
3096     --                   -
3097     --                p_Execution_Mode IN VARCHAR2
3098     --                   execution mode definitions from DB
3099     --                   CODE  UI parameter name       UI Parameter Description
3100     --                   ====  =====================   ========================================================================================
3101     --                   A     All Rules               Will Report on Valid and Invalid Rules in a Rule Set
3102     --                   E     Engine Execution Mode   Will by default report on Valid and Invalid Rules. Same as 'A' but also launches Engine
3103     --                   I     Invalid Rules           Will Report on Invalid Rules in a Rule Set
3104     --                   V     Valid Rules             Will Report on Valid Rules in a Rule Set
3105     --
3106     -- OUT
3107     --                x_Err_Code OUT NUMBER
3108     --                   -
3109     --                x_Err_Msg OUT VARCHAR2
3110     --                   -
3111     --
3112     -- IN OUT
3113     --
3114     --
3115     --
3116     -- HISTORY
3117     --    05-Jan-2004    rjking   comment header added, reformatted and commented.
3118     --
3119     -- *******************************************************************************************
3120 
3121       reset_master_err_state;
3122       z_Err_Code := 0;
3123 
3124       Begin
3125          z_local_vs_for_session := fem_dimension_util_pkg.Local_VS_Combo_ID
3126                                            (p_Ledger_ID
3127                                            ,z_Err_Code
3128                                            ,l_TEMP);
3129          If (z_local_vs_for_session = -1) then
3130             RAISE USER_EXCEPTION;
3131          End If;
3132       End;
3133 
3134       Begin /*--Check Local VS of Rule Set being run --*/
3135          select local_vs_combo_id
3136             into  l_RuleSet_LocalVSComboID
3137             from  Fem_Object_Catalog_B
3138             where object_id = p_Orig_RuleSet_Object_ID;
3139          If (l_RuleSet_LocalVSComboID <> z_local_vs_for_session) then
3140             z_Err_Code := 9;
3141             z_Err_Msg  := G_INVALID_LVSCID_ON_OBJECT;
3142             RAISE USER_EXCEPTION;
3143          End If;
3144       End;
3145 
3146       Begin
3147          l_Rule_Effective_Date := FND_DATE.CANONICAL_TO_DATE(p_Rule_Effective_Date);
3148       End;
3149 
3150       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_ID := p_Orig_RuleSet_Object_ID;
3151       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_Name := GetObjectDisplayName(p_Orig_RuleSet_Object_ID);
3152       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).Owning_RuleSet_Name := '';
3153 
3154       l_curr_RS.RuleSet_Object_ID   :=p_Orig_RuleSet_Object_ID;
3155       l_curr_RS.RuleSet_Object_Name :=l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_Name;
3156       l_curr_RS.Owning_RuleSet_Name :='';
3157 
3158 
3159       If (p_DS_IO_Def_ID is NOT NULL) then
3160          l_IsProductionODS := IsProductionODS
3161                                             (p_DS_IO_Def_ID
3162                                             ,l_Output_Dataset_Name
3163                                             ,l_Output_Dataset_Code
3164                                             );
3165       End If;
3166 
3167       If (NOT z_dataset_error) then
3168          Process_RuleSet (  p_Orig_RuleSet_Object_ID
3169                            ,p_Orig_RuleSet_Object_ID
3170                            ,l_Rule_Set_Instance_Tab
3171                            ,l_Rule_Set_Count
3172                            ,l_Rule_Set_Level
3173                            ,l_Members_Processed_Tab
3174                            ,l_Members_Processed_Count
3175                            ,l_Rule_Effective_Date
3176                            ,l_IsProductionODS
3177                            ,l_Engine_Execution_Sequence
3178                            ,p_Execution_Mode
3179                            ,l_Valid_Members_Tab
3180                            ,l_Valid_Members_Count
3181                            ,l_Invalid_Member_Flags_Tab
3182                            ,l_Invalid_Member_Flags_Count
3183                            ,l_Dependent_Objects_Tab
3184                            ,l_Dependent_Objects_Count
3185                            ,l_Output_Dataset_Code
3186                            ,p_Output_Period_ID
3187                            ,p_Ledger_ID
3188                            ,l_Maximum_Sequence
3189                            ,l_curr_RS);
3190       Else
3191          z_Err_Code := 10;
3192          z_Err_Msg  := G_INVALID_DATASET_GROUP;
3193          RAISE USER_EXCEPTION;
3194       End If;
3195 
3196       Write_Output(  l_Valid_Members_Tab
3197                      ,l_Valid_Members_Count
3198                      ,l_Invalid_Member_Flags_Tab
3199                      ,l_Invalid_Member_Flags_Count
3200                      ,l_Dependent_Objects_Tab
3201                      ,l_Dependent_Objects_Count
3202                      ,p_Orig_RuleSet_Object_ID
3203                      ,l_Rule_Effective_Date
3204                      ,l_Output_Dataset_Name
3205                      ,l_IsProductionODS
3206                      ,p_Execution_Mode);
3207 
3208       If (p_Continue_Process_On_Err_Flg = 'Y') then
3209          If (z_Err_Code <> -1 and z_Err_Code <> 2 and z_Err_Code <> 3) then
3210             z_Err_Code := 0;
3211             z_Err_Msg  := NULL;
3212          End If;
3213       End If;
3214 
3215       x_Err_Code := z_Err_Code;
3216       x_Err_Msg  := z_Err_Msg;
3217 
3218       EXCEPTION
3219          WHEN USER_EXCEPTION THEN
3220             x_Err_Code := z_Err_Code;
3221             x_Err_Msg  := z_Err_Msg;
3222             fem_engines_pkg.user_message(p_msg_text => z_Err_Code||':'||z_Err_Msg);
3223             fnd_file.put_line(FND_FILE.OUTPUT,z_Err_Code||':'||z_Err_Msg);
3224             rollback;
3225             RETURN;
3226 
3227          WHEN OTHERS THEN
3228             z_Err_Code := -1;
3229             z_Err_Msg  := 'Preprocess_RuleSet :'||SQLERRM;
3230             fem_engines_pkg.user_message(p_msg_text => z_Err_Msg);
3231             rollback;
3232             RAISE;
3233 
3234    End Preprocess_RuleSet;
3235 
3236 
3237    -- *******************************************************************************************
3238    -- API name    : FEM_DeleteFlatRuleList_PVT
3239    -- Type        : Private
3240    -- Pre-reqs    : None
3241    -- Function    :  1) delete all rules associated with the current request ID and ruleset ObjID
3242    --                2) Report all errors that occur during the conversion that are not
3243    --                   covered by the UI validation routines
3244    --
3245    --
3246    -- Parameters
3247    -- IN
3248    --                p_api_version                 IN    NUMBER
3249    --                      Current version of this API
3250    --                p_init_msg_list               IN    VARCHAR2 := FND_API.G_FALSE
3251    --                      If set to:
3252    --                         FND_API.G_TRUE    - Initialize FND_MSG_PUB
3253    --                         FND_API.G_FALSE   - DO NOT Initialize FND_MSG_PUB
3254    --                p_commit                      IN    VARCHAR2 := FND_API.G_FALSE
3255    --                      If set to:
3256    --                         FND_API.G_TRUE    - Commit data at exit of this routine
3257    --                         FND_API.G_FALSE   - DO NOT commit data at exit of this routine
3258    --                p_Orig_RuleSet_Object_ID      IN    DEF_OBJECT_ID%TYPE
3259    --                      the object id associated with the list to delete.
3260    --
3261    --
3262    -- OUT
3263    --                x_return_status               OUT   VARCHAR2
3264    --                      Possible return status:
3265    --                         FND_API.G_RET_STS_SUCCESS        -  Call was successful, msgs may
3266    --                                                             still be present (check x_msg_count)
3267    --                         FND_API.G_RET_STS_ERROR          -  Call was not successful, msgs should
3268    --                                                             be present (check x_msg_count)
3269    --                         FND_API.G_RET_STS_UNEXP_ERROR    -  Unexpected errors occurred which are
3270    --                                                             unrecoverable (check x_msg_count)
3271    --
3272    --                x_msg_count                   OUT   NUMBER
3273    --                      Count of messages returned.  If x_msg_count = 1, then the message is returned
3274    --                      in x_msg_data.  If x_msg_count > 1, then messages are returned via FND_MSG_PUB.
3275    --
3276    --                x_msg_data                    OUT   VARCHAR2
3277    --                      Error message returned.
3278    --
3279    -- Version: Current Version   1.0
3280    --
3281    --                            Previous version  N/A
3282    --                            Initial version   1.0
3283    -- *******************************************************************************************
3284    PROCEDURE FEM_DeleteFlatRuleList_PVT(
3285                                  p_api_version                 IN             NUMBER
3286                                 ,p_init_msg_list               IN             VARCHAR2 := FND_API.G_FALSE
3287                                 ,p_commit                      IN             VARCHAR2 := FND_API.G_FALSE
3288                                 ,p_encoded                     IN             VARCHAR2 := FND_API.G_TRUE
3289                                 ,x_return_status               OUT   NOCOPY   VARCHAR2
3290                                 ,x_msg_count                   OUT   NOCOPY   NUMBER
3291                                 ,x_msg_data                    OUT   NOCOPY   VARCHAR2
3292                                 ,p_RuleSet_Object_ID  IN             DEF_OBJECT_ID%TYPE
3293                                 )
3294    IS
3295       l_api_version                    NUMBER := 1.0;
3296       l_api_name                       CONSTANT VARCHAR2(27)   := 'FEM_Preprocess_RuleSet_PVT';
3297       l_module_name                    VARCHAR2(70)            := G_MODULE_NAME || l_api_name;
3298 
3299    BEGIN
3300       -- the infamous preamble..
3301       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
3302                                    p_module=> l_module_name,
3303                                    p_msg_text=> 'ENTER');
3304 
3305       -- initialize our status to 'we are good!'
3306       x_return_status := FND_API.G_RET_STS_SUCCESS;
3307 
3308       -- setup save point for rollbacks..
3309       SAVEPOINT FEM_DeleteFlatRuleList_SvPt;
3310 
3311       -- initialize msg stack?
3312       IF fnd_api.to_Boolean(p_init_msg_list) THEN
3313          fnd_msg_pub.initialize;
3314       END IF;
3315 
3316       -- check API version...
3317       IF NOT fnd_api.Compatible_API_Call (l_api_version,
3318                                           p_api_version,
3319                                           l_api_name,
3320                                           G_PKG_NAME ) THEN
3321          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3322       END IF;
3323 
3324       -- and on to the real code...
3325       DELETE FROM fem_ruleset_process_DATA
3326             WHERE       request_id = FND_GLOBAL.CONC_REQUEST_ID
3327                   AND   rule_set_obj_id = p_RuleSet_Object_ID;
3328 
3329 
3330       -- and the required post work code...
3331       IF fnd_api.to_boolean(p_commit) THEN
3332          COMMIT WORK;
3333       END IF;
3334 
3335       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
3336                                    p_module=> l_module_name,
3337                                    p_msg_text=> 'EXIT');
3338 
3339       FND_MSG_PUB.Count_And_Get ( p_encoded,
3340                                   x_msg_count,
3341                                   x_msg_data );
3342 
3343       EXCEPTION
3344          WHEN OTHERS THEN
3345             FEM_UTILS.set_master_err_state( z_master_err_state,
3346                                                 FEM_UTILS.G_RSM_FATAL_ERR,
3347                                                 G_APP_NAME,
3348                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
3349                                                 G_ERRMAC_ROUTINE_NAME,
3350                                                 l_module_name,
3351                                                 NULL,
3352                                                 G_ERRMAC_SQL_ERROR,
3353                                                 SQLERRM);
3354 
3355             ROLLBACK TO FEM_DeleteFlatRuleList_SvPt;
3356 
3357             FND_MSG_PUB.Count_And_Get ( p_encoded,
3358                                         x_msg_count,
3359                                         x_msg_data );
3360 
3361             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3362 
3363    END FEM_DeleteFlatRuleList_PVT;
3364 
3365 
3366    -- *******************************************************************************************
3367    -- API name    : FEM_Preprocess_RuleSet_PVT
3368    -- Type        : Private
3369    -- Pre-reqs    : None
3370    -- Function    :  1) convert a rule set into a flat structure prior to engine processing
3371    --                2) Report all errors that occur during the conversion that are not
3372    --                   covered by the UI validation routines
3373    --
3374    --
3375    -- Parameters
3376    -- IN
3377    --                p_api_version                 IN    NUMBER
3378    --                      Current version of this API
3379    --                p_init_msg_list               IN    VARCHAR2 := FND_API.G_FALSE
3380    --                      If set to:
3381    --                         FND_API.G_TRUE    - Initialize FND_MSG_PUB
3382    --                         FND_API.G_FALSE   - DO NOT Initialize FND_MSG_PUB
3383    --                p_commit                      IN    VARCHAR2 := FND_API.G_FALSE
3384    --                      If set to:
3385    --                         FND_API.G_TRUE    - Commit data at exit of this routine
3386    --                         FND_API.G_FALSE   - DO NOT commit data at exit of this routine
3387    --                p_Orig_RuleSet_Object_ID      IN    DEF_OBJECT_ID%TYPE
3388    --
3389    --                p_DS_IO_Def_ID                IN    DEF_OBJECT_DEFINITION_ID%TYPE
3390    --
3391    --                p_Rule_Effective_Date         IN    VARCHAR2
3392    --
3393    --                p_Output_Period_ID            IN    NUMBER
3394    --
3395    --                p_Ledger_ID                   IN    NUMBER
3396    --
3397    --                p_Continue_Process_On_Err_Flg IN    VARCHAR2
3398    --                      if set to:
3399    --                         'Y' - continue processing except on extreme fatal errors
3400    --                         'N' - stop on first non-fatal
3401    --
3402    --                p_Execution_Mode              IN    VARCHAR2
3403    --
3404    --                      execution mode definitions from 'FEM_LOOKUPS' where lookup_type = 'FEM_RS_VALIDATE_TYPE_DSC'
3405    --                      CODE  UI parameter name       UI Parameter Description
3406    --                      ====  =====================   ========================================================================================
3407    --                      A     All Rules               Will Report on Valid and Invalid Rules in a Rule Set
3408    --                      E     Engine Execution Mode   Will by default report on Valid and Invalid Rules. Same as 'A' but also launches Engine
3409    --                      I     Invalid Rules           Will Report on Invalid Rules in a Rule Set
3410    --                      V     Valid Rules             Will Report on Valid Rules in a Rule Set
3411    --
3412    --                      The value passed to this routine is the value from the CODE column.
3413    --
3414    --
3415    -- OUT
3416    --                x_return_status               OUT   VARCHAR2
3417    --                      Possible return status:
3418    --                         FND_API.G_RET_STS_SUCCESS        -  Call was successful, msgs may
3419    --                                                             still be present (check x_msg_count)
3420    --                         FND_API.G_RET_STS_ERROR          -  Call was not successful, msgs should
3421    --                                                             be present (check x_msg_count)
3422    --                         FND_API.G_RET_STS_UNEXP_ERROR    -  Unexpected errors occurred which are
3423    --                                                             unrecoverable (check x_msg_count)
3424    --
3425    --                x_msg_count                   OUT   NUMBER
3426    --                      Count of messages returned.  If x_msg_count = 1, then the message is returned
3427    --                      in x_msg_data.  If x_msg_count > 1, then messages are returned via FND_MSG_PUB.
3428    --
3429    --                x_msg_data                    OUT   VARCHAR2
3430    --                      Error message returned.
3431    --
3432    -- Version: Current Version   1.0
3433    --
3434    --                            Previous version  N/A
3435    --                            Initial version   1.0
3436    -- *******************************************************************************************
3437 
3438    PROCEDURE FEM_Preprocess_RuleSet_PVT(
3439                                  p_api_version                 IN             NUMBER
3440                                 ,p_init_msg_list               IN             VARCHAR2 := FND_API.G_FALSE
3441                                 ,p_commit                      IN             VARCHAR2 := FND_API.G_FALSE
3442                                 ,p_encoded                     IN             VARCHAR2 := FND_API.G_TRUE
3443                                 ,x_return_status               OUT   NOCOPY   VARCHAR2
3444                                 ,x_msg_count                   OUT   NOCOPY   NUMBER
3445                                 ,x_msg_data                    OUT   NOCOPY   VARCHAR2
3446                                 ,p_Orig_RuleSet_Object_ID      IN             DEF_OBJECT_ID%TYPE
3447                                 ,p_DS_IO_Def_ID                IN             DEF_OBJECT_DEFINITION_ID%TYPE
3448                                 ,p_Rule_Effective_Date         IN             VARCHAR2
3449                                 ,p_Output_Period_ID            IN             NUMBER
3450                                 ,p_Ledger_ID                   IN             NUMBER
3451                                 ,p_Continue_Process_On_Err_Flg IN             VARCHAR2
3452                                 ,p_Execution_Mode              IN             VARCHAR2
3453                                 )
3454    IS
3455       -- STANDARD STUFF
3456       l_api_version                    NUMBER := 1.0;
3457       l_api_name                       CONSTANT VARCHAR2(27)   := 'FEM_Preprocess_RuleSet_PVT';
3458       l_module_name                    VARCHAR2(70)            := G_MODULE_NAME || l_api_name;
3459 
3460       l_Rule_Set_Instance_Tab          Rule_Set_Instance_Tab;
3461       l_Rule_Set_Count                 BINARY_INTEGER := 0;
3462       l_Rule_Set_Level                 NUMBER := 0;
3463 
3464       l_Members_Processed_Tab          Members_Processed_Instance_Tab;
3465       l_Members_Processed_Count        BINARY_INTEGER := 0;
3466 
3467       l_Valid_Members_Tab              Valid_Invalid_Members_Inst_Tab;
3468       l_Valid_Members_Count            BINARY_INTEGER := 0;
3469 
3470       l_Invalid_Member_Flags_Tab       Members_Validation_Status_Tab;
3471       l_Invalid_Member_Flags_Count     BINARY_INTEGER := 0;
3472 
3473       l_Dependent_Objects_Tab          Dependent_Objects_Tab;
3474       l_Dependent_Objects_Count        BINARY_INTEGER := 0;
3475 
3476       l_Engine_Execution_Sequence      NUMBER  := 0;
3477 
3478       l_Output_Dataset_Name            VARCHAR2(120) := NULL;
3479       l_Output_Dataset_Code            NUMBER(9) := NULL;
3480 
3481       l_IsProductionODS                BOOLEAN     := FALSE;
3482 
3483       l_Rule_Effective_Date            DATE;
3484       l_RuleSet_LocalVSComboID         NUMBER;
3485 
3486       -- Keeps track of the maximum sequence of
3487       -- members of a given Rule Set member.
3488       l_Maximum_Sequence               NUMBER := 0;
3489       l_TEMP                           NUMBER;
3490 
3491       l_curr_RS                        Rule_Set_Instance_Rec;
3492 
3493 
3494    BEGIN
3495       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
3496                                    p_module=> l_module_name,
3497                                    p_msg_text=> 'ENTRY');
3498       reset_master_err_state;
3499       z_dataset_error := FALSE;
3500 
3501       -------------------------------------------------------
3502       -- standard API support header ------------------------
3503       -------------------------------------------------------
3504 
3505       -- initialize our status to 'we are good!'
3506       x_return_status := FND_API.G_RET_STS_SUCCESS;
3507 
3508       -- setup save point for rollbacks..
3509       SAVEPOINT FEM_Preprocess_RuleSet_SvPt;
3510 
3511 
3512       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3513                                    p_module=> l_module_name,
3514                                    p_msg_text=> 'p_api_version(' || p_api_version || ')');
3515       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3516                                    p_module=> l_module_name,
3517                                    p_msg_text=> 'p_init_msg_list(' || p_init_msg_list || ')');
3518       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3519                                    p_module=> l_module_name,
3520                                    p_msg_text=> 'p_commit(' || p_commit || ')');
3521       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3522                                    p_module=> l_module_name,
3523                                    p_msg_text=> 'p_encoded(' || p_encoded || ')');
3524       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3525                                    p_module=> l_module_name,
3526                                    p_msg_text=> 'p_Orig_RuleSet_Object_ID(' || p_Orig_RuleSet_Object_ID || ')');
3527       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3528                                    p_module=> l_module_name,
3529                                    p_msg_text=> 'p_DS_IO_Def_ID(' || p_DS_IO_Def_ID || ')');
3530       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3531                                    p_module=> l_module_name,
3532                                    p_msg_text=> 'p_Rule_Effective_Date(' || p_Rule_Effective_Date || ')');
3533       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3534                                    p_module=> l_module_name,
3535                                    p_msg_text=> 'p_Output_Period_ID(' || p_Output_Period_ID || ')');
3536       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3537                                    p_module=> l_module_name,
3538                                    p_msg_text=> 'p_Ledger_ID(' || p_Ledger_ID || ')');
3539       fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3540                                    p_module=> l_module_name,
3541                                    p_msg_text=> 'p_Execution_Mode(' || p_Execution_Mode || ')');
3542 
3543 
3544       -- initialize msg stack?
3545       IF fnd_api.to_Boolean(p_init_msg_list) THEN
3546          fnd_msg_pub.initialize;
3547       END IF;
3548 
3549       -- since this interface is PVT, this use is trusted and error capture
3550       -- is minimal..
3551       IF p_Continue_Process_On_Err_Flg = 'N' THEN
3552          z_continue_on_error := FALSE;
3553          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3554                                       p_module=> l_module_name,
3555                                       p_msg_text=> 'z_continue_on_error := FALSE');
3556       ELSE
3557          z_continue_on_error := TRUE;
3558          fem_engines_pkg.tech_message(p_severity=>G_LOG_STATEMENT ,
3559                                       p_module=> l_module_name,
3560                                       p_msg_text=> 'z_continue_on_error := TRUE');
3561       END IF;
3562 
3563       -- check API version...
3564       IF NOT fnd_api.Compatible_API_Call (l_api_version,
3565                                           p_api_version,
3566                                           l_api_name,
3567                                           G_PKG_NAME ) THEN
3568          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3569       END IF;
3570 
3571       -------------------------------------------------------
3572       -- end of standard API support header -----------------
3573       -------------------------------------------------------
3574 
3575       -- todo:: most likely bye-bye
3576       z_Err_Code := 0;
3577 
3578       z_local_vs_for_session := fem_dimension_util_pkg.Local_VS_Combo_ID
3579                                         (p_Ledger_ID
3580                                         ,z_Err_Code
3581                                         ,l_TEMP);
3582       If (z_local_vs_for_session = -1) then
3583          -- todo:: unknown error in Local_VS_Combo_ID call.. report as such
3584 
3585          FEM_UTILS.set_master_err_state( z_master_err_state,
3586                                              FEM_UTILS.G_RSM_FATAL_ERR,
3587                                              G_APP_NAME,
3588                                              G_ERRMSG_NO_DSG_FOR_LID  );
3589 
3590          -- this one is bad.. our master rule/ruleset has an invalid VS combo ID.. bomb out now
3591          RAISE FND_API.G_EXC_ERROR;
3592       End If;
3593 
3594       Begin /*--Check Local VS of Rule Set being run --*/
3595          select local_vs_combo_id
3596             into  l_RuleSet_LocalVSComboID
3597             from  Fem_Object_Catalog_B
3598             where object_id = p_Orig_RuleSet_Object_ID;
3599          If (l_RuleSet_LocalVSComboID <> z_local_vs_for_session) then
3600 
3601             -- originally error number's 8 and 9.
3602             FEM_UTILS.set_master_err_state( z_master_err_state,
3603                                                 FEM_UTILS.G_RSM_FATAL_ERR,
3604                                                 G_APP_NAME,
3605                                                 G_ERRMSG_NO_VALID_VALSETS,
3606                                                 G_ERRMAC_RULE_NAME,
3607                                                 GetObjectDisplayName(p_Orig_RuleSet_Object_ID));
3608 
3609             RAISE FND_API.G_EXC_ERROR;
3610          End If;
3611       End;
3612 
3613       l_Rule_Effective_Date := FND_DATE.CANONICAL_TO_DATE(p_Rule_Effective_Date);
3614 
3615 
3616       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_ID   := p_Orig_RuleSet_Object_ID;
3617       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_Name := GetObjectDisplayName(p_Orig_RuleSet_Object_ID);
3618       l_Rule_Set_Instance_Tab(l_Rule_Set_Count).Owning_RuleSet_Name := '';
3619 
3620       -- tracking for RS that is currently being processed.
3621       l_curr_RS.RuleSet_Object_ID   :=p_Orig_RuleSet_Object_ID;
3622       l_curr_RS.RuleSet_Object_Name :=l_Rule_Set_Instance_Tab(l_Rule_Set_Count).RuleSet_Object_Name;
3623       l_curr_RS.Owning_RuleSet_Name :='';
3624 
3625       If (p_DS_IO_Def_ID is NOT NULL) then
3626          l_IsProductionODS := IsProductionODS( p_DS_IO_Def_ID
3627                                                       ,l_Output_Dataset_Name
3628                                                       ,l_Output_Dataset_Code );
3629       End If;
3630 
3631       If (NOT z_dataset_error) then
3632          Process_RuleSet (  p_Orig_RuleSet_Object_ID
3633                            ,p_Orig_RuleSet_Object_ID
3634                            ,l_Rule_Set_Instance_Tab
3635                            ,l_Rule_Set_Count
3636                            ,l_Rule_Set_Level
3637                            ,l_Members_Processed_Tab
3638                            ,l_Members_Processed_Count
3639                            ,l_Rule_Effective_Date
3640                            ,l_IsProductionODS
3641                            ,l_Engine_Execution_Sequence
3642                            ,p_Execution_Mode
3643                            ,l_Valid_Members_Tab
3644                            ,l_Valid_Members_Count
3645                            ,l_Invalid_Member_Flags_Tab
3646                            ,l_Invalid_Member_Flags_Count
3647                            ,l_Dependent_Objects_Tab
3648                            ,l_Dependent_Objects_Count
3649                            ,l_Output_Dataset_Code
3650                            ,p_Output_Period_ID
3651                            ,p_Ledger_ID
3652                            ,l_Maximum_Sequence
3653                            ,l_curr_RS              );
3654 
3655          Write_Output(  l_Valid_Members_Tab
3656                         ,l_Valid_Members_Count
3657                         ,l_Invalid_Member_Flags_Tab
3658                         ,l_Invalid_Member_Flags_Count
3659                         ,l_Dependent_Objects_Tab
3660                         ,l_Dependent_Objects_Count
3661                         ,p_Orig_RuleSet_Object_ID
3662                         ,l_Rule_Effective_Date
3663                         ,l_Output_Dataset_Name
3664                         ,l_IsProductionODS
3665                         ,p_Execution_Mode);
3666 
3667       ELSE
3668          -- originally error # '10'
3669          FEM_UTILS.set_master_err_state( z_master_err_state,
3670                                              FEM_UTILS.G_RSM_NONFATAL_ERR,
3671                                              G_APP_NAME,
3672                                              G_ERRMSG_DSGRP_NOT_FOUND );
3673          RAISE FND_API.G_EXC_ERROR;
3674       End If;
3675 
3676       -- For fatal errors, force a rollback and get out..
3677       IF (z_master_err_state = FEM_UTILS.G_RSM_FATAL_ERR) THEN
3678          RAISE FND_API.G_EXC_ERROR;
3679       -- For nonfatal errors, report error if "continue to process on error"
3680       -- is set to No.  In either case, do not rollback what was stored
3681       -- in fem_ruleset_process_data so the engines can run.
3682       -- Ideally, we want to differentiate between a fatal and nonfatal error
3683       -- but since the FND API Standard has only one expected error code,
3684       -- we have to continue to report error for the same cases as before this
3685       -- change for backward compatability.
3686       ELSIF ((z_master_err_state = FEM_UTILS.G_RSM_NONFATAL_ERR) AND
3687              (NOT z_continue_on_error)) THEN
3688          x_return_status := FND_API.G_RET_STS_ERROR;
3689       END IF;
3690 
3691 
3692       -------------------------------------------------------
3693       -- standard API support
3694       -------------------------------------------------------
3695       IF fnd_api.to_boolean(p_commit) THEN
3696          COMMIT WORK;
3697       END IF;
3698 
3699       fem_engines_pkg.tech_message(p_severity=>G_LOG_PROCEDURE ,
3700                                    p_module=> l_module_name,
3701                                    p_msg_text=> 'EXIT');
3702 
3703       FND_MSG_PUB.Count_And_Get ( p_encoded,
3704                                   x_msg_count,
3705                                   x_msg_data );
3706 
3707       EXCEPTION
3708          WHEN FND_API.G_EXC_ERROR THEN
3709             ROLLBACK TO FEM_Preprocess_RuleSet_SvPt;
3710             FND_MSG_PUB.Count_And_Get ( p_encoded,
3711                                         x_msg_count,
3712                                         x_msg_data );
3713             x_return_status := FND_API.G_RET_STS_ERROR;
3714 
3715 
3716          WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3717             ROLLBACK TO FEM_Preprocess_RuleSet_SvPt;
3718             FND_MSG_PUB.Count_And_Get ( p_encoded,
3719                                         x_msg_count,
3720                                         x_msg_data );
3721 
3722             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3723 
3724          WHEN OTHERS THEN
3725             FEM_UTILS.set_master_err_state( z_master_err_state,
3726                                                 FEM_UTILS.G_RSM_FATAL_ERR,
3727                                                 G_APP_NAME,
3728                                                 G_ERRMSG_UNEXPECTED_SQLERROR,
3729                                                 G_ERRMAC_ROUTINE_NAME,
3730                                                 l_module_name,
3731                                                 NULL,
3732                                                 G_ERRMAC_SQL_ERROR,
3733                                                 SQLERRM);
3734 
3735             ROLLBACK TO FEM_Preprocess_RuleSet_SvPt;
3736 
3737             FND_MSG_PUB.Count_And_Get ( p_encoded,
3738                                         x_msg_count,
3739                                         x_msg_data );
3740 
3741             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3742 
3743 
3744    END FEM_Preprocess_RuleSet_PVT;
3745 
3746 
3747 End FEM_RULE_SET_MANAGER;