DBA Data[Home] [Help]

PACKAGE BODY: APPS.FV_YE_CLOSE

Source


1 PACKAGE BODY Fv_Ye_Close AS
2 --$Header: FVXYECPB.pls 120.47.12010000.2 2008/08/04 11:48:35 gnrajago ship $
3     --  ======================================================================
4     --                  Variable Naming Conventions
5     --  ======================================================================
6     --  1. Input/Output Parameter global variables
7     --     have the format                                   "vp_<Variable Name>"
8     --  2. Other Global Variables have the format            "vg_<Variable_Name>"
9     --  3. Procedure Level local variables have
10     --     the format                                        "vl_<Variable_Name>"
11     --  4. PL/SQL Table variables have                       "vt_<Variable_Name>"
12     --  5. User Defined Exceptions have                      "e_<Exception_Name>"
13     --  6. Variable Cursors have                             "vc_<Variable_Name>"
14     --  ======================================================================
15     --                          Parameter Global Variable Declarations
16     --  ======================================================================
17 
18     g_module_name VARCHAR2(100) ;
19     vp_errbuf           VARCHAR2(1000)                          ;
20     vp_retcode          NUMBER                             ;
21     vp_journal_import   VARCHAR2(1)                             ;
22     vp_timeframe	Fv_Treasury_Symbols.time_frame%TYPE	;
23     vp_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
24     vp_trsymbol		Fv_Treasury_Symbols.treasury_symbol%TYPE;
25     vp_closing_fyr 	Gl_Periods.period_year%TYPE		;
26 
27     --  ======================================================================
28     --                           Other Global Variable Declarations
29     --  ======================================================================
30 
31     vg_sob_id		Gl_Sets_Of_Books.set_of_books_id%TYPE;
32     vg_coa_id		Gl_Sets_Of_Books.chart_of_accounts_id%TYPE;
33     vg_currency		Gl_Sets_Of_Books.currency_code%TYPE;
34     vg_start_date       Gl_Periods.start_date%TYPE;
35     vg_end_date         Gl_Periods.end_date%TYPE;
36     vg_closing_period 	Gl_Period_Statuses.period_name%TYPE;
37     vg_coy_fyr	 	Gl_Periods.period_year%TYPE;
38     vg_coy_start_date   Gl_Periods.start_date%TYPE;
39     vg_coy_period 	Gl_Period_Statuses.period_name%TYPE;
40     vg_bal_segment      Fnd_Id_Flex_Segments.application_column_name%TYPE;
41     vg_acct_segment     Fnd_Id_Flex_Segments.application_column_name%TYPE;
42     vg_acct_segnum 	NUMBER(4);
43     vg_bal_seg_val_opt_code gl_ledgers_public_v.bal_seg_value_option_code%TYPE;
44     vg_trsymbol         Fv_Treasury_Symbols.treasury_symbol%TYPE;
45     vg_trsymbol_id      Fv_Treasury_Symbols.treasury_symbol_id%TYPE;
46     vg_fund_value	Fv_Fund_Parameters.fund_value%TYPE;
47     vg_group_id         Fv_Ye_Groups.group_id%TYPE;
48     vg_seq_id           Fv_Ye_Group_Sequences.sequence_id%TYPE;
49     vg_seq              Fv_Ye_Group_Sequences.SEQUENCE%TYPE;
50     vg_acct_flag        Fv_Ye_Sequence_Accounts.account_flag%TYPE;
51     vg_from_acct        Fv_Ye_Sequence_Accounts.from_account%TYPE;
52     vg_child_acct       Fv_Ye_Sequence_Accounts.from_account%TYPE;
53     vg_to_acct          Fv_Ye_Sequence_Accounts.to_account%TYPE;
54     vg_balance_read_flag  Fv_Ye_Seq_Bal_Temp.balance_read_flag%TYPE;
55     vg_bal_seq_amt 	NUMBER;
56     vg_gl_bal_amt 	NUMBER;
57     vg_coy_dr 		NUMBER;
58     vg_coy_cr 		NUMBER;
59     vt_segments		Fnd_Flex_Ext.SegmentArray;
60     vg_jrnl_group_id	NUMBER;
61     vg_interface_run_id	NUMBER;
62 
63     e_error      	EXCEPTION;
64     e_invalid      	EXCEPTION;
65 
66     vg_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
67     vg_acct_val_set_id  Fnd_Flex_Values.flex_value_set_id%TYPE;
68     vg_num_segs		NUMBER;
69     vg_factsi_attr_exists VARCHAR2(1) ;
70     vg_factsi_bal_cnt   NUMBER;
71     vg_factsi_attribute Fv_System_Parameters.factsi_journal_attribute%TYPE;
72 
73     vg_public_law_attribute    fv_system_parameters.factsii_pub_law_code_attribute%TYPE;
74     vg_advance_type_attribute  fv_system_parameters.factsii_advance_type_attribute%TYPE;
75     vg_trf_dept_id_attribute   fv_system_parameters.factsii_tr_dept_id_attribute%TYPE;
76     vg_trf_main_acct_attribute fv_system_parameters.factsii_tr_main_acct_attribute%TYPE;
77 
78     vg_facts_attributes_setup  BOOLEAN ;
79 
80     vg_closing_period_num      Gl_Period_Statuses.period_num%TYPE;
81 ---------------------------------------------------------------------------------
82 ----------------------------------------------------------------
83   PROCEDURE insert_gl_interface_record(l_amount_dr IN NUMBER,
84                                        l_amount_cr IN NUMBER,
85                                        l_reference_1 IN VARCHAR2,
86                                        l_period_name IN VARCHAR2,
87                                        l_trading_partner IN VARCHAR2,
88 				       l_public_law_code IN VARCHAR2 DEFAULT NULL,
89 				       l_advance_type    IN VARCHAR2 DEFAULT NULL,
90 				       l_trf_dept_id     IN VARCHAR2 DEFAULT NULL,
91 				       l_trf_main_acct   IN VARCHAR2 DEFAULT NULL);
92 
93 -- ------------------------------------------------------------------
94 --                      Procedure Main
95 -- ------------------------------------------------------------------
96 -- Main procedure that is called from the Year End Closing Process
97 -- request set. This procedure calls all the subsequent procedures in
98 -- the Year End Closing process.
99 -- ------------------------------------------------------------------
100 PROCEDURE Main( errbuf                  OUT NOCOPY VARCHAR2,
101                 retcode                 OUT NOCOPY NUMBER,
102                 ledger_id                   NUMBER,
103                 time_frame                  VARCHAR2,
104                 fund_group                  VARCHAR2,
105                 treasury_symbol             VARCHAR2,
106                 closing_fyr                 NUMBER,
107                 journal_import	            VARCHAR2) IS
108  l_module_name         VARCHAR2(200) ;
109 BEGIN
110  l_module_name   :=  g_module_name || 'Main ';
111 
112  vg_sob_id := LEDGER_ID;
113 
114  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
115  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'START YEAR END CLOSING PROCESS.....');
116  END IF;
117 
118    -- Assign initial values
119    vp_retcode := 0;
120    vp_errbuf  := NULL;
121 
122    -- Load the parameter global variables
123    vp_timeframe   	:= time_frame;
124    vp_fundgroup   	:= fund_group;
125    vp_trsymbol   	:= treasury_symbol;
126    vp_closing_fyr   	:= closing_fyr;
127    vp_journal_import   	:= journal_import;
128 
129  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
130  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'THE PARAMETERS PASSED TO THE YEAR END CLOSING PROCESS ARE: '||
131   		'Submit Journal Import = '||vp_journal_import);
132    END IF;
133  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
134  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TIME FRAME = '||VP_TIMEFRAME||
135 
136    		', Fund Group = '||vp_fundgroup);
137    END IF;
138  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
139  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TREASURY SYMBOL = '||VP_TRSYMBOL||
140 
141    		', Closing Fiscal Year = '||TO_CHAR(vp_closing_fyr));
142    END IF;
143 
144    -- Get the Sob, Coa and Currency Code
145  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
146  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE SET OF BOOKS,CHART OF ACCOUNTS AND CURRENCY CODE');
147  END IF;
148    Get_Required_Parameters;
149 
150    IF (vp_retcode = 0) THEN
151       -- Get the Start Date, End Date and Last Period for the Closing Fyr
152  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
153  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE START DATE, END DATE AND LAST PERIOD '||
154 
155 				'of the Closing Fiscal Year');
156                  END IF;
157       Get_Closing_Fyr_Details;
158    END IF;
159 
160    IF (vp_retcode = 0) THEN
161       -- Check if Dynamic Insertion is on
162  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
163  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING IF DYNAMIC INSERTION IS ON.');
164  END IF;
165       Chk_Dynamic_Insertion;
166    END IF;
167 
168    IF (vp_retcode = 0) THEN
169       -- Get the balancing and the natural account segments
170  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
171  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE BALANCING AND THE NATURAL ACCOUNT SEGMENTS.');
172  END IF;
173       Get_Balance_Account_Segments;
174    END IF;
175 
176    IF (vp_retcode = 0) THEN
177       -- Check if there are any parent account values for the To Account
178  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
179  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING THE TO ACCOUNT VALUES IN THE SETUP FORM.....');
180  END IF;
181       Chk_To_Accounts;
182    END IF;
183 
184    IF (vp_retcode = 0) THEN
185       -- Purging the Fv_Ye_Seq_Bal_Temp Table
186  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
187  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PURGING THE FV_YE_SEQ_BAL_TEMP TABLE.');
188  END IF;
189       Purge_Bal_Temp_Table;
190    END IF;
191 
192    IF (vp_retcode = 0) THEN
193       -- Checking for the Year End Parameters
194  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
195  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING FOR THE YEAR END PARAMETERS.');
196  END IF;
197       Check_Year_End_Parameters;
198    END IF;
199 
200    IF (vp_retcode = 0) THEN
201       -- Checking for the data in GL
202  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
203  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING FOR THE DATA IN General Ledger.');
204  END IF;
205       Check_Gl_Data;
206    END IF;
207 
208    IF (vp_retcode = 0) THEN
209       IF (vp_journal_import = 'Y') THEN
210          -- Populating the GL_Interface table when submit_journal_import is Y
211 	 -- Process D
212  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
213  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'POPULATING THE GL_INTERFACE TABLE .');
214  END IF;
215          Populate_Gl_Interface;
216       END IF;
217    END IF;
218 
219    IF (vp_retcode = 0) THEN
220 	-- Submitting the Execution Report
221  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
222  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'SUBMITTING THE EXECUTION REPORT.');
223  END IF;
224 	Submit_Report;
225    END IF;
226 
227    IF vp_retcode <> 0 THEN
228         -- Check for errors
229         errbuf := vp_errbuf;
230         retcode := vp_retcode;
231         ROLLBACK;
232     ELSE
233       -- If public law code and other attributes are not set up
234       -- on the system parameters form, end with a warning.
235       IF NOT vg_facts_attributes_setup
236          THEN
237            retcode := 1;
238            errbuf := 'Year End Closing Process completed with warning because the Public Law, Advance,
239                       AND Transfer attribute COLUMNS are NOT established ON Define SYSTEM Parameters FORM.';
240             FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_ERROR, l_module_name,'Year End Closing Process completed with warning because the Public Law, Advance,
241                       AND Transfer attribute COLUMNS are NOT established ON Define SYSTEM Parameters FORM.');
242         ELSE
243 	   retcode := 0;
244 	   errbuf  := '** Year End Closing Process completed successfully **';
245       END IF;
246       COMMIT;
247    END IF;
248 
249  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
250  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'ENDING THE YEAR END CLOSING PROCESS ......');
251  END IF;
252 
253 EXCEPTION
254    WHEN OTHERS THEN
255 	ROLLBACK;
256         errbuf := '** Year End Closing Process Failed ** '||SQLERRM;
257         retcode := 2;
258         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
259            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
260                          'When Others Exception ' || errbuf );
261         END IF;
262 
263 END Main;
264 
265 -- ------------------------------------------------------------------
266 --                      Procedure Get_Required_Parameters
267 -- ------------------------------------------------------------------
268 -- Get_Required_Parameters procedure is called from Main procedure.
269 -- It gets the sob, coa and the currency code. It also checks for
270 -- the FACTSI Journal Trading Partner attribute for FACTS I processing.
271 -- ------------------------------------------------------------------
272 PROCEDURE Get_Required_Parameters IS
273   l_module_name         VARCHAR2(200) ;
274 BEGIN
275     l_module_name  :=  g_module_name ||
276                       ' Get_Required_Parameters';
277 
278    -- Get the Sob
279 /*   vg_sob_id := TO_NUMBER(Fnd_Profile.Value('GL_SET_OF_BKS_ID'));
280    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
281  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   SET OF BOOKS ID = '||TO_CHAR(VG_SOB_ID));
282    END IF;
283 
284    -- Get the Coa
285    vg_coa_id :=  Sys_Context('FV_CONTEXT','CHART_OF_ACCOUNTS_ID');
286    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
287  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CHART OF ACCOUNTS ID = '||TO_CHAR(VG_COA_ID));
288    END IF;
289 
290    -- Get the Currency code
291    BEGIN
292         SELECT currency_code
293         INTO vg_currency
294         FROM gl_sets_of_books
295         WHERE set_of_books_id = vg_sob_id;
296 
297    	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
298  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CURRENCY CODE = '||VG_CURRENCY);
299    	END IF;
300    EXCEPTION
301         WHEN NO_DATA_FOUND THEN
302             vp_errbuf := 'Error in Get_Required_Parameters:'||
303 	                ' Currency Code is not defined';
304             vp_retcode := 1;
305             RETURN;
306    END;
307 */
308 -- Get if  bal seg value option is enabled  for the ledger
309 --  BSV's are not always assigned to ledgers. Therefore we should not
310 --  enforce BSV assignemnt if there is no BSV flex value set
311 --  is assigned to a ledger.
312 -- Get the COA AND  Currency code
313    BEGIN
314         SELECT currency_code ,
315                 chart_of_accounts_id ,
316                 BAL_SEG_VALUE_OPTION_CODE
317         INTO vg_currency ,
318                 vg_coa_id,
319                 vg_bal_seg_val_opt_code
320         FROM     gl_ledgers_public_v
321       WHERE ledger_id = vg_sob_id;
322 
323 
324         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
325 FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
326                          l_module_name,
327                 '   CHART OF ACCOUNTS ID = '||TO_CHAR(VG_COA_ID));
328  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
329                  l_module_name,
330                 '   CURRENCY CODE = '||VG_CURRENCY);
331 FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
332                  l_module_name,
333                 '   BALANCE SEGMENT OPTION CODE = '|| vg_bal_seg_val_opt_code);
334         END IF;
335    EXCEPTION
336         WHEN NO_DATA_FOUND THEN
337             vp_errbuf := 'Error in Get_Required_Parameters:'||
338                         ' Currency Code and Chart of Accounts are not defined';
339             vp_retcode := 1;
340             RETURN;
341   END;
342 
343 
344 
345    BEGIN
346         SELECT factsi_journal_attribute,
347                factsii_pub_law_code_attribute,
348 	       factsii_advance_type_attribute,
349                factsii_tr_dept_id_attribute,
350 	       factsii_tr_main_acct_attribute
351         INTO   vg_factsi_attribute,
352                vg_public_law_attribute,
353                vg_advance_type_attribute,
354                vg_trf_dept_id_attribute,
355                vg_trf_main_acct_attribute
356         FROM   Fv_System_Parameters;
357 
358         IF (vg_factsi_attribute IS NULL) THEN
359  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
360  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES WILL NOT BE CLOSED BY '||
361 
362                         'the FACTS I F/N and trading partner attributes since the '||
363                         'FACTS I Journal Trading Partner field is not populated in '||
364                         'the Define Federal System Parameters window.');
365                          END IF;
366  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
367  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   TO CLOSE BY FACTS I F/N AND '||
368                          'trading partner attributes, delete the journal entries '||
369                         'created by this process, if any, enter the attribute in '||
370                         'the FACTS I Journal Trading Partner field of the Define '||
371                         'Federal System Parameters window, and rerun the Year End '||
372                         'Close Program.');
373                         END IF;
374 	     vg_factsi_attr_exists := 'N';
375         ELSE
376  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
377  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   FACTS I JOURNAL TRADING PARTNER ATTRIBUTE IS '||
378 
379 					vg_factsi_attribute);
380                  END IF;
381 	     vg_factsi_attr_exists := 'Y';
382         END IF;
383 
384         -- Set the global variable to false if public law code and other parameters
385         -- are not setup in the define system parameters form.
386         IF (vg_public_law_attribute IS NULL OR
387             vg_advance_type_attribute IS NULL OR
388             vg_trf_dept_id_attribute IS NULL OR
389             vg_trf_main_acct_attribute IS NULL)
390           THEN
391             vg_facts_attributes_setup := FALSE;
392          ELSE
393             vg_facts_attributes_setup := TRUE;
394         END IF;
395 
396    EXCEPTION
397         WHEN OTHERS THEN
398             vp_errbuf := 'Error in Get_Required_Parameters:'||
399 	                ' While determining the FACTS I Journal Attribute.';
400             vp_retcode := 2;
401    END;
402 
403 EXCEPTION
404      WHEN OTHERS THEN
405             vp_retcode := 2 ;
406             vp_errbuf  := SQLERRM||' -- Error in Get_Required_Parameters procedure.' ;
407             IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
408                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
409                          'When Others Exception ' || vp_errbuf );
410             END IF;
411             RETURN ;
412 END Get_Required_Parameters;
413 
414 
415 -- ------------------------------------------------------------------
416 --                      Procedure Get_Closing_Fyr_Details
417 -- ------------------------------------------------------------------
418 -- Get_Closing_Fyr_Details procedure is called from Main procedure.
419 -- It gets the start_date,end_date,last_period of the closing fyr.
420 -- It also checks to see if there are any records for the last period
421 -- of the closing year in Fv_Facts1_Period_Balances_v for
422 -- FACTS I processing.
423 -- ------------------------------------------------------------------
424 PROCEDURE Get_Closing_Fyr_Details IS
425  l_module_name         VARCHAR2(200) ;
426 BEGIN
427    l_module_name   :=  g_module_name ||
428                       ' Get_Closing_Fyr_Details';
429 
430    -- Get the Start Date and the End Date of the Closing Fyr
431    BEGIN
432 	SELECT MIN(start_date), MAX(end_date)
433 	INTO vg_start_date, vg_end_date
434 	FROM gl_periods glp, gl_sets_of_books gsob
435 	WHERE glp.period_year = vp_closing_fyr
436 	AND glp.period_set_name = gsob.period_set_name
437 	AND gsob.chart_of_accounts_id = vg_coa_id
438 	AND gsob.set_of_books_id = vg_sob_id;
439 
440 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
441  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   START DATE OF THE CLOSING FISCAL YEAR = '
442 				||TO_CHAR(vg_start_date));
443 	END IF;
444 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
445  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   END DATE OF THE CLOSING FISCAL YEAR = '
446 				||TO_CHAR(vg_end_date));
447 	END IF;
448    EXCEPTION
449 	WHEN OTHERS THEN
450             vp_retcode := 2 ;
451             vp_errbuf  := SQLERRM  ||' -- Error in Get_Closing_Fyr_Details '||
452 		'procedure,while getting the start/end date of closing fiscal year.';
453             RETURN ;
454    END;
455 
456    -- Get the Last Period of the Closing Fyr
457    BEGIN
458 	SELECT period_name, period_num
459 	INTO vg_closing_period, vg_closing_period_num
460 	FROM Gl_Period_Statuses
461 	WHERE ledger_id = vg_sob_id
462 	AND application_id = 101
463 	AND period_year = vp_closing_fyr
464 	AND period_num = (SELECT MAX(period_num)
465 			  FROM gl_period_statuses
466 			  WHERE ledger_id = vg_sob_id
467 			  AND application_id = 101
468 			  AND period_year = vp_closing_fyr);
469 
470 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
471  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   LAST PERIOD OF THE CLOSING FISCAL YEAR = '
472 				||vg_closing_period);
473  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   LAST PERIOD NUM OF THE CLOSING FISCAL YEAR = '
474 				||vg_closing_period_num);
475 	END IF;
476    EXCEPTION
477 	WHEN NO_DATA_FOUND THEN
478 	    vp_retcode := 1;
479 	    vp_errbuf  := 'Error in Get_Closing_Fyr_Details: '||
480 			'Last period is not defined for the Closing Fiscal Year.';
481 	    RETURN;
482 	WHEN OTHERS THEN
483             vp_retcode := 2 ;
484             vp_errbuf  := SQLERRM  ||
485 			' -- Error in Get_Closing_Fyr_Details procedure,'||
486 			'while getting the last period of closing fiscal year.';
487             RETURN ;
488    END;
489 
490    BEGIN
491 
492         SELECT COUNT(*)
493         INTO vg_factsi_bal_cnt
494         FROM Fv_Facts1_Run
495         WHERE period_num = vg_closing_period_num
496 	AND set_of_books_id = vg_sob_id
497 	AND fiscal_year = vp_closing_fyr;
498 
499         IF (vg_factsi_bal_cnt = 0) THEN
500  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
501  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES WILL NOT BE CLOSED BY '||
502 
503                         'the FACTS I F/N and trading partner attributes since there '||
504                         'are no balances in Fv_Facts1_Run table for '||
505                         'the period '||vg_closing_period);
506                          END IF;
507  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
508  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   TO CLOSE BY FACTS I F/N AND '||
509                         'trading partner attributes, delete the journal entries '||
510                         'created by this process, if any, run the FACTS I Interface '||
511                         'program with all edit checks passed by period '||
512                         vg_closing_period||' and rerun the Year End Close Program.');
513                          END IF;
514         ELSE
515  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
516  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES MAY EXIST FOR FACTS I '||
517                         'for the period '||vg_closing_period);
518                          END IF;
519         END IF;
520    EXCEPTION
521         WHEN OTHERS THEN
522             vp_errbuf := 'Error in Get_Closing_Fyr_Details:'||
523                         ' While determining whether balances exist for FACTS I. ';
524             vp_retcode := 2;
525    END;
526 EXCEPTION
527      WHEN OTHERS THEN
528         vp_errbuf := SQLERRM;
529         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
530            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
531                          'When Others Exception ' || vp_errbuf );
532         END IF;
533         RAISE;
534 
535 
536 END Get_Closing_Fyr_Details;
537 
538 
539 -- ------------------------------------------------------------------
540 --                      Procedure Chk_Dynamic_Insertion
541 -- ------------------------------------------------------------------
542 -- Chk_Dynamic_Insertion procedure is called from Main procedure.
543 -- It checks if dynamic insertion is turned on.
544 -- ------------------------------------------------------------------
545 PROCEDURE Chk_Dynamic_Insertion IS
546         l_module_name         VARCHAR2(200)  ;
547         e_nodynamic_insert  EXCEPTION;
548         vl_dyn_ins_flag  Fnd_Id_Flexs.dynamic_inserts_feasible_flag%TYPE;
549 BEGIN
550     l_module_name :=  g_module_name
551                            || ' Chk_Dynamic_Insertion';
552 
553   SELECT dynamic_inserts_feasible_flag
554   INTO vl_dyn_ins_flag
555   FROM Fnd_Id_Flexs
556   WHERE application_id = 101
557   AND  id_flex_code    = 'GL#';
558 
559   IF (vl_dyn_ins_flag = 'N') THEN
560    RAISE e_nodynamic_insert;
561   END IF;
562 
563 EXCEPTION
564         WHEN e_nodynamic_insert THEN
565           vp_retcode := 1;
566           vp_errbuf  := 'Error in Chk_Dynamic_Insertion:Dynamic Inserts '||
567 		'Feasible Flag is not set to Yes.';
568           RETURN;
569         WHEN OTHERS THEN
570           vp_retcode := 2;
571           vp_errbuf  := SQLERRM ||' -- Error in Chk_Dyanmic_Insertionprocedure.';
572           IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
573            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
574                          'When Others Exception ' || vp_errbuf );
575           END IF;
576           RETURN;
577 END Chk_Dynamic_Insertion;
578 
579 -- ------------------------------------------------------------------
580 --                      Procedure Get_Balance_Account_Segments
581 -- ------------------------------------------------------------------
582 -- Get_Balance_Account_Segments procedure is called from Main procedure.
583 -- It gets the balancing and natural account segments, and the
584 -- natural accounting segment number.
585 -- ------------------------------------------------------------------
586 PROCEDURE Get_Balance_Account_Segments IS
587 vl_errcode BOOLEAN;
588            l_module_name         VARCHAR2(200)  ;
589 CURSOR flex_fields IS
590   SELECT application_column_name
591   FROM   fnd_id_flex_segments
592   WHERE  id_flex_code = 'GL#'
593   AND    id_flex_num = vg_coa_id
594   ORDER BY segment_num;
595 
596 l_n_segments   NUMBER(4) := 0;
597 vl_acct_segnum number(4);
598 l_column_name  fnd_id_flex_segments.application_column_name%TYPE;
599 BEGIN
600 
601        l_module_name :=  g_module_name ||
602                                         'Get_Balance_Account_Segments ';
603   fv_utility.get_segment_col_names
604   (
605     chart_of_accounts_id	=> vg_coa_id,
606 		acct_seg_name		      => vg_acct_segment,
607 		balance_seg_name	    => vg_bal_segment,
608 		error_code		        => vl_errcode,
609 		error_message		      => vp_errbuf
610   );
611 
612   IF (vl_errcode) THEN
613     vp_retcode := 2 ;
614     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
615       FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
616     'Call fv_utility.get_segment_col_names' || vp_errbuf );
617     END IF;
618     RETURN;
619   END IF;
620 
621  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
622  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCING SEGMENT IS '||VG_BAL_SEGMENT);
623  END IF;
624  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
625  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NATURAL ACCOUNTING SEGMENT IS '||VG_ACCT_SEGMENT);
626  END IF;
627 
628      -- Get the Account segment number
629      FOR flex_fields_rec IN flex_fields
630      LOOP
631 
632        l_n_segments := l_n_segments + 1;
633        l_column_name := flex_fields_rec.application_column_name;
634 
635        --Get the natural account segment column position in array
636        IF (l_column_name = vg_acct_segment) THEN
637           vl_acct_segnum := l_n_segments;
638        END IF;
639      END LOOP;
640 
641      vg_acct_segnum := vl_acct_segnum;
642 
643    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
644  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NATURAL ACCOUNTING SEGMENT NUMBER IS '	||TO_CHAR(vg_acct_segnum));
645    END IF;
646 
647    -- Get the Account Flex Value set ID
648    BEGIN
649 	SELECT flex_value_set_id
650 	INTO vg_acct_val_set_id
651 	FROM Fnd_Id_Flex_Segments
652 	WHERE application_column_name = vg_acct_segment
653 	AND application_id = 101
654 	AND id_flex_code = 'GL#'
655 	AND id_flex_num = vg_coa_id
656 	AND enabled_flag = 'Y';
657    EXCEPTION
658 	WHEN OTHERS THEN
659 null;
660      --       vp_retcode := 2 ;
661      --       vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments '||
662      --		'procedure,while getting the Account Flex Value Set Id .';
663             RETURN ;
664 
665    END;
666    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
667  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   ACCOUNT FLEX VALUE SET ID IS '	||TO_CHAR(vg_acct_val_set_id));
668    END IF;
669 
670    -- Get the Number of segments in the chart of accounts
671    BEGIN
672 	SELECT COUNT(*)
673 	INTO vg_num_segs
674 	FROM Fnd_Id_Flex_Segments
675 	WHERE application_id = 101
676 	AND id_flex_code = 'GL#'
677 	AND id_flex_num = vg_coa_id
678 	AND enabled_flag = 'Y';
679    EXCEPTION
680 	WHEN OTHERS THEN
681             vp_retcode := 2 ;
682             vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments '||
683 		'procedure,while getting the number of segments .';
684             RETURN ;
685    END;
686    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
687  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NUMBER OF SEGMENTS ARE '  ||TO_CHAR(vg_num_segs));
688    END IF;
689 EXCEPTION
690      WHEN OTHERS THEN
691         vp_retcode := 2 ;
692         vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments
693 		PROCEDURE.' ;
694         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
695            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
696                          'When Others Exception ' || vp_errbuf );
697         END IF;
698 
699         RETURN ;
700 END Get_Balance_Account_Segments;
701 
702 -- ------------------------------------------------------------------
703 --                      Procedure Chk_To_Accounts
704 -- ------------------------------------------------------------------
705 -- Chk_To_Accounts procedure is called from Main procedure.
706 -- It checks if any of the To accounts are parent accounts.
707 -- ------------------------------------------------------------------
708 PROCEDURE Chk_To_Accounts IS
709    CURSOR get_toaccts_cur IS
710 	SELECT DISTINCT to_account
711 	FROM Fv_Ye_Sequence_Accounts
712 	WHERE set_of_books_id = vg_sob_id
713 	ORDER BY to_account;
714 
715    vl_parent_flag VARCHAR2(1) ;
716    vl_acct Fnd_Flex_Values_Vl.flex_value%TYPE;
717 
718    CURSOR get_parentflag_cur IS
719 	SELECT summary_flag
720 	FROM Fnd_Flex_Values_Vl
721 	WHERE flex_value_set_id = vg_acct_val_set_id
722 	AND flex_value = vl_acct;
723 
724   l_module_name         VARCHAR2(200)  ;
725 
726 
727 BEGIN
728 
729   l_module_name   :=  g_module_name || ' Chk_To_Accounts ';
730   vl_parent_flag  := 'N';
731 
732 
733  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
734  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN CHK_TO_ACCOUNTS PROCEDURE');
735  END IF;
736 
737    FOR vc_getaccts IN get_toaccts_cur LOOP
738 	vl_acct := vc_getaccts.to_account;
739 
740 	FOR vc_getparent IN get_parentflag_cur LOOP
741 	   IF (vc_getparent.summary_flag = 'Y') THEN
742 		vp_retcode := 2;
743 		vp_errbuf := 'Parent accounts have been defined for the '||
744 		    'To Account on the Year End Closing Setup form. Please '||
745 		    'define only child accounts for the To Account.';
746 		RETURN;
747 	   END IF;
748 	END LOOP;
749    END LOOP;
750 EXCEPTION
751      WHEN OTHERS THEN
752         vp_retcode := 2 ;
753         vp_errbuf  := SQLERRM  ||' -- Error in Chk_To_Accounts procedure.' ;
754         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
755            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
756                          'When Others Exception ' || vp_errbuf );
757         END IF;
758         RETURN ;
759 END Chk_To_Accounts;
760 
761 -- ------------------------------------------------------------------
762 --                      Procedure Purge_Bal_Temp_Table
763 -- ------------------------------------------------------------------
764 -- Purge_Bal_Temp_Table procedure is called from Main procedure.
765 -- It deletes from the Temp table.
766 -- ------------------------------------------------------------------
767 PROCEDURE Purge_Bal_Temp_Table IS
768              l_module_name      VARCHAR2(200)  ;
769 BEGIN
770 
771      l_module_name  :=  g_module_name ||'Purge_Bal_Temp_Table ';
772 
773      DELETE FROM Fv_Ye_Seq_Bal_Temp WHERE set_of_books_id = vg_sob_id;
774 
775      COMMIT;
776 EXCEPTION
777      WHEN OTHERS THEN
778         vp_retcode := 2 ;
779         vp_errbuf  := SQLERRM  ||' -- Error in Purge_Bal_Temp_Table procedure.' ;
780         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
781            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
782                          'When Others Exception ' || vp_errbuf );
783         END IF;
784 
785         RETURN ;
786 END Purge_Bal_Temp_Table;
787 
788 -- ------------------------------------------------------------------
789 --                      Procedure Check_Gl_Data
790 -- ------------------------------------------------------------------
791 -- Check_Gl_Data procedure is called from Main procedure.
792 -- It checks if there are any records in the Temp table.
793 -- ------------------------------------------------------------------
794 PROCEDURE Check_Gl_Data IS
795    vl_reccnt NUMBER;
796    l_module_name   VARCHAR2(200) ;
797    e_no_gldata EXCEPTION;
798 
799 BEGIN
800 
801     l_module_name  :=  g_module_name || 'Check_Gl_Data';
802 
803 
804      SELECT COUNT(*)
805      INTO vl_reccnt
806      FROM Fv_Ye_Seq_Bal_Temp
807      WHERE set_of_books_id = vg_sob_id;
808 
809      IF (vl_reccnt = 0) THEN
810 	RAISE e_no_gldata;
811      END IF;
812 EXCEPTION
813      WHEN e_no_gldata THEN
814 	vp_retcode := 1;
815         vp_errbuf := 'Year End Closing Process has successfully completed,'||
816 		' but there was no data found in General Ledger, for the Year '||
817 		'End account definitions. Journal Import has not been submitted.';
818 
819      WHEN OTHERS THEN
820         vp_retcode := 2 ;
821         vp_errbuf  := SQLERRM  ||' -- Error in Check_Gl_Date procedure.' ;
822         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
823            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
824                          'When Others Exception ' || vp_errbuf );
825         END IF;
826         RETURN ;
827 END Check_Gl_Data;
828 
829 -- ------------------------------------------------------------------
830 --                      Procedure Check_Year_End_Parameters
831 -- ------------------------------------------------------------------
832 -- Check_Year_End_Parameters procedure is called from Main procedure.
833 -- It checks what are the input parameters passed to the Year End
834 -- Process, specifically whether Trsymbol, timeframe and fundgroup
835 -- are provided as input parameters.Based on the parameters provided
836 -- it derives the others and then calls Get_Year_End_Record procedure.
837 -- ------------------------------------------------------------------
838 PROCEDURE Check_Year_End_Parameters
839         IS
840    TYPE t_checkpara IS REF CURSOR;
841    vc_checkpara t_checkpara;
842 
843    vl_trsymbol	Fv_Treasury_Symbols.treasury_symbol%TYPE;
844    vl_timeframe	Fv_Treasury_Symbols.time_frame%TYPE	;
845    vl_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
846    vl_exp_date	Fv_Treasury_Symbols.expiration_date%TYPE;
847    vl_can_date	Fv_Treasury_Symbols.cancellation_date%TYPE;
848    vl_rec_found_flag  VARCHAR2(1) ;
849    vl_fundgroup_temp	Fv_Treasury_Symbols.fund_group_code%TYPE;
850    l_module_name         VARCHAR2(200)  ;
851 
852 BEGIN
853 
854    l_module_name    :=  g_module_name ||  'Check_Year_End_Parameters  ';
855     vl_rec_found_flag := 'N';
856 
857 
858 
859    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
860  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN CHECK_YEAR_END_PARAMETERS PROCEDURE '||
861 	'with the following Parameters passed to the process:');
862    END IF;
863    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
864  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   TREASURY SYMBOL = '||VP_TRSYMBOL||
865 			', Fund Group Code = '||vp_fundgroup||
866    			', Time Frame = '||vp_timeframe);
867    END IF;
868 
869 -- check if all fund_values are valid for the General Ledger
870 
871 Check_bal_seg_value( vp_fundgroup,
872                                       vp_timeframe,
873                                        vp_trsymbol   ,
874                                        vg_sob_id,
875                                        vg_end_date ) ;
876 
877 
878    IF (vp_trsymbol IS NOT NULL) THEN
879 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
880  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE1: WHEN TREASURY SYMBOL PARAMETER IS PROVIDED.');
881 	END IF;
882 
883 	OPEN vc_checkpara FOR
884 	    'SELECT time_frame,fund_group_code,
885 		   expiration_date,cancellation_date
886 	    FROM Fv_Treasury_Symbols
887 	    WHERE treasury_symbol = :trsymbol
888 	    AND set_of_books_id   = :sob'
889 	USING vp_trsymbol,vg_sob_id;
890 
891 	FETCH vc_checkpara INTO vl_timeframe, vl_fundgroup,
892 		vl_exp_date, vl_can_date;
893 
894 	IF ((vl_exp_date > vg_end_date) AND (vl_can_date > vg_end_date)
895 	  AND (vl_timeframe NOT IN ('MULTIPLE','NO_YEAR'))) THEN
896         	vp_retcode := 1 ;
897         	vp_errbuf  := 'The Treasury Symbol '||vp_trsymbol
898 			||' is neither Expired nor Cancelled nor a Multi-Year'||
899 			' or a No-Year Symbol.';
900 		vp_errbuf := vp_errbuf || ' Year End Processing is not '||
901 			'done for this Treasury Symbol. ';
902 
903 		IF vc_checkpara%ISOPEN THEN
904 		   CLOSE vc_checkpara;
905 		END IF;
906         	RETURN ;
907 	ELSE
908 		-- Process A
909 		Get_Year_End_Record(vp_trsymbol,vl_fundgroup,vl_timeframe);
910 		IF (vp_retcode <> 0) THEN
911 		   RAISE e_error;
912 		END IF;
913 	END IF;
914 
915 	CLOSE vc_checkpara;
916 
917    ELSIF (vp_fundgroup IS NOT NULL) THEN  -- vp_trsymbol
918 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
919  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE2: WHEN FUND GROUP CODE PARAMETER IS PROVIDED.');
920 	END IF;
921 
922         -- IF timeframe is one year, then only the treasury symbols which are
923  	-- either expired or cancelled are selected for processsing. For multi-year
924 	-- and no-year timeframes, the unexpired treasury symbols also need to be
925 	-- processed. Bug 2527452.
926 	IF (vp_timeframe = 'SINGLE') THEN   	-- timeframe 1
927 		OPEN vc_checkpara FOR
928 		   'SELECT treasury_symbol
929 		    FROM Fv_Treasury_symbols
930 		    WHERE set_of_books_id = :sob
931 		    AND time_frame = :timeframe
932 		    AND fund_group_code = :fundgroup
933 		    AND ((expiration_date <= :end_date)
934 				OR (cancellation_date <= :end_date))
935     		    ORDER BY treasury_symbol'
936 		USING vg_sob_id,
937                       vp_timeframe,
938                       vp_fundgroup,
939                       vg_end_date,
940                       vg_end_date;
941 
942 	ELSE					-- timeframe 1
943 		OPEN vc_checkpara FOR
944 		   'SELECT treasury_symbol
945 		    FROM Fv_Treasury_symbols
946 		    WHERE set_of_books_id = :sob_id
947 		    AND time_frame = :timeframe
948 		    AND fund_group_code = :fundgroup
949     		    ORDER BY treasury_symbol'
950 		USING vg_sob_id,vp_timeframe,vp_fundgroup;
951 	END IF;					-- timeframe 1
952    ELSE  -- vp_trsymbol
953 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
954  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE3: WHEN ONLY THE TIME FRAME PARAMETER IS PROVIDED.');
955 	END IF;
956 
957         -- IF timeframe is one year, then only the treasury symbols which are
958  	-- either expired or cancelled are selected for processsing. For multi-year
959 	-- and no-year timeframes, the unexpired treasury symbols also need to be
960 	-- processed. Bug 2527452.
961 	IF (vp_timeframe = 'SINGLE') THEN   	-- timeframe 2
962 		OPEN vc_checkpara FOR
963 		   'SELECT treasury_symbol,fund_group_code
964 		    FROM Fv_Treasury_symbols
965 		    WHERE set_of_books_id = :sob_id
966 		    AND time_frame = :timeframe
967 		    AND ((expiration_date <= :end_date)
968 			OR (cancellation_date <= :end_date))
969     		    ORDER BY treasury_symbol'
970 		USING vg_sob_id,vp_timeframe,vg_end_date,vg_end_date;
971 	ELSE					-- timeframe 2
972 		OPEN vc_checkpara FOR
973 		   'SELECT treasury_symbol,fund_group_code
974 		    FROM Fv_Treasury_symbols
975 		    WHERE set_of_books_id = :sob_id
976 		    AND time_frame = :timeframe
977     		    ORDER BY treasury_symbol'
978 		USING vg_sob_id,vp_timeframe;
979 	END IF;					-- timeframe 2
980 
981    END IF; -- vp_trsymbol
982 
983    IF (vp_trsymbol IS NULL) THEN  -- vp_trsymbol NULL
984 	LOOP
985 	   IF (vp_fundgroup IS NOT NULL) THEN
986 	   	FETCH vc_checkpara INTO vl_trsymbol;
987 	   ELSE
988 		FETCH vc_checkpara INTO vl_trsymbol, vl_fundgroup;
989 	   END IF;
990 
991 
992 	   IF vc_checkpara%FOUND THEN
993 		vl_rec_found_flag := 'Y';
994 
995 		IF (vp_fundgroup IS NULL) THEN
996 		    vl_fundgroup_temp := vl_fundgroup;
997 		ELSE
998 		    vl_fundgroup_temp := vp_fundgroup;
999 		END IF;
1000 
1001 		-- Process A
1002 		Get_Year_End_Record(vl_trsymbol,vl_fundgroup_temp,vp_timeframe);
1003 
1004 		IF (vp_retcode <> 0) THEN
1005 		   RAISE e_error;
1006 		END IF;
1007 	   ELSE
1008 		IF (vl_rec_found_flag = 'N') THEN
1009 		    vp_retcode := 1;
1010 		    IF (vp_fundgroup IS NOT NULL) THEN
1011 		       vp_errbuf  := 'No Treasury Symbols found for '||
1012 			    'the given Appropriation Group '||vp_fundgroup||
1013 			    ' and the given Appropriation Time Frame '||vp_timeframe;
1014 		    ELSE
1015 		       vp_errbuf  := 'No Treasury Symbols found for the '||
1016 				'given Appropriation Time Frame '||vp_timeframe;
1017 		    END IF;
1018 		    RETURN;
1019 		ELSE
1020 		    EXIT;
1021 		END IF; -- vl_rec_found_flag
1022 	   END IF; -- vc_checkpara
1023 	END LOOP;
1024 
1025 	CLOSE vc_checkpara;
1026 
1027    END IF;  -- vp_trsymbol NULL
1028 
1029 EXCEPTION
1030    WHEN e_error THEN
1031         IF vc_checkpara%ISOPEN THEN
1032 	      CLOSE vc_checkpara;
1033         END IF;
1034 	RETURN;
1035 
1036    WHEN OTHERS THEN
1037         vp_retcode := 2 ;
1038         vp_errbuf  := SQLERRM  ||' -- Error in Check_Year_End_Parameters procedure.' ;
1039         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1040            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1041                          'When Others Exception ' || vp_errbuf );
1042         END IF;
1043 
1044         RETURN ;
1045 END Check_Year_End_Parameters;
1046 
1047 -- ------------------------------------------------------------------
1048 --                      Procedure Get_Year_End_Record
1049 -- ------------------------------------------------------------------
1050 -- Get_Year_End_Record procedure is called from
1051 -- Check_Year_End_Parameters procedure.
1052 -- It gets the treasury_symbol_id and then the group_id from
1053 -- fv_ye_groups table. And then calls the Get_Fund_Value procedure.
1054 -- ------------------------------------------------------------------
1055 PROCEDURE Get_Year_End_Record(trsymbol	VARCHAR2,
1056 			      fundgroup VARCHAR2,
1057 			      timeframe VARCHAR2 ) IS
1058    CURSOR get_trsymid_cur IS
1059 	SELECT treasury_symbol_id
1060 	FROM Fv_Treasury_Symbols
1061 	WHERE treasury_symbol = trsymbol
1062 	AND set_of_books_id = vg_sob_id;
1063 
1064    TYPE t_getgroupid IS REF CURSOR;
1065    vc_groupid t_getgroupid;
1066     l_module_name         VARCHAR2(200)  ;
1067 
1068 BEGIN
1069 
1070    l_module_name  :=  g_module_name || 'Get_Year_End_Record ';
1071 
1072 
1073 
1074 
1075  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1076  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     ******************************************************');
1077  END IF;
1078  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1079  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN GET_YEAR_END_RECORD PROCEDURE,'||
1080 
1081 		'processing the following:');
1082          END IF;
1083  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1084  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     TREASURY SYMBOL: '||TRSYMBOL||' FUND GROUP: '||
1085 
1086 		fundgroup||' Time Frame: '||timeframe);
1087          END IF;
1088 
1089    -- Assign the input parameter trsymbol to vg_trsymbol, so that this can be
1090    -- used in the Log messages.
1091    vg_trsymbol := trsymbol;
1092    vg_fundgroup := fundgroup;
1093 
1094    -- Get the Treasury Symbol ID
1095    OPEN get_trsymid_cur;
1096    FETCH get_trsymid_cur INTO vg_trsymbol_id;
1097    CLOSE get_trsymid_cur;
1098    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1099  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     PROCESSING THE TREASURY_SYMBOL_ID '||
1100 			TO_CHAR(vg_trsymbol_id));
1101    END IF;
1102 
1103    OPEN vc_groupid FOR
1104      'SELECT group_id
1105       FROM Fv_Ye_Groups
1106       WHERE treasury_symbol_id = :trsymbol_id
1107       AND fund_group_code = :fundgroup
1108       AND fund_time_frame = :timeframe
1109       AND set_of_books_id = :sob_id'
1110    USING vg_trsymbol_id,fundgroup,timeframe,vg_sob_id;
1111 
1112    FETCH vc_groupid INTO vg_group_id;
1113 
1114    IF vc_groupid%FOUND THEN  --vc_groupid(1)
1115       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1116  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID FOUND FOR TIMEFRAME '||TIMEFRAME||
1117 		' and Fund Group '||fundgroup||' and Treasury Symbol '||
1118 		trsymbol||' is '||TO_CHAR(vg_group_id));
1119       END IF;
1120 
1121    ELSE  --vc_groupid(1)
1122       CLOSE vc_groupid;
1123 
1124       -- Looking for group_id for timeframe and fundgroup parameters
1125       OPEN vc_groupid FOR
1126        'SELECT group_id
1127         FROM Fv_Ye_Groups
1128         WHERE treasury_symbol_id IS NULL
1129         AND fund_group_code = :fundgroup
1130         AND fund_time_frame = :timeframe
1131         AND set_of_books_id = :sob_id'
1132       USING fundgroup,timeframe,vg_sob_id;
1133 
1134       FETCH vc_groupid INTO vg_group_id;
1135 
1136       IF vc_groupid%FOUND THEN  --vc_groupid(2)
1137          IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1138  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID FOUND FOR TIME FRAME '||TIMEFRAME||
1139 		' and Fund Group '||fundgroup||' is '||TO_CHAR(vg_group_id));
1140          END IF;
1141 
1142       ELSE  --vc_groupid(2)
1143          CLOSE vc_groupid;
1144 
1145          -- Looking for group_id for just the timeframe parameter
1146          OPEN vc_groupid FOR
1147     	  'SELECT group_id
1148            FROM Fv_Ye_Groups
1149            WHERE treasury_symbol_id IS NULL
1150            AND fund_group_code IS NULL
1151            AND fund_time_frame = :timeframe
1152            AND set_of_books_id = :sob_id'
1153 	 USING timeframe,vg_sob_id;
1154 
1155          FETCH vc_groupid INTO vg_group_id;
1156 
1157          IF vc_groupid%FOUND THEN  --vc_groupid(3)
1158             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1159  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID FOUND FOR THE TIME FRAME '||TIMEFRAME||
1160 			' is '||TO_CHAR(vg_group_id));
1161             END IF;
1162 
1163 	 ELSE  --vc_groupid(3)
1164 	    CLOSE vc_groupid;
1165 
1166  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1167  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     YEAR END CLOSE RECORD IS NOT DEFINED '||
1168 
1169 			'for any of the combination of :');
1170              END IF;
1171  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1172  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     TIMEFRAME: '||TIMEFRAME||
1173 
1174 			', Fund Group: '||fundgroup||', Treasury Symbol: '||trsymbol);
1175         END IF;
1176  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1177  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     PROCESSING THE NEXT TREASURY SYMBOL....');
1178  END IF;
1179 
1180 	    -- Process the next treasury symbol
1181 	    RETURN;
1182 	 END IF;  --vc_groupid(3)
1183       END IF; --vc_groupid(2)
1184    END IF; --vc_groupid(1)
1185 
1186    CLOSE vc_groupid;
1187 
1188    Get_Fund_Value;
1189 
1190    IF (vp_retcode <> 0) THEN
1191 	RAISE e_error;
1192    END IF;
1193 
1194 EXCEPTION
1195    WHEN e_error THEN
1196         IF vc_groupid%ISOPEN THEN
1197 	      CLOSE vc_groupid;
1198         END IF;
1199 	RETURN;
1200 
1201    WHEN OTHERS THEN
1202         IF vc_groupid%ISOPEN THEN
1203 	      CLOSE vc_groupid;
1204         END IF;
1205         vp_retcode := 2 ;
1206         vp_errbuf  := SQLERRM  ||' -- Error in Get_Year_End_Record procedure.' ;
1207         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1208            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1209                          'When Others Exception ' || vp_errbuf );
1210         END IF;
1211 
1212         RETURN ;
1213 END Get_Year_End_Record;
1214 
1215 -- ------------------------------------------------------------------
1216 --                      Procedure Get_Fund_Value
1217 -- ------------------------------------------------------------------
1218 -- Get_Fund_Value procedure is called from Get_Year_End_Record procedure.
1219 -- It gets all the fund values for the Trsymbol that is processed.
1220 -- It then calls Determine_Acct_Flag procedure. If journal import is 'Y' then,
1221 -- it calls the Update_Closing_Status procedure.
1222 -- ------------------------------------------------------------------
1223 PROCEDURE Get_Fund_Value IS
1224 
1225    CURSOR get_fund_cur IS
1226 	SELECT fund_value
1227 	FROM Fv_Fund_Parameters
1228 	WHERE treasury_symbol_id = vg_trsymbol_id
1229 	AND set_of_books_id = vg_sob_id;
1230 
1231    vl_rec_found_flag VARCHAR2(1) ;
1232   l_module_name         VARCHAR2(200);
1233 
1234 BEGIN
1235    vl_rec_found_flag  := 'N';
1236 
1237    l_module_name          :=  g_module_name ||'Get_Fund_Value ';
1238  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1239  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       IN GET_FUND_VALUE PROC WITH TREASURY SYMBOL ID '||
1240 
1241 				TO_CHAR(vg_trsymbol_id));
1242                  END IF;
1243   OPEN get_fund_cur;
1244   LOOP
1245     FETCH get_fund_cur INTO vg_fund_value;
1246  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1247  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       --------------------------------------------------');
1248  END IF;
1249 
1250     IF get_fund_cur%FOUND THEN   -- get_fund_cur%found
1251  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1252  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       PROCESSING THE FUND '||VG_FUND_VALUE||
1253 
1254 		' for the Treasury Symbol '||vg_trsymbol);
1255          END IF;
1256 
1257 	vl_rec_found_flag := 'Y';
1258 
1259 	-- Process B
1260 	Determine_Acct_Flag;
1261 
1262 	IF (vp_retcode <> 0) THEN
1263 	   RAISE e_error;
1264 	END IF;
1265 
1266 	-- Process C
1267 	IF (vp_journal_import = 'Y') THEN
1268 	   Update_Closing_Status;
1269 
1270 	   IF (vp_retcode <> 0) THEN
1271 	     RAISE e_error;
1272 	   END IF;
1273 	END IF;
1274 
1275     ELSE    -- get_fund_cur%found
1276 	IF (vl_rec_found_flag = 'N') THEN
1277 	   IF (vp_trsymbol IS NOT NULL) THEN
1278  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1279  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO FUND VALUE FOUND FOR THE TREASURY SYMBOL '
1280 
1281 				||vg_trsymbol);
1282                  END IF;
1283 	      vp_retcode := 1;
1284 	      vp_errbuf := 'No Fund Value found for the Treasury Symbol '||
1285 				vg_trsymbol;
1286 	   ELSE
1287  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1288  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO FUND VALUE FOUND FOR THE TREASURY SYMBOL '
1289 				||vg_trsymbol);
1290                  END IF;
1291 	   END IF;
1292 	   RETURN;
1293         ELSE
1294 	   EXIT;
1295 	END IF;
1296     END IF; -- get_fund_cur%found
1297 
1298   END LOOP;
1299   CLOSE get_fund_cur;
1300 
1301 EXCEPTION
1302    WHEN e_error THEN
1303         IF get_fund_cur%ISOPEN THEN
1304 	      CLOSE get_fund_cur;
1305         END IF;
1306 	RETURN;
1307 
1308    WHEN OTHERS THEN
1309         IF get_fund_cur%ISOPEN THEN
1310 	      CLOSE get_fund_cur;
1311         END IF;
1312         vp_retcode := 2 ;
1313         vp_errbuf  := SQLERRM  ||' -- Error in Get_Fund_Value procedure.' ;
1314         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1315            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1316                          'When Others Exception ' || vp_errbuf );
1317         END IF;
1318 
1319         RETURN ;
1320 
1321 END Get_Fund_Value;
1322 
1323 -- ------------------------------------------------------------------
1324 --                      Procedure Determine_Acct_Flag
1325 -- ------------------------------------------------------------------
1326 -- Determine_Acct_Flag procedure is called from Get_Fund_Value procedure.
1327 -- It determines whether the fund is expired,canceled or carryover.
1328 -- It then calls the Get_Year_End_SeqAcct_Info procedure.
1329 -- ------------------------------------------------------------------
1330 PROCEDURE Determine_Acct_Flag IS
1331    CURSOR acctflag_cur IS
1332 	SELECT fts.expiration_date,
1333 	       fts.cancellation_date,
1334 	       fts.time_frame
1335 	FROM Fv_Treasury_Symbols fts, Fv_Fund_Parameters ffp
1336 	WHERE fts.treasury_symbol_id = vg_trsymbol_id
1337 	AND fts.treasury_symbol_id = ffp.treasury_symbol_id
1338 	AND ffp.fund_value = vg_fund_value
1339 	AND fts.treasury_symbol_id = ffp.treasury_symbol_id
1340 	AND fts.set_of_books_id = vg_sob_id
1341 	AND ffp.set_of_books_id = fts.set_of_books_id;
1342 
1343   vl_exp_date Fv_Treasury_Symbols.expiration_date%TYPE;
1344   vl_can_date Fv_Treasury_Symbols.cancellation_date%TYPE;
1345   vl_timeframe Fv_Treasury_Symbols.time_frame%TYPE;
1346   vl_status_flag VARCHAR2(1);
1347   l_module_name         VARCHAR2(200) ;
1348 BEGIN
1349 
1350    l_module_name :=  g_module_name || 'Determine_Acct_Flag '   ;
1351 
1352  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1353  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         IN THE DETERMINE_ACCT_FLAG PROCEDURE:WITH TREASURY '||
1354 
1355 		'Symbol = '||vg_trsymbol||' and Fund Value = '||vg_fund_value);
1356          END IF;
1357 
1358    -- Get the expiration and cancellation date for the treasury symbol
1359    OPEN acctflag_cur;
1360    FETCH acctflag_cur INTO vl_exp_date,vl_can_date,vl_timeframe;
1361    CLOSE acctflag_cur;
1362 
1363    -- Determing whether the fund is expired, cancelled or unexpired
1364    IF ((vl_exp_date <= vg_end_date) AND (vl_can_date <= vg_end_date)) THEN
1365 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1366  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS BOTH EXPIRED AND CANCELLED...');
1367 	END IF;
1368 	-- Set status flag to B(both expired and cancelled)
1369 	vl_status_flag := 'B';
1370    ELSIF ((vl_exp_date <= vg_end_date) AND (vl_can_date > vg_end_date)) THEN
1371 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1372  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS EXPIRED BUT NOT CANCELLED...');
1373 	END IF;
1374 	-- Set status flag to E(expired)
1375 	vl_status_flag := 'E';
1376    ELSIF ((vl_exp_date > vg_end_date) AND (vl_can_date <= vg_end_date)) THEN
1377 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1378  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS CANCELLED BUT NOT EXPIRED...');
1379 	END IF;
1380 	-- Set status flag to C(cancelled)
1381 	vl_status_flag := 'C';
1382    ELSIF (vl_timeframe IN ('NO_YEAR','MULTIPLE')) THEN
1383 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1384  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS UNEXPIRED...');
1385 	END IF;
1386 	-- Set status flag to U(unexpired)
1387 	vl_status_flag := 'U';
1388    END IF;
1389    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1390  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VL_STATUS_FLAG '||VL_STATUS_FLAG);
1391    END IF;
1392 
1393    -- Based on status flag, set vg_acct_flag and call Get_Year_End_SeqAcct_Info proc
1394    IF (vl_status_flag = 'B') THEN
1395 	-- Process all expired records first and then Cancelled records
1396         FOR i IN 1..2 LOOP
1397 		SELECT DECODE(i,1,'Expired',2,'Canceled')
1398 		INTO vg_acct_flag
1399 		FROM DUAL;
1400   		IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1401  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VG_ACCT_FLAG '||VG_ACCT_FLAG);
1402   		END IF;
1403 
1404   		-- Get the Sequence Information
1405 		Get_Year_End_SeqAcct_Info;
1406 
1407   		IF (vp_retcode <> 0) THEN
1408            		RAISE e_error;
1409   		END IF;
1410 	END LOOP;
1411    ELSE
1412 	SELECT DECODE(vl_status_flag,'E','Expired','C','Canceled','U','Unexpired')
1413 	INTO vg_acct_flag
1414 	FROM DUAL;
1415  	 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1416  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VG_ACCT_FLAG '||VG_ACCT_FLAG);
1417  	 END IF;
1418 
1419   	-- Get the Sequence Information
1420 	Get_Year_End_SeqAcct_Info;
1421 
1422   	IF (vp_retcode <> 0) THEN
1423        		RAISE e_error;
1424   	END IF;
1425    END IF;
1426 
1427 EXCEPTION
1428    WHEN e_error THEN
1429 	RETURN;
1430 
1431    WHEN OTHERS THEN
1432         vp_retcode := 2 ;
1433         vp_errbuf  := SQLERRM  ||' -- Error in Detemine_Acct_Flag procedure.' ;
1434         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1435                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1436                          'When Others Exception ' || vp_errbuf );
1437         END IF;
1438 
1439         RETURN ;
1440 END Determine_Acct_Flag;
1441 
1442 -- ------------------------------------------------------------------
1443 --                      Procedure Get_Year_End_SeqAcct_Info
1444 -- ------------------------------------------------------------------
1445 -- Get_Year_End_SeqAcct_Info procedure is called from Determine_Acct_Flag
1446 -- procedure. It gets the sequences, and for each sequence it gets the
1447 -- account entries and processes them.It then calls the procedure
1448 -- Determine_Child_Accounts for each account entry.
1449 -- ------------------------------------------------------------------
1450 PROCEDURE Get_Year_End_SeqAcct_Info IS
1451 
1452    CURSOR get_seq_cur IS
1453 	SELECT sequence_id,SEQUENCE
1454 	FROM Fv_Ye_Group_Sequences
1455 	WHERE group_id = vg_group_id
1456 	AND set_of_books_id = vg_sob_id
1457 	ORDER BY SEQUENCE;
1458 
1459    CURSOR get_acct_cur IS
1460 	SELECT from_account,to_account
1461 	FROM Fv_Ye_Sequence_Accounts
1462 	WHERE sequence_id = vg_seq_id
1463 	AND account_flag = vg_acct_flag
1464 	AND set_of_books_id = vg_sob_id
1465 	ORDER BY order_by_ctr;
1466 
1467    CURSOR get_count_cur IS
1468 	SELECT COUNT(*)
1469 	FROM Fv_Ye_Sequence_Accounts
1470 	WHERE sequence_id = vg_seq_id
1471 	AND set_of_books_id = vg_sob_id;
1472 
1473    vl_seqrec_flag VARCHAR2(1) ;
1474    vl_acctrec_flag VARCHAR2(1) ;
1475    vl_cnt NUMBER ;
1476    l_module_name         VARCHAR2(200)  ;
1477 
1478 BEGIN
1479 
1480   l_module_name :=  g_module_name || '  Get_Year_End_SeqAcct_Info ';
1481   vl_seqrec_flag  := 'N';
1482   vl_acctrec_flag :=  'N';
1483   vl_cnt := 0;
1484 
1485 
1486 
1487 
1488  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1489  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'           IN THE GET_YEAR_END_SEQACCT_INFO PROCEDURE...');
1490  END IF;
1491 
1492    OPEN get_seq_cur;
1493    LOOP						-- getseq loop
1494       FETCH get_seq_cur INTO vg_seq_id, vg_seq;
1495 
1496       IF get_seq_cur%FOUND THEN 		-- get_seq_cur
1497         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1498  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING SEQUENCE '||TO_CHAR(VG_SEQ)||
1499 			' and sequence_id '||TO_CHAR(vg_seq_id));
1500         END IF;
1501 
1502 	vl_seqrec_flag := 'Y';
1503 
1504 	OPEN get_acct_cur;
1505 	LOOP					-- getacct loop
1506           FETCH get_acct_cur INTO vg_from_acct,vg_to_acct;
1507 
1508 	  IF get_acct_cur%FOUND THEN 		-- get_acct_cur
1509              IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1510  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING THE RECORD WITH ACCOUNT '||
1511 		'flag:'||vg_acct_flag||', From Account:'||vg_from_acct
1512 		||', To Account:'|| vg_to_acct);
1513              END IF;
1514 
1515 	     vl_acctrec_flag := 'Y';
1516 
1517 	     -- Call Determine_Child_Accounts;
1518 	     Determine_Child_Accounts;
1519 
1520   	     IF (vp_retcode <> 0) THEN
1521            	RAISE e_error;
1522   	     END IF;
1523 	  ELSE  				-- get_acct_cur
1524 	     IF (vl_acctrec_flag = 'N') THEN
1525 		OPEN get_count_cur;
1526 		FETCH get_count_cur INTO vl_cnt;
1527 		CLOSE get_count_cur;
1528 
1529 		IF (vl_cnt > 0) THEN
1530  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1531  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             NO ACCOUNT INFORMATION FOUND '||
1532 			'with '||vg_acct_flag||' appropriation status for '||
1533 			'the Sequence '||TO_CHAR(vg_seq));
1534              END IF;
1535 		ELSE
1536  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1537  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             NO ACCOUNT INFORMATION FOUND '||
1538 			'for the Sequence '||TO_CHAR(vg_seq));
1539              END IF;
1540 		END IF;
1541 		--RETURN;
1542 	     ELSE
1543 		IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1544  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,
1545  '             PROCESSING IS DONE FOR THE SEQUENCE '
1546 			||TO_CHAR(vg_seq));
1547 		END IF;
1548 		--EXIT;
1549 	     END IF;
1550 	     EXIT;
1551     	  END IF; 				-- get_acct_cur
1552 
1553 	END LOOP;    				-- getacct loop
1554 	CLOSE get_acct_cur;
1555       ELSE 					-- get_seq_cur
1556 	IF (vl_seqrec_flag = 'N') THEN
1557  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1558  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'           NO SEQUENCES FOUND FOR THE GROUP ID '
1559 			||TO_CHAR(vg_group_id));
1560              END IF;
1561 	   RETURN;
1562 	ELSE
1563  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1564  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING IS DONE FOR THE GROUP ID '
1565 
1566 			||TO_CHAR(vg_group_id));
1567              END IF;
1568 	   EXIT;
1569 	END IF;
1570       END IF; 					-- get_seq_cur
1571    END LOOP;   					-- getseq loop
1572    CLOSE get_seq_cur;
1573 
1574 EXCEPTION
1575    WHEN e_error THEN
1576 	IF get_acct_cur%ISOPEN THEN
1577 	   CLOSE get_acct_cur;
1578 	END IF;
1579 	RETURN;
1580 
1581    WHEN OTHERS THEN
1582         vp_retcode := 2 ;
1583         vp_errbuf  := SQLERRM  ||' -- Error in Get_Year_End_SeqAcct_Info procedure.' ;
1584         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1585                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1586                          'When Others Exception ' || vp_errbuf );
1587         END IF;
1588         RETURN ;
1589 
1590 END Get_Year_End_SeqAcct_Info;
1591 
1592 
1593 -- ------------------------------------------------------------------
1594 --                      Procedure Determine_Child_Accounts
1595 -- ------------------------------------------------------------------
1596 -- Determine_Child_Accounts procedure is called from Get_Year_End_SeqAcct_Info
1597 -- procedure. For a record with year_entry= Closing, this procedure
1598 -- gets the balance_read_flag from the Temp table, and then calls
1599 -- Get_Balances procedure. For a record with year_entry = Carryover,
1600 -- it calculates the balances from the previous entry, and then
1601 -- calls the procedure Determine_DrCr.
1602 -- ------------------------------------------------------------------
1603 PROCEDURE Determine_Child_Accounts IS
1604     vl_parent_cnt NUMBER;
1605     vl_child_low Fnd_Flex_Values_Vl.flex_value%TYPE;
1606     vl_child_high Fnd_Flex_Values_Vl.flex_value%TYPE;
1607 
1608     TYPE t_getbal_cnt IS REF CURSOR;
1609     vc_getbal_cnt t_getbal_cnt;
1610     vl_select VARCHAR2(2000);
1611     vl_bal_cnt NUMBER;
1612 
1613     CURSOR get_hierarchies_cur IS
1614       SELECT child_flex_value_low, child_flex_value_high
1615       FROM Fnd_Flex_Value_Hierarchies
1616       WHERE parent_flex_value = vg_from_acct
1617       AND flex_value_set_id = vg_acct_val_set_id;
1618 
1619     CURSOR get_child_values_cur IS
1620       SELECT flex_value
1621       FROM Fnd_Flex_Values_Vl
1622       WHERE flex_value_set_id = vg_acct_val_set_id
1623       AND flex_value BETWEEN vl_child_low AND vl_child_high
1624       ORDER BY flex_value;
1625 
1626   l_module_name         VARCHAR2(200) ;
1627 
1628 BEGIN
1629 
1630  l_module_name  :=  g_module_name || 'Determine_Child_Accounts ';
1631 
1632 
1633  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1634  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               IN DETERMINE_CHILD_ACCOUNTS PROCEDURE...');
1635  END IF;
1636 
1637      BEGIN
1638 	-- Check to see if the from account is a parent
1639 	SELECT COUNT(*)
1640 	INTO vl_parent_cnt
1641 	FROM Fnd_Flex_Values_Vl
1642      	WHERE flex_value_set_id = vg_acct_val_set_id
1643      	AND summary_flag = 'Y'
1644     	AND flex_value = vg_from_acct;
1645 
1646      EXCEPTION
1647 	WHEN OTHERS THEN
1648 	   vp_retcode := 2;
1649 	   vp_errbuf  := SQLERRM || '-- Error in Determine_Child_Accounts procedure,'||
1650 				 'while deriving the balance_read_flag.';
1651 	   RETURN;
1652      END;
1653 
1654      IF (vl_parent_cnt = 0) THEN  	-- parent_cnt
1655        	--  the from account is not a parent
1656         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1657  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FROM ACCOUNT IS NOT A PARENT');
1658         END IF;
1659        	vg_child_acct := vg_from_acct;
1660 
1661  	-- Call Determine_Balance_Read_Flag procedure
1662 	Determine_Balance_Read_Flag;
1663 
1664      	IF (vp_retcode <> 0) THEN
1665 		RAISE e_error;
1666      	END IF;
1667         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1668  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               BALANCE_READ_FLAG IS '||
1669 			vg_balance_read_flag);
1670         END IF;
1671 
1672      	-- Call Get_Balances procedure to get balances for the from account
1673      	Get_Balances;
1674 
1675      	IF (vp_retcode <> 0) THEN
1676 		RAISE e_error;
1677      	END IF;
1678      ELSE	  			-- parent_cnt
1679       	--  the from account is a parent
1680         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1681  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FROM ACCOUNT IS A PARENT');
1682         END IF;
1683 
1684 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1685  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CHECKING TO SEE IF THE PARENT HAS '||
1686 		'any balances.');
1687 	END IF;
1688 
1689 	vl_select := 'SELECT COUNT(*)
1690                    FROM Gl_Balances glb,Gl_Code_Combinations gcc
1691                    WHERE glb.code_combination_id = gcc.code_combination_id
1692                    AND gcc.'||vg_bal_segment||' = :fund_value'||
1693                    ' AND gcc.'||vg_acct_segment|| ' = :from_acct'||
1694                    ' AND gcc.summary_flag = '||''''||'N'||''''||
1695                    ' AND gcc.template_id IS NULL
1696                      AND glb.actual_flag = '||''''||'A'||''''||
1697                    ' AND glb.ledger_id = :sob
1698                    AND gcc.chart_of_accounts_id = :coa
1699                    AND glb.period_year = :closing_fyr
1700                    AND glb.period_name = :closing_period
1701 		   AND glb.currency_code = :currency';
1702 
1703         -- Open thru' native dynamic sql
1704 	EXECUTE IMMEDIATE vl_select INTO vl_bal_cnt USING
1705 		vg_fund_value,vg_from_acct,vg_sob_id,
1706 		vg_coa_id,vp_closing_fyr,vg_closing_period,vg_currency;
1707 
1708 	IF (vl_bal_cnt > 0) THEN		-- bal_check
1709            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1710  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PARENT ACCOUNT HAS BALANCES IN '||
1711 		'General Ledger. This is the scenario, when a child account '||
1712 		'has later been defined as a parent account.Getting the balances.');
1713            END IF;
1714 
1715 	   vg_child_acct := vg_from_acct;
1716            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1717  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE ACCT:'||
1718                         vg_child_acct);
1719            END IF;
1720 
1721            -- Call Process_Acct procedure
1722 	   Process_Acct;
1723 
1724 	   IF (vp_retcode <> 0) THEN
1725                     RAISE e_error;
1726            END IF;
1727 
1728 	ELSE					-- bal_check
1729            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1730  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PARENT ACCOUNT HAS NO BALANCES IN '||
1731 		'General Ledger.');
1732            END IF;
1733 	END IF;					-- bal_check
1734 
1735         -- For each child hierarchy range, get low and high value
1736      	FOR vc_hierarchies IN get_hierarchies_cur LOOP -- Hierarchies
1737             vl_child_low := vc_hierarchies.child_flex_value_low;
1738             vl_child_high := vc_hierarchies.child_flex_value_high;
1739 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1740  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING HIERARCHY WITH LOW: '||
1741 		 vl_child_low||' and high: '||vl_child_high);
1742 	    END IF;
1743 
1744             -- For each child hierarchy, find the child values
1745             FOR vc_children IN get_child_values_cur LOOP  -- children
1746 		--  set the child account
1747       	 	vg_child_acct := vc_children.flex_value;
1748 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1749  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE CHILD VALUE: '||
1750 			vg_child_acct);
1751 	        END IF;
1752 
1753      		-- Call Process_Acct procedure
1754      		Process_Acct;
1755 
1756      		IF (vp_retcode <> 0) THEN
1757 			RAISE e_error;
1758      		END IF;
1759 
1760             END LOOP;  					-- children
1761        END LOOP;  					-- Hierarchies
1762     END IF;				-- parent_cnt
1763 
1764 EXCEPTION
1765    WHEN e_error THEN
1766      RETURN;
1767 
1768    WHEN OTHERS THEN
1769         vp_retcode := 2 ;
1770         vp_errbuf  := SQLERRM  ||' -- Error in Determine_Child_Accounts procedure.' ;
1771         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1772                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1773                          'When Others Exception ' || vp_errbuf );
1774         END IF;
1775         RETURN ;
1776 
1777 END Determine_Child_Accounts;
1778 
1779 -- ------------------------------------------------------------------
1780 --                      Procedure Process_Acct
1781 -- ------------------------------------------------------------------
1782 -- Process_Acct procedure is called from
1783 -- Determine_Child_Accounts procedure. This procedure calls the
1784 -- Determine_Balance_Read_Flag and Get_Balances procedures.
1785 -- ------------------------------------------------------------------
1786 PROCEDURE Process_Acct IS
1787 l_module_name         VARCHAR2(200) ;
1788 
1789 BEGIN
1790   l_module_name  :=  g_module_name || 'Process_Acct ';
1791     -- Call Determine_Balance_Read_Flag procedure
1792     Determine_Balance_Read_Flag;
1793 
1794     IF (vp_retcode <> 0) THEN
1795            RAISE e_error;
1796     END IF;
1797     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1798  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               BALANCE_READ_FLAG IS '||
1799                         vg_balance_read_flag);
1800     END IF;
1801 
1802     -- Call Get_Balances procedure to get balances for the from account
1803     Get_Balances;
1804 
1805     IF (vp_retcode <> 0) THEN
1806            RAISE e_error;
1807     END IF;
1808 
1809 EXCEPTION
1810    WHEN e_error THEN
1811      RETURN;
1812 
1813    WHEN OTHERS THEN
1814         vp_retcode := 2 ;
1815         vp_errbuf  := SQLERRM  ||' -- Error in Process_Acct procedure.' ;
1816         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1817                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1818                          'When Others Exception ' || vp_errbuf );
1819         END IF;
1820        RETURN ;
1821 END Process_Acct;
1822 
1823 -- ------------------------------------------------------------------
1824 --                      Procedure Determine_Balance_Read_Flag
1825 -- ------------------------------------------------------------------
1826 -- Determine_Balance_Read_Flag procedure is called from
1827 -- Process_Acct procedure. This procedure determines the
1828 -- balance_read_flag from the Temp table.
1829 -- ------------------------------------------------------------------
1830 PROCEDURE Determine_Balance_Read_Flag IS
1831 l_module_name         VARCHAR2(200) ;
1832 BEGIN
1833 
1834 
1835        l_module_name  :=  g_module_name ||
1836 			'Determine_Balance_Read_Flag ';
1837 	vg_balance_read_flag := 'N';
1838 
1839 	SELECT DISTINCT balance_read_flag
1840 	INTO vg_balance_read_flag
1841 	FROM Fv_Ye_Seq_Bal_Temp
1842 	WHERE account_seg = vg_child_acct
1843 	AND balance_seg = vg_fund_value
1844 	AND set_of_books_id = vg_sob_id
1845 	AND fiscal_year = vp_closing_fyr
1846 	AND balance_read_flag = 'Y'
1847 	AND group_id = vg_group_id;
1848 
1849 EXCEPTION
1850 	WHEN NO_DATA_FOUND THEN
1851 	   vg_balance_read_flag := 'N';
1852 	WHEN OTHERS THEN
1853 	   vp_retcode := 2;
1854            vp_errbuf  := SQLERRM  ||
1855 		' -- Error in Determine_Balance_Read_Flag procedure.' ;
1856        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1857                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1858                          'When Others Exception ' || vp_errbuf );
1859        END IF;
1860 	   RETURN;
1861 END Determine_Balance_Read_Flag;
1862 
1863 -- ------------------------------------------------------------------
1864 --                      Procedure Get_Balances
1865 -- ------------------------------------------------------------------
1866 -- Get_Balances procedure is called from Process_Acct
1867 -- procedure. It gets the balances from Gl_Balances , and handles
1868 -- the different scenarios and then calls Determine_DrCr procedure.
1869 -- ------------------------------------------------------------------
1870 PROCEDURE Get_Balances IS
1871    vl_rec_found_flag VARCHAR2(1) ;
1872 
1873    TYPE t_getbal IS REF CURSOR;
1874    vc_getbal t_getbal;
1875    vl_select VARCHAR2(2000);
1876 
1877    vl_ccid Gl_Code_Combinations.code_combination_id%TYPE;
1878 
1879    TYPE t_ccidtable IS TABLE OF Gl_Code_Combinations.code_combination_id%TYPE
1880 	INDEX BY BINARY_INTEGER;
1881    vt_ccid 	t_ccidtable;
1882    i	   	BINARY_INTEGER ;
1883    vl_ccid_cnt 	NUMBER;
1884    vl_exists    VARCHAR2(1) ;
1885 
1886    CURSOR get_sumtemp_cur IS
1887 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1888 	FROM Fv_Ye_Seq_Bal_Temp
1889 	WHERE account_seg = vg_child_acct
1890 	AND balance_seg = vg_fund_value
1891 	AND set_of_books_id = vg_sob_id
1892 	AND group_id = vg_group_id
1893 	AND fiscal_year = vp_closing_fyr
1894 	AND balance_read_flag = 'N'
1895 	GROUP BY code_combination_id;
1896 
1897    CURSOR get_sumtemp_seqcur IS
1898 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1899 	FROM Fv_Ye_Seq_Bal_Temp
1900 	WHERE account_seg = vg_child_acct
1901 	AND balance_seg = vg_fund_value
1902 	AND set_of_books_id = vg_sob_id
1903 	AND group_id = vg_group_id
1904 	AND fiscal_year = vp_closing_fyr
1905 	AND balance_read_flag = 'Y'
1906 	AND SEQUENCE IN (SELECT MAX(SEQUENCE)
1907 			FROM Fv_Ye_Seq_Bal_Temp g
1908 			WHERE g.account_seg = vg_from_acct
1909 			AND g.balance_seg = vg_fund_value
1910 			AND g.set_of_books_id = vg_sob_id
1911 			AND g.group_id = vg_group_id
1912 			AND g.balance_read_flag = 'Y')
1913 	GROUP BY code_combination_id;
1914 
1915    CURSOR get_addccid_cur IS
1916 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1917 	FROM Fv_Ye_Seq_Bal_Temp
1918 	WHERE account_seg = vg_child_acct
1919 	AND balance_seg = vg_fund_value
1920 	AND set_of_books_id = vg_sob_id
1921 	AND group_id = vg_group_id
1922 	AND fiscal_year = vp_closing_fyr
1923 	AND balance_read_flag = 'N'
1924 	AND SEQUENCE < vg_seq
1925 	GROUP BY code_combination_id;
1926 
1927     l_module_name         VARCHAR2(200) ;
1928 
1929 BEGIN
1930     l_module_name  :=  g_module_name ||
1931                                 ' Get_Balances ';
1932      vl_rec_found_flag  := 'N';
1933      i      := 1;
1934      vl_exists  := 'N';
1935  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1936  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               IN THE GET_BALANCES PROCEDURE, '||
1937 
1938 	 'processing the account '||vg_child_acct||
1939          ' with balance_read_flag = '||vg_balance_read_flag);
1940  END IF;
1941    -- Purge the Pl/Sql table
1942    vt_ccid.DELETE;
1943 
1944    /* If there are no records defined in the Fv_Ye_Seq_Bal_Temp table *
1945     * for the fund and the from acct within the group that is being   *
1946     * processed. This is the scenario when vg_balance_read_flag = N   */
1947    IF (vg_balance_read_flag = 'N') THEN         -- vg_balance_read_flag
1948       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1949  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CASE: WHEN BALANCE_READ_FLAG = N');
1950       END IF;
1951 
1952       vl_select := 'SELECT glb.code_combination_id,
1953 		   NVL(SUM(NVL(begin_balance_dr,0) + NVL(period_net_dr,0)) -
1954 		   SUM(NVL(begin_balance_cr,0) + NVL(period_net_cr,0)),0)
1955 		   FROM Gl_Balances glb,Gl_Code_Combinations gcc
1956 		   WHERE glb.code_combination_id = gcc.code_combination_id
1957 		   AND gcc.'||vg_bal_segment|| ' = :fund_value'||
1958 		   ' AND gcc.'||vg_acct_segment|| ' = :child_acct'||
1959 		   ' AND gcc.summary_flag = '||''''||'N'||''''||
1960 		   ' AND gcc.template_id IS NULL
1961 		     AND glb.actual_flag = '||''''||'A'||''''||
1962 		   ' AND glb.ledger_id = :sob
1963 		   AND gcc.chart_of_accounts_id = :coa
1964 		   AND glb.period_year = :closing_fyr
1965 		   AND glb.period_name = :closing_period
1966 		   AND glb.currency_code = :currency
1967 		   GROUP BY glb.code_combination_id ';
1968 
1969  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,vl_select);
1970       -- Open thru' native dynamic sql
1971       OPEN vc_getbal FOR vl_select USING vg_fund_value,
1972                                          vg_child_acct,
1973 	                        	 vg_sob_id,
1974                                          vg_coa_id,
1975                                          vp_closing_fyr,
1976                                          vg_closing_period,
1977                                          vg_currency;
1978 
1979       -- Fetch the records
1980       LOOP  					-- loop for balances
1981         vg_gl_bal_amt := 0;
1982 
1983 	FETCH vc_getbal INTO vl_ccid,vg_gl_bal_amt;
1984 
1985         IF (vc_getbal%FOUND) THEN		-- vc_getbal found
1986 	    vl_rec_found_flag := 'Y';
1987 
1988 	    vg_bal_seq_amt := 0;
1989 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1990  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE CCID '
1991 			||TO_CHAR(vl_ccid)||
1992 			' and GL balance amt(vg_gl_bal_amt) is '
1993 			||TO_CHAR(vg_gl_bal_amt));
1994 	    END IF;
1995 
1996 	    BEGIN
1997 		SELECT NVL(SUM(bal_seq_amt),0)
1998 		INTO vg_bal_seq_amt
1999 		FROM Fv_Ye_Seq_Bal_Temp
2000 		WHERE account_seg = vg_child_acct
2001 		AND balance_seg   = vg_fund_value
2002 		AND set_of_books_id = vg_sob_id
2003 		AND group_id = vg_group_id
2004 		AND code_combination_id = vl_ccid
2005 		AND fiscal_year = vp_closing_fyr
2006 		AND balance_read_flag = 'N';
2007 
2008 	    EXCEPTION
2009 		WHEN NO_DATA_FOUND THEN
2010 		   vg_bal_seq_amt := 0;
2011 	    END;
2012 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2013  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE, '||
2014                      'for the ccid being processed is ' ||TO_CHAR(vg_bal_seq_amt));
2015 	    END IF;
2016 
2017 	    -- set the balance_read_flag
2018 	    vg_balance_read_flag := 'Y';
2019 
2020 	    -- Sum the amt from the gl_balances and the temp table.
2021 	    vg_bal_seq_amt := vg_bal_seq_amt + vg_gl_bal_amt;
2022             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2023  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               TOTAL AMOUNT IS '||
2024                         TO_CHAR(vg_bal_seq_amt));
2025             END IF;
2026 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2027  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR PROC.'||
2028 				'Case 1D');
2029 	    END IF;
2030 	    -- Call Determine_DrCr procedure
2031 	    -- Case 1D:
2032 	    Determine_DrCr(vl_ccid);
2033 
2034 	    IF (vp_retcode <> 0) THEN
2035 		RAISE e_error;
2036 	    END IF;
2037 
2038 	    -- put the ccid into the pl/sql table
2039 	    vt_ccid(i) := vl_ccid;
2040 	    i := i + 1;
2041 
2042  	ELSE 					-- vc_getbal found
2043        	   /* Case when no balances are found */
2044 	   /* this else is if vc_getbal not found	      */
2045            /*this code in else part is necessary to handle the*
2046             *following situation:say group_id 1 has two seq's *
2047             *say 10 and 20. Sequence 10 has EXP CY 4700 4650  *
2048             *and EXP CY 4610 4650. Sequence 20 has EXP CY 4650*
2049             *4800. In this situation to get all the balances  *
2050             *from the temp table,for 4650 when we are         *
2051             *processing the 4650 account for sequence 20, we  *
2052             *need to consider the sum for the to accounts 4650*
2053             * for sequence 10 in the temp table.              */
2054 
2055  	   IF (vl_rec_found_flag = 'Y') THEN		-- vl_rec_found_flag
2056 		EXIT;
2057 	   ELSE					-- vl_rec_found_flag
2058 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2059  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               NO BALANCES FOUND IN General Ledger.'||
2060 			'Looking for balances in the Temp table');
2061 	        END IF;
2062 		vg_bal_seq_amt := 0;
2063 
2064 		FOR vc_getsumtemp IN get_sumtemp_cur LOOP -- getsum loop
2065 	            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2066  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FOUND BALANCES '||
2067 					'in Temp Table.');
2068 	            END IF;
2069 
2070 	            -- put the ccid into the pl/sql table
2071 	            vt_ccid(i) := vc_getsumtemp.code_combination_id;
2072 	            i := i + 1;
2073 
2074 		    -- Get the amt from the temp table
2075 		    vg_bal_seq_amt := vc_getsumtemp.amt;
2076 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2077  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE '||
2078 				'is '|| TO_CHAR(vg_bal_seq_amt));
2079 		    END IF;
2080 
2081 		    -- Set the balance_read_flag
2082 		    vg_balance_read_flag := 'Y';
2083 
2084 	    	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2085  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR'||
2086 				' proc. Case 2D');
2087 	    	    END IF;
2088 	    	    -- Call Determine_DrCr procedure
2089 	    	    -- Case 2D:
2090 	    	    Determine_DrCr(vc_getsumtemp.code_combination_id);
2091 
2092 	    	    IF (vp_retcode <> 0) THEN
2093 			    RAISE e_error;
2094 	    	    END IF;
2095 		END LOOP;				-- getsum loop
2096 		EXIT;
2097 	   END IF;				-- vl_rec_found_flag
2098  	END IF; 				-- vc_getbal found
2099 
2100       END LOOP;					-- loop for balances
2101 
2102       -- Get the count of ccids in pl/sql table
2103       vl_ccid_cnt := vt_ccid.COUNT;
2104       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2105  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               THE NUMBER OF CCIDS PROCESSED FROM '||
2106 			'gl_balances for the from acct is '||TO_CHAR(vl_ccid_cnt));
2107       END IF;
2108 
2109       /* The below code is needed to handle the following scenrio: *
2110        * The sequence are defined as follows: Group id 1 has seq's *
2111        * 10 and 20. Seq 10 has Exp 4610 4450, Exp 4700 4450. Seq 20*
2112        * has Exp 4450 4650. In this scenario, say acct 461002 with *
2113        * ccid 30608 has $1145 which has been moved to 4450 with    *
2114        * ccid 34650 based on the first entry of the seq 10. There  *
2115        * was also another ccid 28822 with amt $19M which was moved *
2116        * to 4450.Now when processing seq 20, for 4450 we find an   *
2117        * amt $15M with ccid 28822.When the Ye process runs, it is  *
2118        * just picking up the amount from gl,plus the amt from temp *
2119        * table only for ccid 28822. The below code is necessary to *
2120        * this scenario, where the money in the ccid 34650 for acct *
2121        * 4450 should also be moved to acct 4650.                   */
2122 
2123       FOR vc_addccid IN get_addccid_cur LOOP		-- additional ccid
2124 	vl_ccid := vc_addccid.code_combination_id;
2125 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2126  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE ADDITIONAL CCID '||
2127 			TO_CHAR(vl_ccid));
2128 	END IF;
2129 
2130 	FOR j IN 1..vl_ccid_cnt LOOP
2131 		IF (vt_ccid(j) = vl_ccid) THEN
2132 			vl_exists := 'Y';
2133 			EXIT;
2134 		ELSE
2135 			vl_exists := 'N';
2136 		END IF;
2137         END LOOP;
2138 
2139 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2140  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               VL_EXISTS = '||VL_EXISTS);
2141 	END IF;
2142 
2143 	IF (vl_exists = 'N') THEN
2144 		    -- Get the amt from the temp table
2145 		    vg_bal_seq_amt := vc_addccid.amt;
2146 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2147  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE '||
2148 				'is '|| TO_CHAR(vg_bal_seq_amt)||
2149 				' for the additional ccid '||TO_CHAR(vl_ccid));
2150 		    END IF;
2151 
2152 		    -- Set the balance_read_flag
2153 		    vg_balance_read_flag := 'Y';
2154 
2155 	    	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2156  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR'||
2157 				' proc. Case 4D');
2158 	    	    END IF;
2159 	    	    -- Call Determine_DrCr procedure
2160 	    	    -- Case 4D:
2161 	    	    Determine_DrCr(vl_ccid);
2162 
2163 	    	    IF (vp_retcode <> 0) THEN
2164 			    RAISE e_error;
2165 	    	    END IF;
2166 	END IF;
2167 
2168       END LOOP;						-- additional ccid
2169 
2170    ELSE   					-- vg_balance_read_flag
2171       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2172  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CASE: WHEN BALANCE_READ_FLAG = Y');
2173       END IF;
2174 
2175       FOR vc_getsumseq IN get_sumtemp_seqcur LOOP -- getsumseq loop
2176     	-- Get the amt from the temp table
2177         vg_bal_seq_amt := vc_getsumseq.amt;
2178 
2179 	-- Set the balance_read_flag
2180 	vg_balance_read_flag := 'Y';
2181 
2182 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2183  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR PROC.'||
2184 				'Case 3D');
2185 	END IF;
2186 	-- Call Determine_DrCr procedure
2187 	-- Case 3D:
2188 	Determine_DrCr(vc_getsumseq.code_combination_id);
2189 
2190 	IF (vp_retcode <> 0) THEN
2191 	    RAISE e_error;
2192 	END IF;
2193       END LOOP;					-- getsumseq loop
2194 
2195    END IF;					-- vg_balance_read_flag
2196 
2197 EXCEPTION
2198    WHEN e_error THEN
2199 	IF vc_getbal%ISOPEN THEN
2200 	   CLOSE vc_getbal;
2201 	END IF;
2202 	RETURN;
2203 
2204    WHEN OTHERS THEN
2205         vp_retcode := 2 ;
2206         vp_errbuf  := SQLERRM  ||' -- Error in Get_Balances procedure.' ;
2207        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2208                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2209                          'When Others Exception ' || vp_errbuf );
2210        END IF;
2211     RETURN;
2212 END Get_Balances;
2213 
2214 -- ------------------------------------------------------------------
2215 --                      Procedure Determine_DrCr
2216 -- ------------------------------------------------------------------
2217 -- Determine_DrCr procedure is called from Get_Balances procedure.
2218 -- This determines the debit and credit flag, and then calls the
2219 -- Get_Segment_Values procedure, and then calls Insert_Balances.
2220 -- ------------------------------------------------------------------
2221 PROCEDURE Determine_DrCr(ccid NUMBER) IS
2222    vl_dbt_flag VARCHAR2(1);
2223    vl_crt_flag VARCHAR2(1);
2224 
2225    vl_acct 	    Fv_Ye_Sequence_Accounts.from_account%TYPE;
2226    vl_remaining_bal NUMBER;
2227    vl_drcr_flag     VARCHAR2(1);
2228    vl_read_flag     VARCHAR2(1);
2229    vl_ccid	    Gl_Code_Combinations.code_combination_id%TYPE;
2230    vl_processing_type Fv_Ye_Seq_Bal_Temp.processing_type%TYPE;
2231    vl_acct_combi     VARCHAR2(2000);
2232    vl_delimeter      VARCHAR2(1);
2233    v_cross_val_msg   VARCHAR2(2000);
2234    l_ccid_select varchar2(2048);
2235    l_cursor_id     INTEGER;
2236    l_counter       NUMBER;
2237    l_ignore    INTEGER;
2238 
2239 
2240   CURSOR flex_cursor
2241   (
2242     c_coa_id NUMBER
2243   ) IS
2244   SELECT fifs.application_column_name
2245     FROM fnd_id_flex_segments fifs
2246    WHERE fifs.application_id = 101
2247      AND fifs.id_flex_code = 'GL#'
2248      AND fifs.id_flex_num = c_coa_id
2249      AND fifs.enabled_flag = 'Y'
2250    ORDER by fifs.segment_num;
2251    l_module_name         VARCHAR2(200)  ;
2252 BEGIN
2253 
2254 l_module_name  :=  g_module_name ||'Determine_DrCr ';
2255 
2256 
2257 
2258 
2259  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2260  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                 IN DETERMINE_DRCR PROCEDURE,'||
2261 
2262 		' processing ccid '||TO_CHAR(ccid));
2263          END IF;
2264     -- Determine the debit and credit flag
2265     -- debit flag is used for the from_acct
2266     -- credit flag is used for the to_acct
2267     IF (vg_bal_seq_amt > 0) THEN
2268 	vl_dbt_flag := 'C';
2269 	vl_crt_flag := 'D';
2270     ELSE
2271 	vl_dbt_flag := 'D';
2272 	vl_crt_flag := 'C';
2273     END IF;
2274 
2275     -- Get the Segment Values for the ccid
2276     Get_Segment_Values(ccid);
2277 
2278     IF (vp_retcode <> 0) THEN
2279 	RAISE e_error;
2280     END IF;
2281 
2282     FOR i IN 1..2 LOOP
2283 	IF (i = 1) THEN
2284 	   -- When this procedure is called from Case 1D, this step is
2285 	   -- redundant, but when called from Case 2D , this is required.
2286 	   -- Overlaying the Natural Acct segment with the child Acct
2287 	   vt_segments(vg_acct_segnum) := vg_child_acct;
2288 	   vl_acct := vg_child_acct;
2289 	   vl_remaining_bal := 0;
2290 	   vl_ccid := ccid;
2291 
2292 	   -- Determine the Processing Type(FACTSI or FACTSII or none)
2293            Determine_Processing_Type(vl_processing_type);
2294 
2295            IF (vp_retcode <> 0) THEN
2296 	       RAISE e_error;
2297            END IF;
2298 	ELSE
2299 	   -- This step is required for all the Cases.
2300 	   -- Overlaying the Natural Acct segment with the To Acct
2301 	   vt_segments(vg_acct_segnum) := vg_to_acct;
2302 	   vl_acct := vg_to_acct;
2303 	   vl_remaining_bal := vg_bal_seq_amt;
2304 	   vl_processing_type := 0;
2305 
2306     	   IF NOT Fnd_Flex_Ext.Get_Combination_Id('SQLGL', 'GL#',
2307 					vg_coa_id, SYSDATE, vg_num_segs,
2308 					vt_segments, vl_ccid) THEN
2309 		IF (vl_remaining_bal <> 0) THEN
2310 			RAISE e_invalid;
2311 		ELSE
2312                vl_ccid := NULL;
2313                l_ccid_select := 'SELECT code_combination_id
2314                                  FROM gl_code_combinations gcc
2315                                 WHERE gcc.chart_of_accounts_id = :coa_id ';
2316                FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2317                  l_ccid_select := l_ccid_select ||
2318                                   ' and gcc.'||
2319                                   flex_rec.application_column_name||
2320                                   ' = :c_'||
2321                                   flex_rec.application_column_name;
2322                END LOOP;
2323 
2324                l_cursor_id := dbms_sql.open_cursor;
2325                dbms_sql.parse(l_cursor_id, l_ccid_select, dbms_sql.v7);
2326                dbms_sql.define_column(l_cursor_id, 1, vl_ccid);
2327                dbms_sql.bind_variable(l_cursor_id, ':coa_id', vg_coa_id);
2328 
2329                l_counter := 0;
2330                FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2331                  l_counter := l_counter + 1;
2332                  dbms_sql.bind_variable(l_cursor_id, 'c_'||flex_rec.application_column_name, vt_segments(l_counter));
2333                END LOOP;
2334 
2335                l_ignore := dbms_sql.execute_and_fetch(l_cursor_id);
2336                dbms_sql.column_value(l_cursor_id, 1, vl_ccid);
2337                dbms_sql.close_cursor (l_cursor_id);
2338                IF (vl_ccid IS NULL) THEN
2339  		FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'No CCID Exists for the following Combination');
2340                 l_counter := 0;
2341                 FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2342                   l_counter := l_counter + 1;
2343  		  FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,flex_rec.application_column_name||'='|| vt_segments(l_counter));
2344                 END LOOP;
2345  		FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'Please Create the CCID');
2346 		RAISE e_invalid;
2347 		END IF;
2348 		END IF;
2349 	   END IF;
2350 
2351 	END IF;
2352 
2353 	BEGIN
2354 	   SELECT DECODE(i,1,vl_dbt_flag,vl_crt_flag)
2355 	   INTO vl_drcr_flag
2356 	   FROM DUAL;
2357 
2358 	   SELECT DECODE(i,1,vg_balance_read_flag,'N')
2359 	   INTO vl_read_flag
2360 	   FROM DUAL;
2361 
2362 	EXCEPTION
2363 	   WHEN OTHERS THEN
2364         	vp_retcode := 2 ;
2365         	vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure,'||
2366 			'while deriving the vl_drcr_flag and vl_read_flag.' ;
2367 		RETURN;
2368 	END;
2369 
2370 
2371 -- Insert Null values for the Remaining Segments
2372 
2373    FOR i in vt_segments.count+1..30
2374    LOOP
2375         vt_segments(i) := NULL;
2376    END LOOP;
2377 
2378 
2379 	-- Call the Insert_Balances procedure.
2380 	Insert_Balances(
2381 		vl_ccid,
2382 		vl_acct,
2383 		vg_bal_seq_amt,
2384 		vl_drcr_flag,
2385 		vl_read_flag,
2386 		vl_remaining_bal,
2387 		vl_processing_type,
2388 		vt_segments);
2389 
2390     	IF (vp_retcode <> 0) THEN
2391 		RAISE e_error;
2392     	END IF;
2393     END LOOP;
2394 
2395 EXCEPTION
2396    WHEN e_error THEN
2397 	RETURN;
2398 
2399    WHEN e_invalid THEN
2400       vp_retcode := 2;
2401       v_cross_val_msg :=  fnd_flex_ext.get_message;
2402       vl_delimeter := fnd_flex_ext.get_delimiter('SQLGL', 'GL#',vg_coa_id) ;
2403       vl_acct_combi := fnd_flex_ext.concatenate_segments(vg_num_segs,
2404 				vt_segments, vl_delimeter);
2405 
2406       vp_errbuf := 'The '||'"'||'To Account combination :'|| vl_acct_combi||'"'
2407 		    ||' violates Cross-Validation/Security rule ' ||
2408                     '"'|| v_cross_val_msg ||'".';
2409 
2410  -- vp_errbuf := 'Unable to determine the CCID of the To Account combination,'||
2411 --		'possibly due to a Cross-Validation/Security rule violation.';
2412 	RETURN;
2413 
2414    WHEN OTHERS THEN
2415         vp_retcode := 2 ;
2416         vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure.' ;
2417 
2418        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2419                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2420                          'When Others Exception ' || vp_errbuf );
2421        END IF;
2422      RETURN;
2423 
2424 END Determine_DrCr;
2425 
2426 -- ------------------------------------------------------------------
2427 --                      Procedure Get_Segment_Values
2428 -- ------------------------------------------------------------------
2429 -- Get_Segment_Values procedure is called from Determine_DrCr procedure.
2430 -- This proc gets all the segments for the ccid passed.
2431 -- ------------------------------------------------------------------
2432 PROCEDURE Get_Segment_Values(ccid NUMBER) IS
2433    vl_segment_value VARCHAR2(25);
2434    vl_num_segs		NUMBER;
2435    l_module_name         VARCHAR2(200);
2436 BEGIN
2437 
2438   l_module_name  :=  g_module_name ||
2439                                           'Get_Segment_Values ';
2440 
2441  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2442  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   IN GET_SEGMENT_VALUES PROCEDURE,'||
2443 
2444 		'determing the segments for the ccid '||TO_CHAR(ccid));
2445          END IF;
2446 
2447 
2448    IF NOT fnd_flex_ext.get_segments('SQLGL','GL#',vg_coa_id,ccid,vl_num_segs,
2449                 vt_segments) THEN
2450         raise e_invalid;
2451    END IF;
2452 
2453 EXCEPTION
2454    WHEN e_invalid THEN
2455       vp_retcode := 2;
2456       vp_errbuf := 'Error in Get_Segment_Values - Unable to
2457 		determine the segments for the CCID '||TO_CHAR(ccid);
2458       RETURN;
2459 
2460    WHEN OTHERS THEN
2461       vp_retcode := 2 ;
2462       vp_errbuf  := SQLERRM  ||' -- Error in Get_Segment_Values procedure.' ;
2463        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2464                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2465                          'When Others Exception ' || vp_errbuf );
2466        END IF;
2467 
2468       RETURN ;
2469 
2470 END Get_Segment_Values;
2471 
2472 -- ------------------------------------------------------------------
2473 --                      Procedure Determine_Processing_Type
2474 -- ------------------------------------------------------------------
2475 -- Determine_Processing_Type  procedure is called from Determine_DrCr procedure.
2476 -- This proc determines if the Year end process needs to close the
2477 -- balances at the FACTSI or FACTSII attribute level.
2478 -- ------------------------------------------------------------------
2479 PROCEDURE Determine_Processing_Type(p_type OUT NOCOPY NUMBER) IS
2480 
2481    CURSOR get_attrcnt_csr(p_acct VARCHAR2) IS
2482 	SELECT COUNT(*)
2483 	FROM Fv_Facts_Attributes
2484 	WHERE set_of_books_id = vg_sob_id
2485 	AND facts_acct_number = p_acct;
2486 
2487    CURSOR get_attributes_csr(p_acct VARCHAR2) IS
2488 	SELECT public_law_code,
2489                advance_flag,
2490                transfer_flag,
2491                govt_non_govt
2492 	FROM Fv_Facts_Attributes
2493 	WHERE set_of_books_id = vg_sob_id
2494 	AND facts_acct_number = p_acct;
2495 
2496    CURSOR get_parent_csr IS
2497 	SELECT parent_flex_value
2498 	FROM Fnd_Flex_Value_Norm_Hierarchy
2499 	WHERE flex_value_set_id = vg_acct_val_set_id
2500 	AND vg_child_acct BETWEEN child_flex_value_low AND child_flex_value_high
2501 	ORDER BY parent_flex_value;
2502 
2503    vl_plcode	Fv_Facts_Attributes.public_law_code%TYPE;
2504    vl_advflag	Fv_Facts_Attributes.advance_flag%TYPE;
2505    vl_transflag	Fv_Facts_Attributes.transfer_flag%TYPE;
2506    vl_govtflag	Fv_Facts_Attributes.govt_non_govt%TYPE;
2507    vl_found_flag VARCHAR2(1) ;
2508    vl_cnt       NUMBER;
2509    vl_process_type VARCHAR2(10);
2510    vl_parent    Fnd_Flex_Value_Hierarchies.parent_flex_value%TYPE;
2511 
2512    l_module_name         VARCHAR2(200) ;
2513 
2514 BEGIN
2515 
2516 l_module_name :=  g_module_name ||
2517                                       'Determine_Processing_Type ';
2518 vl_found_flag := 'N';
2519 
2520 
2521 
2522  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2523  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   IN DETERMINE_PROCESSING_TYPE PROCEDURE'||
2524 		' with acct '||vg_child_acct);
2525          END IF;
2526 
2527    OPEN get_attrcnt_csr(vg_child_acct);
2528    FETCH get_attrcnt_csr INTO vl_cnt;
2529    CLOSE get_attrcnt_csr;
2530 
2531    IF (vl_cnt = 1) THEN				-- child cnt
2532       -- Case when the processing acct has attributes in Facts Attributes table
2533  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2534  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PROCESSING ACCT IS IN '||
2535 		'Facts Attributes Table');
2536          END IF;
2537       OPEN get_attributes_csr(vg_child_acct);
2538       FETCH get_attributes_csr INTO
2539 	  vl_plcode,vl_advflag,vl_transflag,vl_govtflag;
2540       CLOSE get_attributes_csr;
2541 
2542       vl_found_flag := 'Y';
2543    ELSIF (vl_cnt = 0) THEN			-- child cnt
2544       -- Case when the child acct has no attributes in Facts Attributes table,
2545       -- hence looking for the parent.
2546  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2547  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PROCESSING ACCT IS NOT IN '||
2548 		'Facts Attributes Table, hence looking for the parent');
2549          END IF;
2550       vl_cnt := 0;
2551       FOR vc_parent IN get_parent_csr LOOP
2552         vl_parent := vc_parent.parent_flex_value;
2553  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2554  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   PROCESSING PARENT '||VL_PARENT);
2555  END IF;
2556 
2557 	OPEN get_attrcnt_csr(vl_parent);
2558         FETCH get_attrcnt_csr INTO vl_cnt;
2559         CLOSE get_attrcnt_csr;
2560 
2561 	IF (vl_cnt = 1) THEN			-- parent cnt
2562 	   IF (vl_found_flag = 'N') THEN	-- found flag
2563 		-- Case when the parent has attributes, the first parent.
2564       		OPEN get_attributes_csr(vl_parent);
2565    	   	FETCH get_attributes_csr INTO
2566 	  		vl_plcode,vl_advflag,vl_transflag,vl_govtflag;
2567       		CLOSE get_attributes_csr;
2568 
2569       		vl_found_flag := 'Y';
2570  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2571  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PARENT '||
2572 				'has attributes in FACTS Table');
2573                  END IF;
2574 	   ELSE					-- found flag
2575 		-- Case when more than one parent is in the Facts Attributes table.
2576 		-- In this case, the processing type should be 0,since we do not
2577 		-- know which acct to consider for getting the attributes.
2578  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2579  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN MORE THAN ONE '||
2580 				'parent has attributes in FACTS table');
2581                  END IF;
2582       		vl_found_flag := 'N';
2583 		EXIT;
2584  	   END IF;				-- found flag
2585 	END IF;					-- parent cnt
2586       END LOOP;
2587 
2588    END IF;					-- child cnt
2589 
2590    IF (vl_found_flag = 'Y') THEN
2591       -- Found attributes either for the processing acct or it's parent.
2592       IF ((vl_plcode = 'Y') OR (vl_advflag = 'Y') OR
2593 	   (vl_transflag = 'Y') ) THEN
2594    	   p_type := 2;
2595       ELSIF( (vl_govtflag IN ('F','Y')) AND (vg_factsi_attr_exists = 'Y')) THEN
2596 	   p_type := 1;
2597       ELSE
2598 	   p_type := 0;
2599       END IF;
2600    ELSE
2601      -- No attributes found for the processing acct or it's parent.
2602       p_type := 0;
2603    END IF;
2604 
2605    IF (p_type = 2) THEN
2606 	vl_process_type := 'FACTS II';
2607    ELSIF (p_type = 1) THEN
2608 	vl_process_type := 'FACTS I';
2609    ELSE
2610 	vl_process_type := 'Regular';
2611    END IF;
2612  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2613  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   PROCESSING BY '||VL_PROCESS_TYPE);
2614  END IF;
2615 
2616 EXCEPTION
2617    WHEN OTHERS THEN
2618       vp_retcode := 2 ;
2619       vp_errbuf  := SQLERRM  ||' -- Error in Determine_Processing_Type procedure.' ;
2620        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2621                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2622                          'When Others Exception ' || vp_errbuf );
2623        END IF;
2624 
2625       RETURN ;
2626 END Determine_Processing_Type;
2627 
2628 -- ------------------------------------------------------------------
2629 --                      Procedure Insert_Balances
2630 -- ------------------------------------------------------------------
2631 -- Insert_Balances procedure is called from Determine_DrCr procedure.
2632 -- This proc inserts into the Fv_Ye_Seq_Bal_Temp table.
2633 -- ------------------------------------------------------------------
2634 PROCEDURE Insert_Balances(ccid 		NUMBER,
2635 			  acct 		VARCHAR2,
2636 			  bal_amt 	NUMBER,
2637 			  dr_cr		VARCHAR2,
2638 			  read_flag 	VARCHAR2,
2639 			  remaining_bal NUMBER,
2640 			  processing_type NUMBER,
2641 			  segs		Fnd_Flex_Ext.SegmentArray) IS
2642 
2643 CURSOR flex_fields IS
2644   SELECT application_column_name
2645   FROM   fnd_id_flex_segments
2646   WHERE  id_flex_code = 'GL#'
2647   AND    id_flex_num = vg_coa_id
2648   AND  enabled_flag = 'Y'
2649   ORDER BY segment_num;
2650 
2651    vl_report_seq    NUMBER;
2652    vl_period_dr     NUMBER;
2653    vl_period_cr     NUMBER;
2654    l_module_name    VARCHAR2(200) ;
2655    vl_segments      Fnd_Flex_Ext.SegmentArray;
2656    vl_segnum        NUMBER;
2657    l_column_name    fnd_id_flex_segments.application_column_name%TYPE;
2658    l_n_segments     NUMBER ;
2659 
2660 BEGIN
2661     l_module_name   :=  g_module_name || 'Insert_Balances ';
2662    -- Get the period net dr, period net cr
2663    BEGIN
2664       SELECT DECODE(dr_cr,'D',ABS(bal_amt),0)
2665       INTO vl_period_dr
2666       FROM DUAL;
2667 
2668       SELECT DECODE(dr_cr,'D',0,ABS(bal_amt))
2669       INTO vl_period_cr
2670       FROM DUAL;
2671    EXCEPTION
2672       WHEN OTHERS THEN
2673        	vp_retcode := 2 ;
2674        	vp_errbuf  := SQLERRM  ||' -- Error in Insert_Balances procedure,'||
2675 		'while deriving the period_net_dr and period_net_cr.' ;
2676 	RETURN;
2677 
2678    END;
2679  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2680  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     IN INSERT_BALANCES PROCEDURE,'||
2681 		'inserting the following:');
2682          END IF;
2683  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2684  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     CCID:'||TO_CHAR(CCID)||' ACCT:'||ACCT||
2685 		' balance read flag: '||read_flag);
2686          END IF;
2687  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2688  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     PERIOD NET DR:'||TO_CHAR(VL_PERIOD_DR)||
2689 		' period net cr:'|| TO_CHAR(vl_period_cr)||
2690 		' remaining balance:'||TO_CHAR(remaining_bal) );
2691          END IF;
2692 
2693    -- Get the report sequence
2694    BEGIN
2695       SELECT Fv_Ye_Seq_Bal_Temp_S.NEXTVAL
2696       INTO vl_report_seq
2697       FROM DUAL;
2698    EXCEPTION
2699       WHEN OTHERS THEN
2700        	vp_retcode := 2 ;
2701        	vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure,'||
2702 		'while deriving the vl_report_seq.' ;
2703 	RETURN;
2704    END;
2705 
2706 
2707   --  map the segment values to the right segments
2708 
2709   -- Insert Null values for the Segments initially
2710 
2711    FOR i in 1..30
2712    LOOP
2713         vl_segments(i) := NULL;
2714    END LOOP;
2715 
2716   l_n_segments := 0;
2717 
2718   FOR flex_fields_rec IN flex_fields
2719   LOOP
2720 
2721     l_n_segments  := l_n_segments + 1;
2722     l_column_name := flex_fields_rec.application_column_name;
2723     vl_segnum     := SUBSTR(l_column_name,8) ;
2724     vl_segments(vl_segnum) := segs(l_n_segments);
2725 
2726   END LOOP;
2727 
2728 
2729 
2730    -- Insert into the Temp table.
2731    INSERT INTO Fv_Ye_Seq_Bal_Temp(
2732 	code_combination_id,
2733         group_id,
2734         SEQUENCE,
2735         account_seg,
2736         balance_seg,
2737         period_net_dr,
2738         period_net_cr,
2739         bal_seq_amt,
2740         period_name,
2741         currency_code,
2742         fiscal_year,
2743         balance_read_flag,
2744         set_of_books_id,
2745 	treasury_symbol_id,
2746 	account_flag,
2747 	report_sequence,
2748 	processing_type,
2749         segment1,segment2,segment3,segment4,segment5,
2750         segment6,segment7,segment8,segment9,segment10,
2751         segment11,segment12,segment13,segment14,
2752         segment15,segment16,segment17,segment18,
2753         segment19,segment20,segment21,segment22,
2754         segment23,segment24,segment25,segment26,
2755         segment27,segment28,segment29,segment30)
2756    VALUES
2757 	(ccid,
2758 	vg_group_id,
2759 	vg_seq,
2760 	acct,
2761 	vg_fund_value,
2762 	vl_period_dr,
2763 	vl_period_cr,
2764 	remaining_bal,
2765 	vg_closing_period,
2766 	vg_currency,
2767 	vp_closing_fyr,
2768 	read_flag,
2769 	vg_sob_id,
2770 	vg_trsymbol_id,
2771 	vg_acct_flag,
2772 	vl_report_seq,
2773 	processing_type,
2774 vl_segments(1),vl_segments(2),vl_segments(3),vl_segments(4),vl_segments(5),
2775 vl_segments(6),vl_segments(7),vl_segments(8),vl_segments(9),vl_segments(10),
2776 vl_segments(11),vl_segments(12),vl_segments(13),vl_segments(14),vl_segments(15),
2777 vl_segments(16),vl_segments(17),vl_segments(18),vl_segments(19),vl_segments(20),
2778 vl_segments(21),vl_segments(22),vl_segments(23),vl_segments(24),vl_segments(25),
2779 vl_segments(26),vl_segments(27),vl_segments(28),vl_segments(29),vl_segments(30));
2780 EXCEPTION
2781    WHEN OTHERS THEN
2782       vp_retcode := 2 ;
2783       vp_errbuf  := SQLERRM  ||' -- Error in Insert_Balances procedure.' ;
2784        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2785                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2786                          'When Others Exception ' || vp_errbuf );
2787        END IF;
2788 
2789       RETURN ;
2790 
2791 END Insert_Balances;
2792 
2793 -- ------------------------------------------------------------------
2794 --                      Procedure Update_Closing_Status
2795 -- ------------------------------------------------------------------
2796 -- Update_Closing_Status procedure is called from Get_Fund_Value procedure.
2797 -- When submit journal import is Y, this proc closes all the pending
2798 -- requisitions, if any exists,for the fund that is being processed.
2799 -- ------------------------------------------------------------------
2800 PROCEDURE Update_Closing_Status IS
2801 
2802    CURSOR get_closereq_cur IS
2803 	SELECT ffp.close_requisitions
2804    	FROM fv_fund_parameters ffp, fv_treasury_symbols fts
2805    	WHERE fts.treasury_symbol = vg_trsymbol
2806    	AND ffp.fund_value = vg_fund_value
2807    	AND ffp.treasury_symbol_id = fts.treasury_symbol_id
2808    	AND ffp.set_of_books_id = vg_sob_id;
2809 
2810    -- Variable declarations for Native Dynamic SQL
2811    TYPE t_refcur IS REF CURSOR;
2812    vl_dist_retcur  t_refcur;
2813    vl_dist_select  VARCHAR2(2000);
2814 
2815    vl_rec_found_flag   	VARCHAR2(1) ;
2816    vl_close_req   	Fv_Fund_Parameters.close_requisitions%TYPE;
2817    vl_distr_id      	Po_Req_Distributions_All.distribution_id%TYPE;
2818    vl_line_id       	Po_Req_Distributions_All.requisition_line_id%TYPE;
2819    vl_req_num       	Po_Requisition_Headers_All.segment1%TYPE;
2820    vl_prev_line_id  	Po_Req_Distributions_All.requisition_line_id%TYPE ;
2821    vl_prt_line_id  	Po_Req_Distributions_All.requisition_line_id%TYPE ;
2822    vl_ctr 		NUMBER ;
2823    vl_index		BINARY_INTEGER;
2824    vl_no_of_rows	NUMBER;
2825    vl_last_row		NUMBER;
2826    vl_lines_count	NUMBER;
2827    vl_header_id     	Po_Requisition_Headers_All.requisition_header_id%TYPE;
2828    vl_prev_header_id    Po_Requisition_Headers_All.requisition_header_id%TYPE ;
2829    vl_prt_hdr_id     	Po_Requisition_Headers_All.requisition_header_id%TYPE;
2830    vl_head_ctr      	NUMBER ;
2831 
2832    TYPE t_lines_table IS TABLE OF NUMBER
2833         INDEX BY BINARY_INTEGER;
2834    vt_lines         t_lines_table;
2835 
2836    TYPE t_headers_table IS TABLE OF NUMBER
2837         INDEX BY BINARY_INTEGER;
2838    vt_headers       t_headers_table;
2839 
2840    CURSOR get_lcount_cur IS
2841 	SELECT COUNT(*)
2842 	FROM Po_Req_Distributions_All
2843 	WHERE requisition_line_id = vt_lines(vl_index)
2844 	AND gl_closed_date IS NULL;
2845 
2846    CURSOR get_header_cur IS
2847 	SELECT DISTINCT requisition_header_id
2848 	FROM Po_Requisition_Lines_All
2849 	WHERE requisition_line_id = vt_lines(vl_index);
2850 
2851    CURSOR get_hcount_cur IS
2852 	SELECT COUNT(*)
2853 	FROM Po_Requisition_Lines_All
2854 	WHERE requisition_header_id = vt_headers(vl_index)
2855 	AND closed_code <> 'FINALLY CLOSED';
2856 
2857    l_module_name         VARCHAR2(200)  ;
2858 
2859 BEGIN
2860     l_module_name  := g_module_name || 'Update_Closing_Status  ';
2861     vl_rec_found_flag  := 'N';
2862     vl_prev_line_id   := 0;
2863     vl_ctr  := 0;
2864     vl_prev_header_id := 0;
2865     vl_head_ctr := 0;
2866 
2867  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2868  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       IN THE UPDATE_CLOSING_STATUS PROCEDURE.....');
2869  END IF;
2870 
2871    -- Get the close requisition
2872    OPEN get_closereq_cur;
2873    FETCH get_closereq_cur INTO vl_close_req;
2874    CLOSE get_closereq_cur;
2875 
2876    IF (vl_close_req = 'N') THEN				-- vl_close_req
2877 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2878  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSE REQUISITIONS = N');
2879 	END IF;
2880 	RETURN;
2881    ELSE							-- vl_close_req
2882 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2883  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSE REQUISITIONS = Y');
2884 	END IF;
2885 
2886         -- Build the select statement to get the distribution details
2887 	vl_dist_select := 'SELECT po.distribution_id,
2888          		   po.requisition_line_id, ph.segment1
2889           		FROM Po_Req_Distributions_All po, gl_code_combinations gcc,
2890 		           Po_Requisition_Lines_All pl, Po_Requisition_Headers_All ph
2891           		WHERE po.gl_closed_date IS NULL
2892           		AND gcc.code_combination_id = po.code_combination_id
2893           		AND gcc.chart_of_accounts_id = :coa
2894           		AND po.set_of_books_id = :sob
2895           		AND gcc.'||vg_bal_segment|| ' = :fund_value'||
2896 			' AND ph.authorization_status = '||''''||'APPROVED'||''''||
2897 			' AND po.requisition_line_id = pl.requisition_line_id
2898 			AND pl.requisition_header_id = ph.requisition_header_id
2899 			AND pl.line_location_id IS NULL
2900 			AND po.gl_encumbered_date <= :end_date' ;
2901 	--Fv_Utility.Debug_Mesg(vl_dist_select);
2902 
2903 	-- Open the ref cursor
2904 	OPEN vl_dist_retcur FOR vl_dist_select USING vg_coa_id,vg_sob_id,
2905 			vg_fund_value,vg_end_date;
2906 	LOOP						-- distrdetails loop
2907 	   FETCH vl_dist_retcur INTO vl_distr_id, vl_line_id,vl_req_num;
2908 
2909 	   IF vl_dist_retcur%FOUND THEN		-- details found
2910 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2911  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       PROCESSING THE REQUISITION NUMBER '||
2912 			vl_req_num||' with requisition line id '
2913 			||TO_CHAR(vl_line_id)||' and the distribution id '
2914 			||TO_CHAR(vl_distr_id) );
2915 	        END IF;
2916 		vl_rec_found_flag := 'Y';
2917 
2918 	        -- If vl_prev_line_id = vl_line_id, then this is the scenario
2919 		-- when for the same requisition line we have multiple distributions.
2920 		-- In this case,just go ahead and update the Po_Req_Distributions_All table
2921 		-- for the new distribution_id,without inseritng into the table.
2922 		IF (vl_prev_line_id <> vl_line_id) THEN  -- vl_prev_line_id
2923 		    -- insert into vt_lines table
2924 		    vt_lines(vl_ctr) := vl_line_id;
2925 		    vl_ctr := vl_ctr + 1;
2926 
2927 		    -- Copy the vl_line_id to vl_prev_line_id
2928 		    vl_prev_line_id  := vl_line_id;
2929 
2930 		END IF;					-- vl_prev_line_id
2931 
2932 	        -- Update the Po_Req_Distributions_All table
2933 	        UPDATE Po_Req_Distributions_All
2934 	        SET gl_closed_date = vg_end_date
2935 	        WHERE distribution_id = vl_distr_id;
2936 		IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2937  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSED THE DISTRIBUTION WITH '||
2938 				'distribution_id '||TO_CHAR(vl_distr_id));
2939 		END IF;
2940 
2941 	   ELSE						-- details found
2942 	        IF (vl_rec_found_flag = 'Y') THEN
2943 		    EXIT;
2944 	        ELSE
2945 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2946  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITIONS FOUND TO '||
2947 			'be processed, where the balancing segment matches '||
2948 			'the fund value '|| vg_fund_value);
2949 		    END IF;
2950 		    RETURN;
2951 	        END IF;
2952 	   END IF;					-- details found
2953 	END LOOP;					-- distrdetails loop
2954 	CLOSE vl_dist_retcur;
2955    END IF;						-- vl_close_req
2956 
2957    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2958  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       BEGININNING PROCESSING FOR THE LINES....');
2959    END IF;
2960    vl_no_of_rows := vt_lines.COUNT;
2961    vl_last_row   := vt_lines.LAST;
2962    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2963  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NUMBER OF ROWS:'|| TO_CHAR(VL_NO_OF_ROWS)||
2964 		' Last Row: '||TO_CHAR(vl_Last_row));
2965    END IF;
2966 
2967    IF (vl_no_of_rows <> 0) THEN				-- vl_no_of_rows lines
2968       vl_index := vt_lines.FIRST;
2969 
2970       LOOP						-- vl_index
2971 	-- Get the Line count
2972 	OPEN get_lcount_cur;
2973 	FETCH get_lcount_cur INTO vl_lines_count;
2974 	CLOSE get_lcount_cur;
2975         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2976  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       VL_LINES_COUNT IS '||TO_CHAR(VL_LINES_COUNT));
2977         END IF;
2978 
2979 	IF (vl_lines_count = 0) THEN			-- vl_lines_count
2980 	     -- Update the Po_Requisition_Lines_All table
2981 	     UPDATE Po_Requisition_Lines_All
2982 	     SET closed_code = 'FINALLY CLOSED'
2983 	     WHERE requisition_line_id = vt_lines(vl_index);
2984 
2985 	     vl_prt_line_id := vt_lines(vl_index);
2986              IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2987  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSED THE LINE WITH REQUISITION_LINE_ID '||
2988 			TO_CHAR(vl_prt_line_id));
2989              END IF;
2990 
2991 	     OPEN get_header_cur;
2992 	     FETCH get_header_cur INTO vl_header_id;
2993 	     CLOSE get_header_cur;
2994 
2995 	     IF (vl_prev_header_id <> vl_header_id) THEN
2996 		   -- insert into the headers table
2997 		   vt_headers(vl_head_ctr) := vl_header_id;
2998 		   vl_head_ctr := vl_head_ctr + 1;
2999 
3000 		   -- assign the vl_header_id to vl_prev_header_id
3001 		   vl_prev_header_id := vl_header_id;
3002 	     END IF;
3003 	END IF;						-- vl_lines_count
3004 
3005 	IF (vl_index = vl_last_row) THEN
3006 	     EXIT;
3007 	END IF;
3008 	vl_index := vl_index + 1;
3009       END LOOP;						-- vl_index
3010 
3011    ELSE							-- vl_no_of_rows lines
3012       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3013  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITION LINES FOUND TO BE PROCESSED....');
3014       END IF;
3015       RETURN;
3016    END IF;						-- vl_no_of_rows lines
3017    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3018  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       ENDING PROCESSING FOR THE LINES....');
3019    END IF;
3020 
3021    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3022  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       BEGINNING PROCESSING FOR THE HEADERS....');
3023    END IF;
3024    vl_no_of_rows := vt_headers.COUNT;
3025    vl_last_row   := vt_headers.LAST;
3026    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3027  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NUMBER OF ROWS:'|| TO_CHAR(VL_NO_OF_ROWS)||
3028 		' Last Row: '||TO_CHAR(vl_Last_row));
3029    END IF;
3030 
3031    IF (vl_no_of_rows <> 0) THEN				-- vl_no_of_rows headers
3032       vl_index := vt_headers.FIRST;
3033 
3034       LOOP						-- headers loop
3035 	-- Get the Header count
3036 	OPEN get_hcount_cur;
3037 	FETCH get_hcount_cur INTO vl_lines_count;
3038 	CLOSE get_hcount_cur;
3039         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3040  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       VL_LINES_COUNT(HDR) IS '||
3041 		TO_CHAR(vl_lines_count));
3042         END IF;
3043 
3044 	IF (vl_lines_count = 0) THEN			-- vl_lines_count header
3045 	     -- Update the Po_Requisition_Headers_All table
3046 	     UPDATE Po_Requisition_Headers_All
3047 	     SET closed_code = 'FINALLY CLOSED'
3048 	     WHERE requisition_header_id = vt_headers(vl_index);
3049 
3050 	     vl_prt_hdr_id := vt_headers(vl_index);
3051             -- IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3052  --FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,
3053  --'       CLOSED THE HEADER WITH '|| 'requisition_header_id '|| TO_CHAR(vl_prt_hdr_id));
3054   --           END IF;
3055 	END IF;						-- vl_lines_count header
3056 
3057 	IF (vl_index = vl_last_row) THEN
3058 	     EXIT;
3059 	END IF;
3060 	vl_index := vl_index + 1;
3061       END LOOP;						-- headers loop
3062    ELSE							-- vl_no_of_rows headers
3063       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3064  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITION HEADERS FOUND TO BE PROCESSED....');
3065       END IF;
3066    END IF;						-- vl_no_of_rows headers
3067    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3068  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       ENDING PROCESSING FOR THE HEADERS....');
3069    END IF;
3070 
3071    vt_lines.DELETE;
3072    vt_headers.DELETE;
3073 EXCEPTION
3074    WHEN OTHERS THEN
3075       vp_retcode := 2 ;
3076       vp_errbuf  := SQLERRM  ||' -- Error in Update_Closing_Status procedure.' ;
3077        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3078                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3079                          'When Others Exception ' || vp_errbuf );
3080        END IF;
3081      RETURN ;
3082 END Update_Closing_Status;
3083 
3084 -- ------------------------------------------------------------------
3085 --                      Procedure Populate_Gl_Interface
3086 -- ------------------------------------------------------------------
3087 -- Populate_Gl_Interface procedure is called from Main procedure.
3088 -- When submit_journal_import =Y, this proc inserts records in gl_interface
3089 -- table, from the temp table and runs the journal import program.
3090 -- ------------------------------------------------------------------
3091 PROCEDURE Populate_Gl_Interface IS
3092    vl_req_id       NUMBER;
3093    vl_call_status  BOOLEAN;
3094    vl_rphase       VARCHAR2(30);
3095    vl_rstatus      VARCHAR2(30);
3096    vl_dphase       VARCHAR2(30);
3097    vl_dstatus      VARCHAR2(30);
3098    vl_message      VARCHAR2(240);
3099    vl_period_name  VARCHAR2(50);
3100   vl_reference_1   VARCHAR2(280);
3101   vl_running_amount         NUMBER;
3102   vl_amount         NUMBER;
3103   vl_amount_dr         NUMBER;
3104   vl_amount_cr         NUMBER;
3105   vl_ccid              NUMBER(15);
3106   vl_ccid_cnt 	   NUMBER;
3107   vl_ptype   	   Fv_Ye_Seq_Bal_Temp.processing_type%TYPE;
3108   vl_factsi_amount NUMBER;
3109   vl_factsi_tempamt NUMBER;
3110   vl_trading_partner Fv_Facts1_Period_Balances_v.eliminations_dept%TYPE;
3111 
3112   vl_stmt  	   VARCHAR2(5000);
3113   vl_line_amount   NUMBER;
3114   vl_attribute_cols  VARCHAR2(2500);
3115   vl_dummy_cols  VARCHAR2(100);
3116   vl_group_by_clause VARCHAR2(1024);
3117 
3118   vl_public_law_code VARCHAR2(150);
3119   vl_advance_type    VARCHAR2(150);
3120   vl_trf_dept_id     VARCHAR2(150);
3121   vl_trf_main_acct   VARCHAR2(150);
3122 
3123   c_gl_line_cur      INTEGER;
3124   vl_fetch_lines     INTEGER;
3125   vl_exec_cur	     INTEGER;
3126   vl_column_num	     NUMBER;
3127   vl_gl_source       VARCHAR2(1024) ;
3128 
3129 
3130    CURSOR journal_entries_cur IS
3131 	SELECT
3132 	       code_combination_id,
3133 		account_seg,
3134 		balance_seg,
3135 		segment1,segment2,segment3,segment4,segment5,
3136 		segment6,segment7,segment8,segment9,segment10,
3137 	 	segment11,segment12,segment13,segment14,
3138                 segment15,segment16,segment17,segment18,
3139                 segment19,segment20,segment21,segment22,
3140                 segment23,segment24,segment25,segment26,
3141                 segment27,segment28,segment29,segment30,
3142                 period_net_dr,
3143                 period_net_cr,
3144 		period_name ,
3145                 balance_read_flag,
3146 		processing_type
3147      	FROM Fv_Ye_Seq_Bal_Temp
3148         WHERE period_net_dr + period_net_cr > 0
3149         AND set_of_books_id = vg_sob_id
3150         ORDER BY report_sequence;
3151 
3152 	CURSOR ccid_cnt_csr IS
3153 		SELECT COUNT(*),SUM(NVL(amount,0))
3154 		FROM Fv_Facts1_Period_Balances_v
3155 		WHERE set_of_books_id = vg_sob_id
3156 		AND period_num <= vg_closing_period_num
3157 		AND period_year = vp_closing_fyr
3158 		AND ccid = vl_ccid;
3159 
3160 
3161 	CURSOR factsi_bal_csr IS
3162 		SELECT SUM(NVL(amount,0)) amount,eliminations_dept,g_ng_indicator
3163 		FROM Fv_Facts1_Period_Balances_v
3164 		WHERE set_of_books_id = vg_sob_id
3165 		AND period_num <= vg_closing_period_num
3166 		AND period_year = vp_closing_fyr
3167 		AND ccid = vl_ccid
3168 		GROUP BY eliminations_dept,g_ng_indicator;
3169 
3170        l_module_name         VARCHAR2(200) ;
3171 BEGIN
3172        l_module_name  := g_module_name ||
3173                            'Populate_Gl_Interface ';
3174 
3175     vl_gl_source  := '(''Budgetary Transaction'',''Year End Close'', ''Manual'')';
3176 
3177  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3178  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN POPULATE_GL_INTERFACE PROCEDURE....');
3179  END IF;
3180 
3181    -- Get the interface_run_id
3182    vg_interface_run_id := Gl_Interface_Control_Pkg.Get_Unique_Run_Id;
3183 
3184    -- Get the journal group_id
3185    SELECT Gl_Interface_Control_S.NEXTVAL
3186    INTO vg_jrnl_group_id
3187    FROM DUAL;
3188 
3189    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3190  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   INTERFACE RUN ID: '||TO_CHAR(VG_INTERFACE_RUN_ID));
3191  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL GROUP ID: '||TO_CHAR(VG_JRNL_GROUP_ID));
3192    END IF;
3193 
3194    --Insert a control record in gl_interface_control for gl_import to work
3195    INSERT INTO Gl_Interface_Control
3196         (je_source_name,
3197         status,
3198         interface_run_id,
3199         group_id,
3200         set_of_books_id)
3201    VALUES ('Year End Close',
3202         'S',
3203         vg_interface_run_id,
3204         vg_jrnl_group_id,
3205         vg_sob_id);
3206 
3207    FOR vc_journals IN journal_entries_cur
3208    LOOP		-- journal_entries loop
3209      vl_ptype := vc_journals.processing_type;
3210      vl_trading_partner := NULL;
3211      vl_ccid := vc_journals.code_combination_id;
3212      vl_period_name := vc_journals.period_name;
3213      vl_reference_1 := NULL;
3214      vt_segments(1) := vc_journals.segment1;
3215      vt_segments(2) := vc_journals.segment2;
3216      vt_segments(3) := vc_journals.segment3;
3217      vt_segments(4) := vc_journals.segment4;
3218      vt_segments(5) := vc_journals.segment5;
3219      vt_segments(6) := vc_journals.segment6;
3220      vt_segments(7) := vc_journals.segment7;
3221      vt_segments(8) := vc_journals.segment8;
3222      vt_segments(9) := vc_journals.segment9;
3223      vt_segments(10) := vc_journals.segment10;
3224      vt_segments(11) := vc_journals.segment11;
3225      vt_segments(12) := vc_journals.segment12;
3226      vt_segments(13) := vc_journals.segment13;
3227      vt_segments(14) := vc_journals.segment14;
3228      vt_segments(15) := vc_journals.segment15;
3229      vt_segments(16) := vc_journals.segment16;
3230      vt_segments(17) := vc_journals.segment17;
3231      vt_segments(18) := vc_journals.segment18;
3232      vt_segments(19) := vc_journals.segment19;
3233      vt_segments(20) := vc_journals.segment20;
3234      vt_segments(21) := vc_journals.segment21;
3235      vt_segments(22) := vc_journals.segment22;
3236      vt_segments(23) := vc_journals.segment23;
3237      vt_segments(24) := vc_journals.segment24;
3238      vt_segments(25) := vc_journals.segment25;
3239      vt_segments(26) := vc_journals.segment26;
3240      vt_segments(27) := vc_journals.segment27;
3241      vt_segments(28) := vc_journals.segment28;
3242      vt_segments(29) := vc_journals.segment29;
3243      vt_segments(30) := vc_journals.segment30;
3244 
3245      vl_line_amount  := 0;
3246 
3247 
3248      IF (vc_journals.balance_read_flag = 'N') THEN	-- balance_read_flag
3249      IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3250  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PROCESSING TO ACCOUNT ' || VC_JOURNALS.ACCOUNT_SEG);
3251     END IF;
3252         Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3253                        vc_journals.period_net_cr, vl_reference_1,
3254 		       vl_period_name,vl_trading_partner);
3255 
3256      ELSE						-- balance_read_flag
3257 	-- If it is a from account, then check which processing to be done.
3258     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3259  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PROCESSING FROM ACCOUNT: ' || VC_JOURNALS.ACCOUNT_SEG||
3260 			' CCID: '||vl_ccid);
3261             END IF;
3262 
3263        IF (vl_ptype = 1) THEN		-- vl_ptype
3264 	  -- FACTS I processing
3265 	  -- Check if the attribute exits and there are balances in the Facts table
3266  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3267  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'FACTS I PROCESSING');
3268  END IF;
3269 
3270           vl_amount := (NVL(vc_journals.period_net_cr,0)
3271 				- NVL(vc_journals.period_net_dr,0) );
3272  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3273  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT TO BE MATCHED ' || VL_AMOUNT);
3274  END IF;
3275 
3276 	  IF ((vg_factsi_attr_exists = 'Y')
3277 			AND (vg_factsi_bal_cnt > 0)) THEN 	-- facts attr
3278  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3279  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'FACTS I ATTRIBUTE EXISTS AND THERE ARE '||
3280 			'balances in FACTS table.');
3281              END IF;
3282 
3283 		OPEN ccid_cnt_csr;
3284 		FETCH ccid_cnt_csr INTO vl_ccid_cnt,vl_factsi_amount;
3285 		CLOSE ccid_cnt_csr;
3286 
3287 		IF (vl_ccid_cnt = 0) THEN			-- ccid cnt
3288 		   -- ccid does not exist in facts table
3289  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3290  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'BALANCES WILL NOT BE CLOSED BY '||
3291 
3292                         'the FACTS I F/N and trading partner attributes for the '||
3293                         'code combination id '||vl_ccid||', since the code '||
3294 			'combination id does not exist in Fv_Facts1_Period_Balances_v.');
3295                          END IF;
3296  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3297  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TO CLOSE BY FACTS I F/N AND '||
3298 
3299                         'trading partner attributes for this code combination id, '||
3300 			'delete the journal entries created by this process, '||
3301 			'if any, run the FACTS I Interface Program with all edit '||
3302                         'checks passed by period '||vg_closing_period||
3303                         'and rerun the Year End Close Program.');
3304  END IF;
3305                    Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3306                        vc_journals.period_net_cr, vl_reference_1,
3307 		       vl_period_name,vl_trading_partner);
3308 		ELSE						-- ccid cnt
3309 		  -- ccid exists in facts table
3310 		  IF (vl_amount <> vl_factsi_amount) THEN	-- amt matching
3311 		      -- amount from year end table does not match with amt from
3312 		      -- facts table.
3313  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3314  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'BALANCES WILL NOT BE CLOSED BY '||
3315                         'the FACTS I F/N and trading partner attributes for the '||
3316                         'code combination id '||vl_ccid||', since the balances '||
3317 			'in GL does not equal to the balances in '||
3318 			'Fv_Facts1_Period_Balances_v.');
3319              END IF;
3320  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3321  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TO CLOSE BY FACTS I F/N AND '||    'trading partner attributes for this code combination id, '||
3322 			'delete the journal entries created by this process, '||
3323 			'if any, run the FACTS I Interface Program with all edit '||
3324                         'checks passed by period '||vg_closing_period||
3325                         'and rerun the Year End Close Program.');
3326                          END IF;
3327 
3328                       Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3329                           vc_journals.period_net_cr, vl_reference_1,
3330 			  vl_period_name,vl_trading_partner);
3331 		  ELSE						-- amt matching
3332 		      -- amount from year end table matches with amt from
3333 		      -- facts table.
3334  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3335  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT MATCHED');
3336  END IF;
3337 		      FOR vc_factsi IN factsi_bal_csr LOOP		-- bal loop
3338 			 vl_factsi_tempamt := vc_factsi.amount;
3339 			 IF (vl_factsi_tempamt > 0) THEN
3340 				vl_amount_dr := 0;
3341 				vl_amount_cr := vl_factsi_tempamt;
3342 			 ELSE
3343 				vl_amount_dr := (-1) * vl_factsi_tempamt;
3344 				vl_amount_cr := 0;
3345 			 END IF;
3346 
3347 			 vl_trading_partner := vc_factsi.eliminations_dept;
3348 
3349                          Insert_Gl_Interface_Record(vl_amount_dr,vl_amount_cr,
3350                               vl_reference_1,vl_period_name,vl_trading_partner);
3351 		      END LOOP;						-- bal loop
3352 
3353 		  END IF;					-- amt matching
3354 
3355 		END IF;						-- ccid cnt
3356 
3357 	  ELSE 							-- facts attr
3358  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3359  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' EITHER FACTS I ATTRIBUTE DOES NOT EXISTS '||
3360 			'or there are no balances in FACTS table.');
3361              END IF;
3362 	    Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3363 			vc_journals.period_net_cr, vl_reference_1,
3364 			vl_period_name,vl_trading_partner);
3365 	  END IF; 						-- facts attr
3366 
3367        ELSIF (vl_ptype = 2) THEN		-- vl_ptype
3368 	  -- FACTS II processing
3369           fv_utility.log_mesg('FACTS II processing');
3370 
3371           vl_amount := (NVL(vc_journals.period_net_dr,0)
3372 				- NVL(vc_journals.period_net_cr,0) );
3373 
3374           -- POPULATE REFERENCE_1 column for all budgetary_transaction ccid
3375           vl_running_amount := 0;
3376 
3377 	---------------------------------------------------------------------------------------
3378 	vl_attribute_cols := NULL;
3379 	vl_dummy_cols     := NULL;
3380 
3381 	-- Populate attribute columns for FACTS II records
3382 	-- Build the attribute columns clause
3383 
3384         IF vg_public_law_attribute IS NOT NULL
3385           THEN
3386            vl_attribute_cols := vl_attribute_cols||', NVL(b.public_law_code, l.'||vg_public_law_attribute||') ';
3387    	END IF;
3388 
3389         IF vg_advance_type_attribute IS NOT NULL
3390           THEN
3391            vl_attribute_cols := vl_attribute_cols||', NVL(b.advance_type, l.'||vg_advance_type_attribute||') ';
3392         END IF;
3393 
3394         IF vg_trf_dept_id_attribute IS NOT NULL
3395           THEN
3396            vl_attribute_cols := vl_attribute_cols||', NVL(b.dept_id, l.'||vg_trf_dept_id_attribute||') ';
3397         END IF;
3398 
3399         IF vg_trf_main_acct_attribute IS NOT NULL
3400           THEN
3401            vl_attribute_cols  := vl_attribute_cols||', NVL(b.main_account, l.'|| vg_trf_main_acct_attribute ||') ';
3402         END IF;
3403 
3404 	IF vl_attribute_cols IS NOT NULL THEN
3405 	  vl_group_by_clause := ' GROUP BY ' || SUBSTR(vl_attribute_cols, 2);
3406 	END IF;
3407 	---------------------------------------------------------------------------------------
3408 	BEGIN
3409            c_gl_line_cur := DBMS_SQL.OPEN_CURSOR  ;
3410          EXCEPTION
3411          WHEN OTHERS THEN
3412             vp_retcode := 2;
3413             vp_errbuf  := SQLERRM||
3414 			  ' Open cursor error in Populate_Gl_Interface procedure.';
3415             RETURN;
3416         END ;
3417 
3418 vl_stmt :=
3419 ' SELECT MAX(Fv_Ye_Carryforward.Convert_To_Num (l.reference_1)) reference_1 ,
3420                      SUM( NVL(entered_dr, 0) - NVL(entered_cr,0) ) line_amount ' ||
3421                      vl_attribute_cols ||
3422             ' FROM  gl_je_lines   l , fv_be_trx_dtls B, gl_je_headers h
3423               WHERE l.code_combination_id = :ccid
3424               AND l.je_header_id = h.je_header_id
3425               AND  NVL(h.je_from_sla_flag, ''N'') IN (''N'',''U'')
3426 -- AND l.gl_sl_link_id is null
3427               AND  EXISTS (SELECT 1
3428                            FROM   gl_period_statuses glp
3429                            WHERE  glp.application_id = 101
3430                            AND    glp.set_of_books_id = :sob_id
3431                            AND    glp.ledger_id = :sob_id
3432                            AND    glp.period_year = :closing_fyr
3433                            AND    glp.period_name = l.period_name)
3434               AND  NVL(l.reference_1, ''-99'')  = TO_CHAR(b.transaction_id (+))
3435               AND l.status = :je_status
3436               AND b.set_of_books_id(+) = :sob_id
3437               AND h.ledger_id = :sob_id
3438               AND b.set_of_books_id = h.ledger_id
3439               '|| vl_group_by_clause ||
3440 ' UNION
3441 SELECT MAX(xdl.SOURCE_DISTRIBUTION_ID_NUM_1) reference_1 ,
3442 SUM( NVL(xl.entered_dr, 0) - NVL(xl.entered_cr,0) ) line_amount '
3443 ||vl_attribute_cols ||
3444 ' FROM  fv_be_trx_dtls B, xla_ae_lines xl , xla_distribution_links xdl,
3445 gl_je_lines   l,  gl_je_headers h, gl_import_references gli
3446 WHERE  xl.code_combination_id = :ccid
3447 AND  xl.ae_header_id = xdl.ae_header_id
3448 AND  xl.ae_line_num = xdl.ae_line_num
3449 AND  xl.gl_sl_link_id = gli.gl_sl_link_id
3450 and gli.je_batch_id = h.je_batch_id
3451 and gli.je_header_id = h.je_header_id
3452 and gli.je_line_num = l.je_line_num
3453 AND  NVL(h.je_from_sla_flag, ''N'') = ''Y''
3454 --l.gl_sl_link_id is not null
3455 AND  l.je_header_id = h.je_header_id
3456 AND  EXISTS (SELECT 1
3457 FROM  gl_period_statuses glp
3458 WHERE  glp.application_id = 101
3459 AND  glp.set_of_books_id = :sob_id
3460 AND  glp.period_year = :closing_fyr
3461 AND   glp.period_name = l.period_name)
3462 AND   NVL(xdl.SOURCE_DISTRIBUTION_ID_NUM_1, '||''''||'-99'||''''||')
3463 = b.transaction_id (+)
3464 AND   l.status = :je_status
3465 AND   h.ledger_id = :sob_id
3466 AND   b.set_of_books_id = h.LEDGER_id'
3467 ||vl_group_by_clause;
3468 
3469 
3470 
3471     	BEGIN
3472         	dbms_sql.parse(c_gl_line_cur, vl_stmt, DBMS_SQL.V7) ;
3473       	  EXCEPTION
3474           WHEN OTHERS THEN
3475             vp_retcode := 2;
3476             vp_errbuf  := SQLERRM||
3477                           ' Parse cursor error in Populate_Gl_Interface procedure.';
3478               FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3479             RETURN;
3480     	END ;
3481 
3482         -- Bind the variables
3483         dbms_sql.bind_variable(c_gl_line_cur,':ccid', vl_ccid);
3484         dbms_sql.bind_variable(c_gl_line_cur,':sob_id', vg_sob_id);
3485         dbms_sql.bind_variable(c_gl_line_cur,':closing_fyr', vp_closing_fyr);
3486         dbms_sql.bind_variable(c_gl_line_cur,':je_status', 'P');
3487         dbms_sql.bind_variable(c_gl_line_cur,':sob_id', vg_sob_id);
3488 
3489         dbms_sql.define_column(c_gl_line_cur, 1, vl_reference_1, 280);
3490         dbms_sql.define_column(c_gl_line_cur, 2, vl_line_amount);
3491 
3492 	vl_column_num := 3;
3493 
3494 	IF vg_public_law_attribute IS NOT NULL THEN
3495            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_public_law_code, 150);
3496 	   vl_column_num := vl_column_num + 1;
3497 	END IF;
3498 
3499 	IF vg_advance_type_attribute IS NOT NULL THEN
3500            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_advance_type, 150);
3501 	   vl_column_num := vl_column_num + 1;
3502 	END IF;
3503 
3504 	IF vg_trf_dept_id_attribute IS NOT NULL THEN
3505            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_trf_dept_id, 150);
3506 	   vl_column_num := vl_column_num + 1;
3507            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_trf_main_acct, 150);
3508 	END IF;
3509 
3510      	BEGIN
3511         	vl_exec_cur := dbms_sql.EXECUTE(c_gl_line_cur);
3512       	 EXCEPTION
3513             WHEN OTHERS THEN
3514             vp_retcode := 2 ;
3515             vp_errbuf  := SQLERRM||
3516                           ' Execute cursor error in Populate_Gl_Interface procedure.';
3517               FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3518         END ;
3519 
3520         LOOP
3521 
3522 	     vl_public_law_code := NULL;
3523 	     vl_advance_type    := NULL;
3524 	     vl_trf_dept_id     := NULL;
3525 	     vl_trf_main_acct   := NULL;
3526 
3527 	     IF dbms_sql.fetch_rows(c_gl_line_cur) = 0 THEN
3528                 EXIT;
3529               ELSE
3530 
3531                 dbms_sql.column_value(c_gl_line_cur, 1, vl_reference_1);
3532                 dbms_sql.column_value(c_gl_line_cur, 2, vl_line_amount);
3533 
3534 	        vl_column_num := 3;
3535 
3536               	IF vg_public_law_attribute IS NOT NULL THEN
3537                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_public_law_code);
3538 	   		vl_column_num := vl_column_num + 1;
3539               	END IF;
3540 
3541               	IF vg_advance_type_attribute IS NOT NULL THEN
3542                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_advance_type);
3543 	   		vl_column_num := vl_column_num + 1;
3544               	END IF;
3545 
3546               	IF vg_trf_dept_id_attribute IS NOT NULL THEN
3547                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_trf_dept_id);
3548 	   	 	vl_column_num := vl_column_num + 1;
3549                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_trf_main_acct);
3550               	END IF;
3551 
3552                 -- vl_reference_1 := gl_record.reference_1;
3553                 IF vl_line_amount <> 0 THEN  -- consider only non zero balance lines
3554                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3555  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' LINE AMOUNT ' || VL_LINE_AMOUNT);
3556             END IF;
3557                     vl_running_amount := vl_running_amount + vl_line_amount;
3558 
3559                     vl_amount_dr := 0;
3560                     vl_amount_cr := 0;
3561 
3562                     IF vl_line_amount > 0 THEN
3563                          vl_amount_cr := ABS(vl_line_amount);
3564                      ELSE
3565                          vl_amount_dr := ABS(vl_line_amount);
3566                     END IF;
3567 
3568                    Insert_gl_interface_record(vl_amount_dr,vl_amount_cr,vl_reference_1,
3569                                   vl_period_name,vl_trading_partner, vl_public_law_code,
3570 				  vl_advance_type, vl_trf_dept_id, vl_trf_main_acct);
3571                 END IF;
3572 	     END IF;
3573         END LOOP;
3574 
3575           BEGIN
3576                 dbms_sql.close_cursor(c_gl_line_cur);
3577            EXCEPTION
3578                 WHEN OTHERS THEN
3579                     vp_retcode := SQLCODE ;
3580                     VP_ERRBUF  := SQLERRM ;
3581                       FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3582                     RETURN ;
3583           END ;
3584 
3585           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3586  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT MATCHED ' || VL_RUNNING_AMOUNT);
3587 END IF;
3588 
3589          FOR facts2_ending_balance_rec IN (SELECT ffeb.ending_balance_cr,
3590                                                    ffeb.ending_balance_dr,
3591                                                    ffeb.transfer_dept_id,
3592                                                    ffeb.public_law,
3593                                                    ffeb.advance_flag,
3594                                                    ffeb.transfer_main_acct
3595                                               FROM fv_factsii_ending_balances ffeb
3596                                              WHERE ffeb.set_of_books_id = vg_sob_id
3597                                                AND ffeb.fiscal_year = vp_closing_fyr-1
3598                                                AND ffeb.ccid = vl_ccid) LOOP
3599 
3600             vl_running_amount := vl_running_amount + NVL(facts2_ending_balance_rec.ending_balance_dr, 0) - NVL(facts2_ending_balance_rec.ending_balance_cr, 0);
3601             Insert_gl_interface_record(facts2_ending_balance_rec.ending_balance_cr,facts2_ending_balance_rec.ending_balance_dr,
3602                                        NULL,
3603                                        vl_period_name,vl_trading_partner,
3604                                        facts2_ending_balance_rec.public_law,
3605                                        facts2_ending_balance_rec.advance_flag,
3606                                        facts2_ending_balance_rec.transfer_dept_id,
3607                                        facts2_ending_balance_rec.transfer_main_acct);
3608           END LOOP;
3609 
3610 
3611                   vl_amount_dr := 0;
3612                   vl_amount_cr := 0;
3613 
3614 	  IF ABS(vl_amount) <> ABS(vl_running_amount) THEN
3615 	    -- Bug 4546827
3616             -- IF (vl_amount < 0) THEN
3617 
3618             IF (vl_amount + vl_running_amount < 0) THEN
3619                 vl_amount_cr := ABS(vl_amount + vl_running_amount);
3620                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3621  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'DIFFERENCE CR AMOUNT ADDED  ' || VL_AMOUNT_CR);
3622 END IF;
3623              ELSE
3624                  vl_amount_dr := ABS(vl_amount + vl_running_amount);
3625                  IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3626  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'DIFFERENCE DR AMOUNT ADDED  ' || VL_AMOUNT_DR);
3627 END IF;
3628              END IF;
3629             -- Bug 7150443. Added vl_public_law_code to the call below.
3630             -- Reverted the change made for above.
3631             Insert_gl_interface_record(vl_amount_dr , vl_amount_cr, NULL,
3632 				       vl_period_name,vl_trading_partner);
3633           END IF;
3634     ELSE					-- vl_ptype
3635        Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3636 			vc_journals.period_net_cr, vl_reference_1,
3637 			vl_period_name,vl_trading_partner);
3638 
3639     END IF;					-- vl_ptype
3640   END IF;					-- balance_read_flag
3641 END LOOP;						-- journal_entries loop
3642 
3643 
3644    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3645  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   AFTER INSERTING INTO GL_INTERFACE....');
3646    END IF;
3647 
3648    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3649  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CALLING THE JOURNAL IMPORT PROGRAM....');
3650    END IF;
3651    -- Submit a Concurrent request to invoke journal import
3652    vl_req_id := FND_REQUEST.SUBMIT_REQUEST('SQLGL',
3653                                     'GLLEZL',
3654                                      '',
3655                                      '',
3656                                      FALSE,
3657                                      TO_CHAR(vg_interface_run_id),
3658                                      TO_CHAR(vg_sob_id),
3659                                      'N', '', '', 'N', 'W');
3660 
3661    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3662  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   THE REQUEST_ID IS '||VL_REQ_ID);
3663    END IF;
3664 
3665    -- if concurrent request submission failed then abort process
3666    IF (vl_req_id = 0) THEN
3667         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3668  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL IMPORT REQUEST NOT SUBMITTED.');
3669         END IF;
3670         vp_errbuf := 'Cannot submit journal import program';
3671         vp_retcode := 1;
3672         ROLLBACK;
3673         RETURN;
3674    ELSE
3675         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3676  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL IMPORT REQUEST SUBMITTED SUCCESSFULLY.');
3677         END IF;
3678         COMMIT;
3679    END IF;
3680 
3681    -- Check status of completed concurrent program
3682    -- and if complete exit
3683    vl_call_status := Fnd_Concurrent.Wait_For_Request(
3684                 vl_req_id, 20, 0, vl_rphase, vl_rstatus,
3685                 vl_dphase, vl_dstatus, vl_message);
3686 
3687    IF (vl_call_status = FALSE) THEN
3688         vp_errbuf := 'Cannot wait for the status of journal import';
3689         vp_retcode := 1;
3690    END IF;
3691 
3692    -- Clean up gl_interface table
3693    Cleanup_Gl_Interface;
3694 
3695    IF (vp_retcode <> 0) THEN
3696 	RETURN;
3697    END IF;
3698 
3699 EXCEPTION
3700    WHEN OTHERS THEN
3701 	vp_retcode := 2;
3702 	vp_errbuf  := SQLERRM || '--Error in Populate_Gl_Interface procedure.';
3703        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3704                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3705                          'When Others Exception ' || vp_errbuf );
3706        END IF;
3707 	RETURN;
3708 END Populate_Gl_Interface;
3709 
3710 -- ------------------------------------------------------------------
3711 --                      Procedure Cleanup_Gl_Interface
3712 -- ------------------------------------------------------------------
3713 -- Cleanup_Gl_Interface procedure is called from Populate_Gl_interface
3714 -- procedure. This cleans up the gl_interface table.
3715 -- ------------------------------------------------------------------
3716 PROCEDURE Cleanup_Gl_Interface IS
3717  l_module_name         VARCHAR2(200) ;
3718 BEGIN
3719 
3720   l_module_name :=  g_module_name || 'Cleanup_Gl_Interface ';
3721 
3722  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3723  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN THE CLEANUP_GL_INTERFACE PROCEDURE....');
3724  END IF;
3725 
3726    -- Delete from Gl_Interface table
3727    DELETE FROM Gl_Interface
3728    WHERE user_je_source_name = 'Year End Close'
3729    AND ledger_id = vg_sob_id
3730    AND group_id = vg_jrnl_group_id;
3731 
3732 EXCEPTION
3733    WHEN OTHERS THEN
3734 	vp_retcode := 2;
3735 	vp_errbuf  := SQLERRM || '--Error in Cleanup_Gl_Interface procedure.';
3736        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3737                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3738                          'When Others Exception ' || vp_errbuf );
3739        END IF;
3740 
3741 	RETURN;
3742 END Cleanup_Gl_Interface;
3743 
3744 -- ------------------------------------------------------------------
3745 --                      Procedure Submit_Report
3746 -- ------------------------------------------------------------------
3747 -- Submit_Report procedure is called from Main procedure.
3748 -- This procedure submits the execution report.
3749 -- ------------------------------------------------------------------
3750 PROCEDURE Submit_Report IS
3751    vl_req_id  NUMBER;
3752    vl_call_status  BOOLEAN;
3753    vl_rphase       VARCHAR2(30);
3754    vl_rstatus      VARCHAR2(30);
3755    vl_dphase       VARCHAR2(30);
3756    vl_dstatus      VARCHAR2(30);
3757    vl_message      VARCHAR2(240);
3758   l_module_name         VARCHAR2(200) ;
3759 
3760 BEGIN
3761    l_module_name  :=  g_module_name || 'Submit_Report ';
3762 
3763    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3764  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN THE SUBMIT_REPORT PROCEDURE....');
3765    END IF;
3766 
3767    vl_req_id := Fnd_Request.Submit_Request('FV','FVXYECER','','',FALSE,
3768                                 vg_sob_id,vp_closing_fyr,vp_timeframe,
3769                                 vp_fundgroup,vp_trsymbol,vp_journal_import);
3770 
3771    IF (vl_req_id = 0) THEN
3772 	vp_retcode := 2;
3773 	vp_errbuf  := 'Error in Submit_Report procedure while submitting the '||
3774 			' Year End Execution Report';
3775 	RETURN;
3776    ELSE
3777 	COMMIT;
3778         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3779  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     YEAR END EXECUTION REPORT IS SUCCESSFULLY '||
3780 			'submitted.....');
3781         END IF;
3782    END IF;
3783 
3784    -- Check status of completed concurrent program
3785    -- and if complete exit
3786    vl_call_status := Fnd_Concurrent.Wait_For_Request(
3787                 vl_req_id, 20, 0, vl_rphase, vl_rstatus,
3788                 vl_dphase, vl_dstatus, vl_message);
3789 
3790    IF (vl_call_status = FALSE) THEN
3791         vp_errbuf := 'Cannot wait for the status of Year End Execution Report';
3792         vp_retcode := 1;
3793 	RETURN;
3794    END IF;
3795 
3796 EXCEPTION
3797    WHEN OTHERS THEN
3798         vp_retcode := 2;
3799         vp_errbuf  := SQLERRM || '--Error in Submit_Report procedure.';
3800         RETURN;
3801 END Submit_Report;
3802 ---------------------------------------------------------------
3803   PROCEDURE insert_gl_interface_record(l_amount_dr IN NUMBER,
3804                                        l_amount_cr IN NUMBER,
3805                                        l_reference_1 IN VARCHAR2,
3806                                        l_period_name IN VARCHAR2,
3807 				       l_trading_partner IN VARCHAR2,
3808 				       l_public_law_code IN VARCHAR2,
3809 				       l_advance_type IN VARCHAR2,
3810 				       l_trf_dept_id IN VARCHAR2,
3811 				       l_trf_main_acct IN VARCHAR2)
3812 
3813  IS
3814 
3815    TYPE attribtable IS TABLE OF gl_je_lines.attribute1%TYPE
3816       INDEX BY BINARY_INTEGER;
3817    vl_attribtable   attribtable ;
3818 
3819   vl_str VARCHAR2(3000);
3820   l_module_name         VARCHAR2(200) ;
3821   BEGIN
3822      l_module_name   :=  g_module_name || 'insert_gl_interface_record ';
3823 
3824        FOR i IN 1..20
3825         LOOP
3826           vl_attribtable(i) := NULL;
3827 	END LOOP;
3828 
3829        IF vg_factsi_attribute IS NOT NULL THEN
3830           vl_attribtable(SUBSTR(vg_factsi_attribute, 10)) := l_trading_partner;
3831        END IF;
3832 
3833        IF vg_public_law_attribute IS NOT NULL THEN
3834           vl_attribtable(SUBSTR(vg_public_law_attribute, 10)) := l_public_law_code;
3835        END IF;
3836 
3837        IF vg_advance_type_attribute IS NOT NULL THEN
3838           vl_attribtable(SUBSTR(vg_advance_type_attribute, 10)) := l_advance_type;
3839        END IF;
3840 
3841        IF vg_trf_dept_id_attribute IS NOT NULL THEN
3842           vl_attribtable(SUBSTR(vg_trf_dept_id_attribute, 10))   := l_trf_dept_id;
3843           vl_attribtable(SUBSTR(vg_trf_main_acct_attribute, 10)) := l_trf_main_acct;
3844        END IF;
3845 
3846    vl_str := 'INSERT INTO Gl_Interface
3847 	       (
3848 		status, ledger_id, accounting_date, currency_code,
3849 		date_created, created_by, actual_flag, user_je_category_name,
3850 		user_je_source_name, entered_dr, entered_cr, group_id,
3851 		period_name, chart_of_accounts_id,
3852                 segment1,segment2,segment3,
3853 		segment4,segment5,segment6,
3854 		segment7,segment8,segment9,
3855 		segment10,segment11,segment12,
3856 		segment13,segment14,segment15,
3857 		segment16,segment17,segment18,
3858                 segment19,segment20,segment21,
3859 		segment22,segment23,segment24,
3860 		segment25,segment26,segment27,
3861 		segment28,segment29,segment30,
3862 		reference21,context,
3863 	        attribute1, attribute2, attribute3, attribute4, attribute5,
3864 		attribute6, attribute7, attribute8, attribute9, attribute10,
3865 		attribute11, attribute12, attribute13, attribute14, attribute15,
3866 		attribute16, attribute17, attribute18, attribute19, attribute20
3867 	       )
3868 	   VALUES
3869 	       (
3870 		:status, :sob_id, :end_date, :currency,
3871 		:current_date, :user_id, :actual_flag, :user_je_category,
3872 		:user_je_source, :amount_dr, :amount_cr, :jrnl_group_id,
3873 		:period_name, :coa_id,
3874                 :vt_segments_1,:vt_segments_2,:vt_segments_3,
3875                 :vt_segments_4,:vt_segments_5,:vt_segments_6,
3876                 :vt_segments_7,:vt_segments_8,:vt_segments_9,
3877 		:vt_segments_10, :vt_segments_11,:vt_segments_12,
3878 		:vt_segments_13, :vt_segments_14,:vt_segments_15,
3879 		:vt_segments_16, :vt_segments_17,:vt_segments_18,
3880 		:vt_segments_19, :vt_segments_20, :vt_segments_21,
3881 		:vt_segments_22,:vt_segments_23, :vt_segments_24,
3882 		:vt_segments_25,:vt_segments_26, :vt_segments_27,
3883 		:vt_segments_28,:vt_segments_29, :vt_segments_30,
3884 		:reference_1,:context,
3885 		:attribute1, :attribute2, :attribute3, :attribute4, :attribute5,
3886 		:attribute6, :attribute7, :attribute8, :attribute9, :attribute10,
3887 		:attribute11, :attribute12, :attribute13, :attribute14, :attribute15,
3888 		:attribute16, :attribute17, :attribute18, :attribute19, :attribute20
3889 	       ) ' ;
3890 
3891     EXECUTE IMMEDIATE vl_str USING
3892 		'NEW', vg_sob_id, vg_end_date, vg_currency,
3893 		SYSDATE, Fnd_Global.user_id, 'A', 'Year End Close',
3894 		'Year End Close', l_amount_dr, l_amount_cr, vg_jrnl_group_id,
3895 		l_period_name, vg_coa_id,
3896                 vt_segments(1),vt_segments(2),vt_segments(3),
3897                 vt_segments(4),vt_segments(5),vt_segments(6),
3898                 vt_segments(7),vt_segments(8),vt_segments(9),
3899 		vt_segments(10),
3900                 vt_segments(11),vt_segments(12),vt_segments(13),
3901                 vt_segments(14),vt_segments(15),vt_segments(16),
3902                 vt_segments(17),vt_segments(18),vt_segments(19),
3903 		vt_segments(20),
3904                 vt_segments(21),vt_segments(22),vt_segments(23),
3905                 vt_segments(24),vt_segments(25),vt_segments(26),
3906                 vt_segments(27),vt_segments(28),vt_segments(29),
3907 		vt_segments(30),
3908 		l_reference_1,'Global Data Elements',
3909 		vl_attribtable(1), vl_attribtable(2), vl_attribtable(3),
3910 		vl_attribtable(4), vl_attribtable(5), vl_attribtable(6),
3911 		vl_attribtable(7), vl_attribtable(8), vl_attribtable(9),
3912 		vl_attribtable(10), vl_attribtable(11), vl_attribtable(12),
3913 	        vl_attribtable(13), vl_attribtable(14), vl_attribtable(15),
3914 		vl_attribtable(16), vl_attribtable(17), vl_attribtable(18),
3915 		vl_attribtable(19), vl_attribtable(20);
3916 
3917 EXCEPTION
3918    WHEN OTHERS THEN
3919         vp_retcode := 2;
3920         vp_errbuf  := SQLERRM || '--Error in Insert_Gl_Interface_Record procedure.';
3921        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3922                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3923                          'When Others Exception ' || vp_errbuf );
3924        END IF;
3925 END insert_gl_interface_record;
3926 -----------------------------------------------------------------------------
3927 -- ------------------------------------------------------------------
3928 --              Procedure Check_bal_seg_value
3929 -- ------------------------------------------------------------------
3930 --  BSV's are not always assigned to ledgers. Therefore we should not
3931 --  enforce BSV assignemnt if there is no BSV flex value set
3932 --  is assigned to a ledger.
3933 --  IF bal_seg_value_option_code column value in GL_LEDGER table is
3934 --  'A' that means all BSV's are valid. If the column is 'I',
3935 --   then some BSV's are valid.
3936 --  ------------------------------------------------------------------
3937 
3938 PROCEDURE Check_bal_seg_value( vp_fund_grp VARCHAR2,
3939                                    vp_time_frame VARCHAR,
3940                                  vp_tsymbol_id VARCHAR  ,
3941                                 vp_sob_id NUMBER ,
3942                                vp_end_date DATE )
3943         IS
3944 TYPE v_fund_val_blk IS TABLE OF fv_fund_parameters.fund_value%TYPE
3945  index by binary_integer;
3946 
3947 V_fund_blk_tbl  v_fund_val_blk;
3948 l_select_stmt varchar2(2500);
3949 l_module_name         VARCHAR2(200)  ;
3950    vl_valid_value     VARCHAR2(1);
3951 Type v_ref_cursor is  REF CURSOR;
3952 v_fund_val_cursor  v_ref_cursor;
3953 vl_invalid_fund varchar2(1);
3954 BEGIN
3955   l_module_name    :=  g_module_name ||  'Check_bal_seg_value  ';
3956 vl_invalid_fund := 'Y';
3957   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3958  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3959                          l_module_name,
3960                         '   IN CHECK_BAL_SEG_VALUE PROCEDURE '||
3961         'with the following Parameters passed to the process:');
3962    END IF;
3963    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3964  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3965                          l_module_name,
3966                 '   FUND GROUP= '||VP_FUND_GRP);
3967  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3968                          l_module_name,
3969                         '   TIME FRAME= '||VP_TIME_FRAME);
3970  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3971                         l_module_name,
3972                 '   TREASURY SYMBOL ID= '||VP_TSYMBOL_ID);
3973  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3974                  l_module_name,
3975                 '   SET OF BOOKS ID= '||VP_SOB_ID);
3976  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
3977                          l_module_name,
3978                         '   END DATE= '||VP_END_DATE);
3979    END IF;
3980 
3981 L_select_stmt :=  '  SELECT ffp.fund_value
3982       FROM fv_fund_parameters ffp,
3983                Fv_Ye_Groups fyg ,
3984                fv_treasury_symbols fts
3985     WHERE  fyg.fund_group_code    = fts.fund_group_code
3986          AND   fts.time_frame         = fyg.fund_time_frame
3987          AND   fts.treasury_symbol_id = fyg.treasury_symbol_id
3988          AND   fts.treasury_symbol_id = ffp.treasury_symbol_id
3989          AND   fyg.fund_group_code    = NVL(:fundgroup, fyg.fund_group_code)
3990          AND   fyg.fund_time_frame    = NVL(:timeframe, fyg.fund_time_frame)
3991          AND   fyg.treasury_symbol = NVL(:TSYMBOLID, fyg.treasury_symbol_id)
3992          AND   fts.set_of_books_id    = :sob_id
3993          AND   fts.set_of_books_id    = fyg.set_of_books_id
3994                AND   fts.set_of_books_id    = ffp.set_of_books_id
3995                AND ((fts.expiration_date <= :end_date)
3996                         OR (fts.cancellation_date <= :end_date))';
3997 
3998 EXECUTE IMMEDIATE L_SELECT_STMT BULK COLLECT INTO v_fund_blk_tbl
3999 USING vp_fund_grp,
4000         vp_time_frame,
4001         vp_tsymbol_id ,
4002         vp_sob_id,
4003         vp_end_date,
4004          vp_end_date;
4005 
4006 FOR I in  1 .. v_fund_blk_tbl.count
4007 LOOP
4008 BEGIN
4009       SELECT  'N'
4010       INTO    vl_invalid_fund
4011       FROM    gl_ledger_segment_values glsv
4012       WHERE   glsv.ledger_id = vp_sob_id
4013        AND     glsv.segment_type_code (+) = 'B'
4014       AND     NVL(glsv.status_code (+), 'X') <> 'I'
4015       AND     NVL(glsv.start_date (+),TO_DATE('1950/01/01','YYYY/MM/DD'))
4016                <= NVL(sysdate,TO_DATE('9999/12/31','YYYY/MM/DD'))
4017       AND     NVL(glsv.end_date (+),TO_DATE('9999/12/31','YYYY/MM/DD'))
4018                >= NVL(sysdate, TO_DATE('1950/01/01','YYYY/MM/DD'))
4019       AND     glsv.segment_value (+)  = v_fund_blk_tbl(i);
4020 
4021 EXCEPTION
4022    WHEN NO_DATA_FOUND THEN
4023       IF vl_invalid_fund = 'Y' THEN
4024 FV_UTILITY.LOG_MESG('The  below fund values are not valid balance  segment
4025 values for the Ledger:');
4026   End if;
4027         vl_invalid_fund := 'W' ;
4028         FV_UTILITY.LOG_MESG('');
4029          FV_UTILITY.LOG_MESG(v_fund_blk_tbl(i));
4030 END;
4031 END LOOP;
4032 EXCEPTION
4033    WHEN OTHERS THEN
4034         vp_retcode := 2 ;
4035         vp_errbuf  := SQLERRM  ||' -- Error in Check Check_bal_seg_value procedure.' ;
4036         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4037            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED,
4038                                  l_module_name,
4039                          'When Others Exception ' || vp_errbuf );
4040         END IF;
4041         RETURN ;
4042 END Check_bal_seg_value;
4043 
4044 BEGIN
4045   g_module_name  := 'fv.plsql.Fv_Ye_Close.';
4046  vg_factsi_attr_exists := 'N';
4047  vp_retcode := 0   ;
4048 
4049 
4050 END Fv_Ye_Close;