DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSC_PROFILE_ENGINE_PKG

Source


1 PACKAGE BODY CSC_Profile_Engine_PKG AS
2 /* $Header: csccpepb.pls 120.22.12010000.3 2008/09/11 03:09:28 mpathani ship $ */
3 
4 --
5 -- Constant values
6 --
7 debug       CONSTANT BOOLEAN 	  := FALSE; -- Run engine in debug or normal mode
8 date_format CONSTANT VARCHAR2(30) := 'YYYY/MM/DD HH24:MI:SS';
9 --
10 -- Global variables
11 --
12 warning_msg	VARCHAR2(2000)  := ''; -- non-fatal error messages
13 error_flag	BOOLEAN 	:= FALSE; -- error evaluating one or more blk/chk
14 --user_id		NUMBER;
15 --login_id		NUMBER;
16 
17 --up_total	Number := 0;
18 --ip_total	Number := 0;
19 --ua_total	NUmber := 0;
20 --ia_total	Number := 0;
21 
22 --g_for_insert	Varchar2(1) := 'Y';
23 --g_for_party	Varchar2(1) := 'Y';
24 --period_date	Date := null;
25 
26 g_error		Varchar2(2000);
27 
28 --
29 -- Utility to delete all records in pl/sql tables
30 --
31 PROCEDURE Table_Delete;
32 
33 
34 --
35 -- Run_Engine
36 --   Loop through all the effective profile checks and evaluate the results
37 --   for each party and account.
38 --   This program can be called in:
39 --      a. customer profile setup form, when changes takes place on the profile definition
40 --      b. customer profile and dashboard window, when refresh button is clicked.
41 --      c. Stand alone as a concurrent program
42 --         note: if no parameters are passed it is assumed that the package will be run
43 --               as a concurrent program. and will update all results for party and account.
44 -- IN
45 --  p_block_tbl - if there are changes in the setup in the profile checks (blocks),
46 --                a table of profile checks is passed.
47 --  p_check_tbl - if there are changes in the setup in the check variable, a table of check
48 --                variables is passed.
49 --  p_party_id
50 --  p_acct_id
51 --  p_group_id
52 --	 -- this parameters is used when the refresh button is pressed. only those profile
53 --	    checks, check variables that falls into the group for that party or account will
54 --	    be calculated.
55 -- OUT
56 --   errbuf - return any error messages
57 --   retcode - return completion status (returns 0 for success, 1 for success
58 --             with warnings, and 2 for error)
59 --
60 
61 PROCEDURE Run_Engine (p_errbuf	 OUT NOCOPY VARCHAR2,
62                       p_retcode  OUT NOCOPY NUMBER,
63                       p_party_id IN  NUMBER,
64                       p_acct_id  IN  NUMBER,
65                       p_group_id IN  NUMBER ) IS
66 
67   v_block_count		NUMBER := 0;
68   v_check_count		NUMBER := 0;
69 
70   v_errbuf		Varchar2(240);
71   v_retcode		Number;
72   v_exception		BOOLEAN;
73 
74   v_date Date := null;
75 
76   --l_period_date	Date := null;
77   l_up_total		Number := 0;
78   l_ip_total		Number := 0;
79   l_ua_total		NUmber := 0;
80   l_ia_total		Number := 0;
81   l_custom_hook_enabled varchar2(1);         /* Added for Custom Hook Enhancement */
82   l_ref_cursor csc_utils.Party_Ref_Cur_Type; /* Added for Custom Hook Enhancement */
83   l_party_rec csc_utils.Prof_Rec_Type;       /* Added for Custom Hook Enhancement */
84   l_party_id		Number;
85 
86 BEGIN
87 
88    -- Default user and login IDs
89    --user_id  := fnd_global.user_id;
90    --login_id := fnd_global.login_id;
91 
92    l_up_total := 0;
93    l_ip_total := 0;
94    l_ua_total := 0;
95    l_ia_total := 0;
96    table_delete;
97 
98     /*************************************************************************************
99 				START OF CUSTOM HOOK ENHANCEMENT
100    CSC_PROF_PARTY_SQL_CUHK will be invoked to get the select statement for fetching party
101    records by the profile engine.
102    *************************************************************************************/
103   l_custom_hook_enabled := 'N';
104 
105 
106    IF  p_party_id IS NULL THEN
107       IF JTF_USR_HKS.ok_to_execute('CSC_PROF_PARTY_SQL_CUHK','GET_PARTY_SQL_PRE','B','C') THEN
108 
109 	l_custom_hook_enabled := 'Y';
110 
111 
112 	CSC_PROF_PARTY_SQL_CUHK.Get_Party_Sql_Pre(l_ref_cursor);
113 	LOOP
114 		FETCH l_ref_cursor INTO l_party_id;
115 		EXIT WHEN l_ref_cursor%NOTFOUND;
116 		IF l_party_id is not NULL then
117 			IF p_group_id is NULL then
118 				Evaluate_Checks3(l_party_id,
119 							    null,
120 							    null,
121 							    v_errbuf,
122 							    v_retcode);
123                        ELSE /* group_id is not null */
124 				Evaluate_Checks2(l_party_id,
125 							    null,
126 							    p_group_id,
127 							    'N',
128 							    v_errbuf,
129 							    v_retcode);
130 		       END IF;
131 		 END IF;
132 	        p_errbuf  := v_errbuf;
133 	        p_retcode := v_retcode;
134 	END LOOP;
135       ELSE
136        l_custom_hook_enabled := 'N';
137     END IF; /* IF JTF_USR_HKS.ok_to_execute */
138     END IF; /*  IF  p_party_id IS NULL */
139 
140     IF l_custom_hook_enabled = 'N' THEN
141     /*Existing logic is used */
142    /*******************************************************************************************
143 				END OF CUSTOM HOOK ENHANCEMENT
144    ********************************************************************************************/
145 
146    IF (p_party_id is null and p_group_id is NULL ) THEN
147 
148 	-- Populate the check results table for all parties and accounts for type 'B'
149         Evaluate_Checks1_Var;
150 
151         IF g_check_no_batch = 'Y' THEN
152           -- Call Evaluate_Blocks1_No_Batch and Evaluate_Checks1_No_Batch
153           -- to process profile variables with no batch sql stmnt for type Variable ('B')
154            Evaluate_Blocks1_No_Batch(l_up_total, l_ip_total, l_ua_total, l_ia_total);
155            Evaluate_Checks1_No_Batch(v_errbuf, v_retcode);
156            p_errbuf := v_errbuf;
157            p_retcode := v_retcode;
158         END IF;
159 
160 	-- Populate the check results table for all parties and accounts for type 'T'
161 	Evaluate_Checks1_Rule(v_errbuf, v_retcode);
162 	p_errbuf := v_errbuf;
163 	p_retcode := v_retcode;
164 
165 	-- Call Relationship Plan Engine
166 	Csc_Plan_Assignment_Pkg.Run_Plan_Engine (v_errbuf, v_retcode, null, null, null, null);
167 
168    ELSIF (p_party_id IS NOT NULL and p_group_id IS NOT NULL) THEN
169 	-- Evaluate for this party Alone, only for Valid checks present in the given group
170 
171       Evaluate_Checks2(p_party_id => p_party_id,
172                        p_acct_id => p_acct_id,
173                        p_group_id => p_group_id,
174                        p_critical_flag => 'N',
175                        errbuf => v_errbuf,
176                        retcode => v_retcode);
177 
178 	party_id_plan_table(1) 	 := p_party_id;
179 	account_id_plan_table(1) := p_acct_id;
180         Csc_Plan_Assignment_Pkg.Run_Plan_Engine (v_errbuf, v_retcode, null, null, p_party_id, null); -- added by mpathani for bug 6928322
181 
182    ELSIF (p_party_id IS NOT NULL and p_group_id is null ) THEN
183 	-- Evaluate for all Valid Checks and For this party ;
184         Evaluate_Checks3(p_party_id, p_acct_id,
185 			 p_group_id, v_errbuf, v_retcode);
186 
187 	party_id_plan_table(1)   := p_party_id;
188 	account_id_plan_table(1) := p_acct_id;
189         Csc_Plan_Assignment_Pkg.Run_Plan_Engine (v_errbuf, v_retcode, null, null, p_party_id, null); -- added by mpathani for bug 6928322
190 
191    ELSIF (p_party_id IS NULL and p_group_id is NOT null ) THEN -- Added for 1850508
192 	-- Assume Group is given, but party and Account are null , Process for all parties
193 	-- This is specifically for cases, where the customers can start 'n' concurrent pgms
194 	-- for different groups.
195 
196 	-- Populate the check results table for all parties and accounts
197 	Evaluate_Checks4_Var(p_Group_id);
198 
199         -- Call Evaluate_Blocks4_No_Batch and Evaluate_Checks4_No_Batch
200 	-- to process profile variables with no batch sql stmnt
201 
202         IF g_check_no_batch = 'Y' THEN
203            Evaluate_Blocks4_No_Batch(l_up_total, l_ip_total, l_ua_total, l_ia_total, p_group_id);
204            Evaluate_Checks4_No_Batch(v_errbuf, v_retcode, p_Group_id);
205            p_errbuf := v_errbuf;
206            p_retcode := v_retcode;
207         END IF;
208 
209 	Evaluate_Checks4_Rule(v_errbuf, v_retcode, p_Group_id);
210 	p_errbuf := v_errbuf;
211 	p_retcode := v_retcode;
212 
213 	-- Call Relationship Plan Engine
214 	-- Check How to call Plans engine
215 	-- Csc_Plan_Assignment_Pkg.Run_Plan_Engine (v_errbuf, v_retcode, null, null, null, null);
216 
217   END IF;
218   END IF; /* IF l_custom_hook_enabled = 'N' */
219 
220 exception
221 	when others then
222 	  table_delete;
223 	  g_error := sqlcode || ' ' || sqlerrm;
224 	  fnd_file.put_line(fnd_file.log , g_error);
225 
226 END Run_Engine;
227 
228   --
229   -- Bug 1942032 to run engine as a concurrent program - overloaded procedure when
230   -- Account Id is removed from conc. program parameters.
231   --
232   PROCEDURE Run_Engine (p_errbuf	OUT NOCOPY VARCHAR2,
233     		      	p_retcode	OUT NOCOPY NUMBER,
234                         p_party_id      IN  NUMBER,
235                         p_group_id IN  NUMBER ) Is
236 
237   begin
238    run_engine(p_errbuf 		=> p_errbuf,
239               p_retcode 	=> p_retcode,
240               p_party_id	=> p_party_id,
241               p_acct_id		=> NULL,
242               p_group_id	=> p_group_id);
243 
244   End Run_engine;
245 
246 /* added the overloaded procedure for JIT enhancement */
247 PROCEDURE Run_Engine_jit (p_party_id IN NUMBER,
248                       p_acct_id	 IN NUMBER,
249                       p_group_id IN NUMBER,
250                       p_critical_flag IN VARCHAR2,
251 		      p_party_type    IN VARCHAR2 DEFAULT 'CUSTOMER')
252 IS
253    v_errbuf  VARCHAR2(240);
254    v_retcode NUMBER;
255 BEGIN
256 /* If party_type is customer -then g_dashboard_for_employee is Y else N */
257 	 IF upper(p_party_type) ='CUSTOMER' then
258 	     g_dashboard_for_employee := 'N';
259 	 elsif upper(p_party_type) ='EMPLOYEE' then
260 	     g_dashboard_for_employee := 'Y';
261 	 else
262 	     g_dashboard_for_employee := ' ';
263 
264 	 end if;
265 
266     Evaluate_Checks2(p_party_id => p_party_id,
267                      p_acct_id => p_acct_id,
268                      p_group_id => p_group_id,
269                      p_critical_flag => p_critical_flag,
270                      errbuf => v_errbuf,
271                      retcode => v_retcode);
272 END Run_Engine_jit;
273 
274 /* Overloaded procedure for R12 Employee HelpDesk Modifications */
275 PROCEDURE Run_Engine_All (p_errbuf	OUT NOCOPY VARCHAR2,
276     		       p_retcode	OUT NOCOPY NUMBER,
277 		       p_party_type  IN VARCHAR2,
278                         p_party_id      IN  NUMBER,
279                         p_group_id IN  NUMBER )
280 IS
281 
282 BEGIN
283 
284 /* If party_type is customer -then g_dashboard_for_employee is Y else N */
285 	 IF upper(p_party_type) ='CUSTOMER' then
286 	     g_dashboard_for_employee := 'N';
287 	 elsif upper(p_party_type) ='EMPLOYEE' then
288 	     g_dashboard_for_employee := 'Y';
289 	 else
290 	     g_dashboard_for_employee := ' ';
291 
292 	 end if;
293 
294 	 run_engine(p_errbuf 		=> p_errbuf,
295 		      p_retcode 	=> p_retcode,
296 	              p_party_id	=> p_party_id,
297 	              p_acct_id		=> null,
298 		      p_group_id	=> p_group_id);
299 
300 END Run_Engine_All;
301 --
302 -- Evaluate_Checks1_Var
303 --   Loop through all checks and evaluate the results
304 --   for each customer and account for type 'B'(Variable)
305 --   Processing if only Batch_Sql_Stmnt is not null
306 --   if check_id is null, party_id is null, account_id is null
307 --	      and block_id is null
308 --
309 
310 PROCEDURE Evaluate_Checks1_Var
311 IS
312 
313   chk_id     Number;
314   chk_name   Varchar2(240);
315   sel_blk_id Number;
316   data_type  Varchar2(90);
317   fmt_mask   Varchar2(90);
318   rule       Varchar2(32767);
319 
320   chk_u_l_flag    Varchar2(3);
321   Thd_grade       Varchar2(9);
322   truncate_flag   Varchar2(1) := 'N';
323 
324   blk_id           Number := null;
325   sql_stmt         Varchar2(2000) := null;
326   batch_sql_stmnt  Varchar2(4000)  := null;
327   curr_code        Varchar2(15) := null;
328 
329   v_party_in_sql Number := 0;
330   v_acct_in_sql  Number := 0;
331 
332   v_party_id    Number;
333   v_check_level Varchar2(10);
334 
335   curr_date DATE := SYSDATE;
336   insert_stmnt        VARCHAR2(4000);
337   insert_stmnt_sum    VARCHAR2(4000);
338   insert_stmnt_final  VARCHAR2(4000);
339   insert_stmnt_party  VARCHAR2(4000);
340   insert_stmnt_acct   VARCHAR2(4000);
341 
342 --Fix bug#7329039 by mpathani
343 --select_clause       VARCHAR2(100);
344 --v_select_clause     VARCHAR2(100);
345   select_clause       VARCHAR2(2000);
346   v_select_clause     VARCHAR2(2000);
347 
348   Range_Low_Value     VARCHAR2(240);
349   Range_High_Value    VARCHAR2(240);
350   val                 VARCHAR2(240) := null;
351 
352   /* variables for columns of insert statement */
353   c_fmt_mask     VARCHAR2(1000);
354   c_grade        VARCHAR2(1000);
355   c_curr_code    VARCHAR2(1000);
356   c_threshold    VARCHAR2(1000);
357   c_rating       VARCHAR2(1000);
358   c_color        VARCHAR2(1000);
359 
360   v_count       NUMBER;
361   v_chk_count   NUMBER;
362   v_batch_count NUMBER;
363 
364 -- varlables for getting CSC schema name
365   v_schema_status VARCHAR2(1);
366   v_industry      VARCHAR2(1);
367   v_schema_name   VARCHAR2(30);
368   v_get_appl      BOOLEAN;
369 
370 -- variables to build the batch sql for summation
371   v_select_pos    number;
372   v_select_length number;
373   v_from_pos      number;
374   v_from_sum      varchar2(2000);
375   v_select_sum    varchar2(2000) := 'SELECT hz.party_id, null, ';
376   v_group_pos     number;
377   v_group         varchar2(2000) := 'GROUP BY hz.party_id';
378   return_status   varchar2(50);
379 
380 -- variables for handling contact profile variables
381   v_where_clause_no_rel VARCHAR2(1000) := 'HZ.PARTY_TYPE IN (' || '''' || 'PERSON' || '''' || ', ' || '''' ||  'ORGANIZATION' || '''' || ')' ;
382   v_where_clause_rel VARCHAR2(1000) := 'HZ.PARTY_TYPE = ' || '''' ||'PARTY_RELATIONSHIP'|| '''' ;
383 
384   TABLESEGMENT_FULL  EXCEPTION;
385   INDEXSEGMENT_FULL  EXCEPTION;
386   SNAPSHOT_TOO_OLD   EXCEPTION;
387   INTERNAL_ERROR     EXCEPTION;
388   SUMMATION_ERROR    EXCEPTION;
389 
390   PRAGMA EXCEPTION_INIT(TABLESEGMENT_FULL, -1653);
391   PRAGMA EXCEPTION_INIT(INDEXSEGMENT_FULL, -1654);
392   PRAGMA EXCEPTION_INIT(SNAPSHOT_TOO_OLD, -1555);
393   PRAGMA EXCEPTION_INIT(INTERNAL_ERROR, -600);
394 
395   checks_csr  checks_cur_var;
396 
397   CURSOR block_csr IS
398       SELECT block_id, sql_stmnt, batch_sql_stmnt, currency_code, select_clause
399         FROM csc_prof_blocks_b a
400        WHERE a.block_id = sel_blk_id;
401 
402    Cursor val_csr3 IS
403      Select Range_Low_Value, Range_High_Value
404      From   csc_prof_check_ratings
405      Where  check_id = chk_id
406      and    check_rating_grade = thd_grade;
407 
408    CURSOR rating_crs IS
409      SELECT rating_code, check_rating_grade, color_code, range_low_value, range_high_value
410        FROM csc_prof_check_ratings
411       WHERE check_id = chk_id;
412 
413 BEGIN
414    COMMIT;
415    EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';
416    EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES=TRUE';
417 
418    v_get_appl :=  FND_INSTALLATION.GET_APP_INFO('CSC', v_schema_status, v_industry, v_schema_name);
419 
420    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_CHECK_RESULTS NOLOGGING';
421    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_BATCH_RESULTS2_T NOLOGGING';
422    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_BATCH_RESULTS1_T NOLOGGING';
423 
424    SELECT count(*) INTO v_chk_count FROM csc_prof_check_results;
425    SELECT count(*) INTO v_batch_count FROM CSC_PROF_BATCH_RESULTS2_T;
426 
427    IF v_chk_count = 0 AND v_batch_count <> 0 THEN
428 
429 
430       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 UNUSABLE';
431       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 UNUSABLE';
432       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 UNUSABLE';
433 
434       INSERT /*+ PARALLEL (csc_prof_check_results, 12) */
435       INTO csc_prof_check_results
436         (check_results_id, check_id, party_id, cust_account_id,
437          value, currency_code, grade, created_by, creation_date,
438          last_updated_by, last_update_date, last_update_login,
439          results_threshold_flag, rating_code, color_code
440          )
441       SELECT
442         check_results_id, check_id, party_id, cust_account_id,
443          value, currency_code, grade, created_by, creation_date,
444          last_updated_by, last_update_date, last_update_login,
445          results_threshold_flag, rating_code, color_code
446       FROM  CSC_PROF_BATCH_RESULTS2_T;
447 
448       COMMIT;
449 
450       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 REBUILD NOLOGGING';
451       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 REBUILD NOLOGGING';
452       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 REBUILD NOLOGGING';
453 
454    END IF;
455    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS2_T' ;
456 
457    IF g_dashboard_for_contact IS NULL THEN
458       FND_PROFILE.GET('CSC_DASHBOARD_VIEW_FOR_CONTACT',g_dashboard_for_contact);
459    END IF;
460 
461 /* R12 Employee HelpDesk Modifications */
462 
463    /* If g_dashboard_for_employee ='Y' then honour only employee level checks.If
464    'N',honour party_level checks with option for contact level fetched from profile option */
465 
466 
467 IF g_dashboard_for_employee ='Y' THEN
468 
469       OPEN checks_csr FOR
470          SELECT check_id, select_block_id, check_level,
471                 data_type, format_mask, check_upper_lower_flag, threshold_grade
472            FROM csc_prof_checks_b
473           WHERE SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
474                             AND Nvl(end_date_active, Sysdate)
475             AND select_type = 'B'
476 	    AND check_level IN ('EMPLOYEE');
477 ELSIF g_dashboard_for_employee ='N' THEN
478       IF g_dashboard_for_contact = 'Y' THEN
479          OPEN checks_csr FOR
480          SELECT check_id, select_block_id,check_level,
481                 data_type, format_mask, check_upper_lower_flag, threshold_grade
482            FROM csc_prof_checks_b
483           WHERE SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
484                             AND Nvl(end_date_active, Sysdate)
485             AND select_type = 'B'
486             AND check_level IN ('PARTY', 'ACCOUNT', 'CONTACT');
487       ELSIF g_dashboard_for_contact = 'N' THEN
488          OPEN checks_csr FOR
489          SELECT check_id, select_block_id,check_level,
490                 data_type, format_mask, check_upper_lower_flag, threshold_grade
491            FROM csc_prof_checks_b
492           WHERE SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
493                             AND Nvl(end_date_active, Sysdate)
494             AND select_type = 'B'
495             AND check_level IN ('PARTY', 'ACCOUNT');
496       END IF;
497 END IF;
498 
499 /* End of  R12 Employee HelpDesk Modifications */
500 
501    LOOP
502        FETCH checks_csr
503        INTO chk_id, sel_blk_id, v_check_level, data_type, fmt_mask, chk_u_l_flag, Thd_grade;
504 
505        EXIT WHEN checks_csr%notfound;
506 
507        Open block_csr;
508        Fetch block_csr INTO blk_id, sql_stmt, batch_sql_stmnt, curr_code, select_clause;
509        Close block_csr;
510 
511        IF batch_sql_stmnt IS NOT NULL THEN
512           IF v_check_level = 'CONTACT' THEN
513              IF g_dashboard_for_contact = 'Y' THEN
514                 batch_sql_stmnt := UPPER(batch_sql_stmnt);
515                 batch_sql_stmnt := REPLACE(batch_sql_stmnt, v_where_clause_no_rel, v_where_clause_rel);
516              END IF;
517           END IF;
518 
519           IF sql_stmt IS NOT NULL Then
520              v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
521              v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
522           Else
523             v_party_in_sql := 0;
524             v_acct_in_sql  := 0;
525           End if;
526 
527           EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS1_T' ;
528           insert_stmnt := 'INSERT INTO CSC_PROF_BATCH_RESULTS1_T ' || batch_sql_stmnt;
529           EXECUTE IMMEDIATE (insert_stmnt);
530 
531           IF v_acct_in_sql <> 0 AND v_check_level = 'PARTY' THEN
532 
533              v_select_pos := NULL;
534              v_select_length := NULL;
535              v_from_pos := NULL;
536              v_from_sum := NULL;
537              v_select_sum := 'SELECT hz.party_id, null, ';
538              v_select_clause := NULL;
539              v_group_pos := NULL;
540 
541              v_select_clause := rtrim(ltrim(UPPER(select_clause)));
542              v_select_sum := v_select_sum || v_select_clause;
543              v_select_pos := instr(upper(batch_sql_stmnt), v_select_clause);
544              v_select_length := length(v_select_clause);
545              v_from_pos := v_select_pos + v_select_length;
546              v_from_sum := substr(batch_sql_stmnt, v_from_pos);
547              v_group_pos := instr(upper(v_from_sum), 'GROUP BY HZ.PARTY_ID');
548              v_from_sum := substr(v_from_sum, 1, v_group_pos -1);
549              v_from_sum := v_from_sum || v_group;
550              v_select_sum := v_select_sum || '  ' || v_from_sum;
551 
552 	    -- validate the sql statement
553              csc_core_utils_pvt.validate_sql_stmnt( p_sql_stmnt => v_select_sum,
554                                                     x_return_status => return_status);
555 
556 	     IF return_status = 'S' THEN
557                    insert_stmnt_sum := 'INSERT INTO CSC_PROF_BATCH_RESULTS1_T ' || v_select_sum ;
558                    EXECUTE IMMEDIATE (insert_stmnt_sum);
559              ELSE
560                 RAISE SUMMATION_ERROR;
561                 fnd_file.put_line(fnd_file.log, 'Summation SQL failed for check_id' || chk_id);
562 	     END IF;
563 
564           END IF;
565 
566           IF v_check_level = 'PARTY' THEN
567              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
568              SELECT party_id, NULL, NULL
569                FROM hz_parties hz
570               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.party_id)
571                 AND hz.status = 'A'
572                 AND hz.party_type IN ('PERSON', 'ORGANIZATION');
573           ELSIF v_check_level = 'CONTACT' THEN
574              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
575              SELECT party_id, NULL, NULL
576                FROM hz_parties hz
577               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.party_id)
578                 AND hz.status = 'A'
579                 AND hz.party_type = 'PARTY_RELATIONSHIP';
580 	  ELSIF v_check_level = 'ACCOUNT' THEN
581              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
582              SELECT party_id, cust_account_id, NULL
583                FROM hz_cust_accounts hz
584               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.account_id = hz.cust_account_id)
585                 AND hz.status = 'A';
586 	 ELSIF v_check_level = 'EMPLOYEE' THEN
587              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
588              SELECT person_id, NULL, NULL
589                FROM per_workforce_current_x hz
590               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.person_id) ;
591 
592           END IF;
593 
594           OPEN val_csr3;
595           FETCH val_csr3 INTO Range_Low_Value, Range_High_Value;
596           IF val_csr3%NOTFOUND THEN
597              Range_Low_Value := NULL;
598              Range_High_Value := NULL;
599           END IF;
600           CLOSE val_csr3;
601 
602           SELECT COUNT(*) INTO v_count FROM csc_prof_check_ratings
603           WHERE check_id = chk_id;
604 
605           rating_tbl.delete;
606 
607           IF v_count > 0 THEN
608              OPEN rating_crs;
609              FOR a in 1..v_count LOOP
610                 FETCH rating_crs INTO rating_tbl(a);
611              END LOOP;
612              CLOSE rating_crs;
613           END IF;
614 
615           c_fmt_mask := 'CSC_Profile_Engine_PKG.format_mask(' ||
616                         '''' || curr_code || '''' || ',' ||
617                         '''' || data_type || '''' || ','||
618 	                'value, '||
619 		        ''''|| fmt_mask || '''' || ')' ;
620 
621           c_grade := 'CSC_Profile_Engine_PKG.rating_color(' ||
622                      chk_id || ', ' ||
623                      'party_id, account_id, value, ' ||
624                      '''' || data_type || '''' || ', ' ||
625                      '''' || 'GRADE' || '''' ||', ' ||
626                      '''' || v_count || '''' || ')'    ;
627 
628           c_curr_code := '''' || curr_code || '''';
629 
630           c_threshold := 'CSC_Profile_Engine_PKG.calc_threshold(' ||
631                          'value, '||
632 	                 '''' || Range_Low_Value || '''' || ', '||
633 	                 '''' || Range_High_Value || '''' || ', '||
634 		         '''' || data_type || '''' || ', ' ||
635 		         '''' || chk_u_l_flag || '''' || ')'   ;
636 
637           c_rating := 'CSC_Profile_Engine_PKG.rating_color(' ||
638                       chk_id || ', ' ||
639                       'party_id, account_id, value, ' ||
640                       '''' || data_type || '''' || ', ' ||
641                       '''' || 'RATING' || '''' ||', ' ||
642 	              '''' || v_count || '''' || ')'    ;
643 
644           c_color := 'CSC_Profile_Engine_PKG.rating_color(' ||
645                       chk_id || ', ' ||
646                      'party_id, account_id, value, ' ||
647                      '''' || data_type || '''' || ', ' ||
648                      '''' || 'COLOR' || '''' ||', ' ||
649                      '''' || v_count || '''' || ')'    ;
650 
651 
652           IF v_check_level = 'ACCOUNT' THEN
653              insert_stmnt_final := 'INSERT /*+ PARALLEL(CSC_PROF_BATCH_RESULTS2_T, 12) */ INTO CSC_PROF_BATCH_RESULTS2_T ' ||
654                              '(check_results_id, check_id, party_id, cust_account_id, value, currency_code, grade, '||
655 			     ' created_by, creation_date, last_updated_by, last_update_date, last_update_login, '||
656 			     ' results_threshold_flag, rating_code, color_code)' ||
657                              ' SELECT csc_prof_check_results_s.nextval, '
658 			      || chk_id || ', party_id, account_id, '
659 			      || c_fmt_mask ||', '
660 			      || c_curr_code || ', '
661 			      || c_grade
662 			      || ', FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.CONC_LOGIN_ID, '
663 			      || c_threshold ||', '
664 			      || c_rating || ', '
665 			      || c_color
666 			      ||' FROM CSC_PROF_BATCH_RESULTS1_T where nvl(account_id, -999999) <> -999999';
667           ELSE
668              insert_stmnt_final := 'INSERT /*+ PARALLEL(CSC_PROF_BATCH_RESULTS2_T, 12) */ INTO CSC_PROF_BATCH_RESULTS2_T ' ||
669                              '(check_results_id, check_id, party_id, cust_account_id, value, currency_code, grade, '||
670 			     ' created_by, creation_date, last_updated_by, last_update_date, last_update_login, '||
671 			     ' results_threshold_flag, rating_code, color_code)' ||
672                              ' SELECT csc_prof_check_results_s.nextval, '
673 			      || chk_id || ', party_id, account_id, '
674 			      || c_fmt_mask ||', '
675 			      || c_curr_code || ', '
676 			      || c_grade
677 			      || ', FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.CONC_LOGIN_ID, '
678 			      || c_threshold ||', '
679 			      || c_rating || ', '
680 			      || c_color
681 			      ||' FROM CSC_PROF_BATCH_RESULTS1_T where account_id IS NULL';
682           END IF;
683 
684           EXECUTE IMMEDIATE (insert_stmnt_final);
685           COMMIT;
686 
687       ELSE
688          /* set the global variable to Y to indicate that profile checks without batch sql exist */
689          g_check_no_batch := 'Y';
690       END IF ; /* batch_sql_stmnt IS NOT NULL */
691    END LOOP;
692    CLOSE checks_csr;
693 
694    INSERT /*+ PARALLEL (CSC_PROF_BATCH_RESULTS2_T, 12) */
695    INTO CSC_PROF_BATCH_RESULTS2_T
696      (check_results_id, check_id, party_id, cust_account_id,
697       value, currency_code, grade, created_by, creation_date,
698       last_updated_by, last_update_date, last_update_login,
699       results_threshold_flag, rating_code, color_code
700       )
701    SELECT
702      check_results_id, check_id, party_id, cust_account_id,
703       value, currency_code, grade, created_by, creation_date,
704       last_updated_by, last_update_date, last_update_login,
705       results_threshold_flag, rating_code, color_code
706    FROM  csc_prof_check_results a
707    WHERE NOT EXISTS (SELECT null FROM csc_prof_checks_b b
708                       WHERE a.check_id = b.check_id
709                         AND b.select_type = 'B');
710 
711    COMMIT;
712 
713    EXECUTE IMMEDIATE 'TRUNCATE TABLE '|| v_schema_name ||'.csc_prof_check_results';
714 
715 
716    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 UNUSABLE';
717    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 UNUSABLE';
718    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 UNUSABLE';
719 
720    INSERT /*+ PARALLEL (csc_prof_check_results, 12) */
721    INTO csc_prof_check_results
722      (check_results_id, check_id, party_id, cust_account_id,
723       value, currency_code, grade, created_by, creation_date,
724       last_updated_by, last_update_date, last_update_login,
725       results_threshold_flag, rating_code, color_code
726       )
727    SELECT
728      check_results_id, check_id, party_id, cust_account_id,
729       value, currency_code, grade, created_by, creation_date,
730       last_updated_by, last_update_date, last_update_login,
731       results_threshold_flag, rating_code, color_code
732    FROM  CSC_PROF_BATCH_RESULTS2_T;
733 
734    COMMIT;
735 
736 
737    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 REBUILD NOLOGGING';
738    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 REBUILD NOLOGGING';
739    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 REBUILD NOLOGGING';
740 
741    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS2_T' ;
742 
743    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML';
744    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_CHECK_RESULTS LOGGING';
745 
746 EXCEPTION
747         when Tablesegment_full then
748              CSC_Profile_Engine_PKG.Handle_Exception;
749              g_error := sqlcode || ' ' || sqlerrm;
750              fnd_file.put_line(fnd_file.log , g_error);
751              App_Exception.raise_exception;
752 
753         when Indexsegment_full then
754              CSC_Profile_Engine_PKG.Handle_Exception;
755              g_error := sqlcode || ' ' || sqlerrm;
756              fnd_file.put_line(fnd_file.log , g_error);
757              App_Exception.raise_exception;
758 
759         when SNAPSHOT_TOO_OLD THEN
760              CSC_Profile_Engine_PKG.Handle_Exception;
761              g_error := sqlcode || ' ' || sqlerrm;
762              fnd_file.put_line(fnd_file.log,g_error);
763              App_Exception.raise_exception;
764 
765         WHEN INTERNAL_ERROR THEN
766              CSC_Profile_Engine_PKG.Handle_Exception;
767              g_error := sqlcode || ' ' || sqlerrm;
768              fnd_file.put_line(fnd_file.log,g_error);
769              App_Exception.raise_exception;
770 
771         WHEN SUMMATION_ERROR THEN
772              CSC_Profile_Engine_PKG.Handle_Exception;
773              set_context('Evaluate_Checks1_Var',
774                          'Summation SQL failed for chk_id => '||to_char(chk_id));
775              RAISE;
776 
777 	WHEN OTHERS THEN
778              CSC_Profile_Engine_PKG.Handle_Exception;
779 	     g_error := sqlcode || ' ' || sqlerrm;
780 	     fnd_file.put_line(fnd_file.log , g_error);
781 
782 END Evaluate_Checks1_Var;
783 --
784 -- Evaluate_Checks1_No_Batch
785 --   Loop through all checks and evaluate the results
786 --   for each customer and account for type variable ('B')
787 --   The procedure is called if the Batch_Sql_Stmnt is null (for backward compatibility)
788 --   if check_id is null, party_id is null, account_id is null
789 --	      and block_id is null
790 --
791 PROCEDURE Evaluate_Checks1_No_Batch
792   ( errbuf	OUT	NOCOPY VARCHAR2,
793     retcode	OUT	NOCOPY NUMBER
794   ) IS
795 
796   chk_id		Number;
797   chk_name		Varchar2(240);
798   cparty_id		Number;
799   ccust_acct_id		Number;
800   sel_type		Varchar2(3);
801   sel_blk_id		Number;
802   data_type		Varchar2(90);
803   fmt_mask		Varchar2(90);
804   rule			Varchar2(32767);
805 
806   Chk_u_l_flag          Varchar2(3);
807   Thd_grade             Varchar2(9);
808 
809   truncate_flag		Varchar2(1) := 'N';
810   acct_flag		Varchar2(1);
811 
812   blk_id		Number 		:= null;
813   blk_name		Varchar2(240)	:= null;
814   sql_stmt		Varchar2(2000)	:= null;
815   curr_code		Varchar2(15)	:= null;
816 
817   v_party_in_sql	Number := 0;
818   v_acct_in_sql		Number := 0;
819   v_check_level         Varchar2(10);
820 
821   l_for_insert		varchar2(1) := 'Y';
822   l_for_party		varchar2(1) := 'Y';
823   l_up_total		Number := 0;
824   l_ip_total		Number := 0;
825   l_ua_total		Number := 0;
826   l_ia_total		Number := 0;
827 
828   v_party_id            Number;
829 
830   CURSOR checks_csr IS
831   SELECT check_id, select_type, select_block_id,
832          data_type, format_mask,check_upper_lower_flag,
833 		 threshold_grade, check_level
834     FROM csc_prof_checks_b a
835    WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks)
836      AND select_type = 'B'
837      AND check_level IN ('PARTY', 'ACCOUNT')
838      AND EXISTS (SELECT null
839                    FROM csc_prof_blocks_b b
840                   WHERE a.select_block_id = b.block_id
841                     AND b.batch_sql_stmnt IS NULL)
842      AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
843                      AND Nvl(end_date_active, SYSDATE);
844 
845   CURSOR cparty_csr IS
846      SELECT party_id
847      FROM hz_parties
848     WHERE status = 'A'
849     AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
850     -- Person, ORG added for 1850508
851 
852   CURSOR caccount_csr IS
853      SELECT party_id, cust_account_id
854      FROM hz_cust_accounts
855      WHERE  party_id=v_party_id
856      AND  status = 'A' ;
857 
858   CURSOR block_csr IS
859       SELECT block_id, sql_stmnt, currency_code
860       FROM csc_prof_blocks_b a
861       WHERE a.block_id = sel_blk_id;
862 
863     cid 	number;
864     val		VARCHAR2(240) := null;
865 
866 BEGIN
867 /* R12 Employee HelpDesk Modifications */
868 
869 /* The processing to be done for either employee level(employee) or customer level(party,account,contact) */
870 IF g_dashboard_for_employee = 'N' THEN
871    l_ip_total := 0;
872    l_up_total := 0;
873    l_ia_total := 0;
874    l_ua_total := 0;
875 
876    OPEN checks_csr;
877    LOOP
878       FETCH checks_csr
879       INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
880 
881       EXIT WHEN checks_csr%notfound;
882 
883       Open block_csr;
884       Fetch block_csr INTO blk_id, sql_stmt, curr_code;
885       Close block_csr;
886 
887       IF sql_stmt IS NOT NULL Then
888          v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
889          v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
890       Else
891          v_party_in_sql := 0;
892          v_acct_in_sql  := 0;
893       End if;
894 
895       Begin
896          cid := dbms_sql.open_cursor;
897          dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
898          dbms_sql.define_column(cid,1,val,240);
899 
900          OPEN cparty_csr;
901          LOOP
902             FETCH cparty_csr INTO cparty_id;
903             EXIT WHEN cparty_csr%notfound;
904             If v_check_level='PARTY' Then
905 	          Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
906 		  sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
907 		  curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
908             End if;
909 
910            /* added this condition for Bug 1937730*/
911             v_party_id:=cparty_id;
912 
913             IF v_check_level = 'ACCOUNT' Then
914                If (v_acct_in_sql = 0)  Then
915                   NULL;
916                Else
917                   OPEN caccount_csr;
918                   LOOP
919                      FETCH caccount_csr
920                       INTO cparty_id, ccust_acct_id;
921                      EXIT WHEN caccount_csr%notfound;
922 
923 		     Evaluate_One_Check(truncate_flag, chk_id,
924                                         cparty_id,ccust_acct_id,v_check_level,sel_type, sel_blk_id,
925                                         data_type, fmt_mask,chk_u_l_flag,Thd_grade,rule, blk_id, sql_stmt,
926                                         curr_code, l_up_total, l_ip_total, l_ua_total
927                                        , l_ia_total ,cid);
928                   END LOOP;
929                   CLOSE caccount_csr;
930                End if; -- Added for 1850508
931             END IF;
932          END LOOP;
933          CLOSE cparty_csr;
934 
935 	 IF (dbms_sql.is_open(cid)) THEN
936 	    dbms_sql.close_cursor(cid);
937 	 end if;
938 
939       Exception
940           When others then
941              IF (dbms_sql.is_open(cid)) THEN
942                 dbms_sql.close_cursor(cid);
943              end if;
944 
945              set_context('Evaluate_Checks1_No_Batch',
946                 'chk_id=>'||to_char(chk_id),
947                 'party_id=>'||to_char(cparty_id),
948                 'account_id=>'||to_char(ccust_acct_id));
949              g_error := sqlcode || ' ' || sqlerrm;
950              set_context(NULL, g_error);
951       End;
952 
953    END LOOP;
954    CLOSE checks_csr;
955 
956    -- check if there are still records to be inserted
957    IF l_ip_total <> 0 THEN
958 	l_for_insert := 'Y';
959 	l_for_party  := 'Y';
960 	Insert_Update_Check_Results
961 		(l_ip_total, l_for_insert, l_for_party);
962 	l_ip_total :=0;
963    END IF;
964    -- check if there are still records to be updated
965    IF l_up_total <> 0 THEN
966 	l_for_insert := 'N';
967 	l_for_party  := 'Y';
968 	Insert_Update_Check_Results
969 		(l_up_total, l_for_insert, l_for_party);
970 	l_up_total :=0;
971    END IF;
972 
973    -- check if there are still records to be inserted
974    IF l_ia_total <> 0 THEN
975 	l_for_insert := 'Y';
976 	l_for_party  := 'N';
977 	Insert_Update_Check_Results
978 		(l_ia_total, l_for_insert, l_for_party);
979 	l_ia_total :=0;
980    END IF;
981    -- check if there are still records to be updated
982    IF l_ua_total <> 0 THEN
983 	l_for_insert := 'N';
984 	l_for_party  := 'N';
985 	Insert_Update_Check_Results
986 		(l_ua_total, l_for_insert, l_for_party);
987 	l_ua_total :=0;
988    END IF;
989 
990    IF g_dashboard_for_contact IS NULL THEN
991       FND_PROFILE.GET('CSC_DASHBOARD_VIEW_FOR_CONTACT',g_dashboard_for_contact);
992    END IF;
993 
994    IF g_dashboard_for_contact = 'Y' THEN
995        l_ip_total := 0;
996        l_up_total := 0;
997        l_ia_total := 0;
998        l_ua_total := 0;
999 
1000        Evaluate_blocks_Rel(p_up_total => l_up_total,
1001                            p_ip_total => l_ip_total,
1002                            p_ua_total => l_ua_total,
1003                            p_ia_total => l_ia_total,
1004                            p_no_batch_sql => 'Y' );
1005 
1006        Evaluate_checks_Rel(errbuf => errbuf,
1007                            retcode => retcode,
1008                            p_no_batch_sql => 'Y');
1009    END IF;
1010 
1011    COMMIT;
1012 
1013    -- Return 0 for successful completion, 1 for warnings, 2 for error
1014    IF (error_flag) THEN
1015       errbuf := Sqlerrm;
1016       retcode := 2;
1017    ELSIF (warning_msg <> '') THEN
1018       errbuf := warning_msg;
1019       retcode := 1;
1020    ELSE
1021       errbuf := '';
1022       retcode := 0;
1023    END IF;
1024 
1025 ELSIF g_dashboard_for_employee = 'Y' THEN
1026        l_ip_total := 0;
1027        l_up_total := 0;
1028        l_ia_total := 0;
1029        l_ua_total := 0;
1030 
1031        Evaluate_blocks_Emp(p_up_total => l_up_total,
1032                            p_ip_total => l_ip_total,
1033                            p_ua_total => l_ua_total,
1034                            p_ia_total => l_ia_total,
1035                            p_no_batch_sql => 'Y' );
1036 
1037        Evaluate_checks_Emp(errbuf => errbuf,
1038                            retcode => retcode,
1039                            p_no_batch_sql => 'Y');
1040 END IF;
1041 
1042    COMMIT;
1043 
1044    -- Return 0 for successful completion, 1 for warnings, 2 for error
1045    IF (error_flag) THEN
1046       errbuf := Sqlerrm;
1047       retcode := 2;
1048    ELSIF (warning_msg <> '') THEN
1049       errbuf := warning_msg;
1050       retcode := 1;
1051    ELSE
1052       errbuf := '';
1053       retcode := 0;
1054    END IF;
1055 
1056    IF (debug) THEN
1057       fnd_file.close;
1058    END IF;
1059 
1060    EXCEPTION
1061       WHEN OTHERS THEN
1062          ROLLBACK;
1063          IF (checks_csr%isopen) THEN
1064 	    CLOSE checks_csr;
1065 	 END IF;
1066 	 IF (cparty_csr%isopen) THEN
1067 	    CLOSE cparty_csr;
1068 	 END IF;
1069 	 IF (caccount_csr%isopen) THEN
1070 	    CLOSE caccount_csr;
1071 	 END IF;
1072 	 IF (debug) THEN
1073 	    fnd_file.close;
1074 	 END IF;
1075 
1076          -- Retrieve error message into errbuf
1077          errbuf := Sqlerrm;
1078 
1079       	 -- Return 2 for error
1080          retcode := 2;
1081 
1082 	 g_error := sqlcode || ' ' || sqlerrm;
1083 	 fnd_file.put_line(fnd_file.log , g_error);
1084 
1085 /* End of R12 Employee HelpDesk Modifications */
1086 
1087 END Evaluate_Checks1_No_Batch;
1088 
1089 --
1090 -- Evaluate_Checks1_Rule
1091 --   Loop through all checks and evaluate the results
1092 --   for each customer and account for type 'T' (Rules)
1093 --   if check_id is null, party_id is null, account_id is null
1094 --	      and block_id is null
1095 --
1096 PROCEDURE Evaluate_Checks1_Rule
1097   ( errbuf	OUT	NOCOPY VARCHAR2,
1098     retcode	OUT	NOCOPY NUMBER ) IS
1099 
1100   chk_id		Number;
1101   chk_name		Varchar2(240);
1102   cparty_id		Number;
1103   ccust_acct_id		Number;
1104   sel_type		Varchar2(3);
1105   sel_blk_id		Number;
1106   data_type		Varchar2(90);
1107   fmt_mask		Varchar2(90);
1108   rule			Varchar2(32767);
1109 
1110   chk_u_l_flag          Varchar2(3);
1111   Thd_grade             Varchar2(9);
1112 
1113   truncate_flag		Varchar2(1) := 'N';
1114   acct_flag		Varchar2(1);
1115 
1116   blk_id		Number 		:= null;
1117   blk_name		Varchar2(240)	:= null;
1118   sql_stmt		Varchar2(2000)	:= null;
1119   curr_code		Varchar2(15)	:= null;
1120 
1121   v_party_in_sql	Number := 0;
1122   v_acct_in_sql		Number := 0;
1123 
1124   l_for_insert		varchar2(1) := 'Y';
1125   l_for_party		varchar2(1) := 'Y';
1126   l_up_total		Number := 0;
1127   l_ip_total		Number := 0;
1128   l_ua_total		Number := 0;
1129   l_ia_total		Number := 0;
1130 
1131   /* added this variable for Bug 1937730*/
1132   v_party_id            Number;
1133   v_check_level         Varchar2(10);
1134 
1135   v_chk_count           NUMBER := 0;
1136 
1137   CURSOR checks_csr IS
1138      SELECT check_id, select_type, select_block_id,check_level,
1139 		data_type, format_mask,check_upper_lower_flag,threshold_grade
1140      FROM csc_prof_checks_b
1141      WHERE Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1142 		AND Nvl(end_date_active, Sysdate)
1143        AND check_level IN ('PARTY', 'ACCOUNT')
1144        AND select_type = 'T'
1145      ORDER BY check_id;
1146 
1147   CURSOR checks_count IS
1148      SELECT COUNT(*)
1149        FROM csc_prof_checks_b
1150       WHERE Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1151                              AND Nvl(end_date_active, Sysdate)
1152         AND select_type = 'T';
1153 
1154   CURSOR cparty_csr IS
1155      SELECT party_id
1156      FROM hz_parties
1157     WHERE status = 'A'
1158     AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
1159     -- Person, ORG added for 1850508
1160 
1161 /* added this condition party_id=v_party_id for Bug 1937730*/
1162   CURSOR caccount_csr IS
1163      SELECT party_id, cust_account_id
1164      FROM hz_cust_accounts
1165      WHERE  party_id=v_party_id
1166      AND  status = 'A';
1167 
1168   CURSOR block_csr IS
1169       SELECT block_id, sql_stmnt, currency_code
1170       FROM csc_prof_blocks_b a
1171       WHERE a.block_id = sel_blk_id;
1172 
1173     -- Added for 1850508
1174     cid 	number;
1175     val		VARCHAR2(240) := null;
1176 
1177 BEGIN
1178 
1179 /* R12 Employee HelpDesk Modifications */
1180 
1181 /* The processing to be done for either employee level(employee) or customer level(party,account,contact) */
1182 IF g_dashboard_for_employee = 'N' THEN
1183 
1184    OPEN checks_count;
1185    FETCH checks_count INTO v_chk_count;
1186    CLOSE checks_count;
1187 
1188    IF v_chk_count > 0 THEN
1189       /* blocks will be evaluated only if the type is T */
1190   -- Populate the block results table for all parties and accounts
1191    Evaluate_Blocks1(l_up_total, l_ip_total, l_ua_total, l_ia_total);
1192    END IF;
1193 
1194    l_ip_total := 0;
1195    l_up_total := 0;
1196    l_ia_total := 0;
1197    l_ua_total := 0;
1198 
1199    OPEN checks_csr;
1200    LOOP
1201        FETCH checks_csr
1202        INTO chk_id, sel_type, sel_blk_id,v_check_level, data_type, fmt_mask,chk_u_l_flag,Thd_grade;
1203 
1204        EXIT WHEN checks_csr%notfound;
1205 
1206        IF (sel_type = 'T') THEN
1207 	   acct_flag := 'N';
1208 	   build_rule(acct_flag,chk_id,v_check_level, rule);
1209        ELSIF (sel_type = 'B') THEN
1210 	   Open block_csr;
1211 	   Fetch block_csr INTO blk_id, sql_stmt, curr_code;
1212 	   Close block_csr;
1213 
1214         /* Uncommented this condition for Bug 1937730*/
1215 	   /*****************/
1216 	   IF sql_stmt IS NOT NULL Then
1217 	      v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
1218 	      v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
1219 	   Else
1220 	      v_party_in_sql := 0;
1221 	      v_acct_in_sql  := 0;
1222 	   End if;
1223 	   /***************/
1224 
1225        END IF;
1226 
1227 /* This begin, end exception is added mainly for exception handing for Bug 1980004*/
1228        Begin
1229 
1230            IF ((sel_type='B' ) OR  (sel_type='T') ) Then -- Only valid types
1231            cid := dbms_sql.open_cursor;
1232 	   if (sel_type = 'B') then
1233 	   	dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
1234 	   elsif (sel_type = 'T') then
1235            	dbms_sql.parse(cid, rule, dbms_sql.native);
1236 	   end if;
1237 	   dbms_sql.define_column(cid,1,val,240);
1238 
1239 	   -- pass the cid
1240 	   OPEN cparty_csr;
1241 	   LOOP
1242 	      FETCH cparty_csr INTO cparty_id;
1243 	      EXIT WHEN cparty_csr%notfound;
1244               If v_check_level='PARTY' Then
1245 	          Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
1246 		  sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
1247 		  curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
1248               End if;
1249 
1250               /* added this condition for Bug 1937730*/
1251                 v_party_id:=cparty_id;
1252 
1253               IF (sel_type = 'T') THEN
1254                      acct_flag := 'Y';
1255                      build_rule(acct_flag,chk_id,v_check_level, rule);
1256               END IF;
1257               IF ((sel_type='B' ) OR (sel_type='T') ) and v_check_level='ACCOUNT' Then -- Only valid Types now
1258                    If ((v_acct_in_sql = 0) and sel_type = 'B') and v_check_level='ACCOUNT' Then -- Added for 1850508
1259                               -- Check can be made only for 'B' types,
1260                               -- If acct is not present as bind variable, the sql might return wrong
1261                               -- rows (party level counts) at account leve.
1262 
1263                               --and (v_party_in_sql <> 0 and v_acct_in_sql <> 0)) OR
1264                               --(sel_type='T') ) Then
1265 
1266                               NULL;
1267                    Else
1268                               -- Loop through all parties with accounts
1269                               -- Added for 1850508
1270                               --Open Cursor
1271                               -- dbms_output.put_line('Opening and PArsing in checks1 Accounts Check_id -'||to_char(chk_id));
1272 
1273 
1274                               OPEN caccount_csr;
1275                               LOOP
1276                                    FETCH caccount_csr
1277                                    INTO cparty_id, ccust_acct_id;
1278                                    EXIT WHEN caccount_csr%notfound;
1279                                    Evaluate_One_Check(truncate_flag, chk_id,
1280                                    cparty_id,ccust_acct_id,v_check_level,sel_type, sel_blk_id,
1281                                    data_type, fmt_mask,chk_u_l_flag,Thd_grade,rule, blk_id, sql_stmt,
1282                                    curr_code, l_up_total, l_ip_total, l_ua_total
1283                                    , l_ia_total ,cid);
1284                               END LOOP;
1285                               CLOSE caccount_csr;
1286                     End if; -- Added for 1850508
1287                END IF;
1288 
1289 
1290 	   END LOOP;
1291 	   CLOSE cparty_csr;
1292 	   IF (dbms_sql.is_open(cid)) THEN
1293 	      dbms_sql.close_cursor(cid);
1294 	   end if;
1295         END IF;
1296      Exception
1297         When others then
1298 
1299           IF (dbms_sql.is_open(cid)) THEN
1300               dbms_sql.close_cursor(cid);
1301           end if;
1302 
1303           set_context('Evaluate_Checks1_Rule',
1304                 'chk_id=>'||to_char(chk_id),
1305                 'party_id=>'||to_char(cparty_id),
1306                 'account_id=>'||to_char(ccust_acct_id));
1307           g_error := sqlcode || ' ' || sqlerrm;
1308           set_context(NULL, g_error);
1309     End;
1310 
1311 
1312    END LOOP;
1313    CLOSE checks_csr;
1314 
1315    -- check if there are still records to be inserted
1316    IF l_ip_total <> 0 THEN
1317 	l_for_insert := 'Y';
1318 	l_for_party  := 'Y';
1319 	Insert_Update_Check_Results
1320 		(l_ip_total, l_for_insert, l_for_party);
1321 	l_ip_total :=0;
1322    END IF;
1323    -- check if there are still records to be updated
1324    IF l_up_total <> 0 THEN
1325 	l_for_insert := 'N';
1326 	l_for_party  := 'Y';
1327 	Insert_Update_Check_Results
1328 		(l_up_total, l_for_insert, l_for_party);
1329 	l_up_total :=0;
1330    END IF;
1331 
1332 
1333    -- check if there are still records to be inserted
1334    IF l_ia_total <> 0 THEN
1335 	l_for_insert := 'Y';
1336 	l_for_party  := 'N';
1337 	Insert_Update_Check_Results
1338 		(l_ia_total, l_for_insert, l_for_party);
1339 	l_ia_total :=0;
1340    END IF;
1341    -- check if there are still records to be updated
1342    IF l_ua_total <> 0 THEN
1343 	l_for_insert := 'N';
1344 	l_for_party  := 'N';
1345 	Insert_Update_Check_Results
1346 		(l_ua_total, l_for_insert, l_for_party);
1347 	l_ua_total :=0;
1348    END IF;
1349 /* End of R12 Employee HelpDesk Modifications */
1350    IF g_dashboard_for_contact = 'Y' THEN
1351        l_ip_total := 0;
1352        l_up_total := 0;
1353        l_ia_total := 0;
1354        l_ua_total := 0;
1355 
1356        Evaluate_blocks_Rel(p_up_total => l_up_total,
1357                            p_ip_total => l_ip_total,
1358                            p_ua_total => l_ua_total,
1359                            p_ia_total => l_ia_total,
1360                            p_rule_only => 'Y' );
1361 
1362        Evaluate_checks_Rel(errbuf => errbuf,
1363                            retcode => retcode,
1364                            p_rule_only => 'Y');
1365    END IF;
1366 
1367    COMMIT;
1368 
1369    -- Return 0 for successful completion, 1 for warnings, 2 for error
1370    IF (error_flag) THEN
1371       errbuf := Sqlerrm;
1372       retcode := 2;
1373    ELSIF (warning_msg <> '') THEN
1374       errbuf := warning_msg;
1375       retcode := 1;
1376    ELSE
1377       errbuf := '';
1378       retcode := 0;
1379    END IF;
1380 
1381   ELSIF g_dashboard_for_employee = 'Y' THEN
1382        l_ip_total := 0;
1383        l_up_total := 0;
1384        l_ia_total := 0;
1385        l_ua_total := 0;
1386 
1387        Evaluate_blocks_Emp(p_up_total => l_up_total,
1388                            p_ip_total => l_ip_total,
1389                            p_ua_total => l_ua_total,
1390                            p_ia_total => l_ia_total,
1391                            p_rule_only => 'Y' );
1392 
1393        Evaluate_checks_Emp(errbuf => errbuf,
1394                            retcode => retcode,
1395                            p_rule_only => 'Y');
1396    END IF;
1397 
1398    COMMIT;
1399 
1400    -- Return 0 for successful completion, 1 for warnings, 2 for error
1401    IF (error_flag) THEN
1402       errbuf := Sqlerrm;
1403       retcode := 2;
1404    ELSIF (warning_msg <> '') THEN
1405       errbuf := warning_msg;
1406       retcode := 1;
1407    ELSE
1408       errbuf := '';
1409       retcode := 0;
1410    END IF;
1411 
1412      IF (debug) THEN
1413       fnd_file.close;
1414    END IF;
1415 
1416    EXCEPTION
1417       WHEN OTHERS THEN
1418          ROLLBACK;
1419          IF (checks_csr%isopen) THEN
1420 	    CLOSE checks_csr;
1421 	 END IF;
1422 	 IF (cparty_csr%isopen) THEN
1423 	    CLOSE cparty_csr;
1424 	 END IF;
1425 	 IF (caccount_csr%isopen) THEN
1426 	    CLOSE caccount_csr;
1427 	 END IF;
1428 	 IF (debug) THEN
1429 	    fnd_file.close;
1430 	 END IF;
1431 
1432          -- Retrieve error message into errbuf
1433          errbuf := Sqlerrm;
1434 
1435       	 -- Return 2 for error
1436          retcode := 2;
1437 
1438 	 g_error := sqlcode || ' ' || sqlerrm;
1439 	 fnd_file.put_line(fnd_file.log , g_error);
1440 
1441 END Evaluate_Checks1_Rule;
1442 
1443 /******************************************
1444    EVALUATE_CHECKS2_JIT
1445    Added this procedure for JIT enhancement -- Bug 4535407
1446    Evaluate_Checks2_JIT is called by Evaluate_Checks2.
1447    Evaluate_Checks2 will open different cursors for JIT and non-JIT flows
1448    and calls this procedure for every record
1449 ******************************************/
1450 
1451 PROCEDURE Evaluate_Checks2_JIT
1452   ( p_party_id		IN	NUMBER,
1453     p_acct_id		IN	NUMBER,
1454     p_check_id          IN      NUMBER,
1455     p_select_type       IN      VARCHAR2,
1456     p_select_block_id   IN      NUMBER,
1457     p_data_type         IN      VARCHAR2,
1458     p_format_mask       IN      VARCHAR2,
1459     p_chk_upp_low_flag  IN      VARCHAR2,
1460     p_threshold_grade   IN      VARCHAR2,
1461     p_check_level       IN      VARCHAR2,
1462     p_group_id          IN      NUMBER
1463   )
1464 IS
1465 
1466    chk_id		Number;
1467    chk_name		Varchar2(240);
1468    sel_type		Varchar2(3);
1469    sel_blk_id		Number;
1470    data_type		Varchar2(90);
1471    fmt_mask		Varchar2(90);
1472    rule			Varchar2(32767);
1473 
1474    Chk_u_l_flag          Varchar2(3);
1475    Thd_grade             Varchar2(9);
1476 
1477    v_block_id		Number;
1478    truncate_flag		Varchar2(1):= 'N';
1479    acct_flag		Varchar2(1);
1480 
1481    blk_id		Number 		:= null;
1482    blk_name		Varchar2(240)	:= null;
1483    sql_stmt		Varchar2(2000)	:= null;
1484    curr_code		Varchar2(15)	:= null;
1485 
1486    l_for_insert		varchar2(1) := 'Y';
1487    l_for_party		varchar2(1) := 'Y';
1488    l_up_total		Number := 0;
1489    l_ip_total		Number := 0;
1490    l_ua_total		Number := 0;
1491    l_ia_total		Number := 0;
1492 
1493    v_party_in_sql	Number := 0;
1494    v_acct_in_sql		Number := 0;
1495    v_check_level         Varchar2(10);
1496 
1497    v_rel_party   NUMBER ;
1498 
1499 
1500 /* added these variable for Bug 1937730*/
1501    v_party_id            Number;
1502    cparty_id             Number;
1503    ccust_acct_id         Number;
1504    cid                   Number;
1505    val                   Varchar2(240) := null;
1506 
1507 
1508   -- cursor to get the blocks related to the check
1509    CURSOR cblocks_csr IS
1510       SELECT distinct block_id
1511         FROM csc_prof_check_rules_b
1512       WHERE check_id = chk_id
1513       UNION
1514       (SELECT distinct expr_to_block_id
1515          FROM csc_prof_check_rules_b
1516         WHERE check_id = chk_id);
1517 
1518    CURSOR block_csr IS
1519       SELECT block_id, sql_stmnt, currency_code
1520         FROM csc_prof_blocks_b a
1521        WHERE a.block_id = p_select_block_id;
1522 
1523 /* added this condition party_id=v_party_id for Bug 1937730*/
1524    CURSOR caccount_csr IS
1525       SELECT party_id, cust_account_id
1526         FROM hz_cust_accounts
1527        WHERE party_id=v_party_id
1528          AND status = 'A' ;
1529 
1530 BEGIN
1531    l_ip_total :=0;
1532    l_up_total :=0;
1533    l_ia_total :=0;
1534    l_ua_total :=0;
1535 
1536    chk_id := p_check_id;
1537    sel_type := p_select_type;
1538    sel_blk_id := p_select_block_id;
1539    data_type := p_data_type;
1540    fmt_mask := p_format_mask;
1541    chk_u_l_flag := p_chk_upp_low_flag;
1542    thd_grade := p_threshold_grade;
1543    v_check_level := p_check_level;
1544 
1545    IF sel_type = 'T' then
1546       OPEN cblocks_csr;
1547       LOOP
1548          FETCH cblocks_csr into v_block_id;
1549          EXIT when cblocks_csr%notfound;
1550 
1551 	 Evaluate_Blocks2(v_block_id,p_party_id,p_acct_id,
1552 	                  l_up_total, l_ip_total, l_ua_total, l_ia_total);
1553 
1554       END LOOP;
1555       CLOSE cblocks_csr;
1556    END IF;
1557 
1558    l_ip_total :=0;
1559    l_up_total :=0;
1560    l_ia_total :=0;
1561    l_ua_total :=0;
1562 
1563    IF (sel_type = 'T') THEN
1564       IF p_acct_id IS NULL THEN
1565          acct_flag := 'N';
1566          build_rule(acct_flag,chk_id,v_check_level, rule);
1567       ELSE
1568          acct_flag := 'Y';
1569          build_rule(acct_flag,chk_id,v_check_level, rule);
1570       END IF;
1571 
1572    ELSIF (sel_type = 'B') THEN
1573       OPEN block_csr;
1574       FETCH block_csr INTO blk_id, sql_stmt, curr_code;
1575       CLOSE block_csr;
1576 
1577       IF sql_stmt IS NOT NULL THEN
1578          v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
1579          v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
1580       ELSE
1581          v_party_in_sql := 0;
1582          v_acct_in_sql  := 0;
1583       END IF;
1584    END IF;
1585 /* R12 Employee HelpDesk Modifications */
1586    IF v_check_level in('PARTY','CONTACT','EMPLOYEE') THEN
1587      -- p_cid is passed as null as Cursor has to be parsed always
1588       Evaluate_One_Check(truncate_flag, chk_id, p_party_id, Null,v_check_level,
1589 		 sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
1590 		     curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,NULL);
1591    END IF;
1592 /* End of R12 Employee HelpDesk Modifications */
1593     /* This begin, end exception is added mainly for exception handing for Bug 1980004*/
1594     /* added this condition for Bug 1937730*/
1595    BEGIN
1596       v_party_id := p_party_id;
1597       IF ((sel_type = 'B' ) OR (sel_type = 'T') ) and v_check_level = 'ACCOUNT' THEN -- Only valid Types now
1598          IF ((v_acct_in_sql = 0) and sel_type = 'B') and v_check_level = 'ACCOUNT' THEN -- Added for 1850508
1599                -- Check can be made only for 'B' types,
1600                -- If acct is not present as bind variable, the sql might returnwrong
1601                -- rows (party level counts) at account leve.
1602                  --and (v_party_in_sql <> 0 and v_acct_in_sql <> 0)) OR
1603                  --(sel_type='T') ) Then
1604              NULL;
1605           ELSE
1606              -- Loop through all parties with accounts
1607              -- Added for 1850508
1608              --Open Cursor
1609              -- dbms_output.put_line('Opening and PArsing in checks1 Accounts Check_id -'||to_char(chk_id));
1610              cid := dbms_sql.open_cursor;
1611              IF (sel_type = 'B') THEN
1612                 dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
1613              ELSIF (sel_type = 'T') THEN
1614                 dbms_sql.parse(cid, rule, dbms_sql.native);
1615              END IF;
1616              dbms_sql.define_column(cid,1,val,240);
1617 
1618              OPEN caccount_csr;
1619              LOOP
1620                 FETCH caccount_csr INTO cparty_id, ccust_acct_id;
1621                 EXIT WHEN caccount_csr%notfound;
1622 
1623                 Evaluate_One_Check(truncate_flag, chk_id,
1624                             cparty_id,ccust_acct_id,v_check_level, sel_type, sel_blk_id,
1625                             data_type, fmt_mask,chk_u_l_flag,
1626                             Thd_grade, rule, blk_id, sql_stmt,curr_code,
1627                             l_up_total, l_ip_total, l_ua_total, l_ia_total
1628                             ,cid);
1629              END LOOP;
1630              CLOSE caccount_csr;
1631 
1632              IF (dbms_sql.is_open(cid)) THEN
1633                 dbms_sql.close_cursor(cid);
1634              END IF;
1635 
1636           END IF; -- Added for 1850508
1637        END IF;
1638    EXCEPTION
1639       WHEN OTHERS THEN
1640          IF (dbms_sql.is_open(cid)) THEN
1641             dbms_sql.close_cursor(cid);
1642          END IF;
1643 
1644           set_context('Evaluate_Checks2_JIT',
1645                 'chk_id=>'||to_char(chk_id),
1646                 'party_id=>'||to_char(cparty_id),
1647                 'account_id=>'||to_char(ccust_acct_id));
1648           g_error := sqlcode || ' ' || sqlerrm;
1649           set_context(NULL, g_error);
1650    END;
1651 
1652    IF l_ip_total <> 0 THEN
1653       l_for_insert := 'Y';
1654       l_for_party  := 'Y';
1655       Insert_Update_Check_Results(l_ip_total, l_for_insert, l_for_party);
1656       l_ip_total :=0;
1657    END IF;
1658      -- check if there are still records to be updated
1659    IF l_up_total <> 0 THEN
1660       l_for_insert := 'N';
1661       l_for_party  := 'Y';
1662       Insert_Update_Check_Results(l_up_total, l_for_insert, l_for_party);
1663       l_up_total :=0;
1664    END IF;
1665 
1666    -- check if there are still records to be inserted
1667    IF l_ia_total <> 0 THEN
1668       l_for_insert := 'Y';
1669       l_for_party  := 'N';
1670       Insert_Update_Check_Results(l_ia_total, l_for_insert, l_for_party);
1671       l_ia_total :=0;
1672    END IF;
1673    -- check if there are still records to be updated
1674    IF l_ua_total <> 0 THEN
1675       l_for_insert := 'N';
1676       l_for_party  := 'N';
1677       Insert_Update_Check_Results(l_ua_total, l_for_insert, l_for_party);
1678       l_ua_total :=0;
1679    END IF;
1680 
1681   COMMIT;
1682 END Evaluate_Checks2_JIT;
1683 
1684 --
1685 -- Evaluate_Checks2
1686 --   Loop through all checks and evaluate the results
1687 --   for the Given Party
1688 --   if Party and Group are Provided
1689 --   Only the checks and blocks for a given group_id
1690 --   This is used when the refresh button is pressed or from JIT process
1691 --
1692 
1693 PROCEDURE Evaluate_Checks2
1694   ( p_party_id		IN	NUMBER,
1695     p_acct_id		IN	NUMBER,
1696     p_group_id		IN	NUMBER,
1697     p_critical_flag     IN      VARCHAR2 DEFAULT 'N', /* added for JIT enhancement */
1698     errbuf		OUT	NOCOPY VARCHAR2,
1699     retcode		OUT	NOCOPY NUMBER ) IS
1700 
1701    CURSOR checks_csr IS
1702       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1703              check_upper_lower_flag, threshold_grade, check_level
1704         FROM csc_prof_checks_b chk
1705        WHERE check_level IN ('PARTY','ACCOUNT')
1706          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1707               AND nvl(end_date_active, Sysdate))
1708          AND EXISTS ( SELECT a.check_id
1709                         FROM csc_prof_group_checks a
1710                        WHERE a.group_id   = p_group_id
1711                          AND chk.check_id = a.check_id);
1712 
1713    /* added cursor checks_crit_csr for JIT enhancement -- Bug 4535407 */
1714    CURSOR checks_crit_csr IS
1715       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1716              check_upper_lower_flag, threshold_grade, check_level
1717         FROM csc_prof_checks_b chk
1718        WHERE check_level IN ('PARTY','ACCOUNT')
1719          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1720               AND nvl(end_date_active, Sysdate))
1721          AND EXISTS ( SELECT a.check_id
1722                         FROM csc_prof_group_checks a
1723                        WHERE a.group_id   = p_group_id
1724                          AND chk.check_id = a.check_id
1725                          AND a.critical_flag = 'Y');
1726 
1727    CURSOR rel_party_csr(c_party_id IN NUMBER) IS
1728      SELECT 1
1729        FROM hz_parties
1730       WHERE party_id = c_party_id
1731         AND party_type = 'PARTY_RELATIONSHIP'
1732         AND status = 'A';
1733 
1734    CURSOR employee_csr(c_party_id IN NUMBER) IS
1735      SELECT 1
1736        FROM per_workforce_current_x
1737       WHERE person_id = c_party_id;
1738 
1739 
1740    CURSOR rel_checks_csr IS
1741       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1742              check_upper_lower_flag, threshold_grade, check_level
1743         FROM csc_prof_checks_b chk
1744        WHERE check_level = 'CONTACT'
1745          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1746               AND nvl(end_date_active, Sysdate))
1747          AND EXISTS ( SELECT a.check_id
1748                         FROM csc_prof_group_checks a
1749                        WHERE a.group_id   = p_group_id
1750                          AND chk.check_id = a.check_id);
1751 
1752    /* added cursor checks_csr_jit for JIT enhancement -- Bug 4535407 */
1753    CURSOR rel_checks_crit_csr IS
1754       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1755              check_upper_lower_flag, threshold_grade, check_level
1756         FROM csc_prof_checks_b chk
1757        WHERE check_level = 'CONTACT'
1758          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1759               AND nvl(end_date_active, Sysdate))
1760          AND EXISTS ( SELECT a.check_id
1761                         FROM csc_prof_group_checks a
1762                        WHERE a.group_id   = p_group_id
1763                          AND chk.check_id = a.check_id
1764                          AND a.critical_flag = 'Y');
1765 
1766 /* R12 Employee HelpDesk Modifications */
1767 CURSOR emp_checks_csr IS
1768       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1769              check_upper_lower_flag, threshold_grade, check_level
1770         FROM csc_prof_checks_b chk
1771        WHERE check_level = 'EMPLOYEE'
1772          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1773               AND nvl(end_date_active, Sysdate))
1774          AND EXISTS ( SELECT a.check_id
1775                         FROM csc_prof_group_checks a
1776                        WHERE a.group_id   = p_group_id
1777                          AND chk.check_id = a.check_id);
1778 
1779 CURSOR emp_checks_crit_csr IS
1780       SELECT check_id, select_type, select_block_id, data_type, format_mask,
1781              check_upper_lower_flag, threshold_grade, check_level
1782         FROM csc_prof_checks_b chk
1783        WHERE check_level = 'EMPLOYEE'
1784          AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
1785               AND nvl(end_date_active, Sysdate))
1786          AND EXISTS ( SELECT a.check_id
1787                         FROM csc_prof_group_checks a
1788                        WHERE a.group_id   = p_group_id
1789                          AND chk.check_id = a.check_id
1790                          AND a.critical_flag = 'Y');
1791 
1792 /* End of R12 Employee HelpDesk Modifications */
1793 
1794    l_rel_refresh VARCHAR2(1) := 'N';
1795    v_rel_party   NUMBER;
1796 
1797    l_emp_refresh VARCHAR2(1) := 'N';
1798    v_emp_party   NUMBER;
1799 
1800 
1801 
1802 BEGIN
1803 /* Moved the code to Evaluate_Checks2_JIT for JIT enhancement. -- Bug 4535407
1804 
1805    Logic
1806    -----
1807    IF jit_flag = 'Y' THEN
1808       OPEN checks_crit_csr;
1809       CALL Evaluate_Checks2_JIT;
1810    ELSE
1811       OPEN checks_csr;
1812       CALL Evaluate_Checks2_JIT;
1813    END IF;
1814 
1815 */
1816 
1817 /* Bug 5168090 Fix - scenario where employee_id and party_id from hz_parties have the same value */
1818  IF g_dashboard_for_employee = 'Y' THEN
1819       l_emp_refresh := 'Y';
1820   ELSE
1821       OPEN rel_party_csr(p_party_id);
1822       FETCH rel_party_csr INTO v_rel_party;
1823       IF rel_party_csr%FOUND THEN
1824        l_rel_refresh := 'Y';
1825        END IF;
1826        CLOSE rel_party_csr;
1827   END IF;
1828 
1829  /* Bug 5168090 Fix */
1830 
1831    IF l_rel_refresh = 'Y' THEN
1832       IF p_critical_flag = 'Y' THEN
1833          FOR i IN rel_checks_crit_csr
1834          LOOP
1835            Evaluate_Checks2_JIT
1836               ( p_party_id => p_party_id,
1837                 p_acct_id  => p_acct_id,
1838                 p_check_id => i.check_id,
1839                 p_select_type => i.select_type,
1840                 p_select_block_id => i.select_block_id,
1841                 p_data_type => i.data_type,
1842                 p_format_mask => i.format_mask,
1843                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1844                 p_threshold_grade => i.threshold_grade,
1845                 p_check_level => i.check_level,
1846                 p_group_id => p_group_id
1847                );
1848          END LOOP;
1849       ELSE
1850          FOR i IN rel_checks_csr
1851          LOOP
1852            Evaluate_Checks2_JIT
1853               ( p_party_id => p_party_id,
1854                 p_acct_id  => p_acct_id,
1855                 p_check_id => i.check_id,
1856                 p_select_type => i.select_type,
1857                 p_select_block_id => i.select_block_id,
1858                 p_data_type => i.data_type,
1859                 p_format_mask => i.format_mask,
1860                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1861                 p_threshold_grade => i.threshold_grade,
1862                 p_check_level => i.check_level,
1863                 p_group_id => p_group_id
1864                );
1865          END LOOP;
1866       END IF;
1867    ELSIF l_emp_refresh = 'Y' THEN
1868 /* R12 Employee HelpDesk Modifications */
1869      IF p_critical_flag = 'Y' THEN
1870          FOR i IN emp_checks_crit_csr
1871          LOOP
1872            Evaluate_Checks2_JIT
1873               ( p_party_id => p_party_id,
1874                 p_acct_id  => p_acct_id,
1875                 p_check_id => i.check_id,
1876                 p_select_type => i.select_type,
1877                 p_select_block_id => i.select_block_id,
1878                 p_data_type => i.data_type,
1879                 p_format_mask => i.format_mask,
1880                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1881                 p_threshold_grade => i.threshold_grade,
1882                 p_check_level => i.check_level,
1883                 p_group_id => p_group_id
1884                );
1885          END LOOP;
1886       ELSE
1887          FOR i IN emp_checks_csr
1888          LOOP
1889            Evaluate_Checks2_JIT
1890               ( p_party_id => p_party_id,
1891                 p_acct_id  => p_acct_id,
1892                 p_check_id => i.check_id,
1893                 p_select_type => i.select_type,
1894                 p_select_block_id => i.select_block_id,
1895                 p_data_type => i.data_type,
1896                 p_format_mask => i.format_mask,
1897                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1898                 p_threshold_grade => i.threshold_grade,
1899                 p_check_level => i.check_level,
1900                 p_group_id => p_group_id
1901                );
1902          END LOOP;
1903       END IF;
1904 /* End of R12 Employee HelpDesk Modifications */
1905    ELSE
1906       IF p_critical_flag = 'Y' THEN
1907          FOR i IN checks_crit_csr
1908          LOOP
1909            Evaluate_Checks2_JIT
1910               ( p_party_id => p_party_id,
1911                 p_acct_id  => p_acct_id,
1912                 p_check_id => i.check_id,
1913                 p_select_type => i.select_type,
1914                 p_select_block_id => i.select_block_id,
1915                 p_data_type => i.data_type,
1916                 p_format_mask => i.format_mask,
1917                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1918                 p_threshold_grade => i.threshold_grade,
1919                 p_check_level => i.check_level,
1920                 p_group_id => p_group_id
1921                );
1922             END LOOP;
1923       ELSE
1924          FOR i IN checks_csr
1925          LOOP
1926            Evaluate_Checks2_JIT
1927               ( p_party_id => p_party_id,
1928                 p_acct_id  => p_acct_id,
1929                 p_check_id => i.check_id,
1930                 p_select_type => i.select_type,
1931                 p_select_block_id => i.select_block_id,
1932                 p_data_type => i.data_type,
1933                 p_format_mask => i.format_mask,
1934                 p_chk_upp_low_flag => i.check_upper_lower_flag,
1935                 p_threshold_grade => i.threshold_grade,
1936                 p_check_level => i.check_level,
1937                 p_group_id => p_group_id
1938                );
1939             END LOOP;
1940       END IF;
1941    END IF;
1942 
1943    -- Return 0 for successful completion, 1 for warnings, 2 for error
1944    IF (error_flag) THEN
1945       errbuf := Sqlerrm;
1946       retcode := 2;
1947    ELSIF (warning_msg <> '') THEN
1948       errbuf := warning_msg;
1949       retcode := 1;
1950    ELSE
1951       errbuf := '';
1952       retcode := 0;
1953    END IF;
1954 
1955    IF (debug) THEN
1956       fnd_file.close;
1957    END IF;
1958 
1959 EXCEPTION
1960    WHEN OTHERS THEN
1961       ROLLBACK;
1962       IF (checks_csr%isopen) THEN
1963          CLOSE checks_csr;
1964       END IF;
1965 
1966       IF (debug) THEN
1967          fnd_file.close;
1968       END IF;
1969 
1970    -- Retrieve error message into errbuf
1971       errbuf := Sqlerrm;
1972 
1973    -- Return 2 for error
1974       retcode := 2;
1975 
1976       g_error := sqlcode || ' ' || sqlerrm;
1977       fnd_file.put_line(fnd_file.log , g_error);
1978 
1979 END Evaluate_Checks2;
1980 
1981 
1982   --
1983   -- Evaluate_Checks3
1984   --   Loop through all checks and evaluate the results
1985   --   for each customer and account.
1986   --   if check_id is null, party_id is not null or account_id is not null
1987   --         and block_id is null
1988   --   get only the checks and blocks for a given group_id
1989   --   This is used when the refresh button is pressed
1990   --
1991   PROCEDURE Evaluate_Checks3
1992     ( p_party_id      IN   NUMBER,
1993       p_acct_id       IN   NUMBER,
1994       p_group_id      IN   NUMBER,
1995       errbuf          OUT NOCOPY VARCHAR2,
1996       retcode         OUT NOCOPY NUMBER ) IS
1997 
1998 	chk_id            Number;
1999 	chk_name          Varchar2(240);
2000 	sel_type          Varchar2(3);
2001 	sel_blk_id        Number;
2002 	data_type         Varchar2(90);
2003 	fmt_mask          Varchar2(90);
2004 	rule              Varchar2(32767);
2005 
2006    Chk_u_l_flag          Varchar2(3);
2007    Thd_grade             Varchar2(9);
2008 
2009 	v_block_id        Number;
2010 	truncate_flag     Varchar2(1):= 'N';
2011 	acct_flag         Varchar2(1);
2012 
2013 	blk_id            Number         := null;
2014 	blk_name          Varchar2(240)  := null;
2015 	sql_stmt          Varchar2(2000) := null;
2016 	curr_code         Varchar2(15)   := null;
2017 
2018 	l_for_insert      varchar2(1) := 'Y';
2019 	l_for_party       varchar2(1) := 'Y';
2020 	l_up_total        Number := 0;
2021 	l_ip_total        Number := 0;
2022 	l_ua_total        NUmber := 0;
2023 	l_ia_total        Number := 0;
2024 
2025 	v_party_in_sql    Number := 0;
2026 	v_acct_in_sql     Number := 0;
2027    v_check_level     Varchar2(10);
2028    v_rel_refresh     Varchar2(1) := 'N';
2029 
2030         /* added these variable for Bug 1937730*/
2031         v_party_id            Number;
2032         cparty_id             Number;
2033         ccust_acct_id         Number;
2034         cid                   Number;
2035         val                   Varchar2(240) := null;
2036 
2037 	-- cursor to retrieve all checks that belong to that group
2038         CURSOR checks_csr IS
2039           SELECT check_id, select_type, select_block_id, data_type,
2040 		format_mask,check_upper_lower_flag,threshold_grade,
2041                 check_level
2042 	  FROM csc_prof_checks_b chk
2043 	  WHERE check_level IN ('PARTY','ACCOUNT')
2044 	  AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
2045 				  AND nvl(end_date_active, Sysdate))
2046 	  AND Exists ( SELECT a.check_id
2047     			FROM csc_prof_group_checks a
2048     			WHERE chk.check_id = a.check_id
2049                         AND sysdate between
2050                        nvl(a.start_date_active,sysdate)
2051                        AND nvl(a.end_date_active,sysdate));
2052 
2053 /* R12 Employee HelpDesk Modifications */
2054 	CURSOR  checks_emp_csr IS
2055           SELECT check_id, select_type, select_block_id, data_type,
2056 		format_mask,check_upper_lower_flag,threshold_grade,
2057                 check_level
2058 	  FROM csc_prof_checks_b chk
2059 	  WHERE check_level IN ('EMPLOYEE')
2060 	  AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
2061 				  AND nvl(end_date_active, Sysdate))
2062 	  AND Exists ( SELECT a.check_id
2063     			FROM csc_prof_group_checks a
2064     			WHERE chk.check_id = a.check_id
2065                         AND sysdate between
2066                        nvl(a.start_date_active,sysdate)
2067                        AND nvl(a.end_date_active,sysdate));
2068 /* End of R12 Employee HelpDesk Modifications */
2069 
2070 	-- cursor to get the blocks related to the check
2071 	CURSOR cblocks_csr IS
2072 	  Select distinct block_id
2073 	  From csc_prof_check_rules_b
2074 	  Where check_id = chk_id
2075           UNION
2076           (Select distinct expr_to_block_id
2077           From csc_prof_check_rules_b
2078 	  Where check_id = chk_id);
2079 
2080         CURSOR block_csr IS
2081 	  SELECT block_id, sql_stmnt, currency_code
2082 	  FROM csc_prof_blocks_b a
2083 	  WHERE a.block_id = sel_blk_id;
2084 
2085        /* added this condition party_id=v_party_id for Bug 1937730*/
2086         CURSOR caccount_csr IS
2087           SELECT party_id, cust_account_id
2088           FROM hz_cust_accounts
2089           WHERE  party_id=v_party_id
2090           AND  status = 'A' ;
2091 
2092     CURSOR checks_relparty_csr IS
2093      SELECT check_id, select_type, select_block_id, data_type, format_mask,
2094             check_upper_lower_flag,threshold_grade,check_level
2095      FROM csc_prof_checks_b chk
2096      WHERE check_level = 'CONTACT'
2097        AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
2098 		AND nvl(end_date_active, Sysdate))
2099      AND Exists ( SELECT a.check_id
2100     			FROM csc_prof_group_checks a
2101     			WHERE chk.check_id = a.check_id
2102     			AND sysdate between nvl(a.start_date_active,sysdate)
2103     			AND nvl(a.end_date_active,sysdate));
2104 
2105   CURSOR crelparty_csr(c_party_id IN NUMBER) IS
2106      SELECT party_id FROM hz_parties
2107      WHERE party_id = c_party_id
2108       AND party_type = 'PARTY_RELATIONSHIP'
2109       AND status = 'A';
2110 
2111 BEGIN
2112 
2113 
2114   l_ip_total :=0;
2115   l_up_total :=0;
2116   l_ia_total :=0;
2117   l_ua_total :=0;
2118    -- Loop through check_id and update block results for a party or account
2119 	OPEN checks_csr;
2120 	  LOOP
2121 	  FETCH checks_csr
2122 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2123 
2124 	  EXIT WHEN checks_csr%notfound;
2125 
2126 	  IF sel_type = 'T' then
2127 	  OPEN cblocks_csr;
2128 	  LOOP
2129 	     FETCH cblocks_csr into v_block_id;
2130 	     Exit when cblocks_csr%notfound;
2131 
2132 	     Evaluate_Blocks2(v_block_id,p_party_id,p_acct_id,
2133 	     l_up_total, l_ip_total, l_ua_total, l_ia_total);
2134 
2135 	 END LOOP;
2136 	 CLOSE cblocks_csr;
2137 	 END IF;
2138    END LOOP;
2139 CLOSE checks_csr;
2140 
2141   l_ip_total :=0;
2142   l_up_total :=0;
2143   l_ia_total :=0;
2144   l_ua_total :=0;
2145 
2146 -- Loop through check_id and update check results for a party or account
2147   OPEN checks_csr;
2148   LOOP
2149 	  FETCH checks_csr
2150 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2151 	  EXIT WHEN checks_csr%notfound;
2152 
2153 	  --  IF (chk_id NOT BETWEEN 21 AND 24) THEN
2154 	  IF (sel_type = 'T') THEN
2155 	     IF p_acct_id IS NULL THEN
2156 		   acct_flag := 'N';
2157 		   build_rule(acct_flag,chk_id,v_check_level, rule);
2158              ELSE
2159 	           acct_flag := 'Y';
2160 		   build_rule(acct_flag,chk_id,v_check_level, rule);
2161 	     END IF;
2162 
2163 	  ELSIF (sel_type = 'B') THEN
2164 
2165 		Open block_csr;
2166 		Fetch block_csr INTO blk_id, sql_stmt, curr_code;
2167 		Close block_csr;
2168 
2169                 /* Uncommented this condition for Bug 1937730*/
2170 		 /******************/
2171 		 IF sql_stmt IS NOT NULL Then
2172 			v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
2173 			v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
2174 		 Else
2175 			v_party_in_sql := 0;
2176 			v_acct_in_sql  := 0;
2177 		 End if;
2178 		/******************/
2179 
2180 	   END IF;
2181 
2182        If v_check_level='PARTY' then
2183           -- p_cid is passed as null as Cursor has to be parsed always
2184 	  Evaluate_One_Check(truncate_flag, chk_id, p_party_id, null,v_check_level,
2185 	  sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
2186 	  curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,NULL );
2187        End if;
2188    --END IF;
2189 
2190 /* This begin, end exception is added mainly for exception handing for Bug 19800
2191 04*/
2192 
2193    Begin
2194       /* Added this condition for Bug 1937730*/
2195           v_party_id:=p_party_id;
2196 
2197 
2198     IF ((sel_type='B' ) OR (sel_type='T') ) and v_check_level='ACCOUNT' Then -- Only valid Types now
2199          If ((v_acct_in_sql = 0) and sel_type = 'B') and v_check_level='ACCOUNT' Then -- Added for 1850508
2200                 -- Check can be made only for 'B' types,
2201                 -- If acct is not present as bind variable, the sql might returnwrong
2202                 -- rows (party level counts) at account leve.
2203 
2204                  --and (v_party_in_sql <> 0 and v_acct_in_sql <> 0)) OR
2205                    --(sel_type='T') ) Then
2206                 NULL;
2207          Else
2208                  -- Loop through all parties with accounts
2209                  -- Added for 1850508
2210                  --Open Cursor
2211                  -- dbms_output.put_line('Opening and PArsing in checks1 Accounts Check_id -'||to_char(chk_id));
2212                  cid := dbms_sql.open_cursor;
2213                  if (sel_type = 'B') then
2214                         dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
2215                  elsif (sel_type = 'T') then
2216                         dbms_sql.parse(cid, rule, dbms_sql.native);
2217                  end if;
2218                  dbms_sql.define_column(cid,1,val,240);
2219 
2220                  OPEN caccount_csr;
2221                  LOOP
2222                             FETCH caccount_csr
2223                             INTO cparty_id, ccust_acct_id;
2224                             EXIT WHEN caccount_csr%notfound;
2225                             Evaluate_One_Check(truncate_flag, chk_id, cparty_id,
2226                             ccust_acct_id,v_check_level,sel_type, sel_blk_id,data_type,
2227                             fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,curr_code,
2228                             l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid)
2229                             ;
2230                  END LOOP;
2231                  CLOSE caccount_csr;
2232 		 IF (dbms_sql.is_open(cid)) THEN
2233 			dbms_sql.close_cursor(cid);
2234 		 end if;
2235          End if; -- Added for 1850508
2236      END IF;
2237 
2238     Exception
2239 
2240         When others then
2241           IF (dbms_sql.is_open(cid)) THEN
2242                         dbms_sql.close_cursor(cid);
2243           end if;
2244 
2245           set_context('Evaluate_Checks3',
2246                 'chk_id=>'||to_char(chk_id),
2247                 'party_id=>'||to_char(cparty_id),
2248                 'account_id=>'||to_char(ccust_acct_id));
2249           g_error := sqlcode || ' ' || sqlerrm;
2250           set_context(NULL, g_error);
2251     End;
2252 
2253    END LOOP;
2254    CLOSE checks_csr;
2255 
2256 /*Commented this if condition for Bug 1937730*/
2257 --   IF p_acct_id IS NULL THEN
2258     -- check if there are still records to be inserted
2259     IF l_ip_total <> 0 THEN
2260 	  l_for_insert := 'Y';
2261           l_for_party  := 'Y';
2262 	  Insert_Update_Check_Results
2263 	   (l_ip_total, l_for_insert, l_for_party);
2264           l_ip_total :=0;
2265     END IF;
2266     -- check if there are still records to be updated
2267     IF l_up_total <> 0 THEN
2268 	  l_for_insert := 'N';
2269 	  l_for_party  := 'Y';
2270 	  Insert_Update_Check_Results
2271 	   (l_up_total, l_for_insert, l_for_party);
2272 	  l_up_total :=0;
2273     END IF;
2274 
2275  -- ELSE
2276    -- check if there are still records to be inserted
2277    IF l_ia_total <> 0 THEN
2278 	 l_for_insert := 'Y';
2279          l_for_party  := 'N';
2280          Insert_Update_Check_Results
2281 	  (l_ia_total, l_for_insert, l_for_party);
2282 	 l_ia_total :=0;
2283    END IF;
2284 
2285 -- check if there are still records to be updated
2286   IF l_ua_total <> 0 THEN
2287      l_for_insert := 'N';
2288      l_for_party  := 'N';
2289      Insert_Update_Check_Results
2290      (l_ua_total, l_for_insert, l_for_party);
2291      l_ua_total :=0;
2292   END IF;
2293 
2294   --New changes
2295   IF g_dashboard_for_contact IS NULL THEN
2296       FND_PROFILE.GET('CSC_DASHBOARD_VIEW_FOR_CONTACT',g_dashboard_for_contact);
2297   END IF;
2298   IF g_dashboard_for_contact = 'Y' THEN
2299    l_ip_total :=0;
2300    l_up_total :=0;
2301    l_ia_total :=0;
2302    l_ua_total :=0;
2303    -- Loop through check_id and update block results for a party or account
2304 	OPEN checks_relparty_csr;
2305 	  LOOP
2306 	  FETCH checks_relparty_csr
2307 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2308 	  EXIT WHEN checks_relparty_csr%notfound;
2309 
2310 	  IF sel_type = 'T' then
2311 	  OPEN cblocks_csr;
2312 	  LOOP
2313 	     FETCH cblocks_csr into v_block_id;
2314 	     Exit when cblocks_csr%notfound;
2315 	     Evaluate_Blocks5(v_block_id,p_party_id,
2316 	     l_up_total, l_ip_total, l_ua_total, l_ia_total);
2317 	 END LOOP;
2318 	 CLOSE cblocks_csr;
2319 	 END IF;
2320    END LOOP;
2321    CLOSE checks_relparty_csr;
2322 
2323     l_ip_total :=0;
2324     l_up_total :=0;
2325     l_ia_total :=0;
2326     l_ua_total :=0;
2327 
2328 -- Loop through check_id and update check results for a party or account
2329   OPEN checks_relparty_csr;
2330   LOOP
2331 	  FETCH checks_relparty_csr
2332 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2333 	  EXIT WHEN checks_relparty_csr%notfound;
2334 	  IF (sel_type = 'T') THEN
2335 	     build_rule('N',chk_id,v_check_level, rule);
2336      ELSIF (sel_type = 'B') THEN
2337 		Open block_csr;
2338 		Fetch block_csr INTO blk_id, sql_stmt, curr_code;
2339 		Close block_csr;
2340       IF sql_stmt IS NOT NULL Then
2341 			v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
2342 		 Else
2343 			v_party_in_sql := 0;
2344 		 End if;
2345 
2346 	   END IF;
2347 
2348       If v_check_level='CONTACT' then
2349        Evaluate_One_Check(truncate_flag, chk_id, p_party_id, null,v_check_level,
2350 	     sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
2351 	     curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,NULL );
2352       End if;
2353     END LOOP;
2354    CLOSE checks_relparty_csr;
2355     IF l_ip_total <> 0 THEN
2356 	  l_for_insert := 'Y';
2357           l_for_party  := 'Y';
2358 	  Insert_Update_Check_Results
2359 	   (l_ip_total, l_for_insert, l_for_party);
2360           l_ip_total :=0;
2361     END IF;
2362     -- check if there are still records to be updated
2363     IF l_up_total <> 0 THEN
2364 	  l_for_insert := 'N';
2365 	  l_for_party  := 'Y';
2366 	  Insert_Update_Check_Results
2367 	   (l_up_total, l_for_insert, l_for_party);
2368 	  l_up_total :=0;
2369     END IF;
2370   END IF; -- global if
2371   --End of new changes
2372 
2373     --New changes for Employee HelpDesk
2374 
2375   IF g_dashboard_for_employee = 'Y' THEN
2376    l_ip_total :=0;
2377    l_up_total :=0;
2378    l_ia_total :=0;
2379    l_ua_total :=0;
2380    -- Loop through check_id and update block results for a party or account
2381 	OPEN checks_emp_csr;
2382 	  LOOP
2383 	  FETCH checks_emp_csr
2384 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2385 	  EXIT WHEN checks_emp_csr%notfound;
2386 
2387 	  IF sel_type = 'T' then
2388 	  OPEN cblocks_csr;
2389 	  LOOP
2390 	     FETCH cblocks_csr into v_block_id;
2391 	     Exit when cblocks_csr%notfound;
2392 	     Evaluate_Blocks5(v_block_id,p_party_id,
2393 	     l_up_total, l_ip_total, l_ua_total, l_ia_total);
2394 	 END LOOP;
2395 	 CLOSE cblocks_csr;
2396 	 END IF;
2397    END LOOP;
2398    CLOSE checks_emp_csr;
2399 
2400     l_ip_total :=0;
2401     l_up_total :=0;
2402     l_ia_total :=0;
2403     l_ua_total :=0;
2404 
2405 -- Loop through check_id and update check results for a party or account
2406   OPEN checks_emp_csr;
2407   LOOP
2408 	  FETCH checks_emp_csr
2409 	  INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
2410 	  EXIT WHEN checks_emp_csr%notfound;
2411 	  IF (sel_type = 'T') THEN
2412 	     build_rule('N',chk_id,v_check_level, rule);
2413      ELSIF (sel_type = 'B') THEN
2414 		Open block_csr;
2415 		Fetch block_csr INTO blk_id, sql_stmt, curr_code;
2416 		Close block_csr;
2417       IF sql_stmt IS NOT NULL Then
2418 			v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
2419 		 Else
2420 			v_party_in_sql := 0;
2421 		 End if;
2422 
2423 	   END IF;
2424 
2425       If v_check_level='EMPLOYEE' then
2426        Evaluate_One_Check(truncate_flag, chk_id, p_party_id, null,v_check_level,
2427 	     sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
2428 	     curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,NULL );
2429       End if;
2430     END LOOP;
2431    CLOSE checks_emp_csr;
2432     IF l_ip_total <> 0 THEN
2433 	  l_for_insert := 'Y';
2434           l_for_party  := 'Y';
2435 	  Insert_Update_Check_Results
2436 	   (l_ip_total, l_for_insert, l_for_party);
2437           l_ip_total :=0;
2438     END IF;
2439     -- check if there are still records to be updated
2440     IF l_up_total <> 0 THEN
2441 	  l_for_insert := 'N';
2442 	  l_for_party  := 'Y';
2443 	  Insert_Update_Check_Results
2444 	   (l_up_total, l_for_insert, l_for_party);
2445 	  l_up_total :=0;
2446     END IF;
2447   END IF; -- global if
2448   --End of new changes
2449 
2450   COMMIT;
2451 
2452 -- Return 0 for successful completion, 1 for warnings, 2 for error
2453   IF (error_flag) THEN
2454 	errbuf := Sqlerrm;
2455 	retcode := 2;
2456   ELSIF (warning_msg <> '') THEN
2457 	errbuf := warning_msg;
2458 	retcode := 1;
2459   ELSE
2460 	errbuf := '';
2461 	retcode := 0;
2462   END IF;
2463 
2464   IF (debug) THEN
2465 	  fnd_file.close;
2466   END IF;
2467 
2468   EXCEPTION
2469 	 WHEN OTHERS THEN
2470 		 ROLLBACK;
2471 		 IF (checks_csr%isopen) THEN
2472 		    CLOSE checks_csr;
2473 	         END IF;
2474 	         IF (debug) THEN
2475 		    fnd_file.close;
2476 		 END IF;
2477 		 -- Retrieve error message into errbuf
2478 		 errbuf := Sqlerrm;
2479 		 -- Return 2 for error
2480 		 retcode := 2;
2481 		 g_error := sqlcode || ' ' || sqlerrm;
2482 		 fnd_file.put_line(fnd_file.log , g_error);
2483 
2484 END Evaluate_Checks3;
2485 
2486 --  This procedure evaluates the checks for all parties/account in a particular group
2487 --  The batch sql statement is not null and profile check is of type variable ('B')
2488 PROCEDURE Evaluate_Checks4_Var
2489 (p_group_id NUMBER)
2490 IS
2491 
2492   chk_id     Number;
2493   chk_name   Varchar2(240);
2494   sel_blk_id Number;
2495   data_type  Varchar2(90);
2496   fmt_mask   Varchar2(90);
2497   rule       Varchar2(32767);
2498 
2499   chk_u_l_flag    Varchar2(3);
2500   Thd_grade       Varchar2(9);
2501   truncate_flag   Varchar2(1) := 'N';
2502 
2503   blk_id           Number := null;
2504   sql_stmt         Varchar2(2000) := null;
2505   batch_sql_stmnt  Varchar2(4000)  := null;
2506   curr_code        Varchar2(15) := null;
2507 
2508   v_party_in_sql Number := 0;
2509   v_acct_in_sql  Number := 0;
2510 
2511   v_party_id    Number;
2512   v_check_level Varchar2(10);
2513 
2514   curr_date DATE := SYSDATE;
2515   insert_stmnt        VARCHAR2(4000);
2516   insert_stmnt_sum    VARCHAR2(4000);
2517   insert_stmnt_final  VARCHAR2(4000);
2518   insert_stmnt_party  VARCHAR2(4000);
2519   insert_stmnt_acct   VARCHAR2(4000);
2520 
2521 --Fix bug#7329039 by mpathani
2522 --select_clause       VARCHAR2(100);
2523 --v_select_clause     VARCHAR2(100);
2524   select_clause       VARCHAR2(2000);
2525   v_select_clause     VARCHAR2(2000);
2526 
2527 
2528   Range_Low_Value     VARCHAR2(240);
2529   Range_High_Value    VARCHAR2(240);
2530   val                 VARCHAR2(240) := null;
2531 
2532   /* variables for columns of insert statement */
2533   c_fmt_mask     VARCHAR2(1000);
2534   c_grade        VARCHAR2(1000);
2535   c_curr_code    VARCHAR2(1000);
2536   c_threshold    VARCHAR2(1000);
2537   c_rating       VARCHAR2(1000);
2538   c_color        VARCHAR2(1000);
2539 
2540   v_count       NUMBER;
2541   v_chk_count   NUMBER;
2542   v_batch_count NUMBER;
2543 
2544 -- varlables for getting CSC schema name
2545   v_schema_status VARCHAR2(1);
2546   v_industry      VARCHAR2(1);
2547   v_schema_name   VARCHAR2(30);
2548   v_get_appl      BOOLEAN;
2549 
2550 -- variables to build the batch sql for summation
2551   v_select_pos    number;
2552   v_select_length number;
2553   v_from_pos      number;
2554   v_from_sum      varchar2(2000);
2555   v_select_sum    varchar2(2000) := 'SELECT hz.party_id, null, ';
2556   v_group_pos     number;
2557   v_group         varchar2(2000) := 'GROUP BY hz.party_id';
2558   return_status   varchar2(50);
2559 
2560 -- variables for handling contact profile variables
2561   v_where_clause_no_rel VARCHAR2(1000) := 'HZ.PARTY_TYPE IN (' || '''' || 'PERSON' || '''' || ', ' || '''' ||  'ORGANIZATION' || '''' || ')' ;
2562   v_where_clause_rel VARCHAR2(1000) := 'HZ.PARTY_TYPE = ' || '''' ||'PARTY_RELATIONSHIP'|| '''' ;
2563 
2564   TABLESEGMENT_FULL  EXCEPTION;
2565   INDEXSEGMENT_FULL  EXCEPTION;
2566   SNAPSHOT_TOO_OLD   EXCEPTION;
2567   INTERNAL_ERROR     EXCEPTION;
2568   SUMMATION_ERROR    EXCEPTION;
2569 
2570   PRAGMA EXCEPTION_INIT(TABLESEGMENT_FULL, -1653);
2571   PRAGMA EXCEPTION_INIT(INDEXSEGMENT_FULL, -1654);
2572   PRAGMA EXCEPTION_INIT(SNAPSHOT_TOO_OLD, -1555);
2573   PRAGMA EXCEPTION_INIT(INTERNAL_ERROR, -600);
2574 
2575   checks_csr  checks_cur_var;
2576 
2577   CURSOR block_csr IS
2578       SELECT block_id, sql_stmnt, UPPER(batch_sql_stmnt), currency_code, select_clause
2579         FROM csc_prof_blocks_b a
2580        WHERE a.block_id = sel_blk_id;
2581 
2582    Cursor val_csr3 IS
2583      Select Range_Low_Value, Range_High_Value
2584      From   csc_prof_check_ratings
2585      Where  check_id = chk_id
2586      and    check_rating_grade = thd_grade;
2587 
2588    CURSOR rating_crs IS
2589      SELECT rating_code, check_rating_grade, color_code, range_low_value, range_high_value
2590        FROM csc_prof_check_ratings
2591       WHERE check_id = chk_id;
2592 
2593 BEGIN
2594    COMMIT;
2595    EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';
2596    EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES=TRUE';
2597 
2598    v_get_appl :=  FND_INSTALLATION.GET_APP_INFO('CSC', v_schema_status, v_industry, v_schema_name);
2599 
2600    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_CHECK_RESULTS NOLOGGING';
2601    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_BATCH_RESULTS2_T NOLOGGING';
2602    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_BATCH_RESULTS1_T NOLOGGING';
2603 
2604    SELECT count(*) INTO v_chk_count FROM csc_prof_check_results;
2605    SELECT count(*) INTO v_batch_count FROM CSC_PROF_BATCH_RESULTS2_T;
2606 
2607    IF v_chk_count = 0 AND v_batch_count <> 0 THEN
2608 
2609 
2610       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 UNUSABLE';
2611       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 UNUSABLE';
2612       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 UNUSABLE';
2613 
2614       INSERT /*+ PARALLEL (csc_prof_check_results, 12) */
2615       INTO csc_prof_check_results
2616         (check_results_id, check_id, party_id, cust_account_id,
2617          value, currency_code, grade, created_by, creation_date,
2618          last_updated_by, last_update_date, last_update_login,
2619          results_threshold_flag, rating_code, color_code
2620          )
2621       SELECT
2622         check_results_id, check_id, party_id, cust_account_id,
2623          value, currency_code, grade, created_by, creation_date,
2624          last_updated_by, last_update_date, last_update_login,
2625          results_threshold_flag, rating_code, color_code
2626       FROM  CSC_PROF_BATCH_RESULTS2_T;
2627 
2628       COMMIT;
2629 
2630 
2631       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 REBUILD NOLOGGING';
2632       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 REBUILD NOLOGGING';
2633       EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 REBUILD NOLOGGING';
2634 
2635    END IF;
2636    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS2_T' ;
2637 
2638    IF g_dashboard_for_contact IS NULL THEN
2639       FND_PROFILE.GET('CSC_DASHBOARD_VIEW_FOR_CONTACT', g_dashboard_for_contact);
2640    END IF;
2641 
2642 /* R12 Employee HelpDesk Modifications */
2643 
2644  IF g_dashboard_for_employee ='Y' THEN
2645       OPEN checks_csr FOR
2646          SELECT check_id, select_block_id, check_level,
2647                 data_type, format_mask, check_upper_lower_flag, threshold_grade
2648            FROM csc_prof_checks_b
2649            WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
2650                               WHERE group_id = p_group_id)
2651                               AND SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
2652                               AND Nvl(end_date_active, Sysdate)
2653 			      AND select_type = 'B'
2654 	                      AND check_level IN ('EMPLOYEE');
2655 
2656  ELSIF g_dashboard_for_employee ='N' THEN
2657   IF g_dashboard_for_contact = 'Y' THEN
2658       OPEN checks_csr FOR
2659          SELECT check_id, select_block_id,check_level,
2660                 data_type, format_mask, check_upper_lower_flag, threshold_grade
2661           FROM csc_prof_checks_b
2662           WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
2663                               WHERE group_id = p_group_id)
2664 	                      AND  SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
2665                               AND Nvl(end_date_active, Sysdate)
2666                               AND select_type = 'B'
2667                               AND check_level IN ('PARTY', 'ACCOUNT', 'CONTACT');
2668   ELSIF g_dashboard_for_contact = 'N' THEN
2669       OPEN checks_csr FOR
2670          SELECT check_id, select_block_id,check_level,
2671                 data_type, format_mask, check_upper_lower_flag, threshold_grade
2672            FROM csc_prof_checks_b
2673           WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
2674                               WHERE group_id = p_group_id)
2675                               AND SYSDATE BETWEEN Nvl(start_date_active, Sysdate)
2676                               AND Nvl(end_date_active, Sysdate)
2677                               AND select_type = 'B'
2678                               AND check_level IN ('PARTY', 'ACCOUNT');
2679    END IF;
2680   END IF;
2681 
2682 /* End of R12 Employee HelpDesk Modifications */
2683    LOOP
2684        FETCH checks_csr
2685        INTO chk_id, sel_blk_id, v_check_level, data_type, fmt_mask, chk_u_l_flag, Thd_grade;
2686        EXIT WHEN checks_csr%notfound;
2687 
2688        OPEN block_csr;
2689        FETCH block_csr INTO blk_id, sql_stmt, batch_sql_stmnt, curr_code, select_clause;
2690        CLOSE block_csr;
2691 
2692        IF batch_sql_stmnt IS NOT NULL THEN
2693 
2694           IF v_check_level = 'CONTACT' THEN
2695              IF g_dashboard_for_contact = 'Y' THEN
2696                 batch_sql_stmnt := UPPER(batch_sql_stmnt);
2697                 batch_sql_stmnt := REPLACE(batch_sql_stmnt, v_where_clause_no_rel, v_where_clause_rel);
2698              END IF;
2699           END IF;
2700 
2701           IF sql_stmt IS NOT NULL THEN
2702              v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
2703              v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
2704           ELSE
2705             v_party_in_sql := 0;
2706             v_acct_in_sql  := 0;
2707           END IF;
2708 
2709           EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS1_T' ;
2710 
2711           insert_stmnt := 'INSERT INTO CSC_PROF_BATCH_RESULTS1_T ' || batch_sql_stmnt;
2712           EXECUTE IMMEDIATE (insert_stmnt);
2713 
2714           IF v_acct_in_sql <> 0 AND v_check_level = 'PARTY' THEN
2715 
2716              v_select_pos := NULL;
2717              v_select_length := NULL;
2718              v_from_pos := NULL;
2719              v_from_sum := NULL;
2720              v_select_sum := 'SELECT hz.party_id, null, ';
2721              v_select_clause := NULL;
2722              v_group_pos := NULL;
2723 
2724              v_select_clause := rtrim(ltrim(UPPER(select_clause)));
2725              v_select_sum := v_select_sum || v_select_clause;
2726              v_select_pos := instr(upper(batch_sql_stmnt), v_select_clause);
2727              v_select_length := length(v_select_clause);
2728              v_from_pos := v_select_pos + v_select_length;
2729              v_from_sum := substr(batch_sql_stmnt, v_from_pos);
2730              v_group_pos := instr(upper(v_from_sum), 'GROUP BY HZ.PARTY_ID');
2731              v_from_sum := substr(v_from_sum, 1, v_group_pos -1);
2732              v_from_sum := v_from_sum || v_group;
2733              v_select_sum := v_select_sum || '  ' || v_from_sum;
2734 
2735 	    -- validate the sql statement
2736              csc_core_utils_pvt.validate_sql_stmnt( p_sql_stmnt => v_select_sum,
2737                                                     x_return_status => return_status);
2738 
2739 	     IF return_status = 'S' THEN
2740                    insert_stmnt_sum := 'INSERT INTO CSC_PROF_BATCH_RESULTS1_T ' || v_select_sum ;
2741                    EXECUTE IMMEDIATE (insert_stmnt_sum);
2742              ELSE
2743                 RAISE SUMMATION_ERROR;
2744                 fnd_file.put_line(fnd_file.log, 'Summation SQL failed for check_id' || chk_id);
2745 	     END IF;
2746 
2747           END IF;
2748 
2749           IF v_check_level = 'PARTY' THEN
2750              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
2751              SELECT party_id, NULL, NULL
2752                FROM hz_parties hz
2753               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.party_id)
2754                 AND hz.status = 'A'
2755                 AND hz.party_type IN ('PERSON', 'ORGANIZATION');
2756           ELSIF v_check_level = 'CONTACT' THEN
2757              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
2758              SELECT party_id, NULL, NULL
2759                FROM hz_parties hz
2760               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.party_id)
2761                 AND hz.status = 'A'
2762                 AND hz.party_type = 'PARTY_RELATIONSHIP';
2763 	  ELSIF v_check_level = 'ACCOUNT' THEN
2764              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
2765              SELECT party_id, cust_account_id, NULL
2766                FROM hz_cust_accounts hz
2767               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.account_id = hz.cust_account_id)
2768                 AND hz.status = 'A';
2769 	ELSIF v_check_level = 'EMPLOYEE' THEN
2770              INSERT INTO CSC_PROF_BATCH_RESULTS1_T(PARTY_ID,ACCOUNT_ID,VALUE)
2771              SELECT person_id, NULL, NULL
2772                FROM per_workforce_current_x hz
2773               WHERE NOT EXISTS (SELECT 1 FROM CSC_PROF_BATCH_RESULTS1_T c WHERE c.party_id = hz.person_id) ;
2774 
2775           END IF;
2776 
2777           OPEN val_csr3;
2778           FETCH val_csr3 INTO Range_Low_Value, Range_High_Value;
2779           IF val_csr3%NOTFOUND THEN
2780              Range_Low_Value := NULL;
2781              Range_High_Value := NULL;
2782           END IF;
2783           CLOSE val_csr3;
2784 
2785           SELECT COUNT(*) INTO v_count FROM csc_prof_check_ratings
2786           WHERE check_id = chk_id;
2787 
2788           rating_tbl.delete;
2789 
2790           IF v_count > 0 THEN
2791              OPEN rating_crs;
2792              FOR a in 1..v_count LOOP
2793                 FETCH rating_crs INTO rating_tbl(a);
2794              END LOOP;
2795              CLOSE rating_crs;
2796           END IF;
2797 
2798           c_fmt_mask := 'CSC_Profile_Engine_PKG.format_mask(' ||
2799                         '''' || curr_code || '''' || ',' ||
2800                         '''' || data_type || '''' || ','||
2801 	                'value, '||
2802 		        ''''|| fmt_mask || '''' || ')' ;
2803 
2804           c_grade := 'CSC_Profile_Engine_PKG.rating_color(' ||
2805                      chk_id || ', ' ||
2806                      'party_id, account_id, value, ' ||
2807                      '''' || data_type || '''' || ', ' ||
2808                      '''' || 'GRADE' || '''' ||', ' ||
2809                      '''' || v_count || '''' || ')'    ;
2810 
2811           c_curr_code := '''' || curr_code || '''';
2812 
2813           c_threshold := 'CSC_Profile_Engine_PKG.calc_threshold(' ||
2814                          'value, '||
2815 	                 '''' || Range_Low_Value || '''' || ', '||
2816 	                 '''' || Range_High_Value || '''' || ', '||
2817 		         '''' || data_type || '''' || ', ' ||
2818 		         '''' || chk_u_l_flag || '''' || ')'   ;
2819 
2820           c_rating := 'CSC_Profile_Engine_PKG.rating_color(' ||
2821                       chk_id || ', ' ||
2822                       'party_id, account_id, value, ' ||
2823                       '''' || data_type || '''' || ', ' ||
2824                       '''' || 'RATING' || '''' ||', ' ||
2825 	              '''' || v_count || '''' || ')'    ;
2826 
2827           c_color := 'CSC_Profile_Engine_PKG.rating_color(' ||
2828                       chk_id || ', ' ||
2829                      'party_id, account_id, value, ' ||
2830                      '''' || data_type || '''' || ', ' ||
2831                      '''' || 'COLOR' || '''' ||', ' ||
2832                      '''' || v_count || '''' || ')'    ;
2833 
2834           IF v_check_level = 'ACCOUNT' THEN
2835              insert_stmnt_final := 'INSERT /*+ PARALLEL(CSC_PROF_BATCH_RESULTS2_T, 12) */ INTO CSC_PROF_BATCH_RESULTS2_T ' ||
2836                              '(check_results_id, check_id, party_id, cust_account_id, value, currency_code, grade, '||
2837 			     ' created_by, creation_date, last_updated_by, last_update_date, last_update_login, '||
2838 			     ' results_threshold_flag, rating_code, color_code)' ||
2839                              ' SELECT csc_prof_check_results_s.nextval, '
2840 			      || chk_id || ', party_id, account_id, '
2841 			      || c_fmt_mask ||', '
2842 			      || c_curr_code || ', '
2843 			      || c_grade
2844 			      || ', FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.CONC_LOGIN_ID, '
2845 			      || c_threshold ||', '
2846 			      || c_rating || ', '
2847 			      || c_color
2848 			      ||' FROM CSC_PROF_BATCH_RESULTS1_T where nvl(account_id, -999999) <> -999999';
2849           ELSE
2850              insert_stmnt_final := 'INSERT /*+ PARALLEL(CSC_PROF_BATCH_RESULTS2_T, 12) */ INTO CSC_PROF_BATCH_RESULTS2_T ' ||
2851                              '(check_results_id, check_id, party_id, cust_account_id, value, currency_code, grade, '||
2852 			     ' created_by, creation_date, last_updated_by, last_update_date, last_update_login, '||
2853 			     ' results_threshold_flag, rating_code, color_code)' ||
2854                              ' SELECT csc_prof_check_results_s.nextval, '
2855 			      || chk_id || ', party_id, account_id, '
2856 			      || c_fmt_mask ||', '
2857 			      || c_curr_code || ', '
2858 			      || c_grade
2859 			      || ', FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.USER_ID, Sysdate, FND_GLOBAL.CONC_LOGIN_ID, '
2860 			      || c_threshold ||', '
2861 			      || c_rating || ', '
2862 			      || c_color
2863 			      ||' FROM CSC_PROF_BATCH_RESULTS1_T where account_id IS NULL';
2864           END IF;
2865 
2866           EXECUTE IMMEDIATE (insert_stmnt_final);
2867           COMMIT;
2868       ELSE
2869          /* set the global variable to Y to indicate that profile checks without batch sql exist */
2870          g_check_no_batch := 'Y';
2871       END IF ; /* batch_sql_stmnt IS NOT NULL */
2872    END LOOP;
2873    CLOSE checks_csr;
2874 
2875    INSERT /*+ PARALLEL (CSC_PROF_BATCH_RESULTS2_T, 12) */
2876    INTO CSC_PROF_BATCH_RESULTS2_T
2877      (check_results_id, check_id, party_id, cust_account_id,
2878       value, currency_code, grade, created_by, creation_date,
2879       last_updated_by, last_update_date, last_update_login,
2880       results_threshold_flag, rating_code, color_code
2881       )
2882    SELECT
2883      check_results_id, check_id, party_id, cust_account_id,
2884       value, currency_code, grade, created_by, creation_date,
2885       last_updated_by, last_update_date, last_update_login,
2886       results_threshold_flag, rating_code, color_code
2887    FROM  csc_prof_check_results
2888    WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
2889                       MINUS
2890                       SELECT check_id FROM csc_prof_group_checks a
2891                        WHERE group_id = p_group_id
2892                          AND EXISTS (SELECT 1 FROM csc_prof_checks_b b
2893                                       WHERE a.check_id = b.check_id AND b.select_type = 'B'));
2894 
2895    COMMIT;
2896 
2897    EXECUTE IMMEDIATE 'TRUNCATE TABLE '|| v_schema_name ||'.csc_prof_check_results';
2898 
2899 
2900    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 UNUSABLE';
2901    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 UNUSABLE';
2902    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 UNUSABLE';
2903 
2904    INSERT /*+ PARALLEL (csc_prof_check_results, 12) */
2905    INTO csc_prof_check_results
2906      (check_results_id, check_id, party_id, cust_account_id,
2907       value, currency_code, grade, created_by, creation_date,
2908       last_updated_by, last_update_date, last_update_login,
2909       results_threshold_flag, rating_code, color_code
2910       )
2911    SELECT
2912      check_results_id, check_id, party_id, cust_account_id,
2913       value, currency_code, grade, created_by, creation_date,
2914       last_updated_by, last_update_date, last_update_login,
2915       results_threshold_flag, rating_code, color_code
2916    FROM  CSC_PROF_BATCH_RESULTS2_T;
2917 
2918    COMMIT;
2919 
2920 
2921    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 REBUILD NOLOGGING';
2922    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 REBUILD NOLOGGING';
2923    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 REBUILD NOLOGGING';
2924 
2925    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS2_T' ;
2926    EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || v_schema_name ||'.CSC_PROF_BATCH_RESULTS1_T' ;
2927 
2928    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML';
2929    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_CHECK_RESULTS LOGGING';
2930 
2931 EXCEPTION
2932         WHEN Tablesegment_full then
2933              CSC_Profile_Engine_PKG.Handle_Exception;
2934              g_error := sqlcode || ' ' || sqlerrm;
2935              set_context('Evaluate_Checks4_Var',
2936                          'check_id => ' || chk_id,
2937                          'Error => ' || g_error);
2938              App_Exception.raise_exception;
2939 
2940         WHEN Indexsegment_full then
2941              CSC_Profile_Engine_PKG.Handle_Exception;
2942              g_error := sqlcode || ' ' || sqlerrm;
2943              set_context('Evaluate_Checks4_Var',
2944                          'check_id => ' || chk_id,
2945                          'Error => ' || g_error);
2946              App_Exception.raise_exception;
2947 
2948         WHEN SNAPSHOT_TOO_OLD THEN
2949              CSC_Profile_Engine_PKG.Handle_Exception;
2950              g_error := sqlcode || ' ' || sqlerrm;
2951              set_context('Evaluate_Checks4_Var',
2952                          'check_id => ' || chk_id,
2953                          'Error => ' || g_error);
2954              App_Exception.raise_exception;
2955 
2956         WHEN INTERNAL_ERROR THEN
2957              CSC_Profile_Engine_PKG.Handle_Exception;
2958              g_error := sqlcode || ' ' || sqlerrm;
2959              set_context('Evaluate_Checks4_Var',
2960                          'check_id => ' || chk_id,
2961                          'Error => ' || g_error);
2962              App_Exception.raise_exception;
2963 
2964         WHEN SUMMATION_ERROR THEN
2965              CSC_Profile_Engine_PKG.Handle_Exception;
2966              set_context('Evaluate_Checks4_Var',
2967                          'Summation SQL failed for chk_id => '||to_char(chk_id));
2968              RAISE;
2969 
2970 	WHEN OTHERS THEN
2971              CSC_Profile_Engine_PKG.Handle_Exception;
2972 	     g_error := sqlcode || ' ' || sqlerrm;
2973              set_context('Evaluate_Checks4_Var',
2974                          'check_id => ' || chk_id,
2975                          'Error => ' || g_error);
2976              RAISE;
2977 
2978 END Evaluate_Checks4_Var;
2979 
2980 --  This procedure evaluates the checks
2981 --  for which the batch sql statement is NULL and group_id is not null
2982 
2983 PROCEDURE Evaluate_Checks4_No_Batch
2984   ( errbuf	OUT	NOCOPY VARCHAR2,
2985     retcode	OUT	NOCOPY NUMBER ,
2986     p_group_id  in      Number) IS
2987 
2988   chk_id		Number;
2989   chk_name		Varchar2(240);
2990   cparty_id		Number;
2991   ccust_acct_id		Number;
2992   sel_type		Varchar2(3);
2993   sel_blk_id		Number;
2994   data_type		Varchar2(90);
2995   fmt_mask		Varchar2(90);
2996   rule			Varchar2(32767);
2997 
2998   Chk_u_l_flag          Varchar2(3);
2999   Thd_grade             Varchar2(9);
3000 
3001   truncate_flag		Varchar2(1) := 'N';
3002   acct_flag		Varchar2(1);
3003 
3004   blk_id		Number 		:= null;
3005   blk_name		Varchar2(240)	:= null;
3006   sql_stmt		Varchar2(2000)	:= null;
3007   curr_code		Varchar2(15)	:= null;
3008 
3009   v_party_in_sql	Number := 0;
3010   v_acct_in_sql		Number := 0;
3011   v_check_level         Varchar2(10);
3012 
3013   l_for_insert		varchar2(1) := 'Y';
3014   l_for_party		varchar2(1) := 'Y';
3015   l_up_total		Number := 0;
3016   l_ip_total		Number := 0;
3017   l_ua_total		Number := 0;
3018   l_ia_total		Number := 0;
3019 
3020   v_party_id            Number;
3021 
3022   CURSOR checks_csr IS
3023   SELECT check_id, select_type, select_block_id,
3024          data_type, format_mask,check_upper_lower_flag,
3025 		 threshold_grade, check_level
3026     FROM csc_prof_checks_b a
3027    WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
3028 	                   WHERE group_id = p_group_id)
3029      AND select_type = 'B'
3030      AND check_level IN ('PARTY','ACCOUNT')
3031      AND EXISTS (SELECT null
3032                    FROM csc_prof_blocks_b b
3033                   WHERE a.select_block_id = b.block_id
3034                     AND b.batch_sql_stmnt IS NULL)
3035      AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
3036                      AND Nvl(end_date_active, SYSDATE);
3037 
3038   CURSOR cparty_csr IS
3039      SELECT party_id
3040      FROM hz_parties
3041     WHERE status = 'A'
3042     AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
3043     -- Person, ORG added for 1850508
3044 
3045   CURSOR caccount_csr IS
3046      SELECT party_id, cust_account_id
3047      FROM hz_cust_accounts
3048      WHERE  party_id=v_party_id
3049      AND  status = 'A' ;
3050 
3051   CURSOR block_csr IS
3052       SELECT block_id, sql_stmnt, currency_code
3053       FROM csc_prof_blocks_b a
3054       WHERE a.block_id = sel_blk_id;
3055 
3056     cid 	number;
3057     val		VARCHAR2(240) := null;
3058 
3059 BEGIN
3060 /* R12 Employee HelpDesk Modifications */
3061 
3062 /* The processing to be done for either employee level(employee) or customer level(party,account,contact) */
3063 IF g_dashboard_for_employee = 'N' THEN
3064 
3065    l_ip_total := 0;
3066    l_up_total := 0;
3067    l_ia_total := 0;
3068    l_ua_total := 0;
3069 
3070    OPEN checks_csr;
3071    LOOP
3072       FETCH checks_csr
3073       INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
3074 
3075       EXIT WHEN checks_csr%notfound;
3076 
3077       Open block_csr;
3078       Fetch block_csr INTO blk_id, sql_stmt, curr_code;
3079       Close block_csr;
3080 
3081       IF sql_stmt IS NOT NULL Then
3082          v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
3083          v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
3084       Else
3085          v_party_in_sql := 0;
3086          v_acct_in_sql  := 0;
3087       End if;
3088 
3089       Begin
3090          cid := dbms_sql.open_cursor;
3091          dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
3092          dbms_sql.define_column(cid,1,val,240);
3093 
3094          OPEN cparty_csr;
3095          LOOP
3096             FETCH cparty_csr INTO cparty_id;
3097             EXIT WHEN cparty_csr%notfound;
3098             If v_check_level='PARTY' Then
3099 	          Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
3100 		  sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
3101 		  curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
3102             End if;
3103 
3104            /* added this condition for Bug 1937730*/
3105             v_party_id:=cparty_id;
3106 
3107             IF v_check_level = 'ACCOUNT' Then
3108                If (v_acct_in_sql = 0)  Then
3109                   NULL;
3110                Else
3111                   OPEN caccount_csr;
3112                   LOOP
3113                      FETCH caccount_csr
3114                       INTO cparty_id, ccust_acct_id;
3115                      EXIT WHEN caccount_csr%notfound;
3116 
3117 		     Evaluate_One_Check(truncate_flag, chk_id,
3118                                         cparty_id,ccust_acct_id,v_check_level,sel_type, sel_blk_id,
3119                                         data_type, fmt_mask,chk_u_l_flag,Thd_grade,rule, blk_id, sql_stmt,
3120                                         curr_code, l_up_total, l_ip_total, l_ua_total
3121                                        , l_ia_total ,cid);
3122                   END LOOP;
3123                   CLOSE caccount_csr;
3124                End if; -- Added for 1850508
3125             END IF;
3126          END LOOP;
3127          CLOSE cparty_csr;
3128 
3129 	 IF (dbms_sql.is_open(cid)) THEN
3130 	    dbms_sql.close_cursor(cid);
3131 	 end if;
3132 
3133       Exception
3134           When others then
3135              IF (dbms_sql.is_open(cid)) THEN
3136                 dbms_sql.close_cursor(cid);
3137              end if;
3138 
3139              set_context('Evaluate_Checks4_No_Batch',
3140                 'chk_id=>'||to_char(chk_id),
3141                 'party_id=>'||to_char(cparty_id),
3142                 'account_id=>'||to_char(ccust_acct_id));
3143              g_error := sqlcode || ' ' || sqlerrm;
3144              set_context(NULL, g_error);
3145       End;
3146 
3147    END LOOP;
3148    CLOSE checks_csr;
3149 
3150    -- check if there are still records to be inserted
3151    IF l_ip_total <> 0 THEN
3152 	l_for_insert := 'Y';
3153 	l_for_party  := 'Y';
3154 	Insert_Update_Check_Results
3155 		(l_ip_total, l_for_insert, l_for_party);
3156 	l_ip_total :=0;
3157    END IF;
3158    -- check if there are still records to be updated
3159    IF l_up_total <> 0 THEN
3160 	l_for_insert := 'N';
3161 	l_for_party  := 'Y';
3162 	Insert_Update_Check_Results
3163 		(l_up_total, l_for_insert, l_for_party);
3164 	l_up_total :=0;
3165    END IF;
3166 
3167    -- check if there are still records to be inserted
3168    IF l_ia_total <> 0 THEN
3169 	l_for_insert := 'Y';
3170 	l_for_party  := 'N';
3171 	Insert_Update_Check_Results
3172 		(l_ia_total, l_for_insert, l_for_party);
3173 	l_ia_total :=0;
3174    END IF;
3175    -- check if there are still records to be updated
3176    IF l_ua_total <> 0 THEN
3177 	l_for_insert := 'N';
3178 	l_for_party  := 'N';
3179 	Insert_Update_Check_Results
3180 		(l_ua_total, l_for_insert, l_for_party);
3181 	l_ua_total :=0;
3182    END IF;
3183 
3184    IF g_dashboard_for_contact IS NULL THEN
3185       FND_PROFILE.GET('CSC_DASHBOARD_VIEW_FOR_CONTACT',g_dashboard_for_contact);
3186    END IF;
3187 
3188    IF g_dashboard_for_contact = 'Y' THEN
3189        l_ip_total := 0;
3190        l_up_total := 0;
3191        l_ia_total := 0;
3192        l_ua_total := 0;
3193 
3194        Evaluate_blocks_Rel(p_up_total => l_up_total,
3195                            p_ip_total => l_ip_total,
3196                            p_ua_total => l_ua_total,
3197                            p_ia_total => l_ia_total,
3198                            p_group_id => p_group_id,
3199                            p_no_batch_sql => 'Y' );
3200 
3201        Evaluate_checks_Rel(errbuf => errbuf,
3202                            retcode => retcode,
3203                            p_group_id => p_group_id,
3204                            p_no_batch_sql => 'Y');
3205    END IF;
3206 
3207    COMMIT;
3208 
3209    -- Return 0 for successful completion, 1 for warnings, 2 for error
3210    IF (error_flag) THEN
3211       errbuf := Sqlerrm;
3212       retcode := 2;
3213    ELSIF (warning_msg <> '') THEN
3214       errbuf := warning_msg;
3215       retcode := 1;
3216    ELSE
3217       errbuf := '';
3218       retcode := 0;
3219    END IF;
3220 
3221   ELSIF g_dashboard_for_employee = 'Y' THEN
3222        l_ip_total := 0;
3223        l_up_total := 0;
3224        l_ia_total := 0;
3225        l_ua_total := 0;
3226 
3227        Evaluate_blocks_Emp(p_up_total => l_up_total,
3228                            p_ip_total => l_ip_total,
3229                            p_ua_total => l_ua_total,
3230                            p_ia_total => l_ia_total,
3231                            p_group_id => p_group_id,
3232                            p_no_batch_sql => 'Y' );
3233 
3234        Evaluate_checks_Emp(errbuf => errbuf,
3235                            retcode => retcode,
3236                            p_group_id => p_group_id,
3237                            p_no_batch_sql => 'Y');
3238    END IF;
3239 
3240    COMMIT;
3241 
3242    -- Return 0 for successful completion, 1 for warnings, 2 for error
3243    IF (error_flag) THEN
3244       errbuf := Sqlerrm;
3245       retcode := 2;
3246    ELSIF (warning_msg <> '') THEN
3247       errbuf := warning_msg;
3248       retcode := 1;
3249    ELSE
3250       errbuf := '';
3251       retcode := 0;
3252    END IF;
3253 
3254    IF (debug) THEN
3255       fnd_file.close;
3256    END IF;
3257 
3258    EXCEPTION
3259       WHEN OTHERS THEN
3260          ROLLBACK;
3261          IF (checks_csr%isopen) THEN
3262 	    CLOSE checks_csr;
3263 	 END IF;
3264 	 IF (cparty_csr%isopen) THEN
3265 	    CLOSE cparty_csr;
3266 	 END IF;
3267 	 IF (caccount_csr%isopen) THEN
3268 	    CLOSE caccount_csr;
3269 	 END IF;
3270 	 IF (debug) THEN
3271 	    fnd_file.close;
3272 	 END IF;
3273 
3274          -- Retrieve error message into errbuf
3275          errbuf := Sqlerrm;
3276 
3277       	 -- Return 2 for error
3278          retcode := 2;
3279 
3280 	 g_error := sqlcode || ' ' || sqlerrm;
3281 	 fnd_file.put_line(fnd_file.log , g_error);
3282 
3283 END Evaluate_Checks4_No_Batch;
3284 --
3285 -- Evaluate_Checks4_Rule
3286 --   if Party_id is null, Account_id is null and Group_id is not null
3287 --   Loop through Checks in this group and evaluate the results
3288 --   for all Parties and Accounts for Profile check type Rule ('T')
3289 --
3290 PROCEDURE Evaluate_Checks4_Rule
3291   ( errbuf	OUT	NOCOPY VARCHAR2,
3292     retcode	OUT	NOCOPY NUMBER ,
3293     p_group_id  in      Number) IS
3294 
3295   chk_id		Number;
3296   chk_name		Varchar2(240);
3297   cparty_id		Number;
3298   ccust_acct_id		Number;
3299   sel_type		Varchar2(3);
3300   sel_blk_id		Number;
3301   data_type		Varchar2(90);
3302   fmt_mask		Varchar2(90);
3303   rule			Varchar2(32767);
3304 
3305   Chk_u_l_flag          Varchar2(3);
3306   Thd_grade             Varchar2(9);
3307 
3308   truncate_flag		Varchar2(1) := 'N';
3309   acct_flag		Varchar2(1);
3310 
3311   blk_id		Number 		:= null;
3312   blk_name		Varchar2(240)	:= null;
3313   sql_stmt		Varchar2(2000)	:= null;
3314   curr_code		Varchar2(15)	:= null;
3315 
3316   v_party_in_sql	Number := 0;
3317   v_acct_in_sql		Number := 0;
3318   v_check_level         Varchar2(10);
3319 
3320   l_for_insert		varchar2(1) := 'Y';
3321   l_for_party		varchar2(1) := 'Y';
3322   l_up_total		Number := 0;
3323   l_ip_total		Number := 0;
3324   l_ua_total		Number := 0;
3325   l_ia_total		Number := 0;
3326 
3327   v_chk_count           NUMBER := 0;
3328 
3329 /* added this variable for Bug 1937730*/
3330   v_party_id            Number;
3331 
3332   CURSOR checks_csr IS
3333      SELECT check_id, select_type, select_block_id,
3334 		data_type, format_mask,check_upper_lower_flag,threshold_grade,
3335                 check_level
3336      FROM csc_prof_checks_b
3337     WHERE check_id in (select check_id from csc_prof_group_checks
3338 	               where group_id = p_group_id)
3339       AND check_level IN ('PARTY','ACCOUNT')
3340       AND  Sysdate BETWEEN Nvl(start_date_active, Sysdate)
3341                        AND Nvl(end_date_active, Sysdate)
3342       AND select_type = 'T';
3343 
3344     CURSOR checks_count IS
3345      SELECT COUNT(*)
3346        FROM csc_prof_checks_b
3347       WHERE check_id in (select check_id from csc_prof_group_checks
3348                          where group_id = p_group_id)
3349         AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
3350                              AND Nvl(end_date_active, Sysdate)
3351         AND select_type = 'T';
3352 
3353   CURSOR cparty_csr IS
3354      SELECT party_id
3355      FROM hz_parties
3356     WHERE status = 'A'
3357     AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
3358     -- Person, ORG added for 1850508
3359 
3360 /* added this condition party_id=v_party_id for Bug 1937730*/
3361   CURSOR caccount_csr IS
3362      SELECT party_id, cust_account_id
3363      FROM hz_cust_accounts
3364      WHERE  party_id=v_party_id
3365      AND  status = 'A' ;
3366 
3367   CURSOR block_csr IS
3368       SELECT block_id, sql_stmnt, currency_code
3369       FROM csc_prof_blocks_b a
3370       WHERE a.block_id = sel_blk_id;
3371 
3372     cid 	number;
3373     val		VARCHAR2(240) := null;
3374 
3375 BEGIN
3376 /* R12 Employee HelpDesk Modifications */
3377 
3378   /* The processing to be done for either employee level(employee) or customer level(party,account,contact) */
3379 IF g_dashboard_for_employee = 'N' THEN
3380 
3381    OPEN checks_count;
3382    FETCH checks_count INTO v_chk_count;
3383    CLOSE checks_count;
3384 
3385    IF v_chk_count > 0 THEN
3386       /* blocks will be evaluated only if the type is T */
3387       Evaluate_Blocks4(l_up_total, l_ip_total, l_ua_total, l_ia_total,p_group_id);
3388    END IF;
3389 
3390    l_ip_total := 0;
3391    l_up_total := 0;
3392    l_ia_total := 0;
3393    l_ua_total := 0;
3394 
3395    OPEN checks_csr;
3396    LOOP
3397        FETCH checks_csr
3398        INTO chk_id, sel_type, sel_blk_id, data_type, fmt_mask,chk_u_l_flag,Thd_grade,v_check_level;
3399 
3400        EXIT WHEN checks_csr%notfound;
3401 
3402        IF (sel_type = 'T') THEN
3403 	   acct_flag := 'N';
3404 	   build_rule(acct_flag,chk_id,v_check_level, rule);
3405        ELSIF (sel_type = 'B') THEN
3406 	   Open block_csr;
3407 	   Fetch block_csr INTO blk_id, sql_stmt, curr_code;
3408 	   Close block_csr;
3409        END IF;
3410 
3411         IF sql_stmt IS NOT NULL Then
3412               v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
3413               v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
3414            Else
3415               v_party_in_sql := 0;
3416               v_acct_in_sql  := 0;
3417         End if;
3418 
3419 /* This begin, end exception is added mainly for exception handing for Bug 19800
3420 04*/
3421 
3422        Begin
3423 
3424        IF ((sel_type='B' ) OR  (sel_type='T') ) Then -- Only valid types
3425 
3426        	   -- Loop through all parties
3427 
3428 	   -- Open the Cursor
3429 	   cid := dbms_sql.open_cursor;
3430 	   if (sel_type = 'B') then
3431 	   	dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
3432 	   elsif (sel_type = 'T') then
3433            	dbms_sql.parse(cid, rule, dbms_sql.native);
3434 	   end if;
3435 	   dbms_sql.define_column(cid,1,val,240);
3436 
3437 	   -- pass the cid
3438 	   OPEN cparty_csr;
3439 	   LOOP
3440 	      FETCH cparty_csr INTO cparty_id;
3441 	      EXIT WHEN cparty_csr%notfound;
3442               If v_check_level='PARTY' Then
3443 	          Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
3444 		  sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
3445 		  curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
3446               End if;
3447 
3448               /* added this condition for Bug 1937730*/
3449                 v_party_id:=cparty_id;
3450 
3451               IF (sel_type = 'T') THEN
3452                      acct_flag := 'Y';
3453                      build_rule(acct_flag,chk_id,v_check_level, rule);
3454               END IF;
3455 
3456               IF ((sel_type='B' ) OR (sel_type='T') ) and v_check_level='ACCOUNT' Then -- Only valid Types now
3457                    If ((v_acct_in_sql = 0) and sel_type = 'B') and v_check_level='ACCOUNT'  Then -- Added for1850508
3458                               -- Check can be made only for 'B' types,
3459                               -- If acct is not present as bind variable, the sql might return wrong
3460                               -- rows (party level counts) at account leve.
3461 
3462                               --and (v_party_in_sql <> 0 and v_acct_in_sql <> 0) OR
3463                               --(sel_type='T') ) Then
3464 
3465                               NULL;
3466                    Else
3467                    -- Loop through all parties with accounts
3468                               -- Added for 1850508
3469                               --Open Cursor
3470                               -- dbms_output.put_line('Opening and PArsing in checks1 Accounts Check_id -'||to_char(chk_id));
3471 
3472 
3473                               OPEN caccount_csr;
3474                               LOOP
3475                                    FETCH caccount_csr
3476                                    INTO cparty_id, ccust_acct_id;
3477                                    EXIT WHEN caccount_csr%notfound;
3478                                    Evaluate_One_Check(truncate_flag, chk_id,
3479                                    cparty_id,ccust_acct_id,v_check_level,sel_type, sel_blk_id,
3480                                    data_type, fmt_mask,chk_u_l_flag,Thd_grade,rule, blk_id, sql_stmt,
3481                                    curr_code, l_up_total, l_ip_total, l_ua_total
3482                                    , l_ia_total ,cid);
3483                               END LOOP;
3484                               CLOSE caccount_csr;
3485                     End if; -- Added for 1850508
3486                END IF;
3487 
3488 	   END LOOP;
3489 	   CLOSE cparty_csr;
3490 	   IF (dbms_sql.is_open(cid)) THEN
3491 	      dbms_sql.close_cursor(cid);
3492 	   end if;
3493         END IF;
3494 
3495     Exception
3496 
3497         When others then
3498           IF (dbms_sql.is_open(cid)) THEN
3499               dbms_sql.close_cursor(cid);
3500           end if;
3501 
3502           set_context('Evaluate_Checks4_Rule',
3503                 'chk_id=>'||to_char(chk_id),
3504                 'party_id=>'||to_char(cparty_id),
3505                 'account_id=>'||to_char(ccust_acct_id));
3506           g_error := sqlcode || ' ' || sqlerrm;
3507           set_context(NULL, g_error);
3508     End;
3509 
3510    END LOOP;
3511    CLOSE checks_csr;
3512 
3513    -- check if there are still records to be inserted
3514    IF l_ip_total <> 0 THEN
3515 	l_for_insert := 'Y';
3516 	l_for_party  := 'Y';
3517 	Insert_Update_Check_Results
3518 		(l_ip_total, l_for_insert, l_for_party);
3519 	l_ip_total :=0;
3520    END IF;
3521    -- check if there are still records to be updated
3522    IF l_up_total <> 0 THEN
3523 	l_for_insert := 'N';
3524 	l_for_party  := 'Y';
3525 	Insert_Update_Check_Results
3526 		(l_up_total, l_for_insert, l_for_party);
3527 	l_up_total :=0;
3528    END IF;
3529 
3530    -- check if there are still records to be inserted
3531    IF l_ia_total <> 0 THEN
3532 	l_for_insert := 'Y';
3533 	l_for_party  := 'N';
3534 	Insert_Update_Check_Results
3535 		(l_ia_total, l_for_insert, l_for_party);
3536 	l_ia_total :=0;
3537    END IF;
3538    -- check if there are still records to be updated
3539    IF l_ua_total <> 0 THEN
3540 	l_for_insert := 'N';
3541 	l_for_party  := 'N';
3542 	Insert_Update_Check_Results
3543 		(l_ua_total, l_for_insert, l_for_party);
3544 	l_ua_total :=0;
3545    END IF;
3546 
3547    IF g_dashboard_for_contact = 'Y' THEN
3548        l_ip_total := 0;
3549        l_up_total := 0;
3550        l_ia_total := 0;
3551        l_ua_total := 0;
3552 
3553        Evaluate_blocks_Rel(p_up_total => l_up_total,
3554                            p_ip_total => l_ip_total,
3555                            p_ua_total => l_ua_total,
3556                            p_ia_total => l_ia_total,
3557                            p_group_id => p_group_id,
3558                            p_rule_only => 'Y' );
3559 
3560        Evaluate_checks_Rel(errbuf => errbuf,
3561                            retcode => retcode,
3562                            p_group_id => p_group_id,
3563                            p_rule_only => 'Y');
3564    END IF;
3565 
3566    COMMIT;
3567 
3568    -- Return 0 for successful completion, 1 for warnings, 2 for error
3569    IF (error_flag) THEN
3570       errbuf := Sqlerrm;
3571       retcode := 2;
3572    ELSIF (warning_msg <> '') THEN
3573       errbuf := warning_msg;
3574       retcode := 1;
3575    ELSE
3576       errbuf := '';
3577       retcode := 0;
3578    END IF;
3579 /* R12 Employee HelpDesk Modifications */
3580 
3581   ELSIF g_dashboard_for_employee = 'Y' THEN
3582        l_ip_total := 0;
3583        l_up_total := 0;
3584        l_ia_total := 0;
3585        l_ua_total := 0;
3586 
3587        Evaluate_blocks_Emp(p_up_total => l_up_total,
3588                            p_ip_total => l_ip_total,
3589                            p_ua_total => l_ua_total,
3590                            p_ia_total => l_ia_total,
3591                            p_group_id => p_group_id,
3592                            p_rule_only => 'Y' );
3593 
3594        Evaluate_checks_Emp(errbuf => errbuf,
3595                            retcode => retcode,
3596                            p_group_id => p_group_id,
3597                            p_rule_only => 'Y');
3598    END IF;
3599 /* End of  R12 Employee HelpDesk Modifications */
3600    COMMIT;
3601 
3602    -- Return 0 for successful completion, 1 for warnings, 2 for error
3603    IF (error_flag) THEN
3604       errbuf := Sqlerrm;
3605       retcode := 2;
3606    ELSIF (warning_msg <> '') THEN
3607       errbuf := warning_msg;
3608       retcode := 1;
3609    ELSE
3610       errbuf := '';
3611       retcode := 0;
3612    END IF;
3613 
3614    IF (debug) THEN
3615       fnd_file.close;
3616    END IF;
3617 
3618    EXCEPTION
3619       WHEN OTHERS THEN
3620          ROLLBACK;
3621          IF (checks_csr%isopen) THEN
3622 	    CLOSE checks_csr;
3623 	 END IF;
3624 	 IF (cparty_csr%isopen) THEN
3625 	    CLOSE cparty_csr;
3626 	 END IF;
3627 	 IF (caccount_csr%isopen) THEN
3628 	    CLOSE caccount_csr;
3629 	 END IF;
3630 	 IF (debug) THEN
3631 	    fnd_file.close;
3632 	 END IF;
3633 
3634          -- Retrieve error message into errbuf
3635          errbuf := Sqlerrm;
3636 
3637       	 -- Return 2 for error
3638          retcode := 2;
3639 
3640 	 g_error := sqlcode || ' ' || sqlerrm;
3641 	 fnd_file.put_line(fnd_file.log , g_error);
3642 
3643 END Evaluate_Checks4_Rule;
3644 --
3645 -- Evaluate_One_Check
3646 --   Evaluate the given profile check and store the result in the
3647 --   CSC_PROF_CHECK_RESULTS table. Also store the grade if ranges are
3648 --   specified.
3649 -- IN
3650 --   chk_id  	- profile check identifier
3651 --   cust_id 	- customer identifier for which check is evaluated
3652 --   acct_id 	- customer's account identifier
3653 --   sel_type 	- 'B' for block; 'T' for true or false ("indicator" check)
3654 --   sel_blk_id - building block identifier (required if select type is block)
3655 --   data_type 	- data type of check result (used for applying format mask)
3656 --   fmt_mask 	- format mask for check result (ignored if data type is char or
3657 --              	currency code is present)
3658 --   rule  	- sql statement that returns 0 or 1 row for an indicator check
3659 --   P_CID 	- Cursor passed from calling routine to avoid re-parsing the same sql statement
3660 PROCEDURE Evaluate_One_Check
3661   ( p_truncate_flag	IN	VARCHAR2,
3662     p_chk_id		IN	NUMBER,
3663     p_party_id		IN	NUMBER,
3664     p_acct_id		IN	NUMBER	 DEFAULT NULL,
3665     p_check_level       IN      VARCHAR2 DEFAULT NULL,
3666     p_sel_type		IN	VARCHAR2,
3667     p_sel_blk_id	IN	NUMBER   DEFAULT NULL,
3668     p_data_type     	IN	VARCHAR2 DEFAULT NULL,
3669     p_fmt_mask		IN	VARCHAR2 DEFAULT NULL,
3670     p_chk_u_l_flag      IN      VARCHAR2 DEFAULT NULL,
3671     p_thd_grade         IN      VARCHAR2 DEFAULT NULL,
3672     p_rule		IN	VARCHAR2 DEFAULT NULL,
3673     p_blk_id		IN	NUMBER   DEFAULT NULL,
3674     p_sql_stmt		IN	VARCHAR2 DEFAULT NULL,
3675     p_curr_code		IN	VARCHAR2 DEFAULT NULL,
3676     p_up_total      	IN OUT NOCOPY NUMBER ,
3677     p_ip_total      	IN OUT NOCOPY NUMBER ,
3678     p_ua_total      	IN OUT NOCOPY NUMBER ,
3679     p_ia_total      	IN OUT NOCOPY NUMBER ,
3680     p_cid		IN	NUMBER) IS
3681 
3682     v_party_in_sql        Number := 0;
3683     v_acct_in_sql         Number := 0;
3684     v_employee_in_sql     Number := 0;
3685 
3686     val		VARCHAR2(240) := null;
3687     curr_code	VARCHAR2(15)  := null;
3688     grd		VARCHAR2(3)   := null;
3689     cid		NUMBER        := null;
3690     dummy	NUMBER;
3691 
3692     Rng_h_v     Varchar2(240);
3693     Rng_l_v     Varchar2(240);
3694     Result      Varchar2(3);
3695 
3696 
3697     --l_period_date	Date := NULL;
3698     l_for_insert	varchar2(1) := 'Y';
3699     l_for_party		varchar2(1) := 'Y';
3700 
3701     v_rating_code       Varchar2(240);
3702     v_color_code        Varchar2(240);
3703 
3704     v_party_count	Number := 0;
3705     v_account_count	Number := 0;
3706     v_val		Number := 0;
3707     v_format_date       DATE;
3708 
3709   Cursor val_crs1 IS
3710      Select check_rating_grade,rating_code,color_code
3711      From csc_prof_check_ratings
3712      Where check_id = p_chk_id
3713      And ( nvl(Range_Low_Value,val) <= v_val AND
3714 	   nvl(Range_High_Value,val) >= v_val );
3715 
3716   Cursor val_crs2 IS
3717      Select check_rating_grade,rating_code,color_code
3718      From csc_prof_check_ratings
3719      Where check_id = p_chk_id
3720      And ( nvl(Range_Low_Value,val) <= val AND
3721 	   nvl(Range_High_Value,val) >= val );
3722 
3723 /* This Cursor added for BUG 1534103 - VIS115P: THRESHOLD FUNCTIONALITY IS NOT WORKING. */
3724    Cursor val_crs3 IS
3725      Select Range_Low_Value,Range_High_Value
3726      From   csc_prof_check_ratings
3727      Where  check_id = p_chk_id
3728      and    check_rating_grade=p_thd_grade;
3729 
3730 /*
3731      -- for party level
3732      Cursor party_check_crs IS
3733 	Select count(*)
3734 	From csc_prof_check_results
3735 	Where check_id = p_chk_id
3736 	And party_id = p_party_id
3737 	And cust_account_id IS NULL;
3738 
3739      -- for account level
3740      Cursor account_check_crs IS
3741 	Select count(*)
3742 	From csc_prof_check_results
3743 	Where check_id = p_chk_id
3744 	And party_id = p_party_id
3745 	And cust_account_id = p_acct_id;
3746 */
3747 BEGIN
3748    IF (p_sel_type = 'B') THEN
3749 	Begin
3750 
3751 	    -- P_CID is the Cursor to avoid reparsing the sql stmt
3752 	    -- P_CID would not be null when engine runs for more than 1 party (e.g. evaluate_checks1)
3753 	    -- P_CID would be null when engine is being run for 1 party (e.g. evaluate_checks2)
3754 
3755     	    -- Added for 1850508
3756 	    if p_cid is null then
3757 	    	cid := dbms_sql.open_cursor;
3758 	        dbms_sql.parse(cid, p_sql_stmt, dbms_sql.native);
3759 	        dbms_sql.define_column(cid,1,val,240);
3760 	    else
3761 		cid := p_cid;
3762 	    end if;
3763 
3764           IF p_sql_stmt IS NOT NULL Then
3765               v_party_in_sql := INSTR(lower(p_sql_stmt),':party_id',1);
3766               v_acct_in_sql  := INSTR(lower(p_sql_stmt),':cust_account_id',1);
3767 	        v_employee_in_sql := INSTR(lower(p_sql_stmt),':employee_id',1);
3768           Else
3769               v_party_in_sql := 0;
3770               v_acct_in_sql  := 0;
3771 	       v_employee_in_sql := 0;
3772           End if;
3773 
3774          -- For Bug 1935015 commented this if statement and created 2 variables
3775 
3776         if p_check_level='PARTY' OR p_check_level = 'CONTACT' then
3777 
3778             if v_party_in_sql  > 0 then
3779 	    	dbms_sql.bind_variable(cid, ':party_id', p_party_id);
3780 	    end if;
3781             if v_acct_in_sql  > 0 then
3782                 dbms_sql.bind_variable(cid, ':cust_account_id',p_acct_id);
3783             end if;
3784 
3785         elsif p_check_level='ACCOUNT' then
3786             if v_party_in_sql  > 0 then
3787                 dbms_sql.bind_variable(cid, ':party_id', p_party_id);
3788             end if;
3789 
3790             if v_acct_in_sql  > 0 then
3791                 dbms_sql.bind_variable(cid, ':cust_account_id',p_acct_id);
3792             end if;
3793          /* R12 Employee HelpDesk Modifications */
3794 	elsif p_check_level='EMPLOYEE' then
3795             if v_employee_in_sql  > 0 then
3796                 dbms_sql.bind_variable(cid, ':employee_id', p_party_id);
3797             end if;
3798 
3799         end if;
3800 
3801 
3802 	    dummy := dbms_sql.execute_and_fetch(cid);
3803 
3804             /* added the below condition for bug 3787383 */
3805             IF dummy > 0 THEN
3806                dbms_sql.column_value(cid,1,val);
3807             ELSE
3808                val := NULL;
3809             END IF;
3810 
3811 	    if p_cid is null then
3812 	    	dbms_sql.close_cursor(cid);
3813 	    end if;
3814 
3815 --	  END IF;
3816 
3817 	Exception
3818 	  When Others then
3819 		if p_cid is null then
3820 			IF (dbms_sql.is_open(cid)) THEN
3821 			    dbms_sql.close_cursor(cid);
3822 			END IF;
3823 		end if;
3824 		val := '0';
3825 	End;
3826 
3827    ELSIF (p_sel_type = 'T') THEN
3828 	Begin
3829 
3830     	    -- Added for 1850508
3831 	   if (p_cid is null) then
3832 	   	cid := dbms_sql.open_cursor;
3833                 dbms_sql.parse(cid, p_rule, dbms_sql.native);
3834 	   else
3835 		cid := p_cid;
3836 	   end if;
3837 
3838         -- for Bug 1935015 changed instr(sql_stmt..) to INSTR(lower(sql_stmt)..)
3839           IF p_rule IS NOT NULL Then
3840               v_party_in_sql := INSTR(lower(p_rule),':party_id',1);
3841               v_acct_in_sql  := INSTR(lower(p_rule),':cust_account_id',1);
3842 	       v_employee_in_sql  := INSTR(lower(p_rule),':employee_id',1);
3843           Else
3844               v_party_in_sql := 0;
3845               v_acct_in_sql  := 0;
3846 	       v_employee_in_sql  := 0;
3847           End if;
3848 
3849 	   IF p_check_level='PARTY' OR p_check_level = 'CONTACT' THEN
3850                  if v_party_in_sql  > 0 then
3851 		         dbms_sql.bind_variable(cid, ':party_id', p_party_id);
3852 		 end if;
3853                  if v_acct_in_sql  > 0 then
3854                          dbms_sql.bind_variable(cid, ':cust_account_id',p_acct_id);
3855                  end if;
3856 
3857 	   ELSIF p_check_level='ACCOUNT' then
3858                  if v_party_in_sql  > 0 then
3859 			 dbms_sql.bind_variable(cid, ':party_id', p_party_id);
3860 		 end if;
3861 
3862                  if v_acct_in_sql  > 0 then
3863 	           	 dbms_sql.bind_variable(cid, ':cust_account_id', p_acct_id);
3864      	         end if;
3865 		 /* R12 Employee HelpDesk Modifications */
3866 	    ELSIF p_check_level='EMPLOYEE' then
3867 		if v_employee_in_sql  > 0 then
3868 			dbms_sql.bind_variable(cid, ':employee_id', p_party_id);
3869 	            end if;
3870 	   END IF;
3871 
3872            val := dbms_sql.execute_and_fetch(cid); -- returns 0 if no rows found
3873     	    -- Added for 1850508
3874 	   if (p_cid is null) then
3875 	   	dbms_sql.close_cursor(cid);
3876 	   end if;
3877 	Exception
3878 	   When Others then
3879 	   	if (p_cid is null) then
3880 			IF (dbms_sql.is_open(cid)) THEN
3881 				dbms_sql.close_cursor(cid);
3882 			end if;
3883 	   	end if;
3884 		val := null;
3885 	End;
3886    END IF;
3887 
3888 /* This condition added for BUG 1534103 - VIS115P: THRESHOLD FUNCTIONALITY IS NOT WORKING. */
3889 
3890     IF (p_sel_type = 'B') and (p_data_type IN ('NUMBER', 'DATE')) THEN
3891         IF p_data_type = 'NUMBER' Then
3892            IF val IS NULL Then
3893                 val := '0';
3894            END IF;
3895            OPEN val_crs3;
3896            FETCH val_crs3 INTO Rng_l_v,rng_h_v;
3897            IF val_crs3%notfound THEN
3898                 Result := 'Y';
3899            END IF;
3900            CLOSE val_crs3;
3901 
3902 
3903            If p_chk_u_l_flag ='U' Then
3904               If to_number(val)>to_number(rng_h_v) then
3905                   Result:='Y';
3906               Else
3907                   Result:='N';
3908               End If;
3909            Elsif p_chk_u_l_flag ='L' Then
3910                If to_number(val)<to_number(rng_l_v) then
3911                   Result:='Y';
3912                 Else
3913                   Result:='N';
3914                 End If;
3915             Else
3916                  Result:='N';
3917             End If;
3918 
3919         ELSE
3920            /* added the below code for bug 4071727 */
3921            OPEN val_crs3;
3922            FETCH val_crs3 INTO Rng_l_v,rng_h_v;
3923            IF val_crs3%notfound THEN
3924                 Result := 'Y';
3925            END IF;
3926            CLOSE val_crs3;
3927            /* added till here for bug 4071727 */
3928 
3929            If val is not null then
3930                If p_chk_u_l_flag ='U' Then
3931 	           /* added to_date for bug 4071727 */
3932                    If to_Date(val, 'DD-MM-RRRR') > to_date(rng_h_v, 'DD-MM-RRRR') Then
3933                       Result:='Y';
3934                    Else
3935                       Result:='N';
3936                    End If;
3937                Elsif p_chk_u_l_flag ='L' Then
3938 	          /* added to_date for bug 4071727 */
3939                   If to_Date(val, 'DD-MM-RRRR') < to_Date(rng_l_v, 'DD-MM-RRRR') Then
3940                        Result:='Y';
3941                    Else
3942                        Result:='N';
3943                    End If;
3944                Else
3945                     Result:='N';
3946                End If;
3947            End if;
3948  END IF;
3949   -- ELSE
3950    --     grd := NULL;
3951    END IF;
3952 /* Condition for BUG 1534103 - VIS115P: THRESHOLD FUNCTIONALITY IS NOT WORKING. ended*/
3953 
3954    IF (p_sel_type = 'B') and (p_data_type IN ('NUMBER', 'DATE')) THEN
3955 	IF p_data_type = 'NUMBER' Then
3956 	   IF val IS NULL Then
3957 		val := '0';
3958 	   END IF;
3959 	   v_val := to_number(val);
3960 	   val := to_char(v_val);
3961 	   OPEN val_crs1;
3962 	   FETCH val_crs1 INTO grd,v_rating_code,v_color_code;
3963 	   IF val_crs1%notfound THEN
3964 		grd := NULL;
3965                 /* Added for Bug 2227062 */
3966                 v_rating_code := NULL;
3967                 v_color_code := NULL;
3968 	   END IF;
3969 	   CLOSE val_crs1;
3970 	ELSE
3971 	  IF val is not null then
3972 	     OPEN val_crs2;
3973 	     FETCH val_crs2 INTO grd,v_rating_code,v_color_code;
3974 	     IF val_crs2%notfound THEN
3975 		grd := NULL;
3976                 /* Added for Bug 2227062 */
3977                 v_rating_code := NULL;
3978                 v_color_code := NULL;
3979 	     END IF;
3980 	     CLOSE val_crs2;
3981 	  END IF;
3982 	END IF;
3983    ELSE
3984 	grd := NULL;
3985    END IF;
3986 
3987    -- Only convert to format mask if result is not True/False
3988    IF ((p_sel_type = 'B') AND (curr_code IS NULL)) THEN
3989       IF (p_fmt_mask IS NOT NULL) THEN
3990 	 IF (p_data_type = 'NUMBER') THEN
3991 	    val := To_char(To_number(val), p_fmt_mask);
3992          ELSIF (p_data_type = 'DATE') THEN
3993             BEGIN
3994                /* modified the to_date to RRRR format for bug 4177903 */
3995                v_format_date := to_date(val, 'DD-MM-RRRR');
3996                val := To_char(v_format_date, p_fmt_mask);
3997             EXCEPTION
3998                WHEN OTHERS THEN
3999                   val := null;
4000             END;
4001          END IF;
4002       END IF;
4003    ELSIF (p_sel_type = 'T') THEN
4004       IF (val > 0) THEN
4005 	 val := 'Y';
4006        ELSE
4007 	 val := 'N';
4008       END IF;
4009    END IF;
4010 
4011 
4012    BEGIN
4013       IF p_acct_id IS NULL THEN
4014 	 IF p_truncate_flag = 'N' THEN
4015            begin
4016              select 1 into v_party_count
4017              from csc_prof_check_results
4018              where check_id = p_chk_id
4019              and party_id = p_party_id
4020              and cust_account_id is null;
4021            exception when no_data_found then
4022                v_party_count := 0;
4023            when others then
4024                v_party_count := null;
4025           end;
4026 /*
4027 	    OPEN party_check_crs;
4028 	    FETCH party_check_crs INTO v_party_count;
4029 	    IF party_check_crs%notfound THEN
4030 	       v_party_count := 0;
4031 	    END IF;
4032 	    CLOSE party_check_crs;
4033 */
4034 	 ELSE
4035 	   v_party_count := 0;
4036 	 END IF;
4037 
4038 	 IF v_party_count = 0 THEN
4039 	    p_ip_total := p_ip_total + 1;
4040 
4041 	    -- assign values to insert party check results
4042 	    ip_check_id(p_ip_total) := p_chk_id;
4043 	    ip_party_id(p_ip_total) := p_party_id;
4044 	    ip_account_id(p_ip_total) := NULL;
4045 	    ip_value(p_ip_total) := val;
4046 	    ip_currency(p_ip_total) := curr_code;
4047 	    ip_grade(p_ip_total) := grd;
4048             ip_rating_code(p_ip_total) :=v_rating_code;
4049             ip_color_code(p_ip_total) :=v_color_code;
4050             ip_results(p_ip_total) := result;
4051 	    IF p_ip_total = 1000 THEN
4052 		l_for_insert := 'Y';
4053 		l_for_party  := 'Y';
4054 		Insert_Update_Check_Results
4055 			(p_ip_total, l_for_insert, l_for_party);
4056 		p_ip_total :=0;
4057 	    END IF;
4058 
4059 	 ELSIF v_party_count = 1 THEN
4060 	    p_up_total := p_up_total + 1;
4061 
4062 	    -- assign values to update party check results
4063 	    up_check_id(p_up_total) := p_chk_id;
4064 	    up_party_id(p_up_total) := p_party_id;
4065 	    up_account_id(p_up_total) := NULL;
4066 	    up_value(p_up_total) := val;
4067 	    up_currency(p_up_total) := curr_code;
4068 	    up_grade(p_up_total) := grd;
4069             up_rating_code(p_up_total) :=v_rating_code;
4070             up_color_code(p_up_total) :=v_color_code;
4071             up_results(p_up_total) := result;
4072 	    IF p_up_total = 1000 THEN
4073 		l_for_insert := 'N';
4074 		l_for_party  := 'Y';
4075 		Insert_Update_Check_Results
4076 			(p_up_total, l_for_insert, l_for_party);
4077 		p_up_total := 0;
4078 	    END IF;
4079 
4080 	 END IF;
4081 
4082       ELSE
4083 	 IF p_truncate_flag = 'N' THEN
4084             begin
4085               select 1 into v_account_count from csc_prof_check_results
4086               where check_id = p_chk_id
4087               and party_id = p_party_id
4088 	      and CUST_ACCOUNT_ID =p_acct_id;  -- Bug 5255227 Fix
4089              exception when no_data_found then
4090               v_account_count := 0;
4091 	      when TOO_MANY_ROWS then
4092                v_account_count := 1;
4093              when others then
4094               v_account_count := null;
4095             end ;
4096 /*
4097 	    OPEN account_check_crs;
4098 	    FETCH account_check_crs INTO v_account_count;
4099 	    IF account_check_crs%notfound THEN
4100 	       v_account_count := 0;
4101 	    END IF;
4102 	    CLOSE account_check_crs;
4103 */
4104 	 ELSE
4105 	   v_account_count := 0;
4106 	 END IF;
4107 
4108 	 IF v_account_count = 0 THEN
4109 	    p_ia_total := p_ia_total + 1;
4110 	    -- assign values to insert
4111 	    ia_check_id(p_ia_total) := p_chk_id;
4112 	    ia_party_id(p_ia_total) := p_party_id;
4113 	    ia_account_id(p_ia_total) := p_acct_id;
4114 	    ia_value(p_ia_total) := val;
4115 	    ia_currency(p_ia_total) := curr_code;
4116 	    ia_grade(p_ia_total) := grd;
4117             ia_rating_code(p_ia_total) := v_rating_code;
4118             ia_color_code(p_ia_total) := v_color_code;
4119             ia_results(p_ia_total) := result;
4120 
4121 	    IF p_ia_total = 1000 THEN
4122 		l_for_insert := 'Y';
4123 		l_for_party  := 'N';
4124 		Insert_Update_Check_Results
4125 			(p_ia_total, l_for_insert, l_for_party);
4126 		p_ia_total := 0;
4127 	    END IF;
4128 
4129 	 ELSIF v_account_count = 1 THEN
4130 	    p_ua_total := p_ua_total + 1;
4131 
4132 	    -- assign values to update party tables
4133 	    ua_check_id(p_ua_total) := p_chk_id;
4134 	    ua_party_id(p_ua_total) := p_party_id;
4135 	    ua_account_id(p_ua_total) := p_acct_id;
4136 	    ua_value(p_ua_total) := val;
4137 	    ua_currency(p_ua_total) := curr_code;
4138             -- This is a Bug fix for 1934720, changing p_ia_total to p_ua_total
4139 	    ua_grade(p_ua_total) := grd;
4140             ua_rating_code(p_ua_total) := v_rating_code;
4141             ua_color_code(p_ua_total) := v_color_code;
4142             ua_results(p_ua_total) := result;
4143 	    IF p_ua_total = 1000 THEN
4144 		l_for_insert := 'N';
4145 		l_for_party  := 'N';
4146 		Insert_Update_Check_Results
4147 			(p_ua_total, l_for_insert, l_for_party);
4148 		p_ua_total := 0;
4149 	    END IF;
4150 
4151 	 END IF;
4152       END IF;
4153 
4154    END;
4155 
4156    EXCEPTION
4157       -- If an exception is raised, close cursor before exiting
4158       WHEN OTHERS THEN
4159 	IF val_crs1%isopen THEN
4160 	   CLOSE val_crs1;
4161 	END IF;
4162 	IF val_crs2%isopen THEN
4163 	   CLOSE val_crs2;
4164 	END IF;
4165 /*
4166 	IF party_check_crs%isopen THEN
4167 	   CLOSE party_check_crs;
4168 	END IF;
4169 	IF account_check_crs%isopen THEN
4170 	   CLOSE account_check_crs;
4171 	END IF;
4172 */
4173 	if p_cid is null then
4174 		IF (dbms_sql.is_open(cid)) THEN
4175 		    dbms_sql.close_cursor(cid);
4176 		END IF;
4177 	end if;
4178 	set_context('Evaluate_One_Check',
4179 		'chk_id=>'||to_char(p_chk_id),
4180 		'party_id=>'||to_char(p_party_id),
4181 		'account_id=>'||to_char(p_acct_id));
4182 	g_error := sqlcode || ' ' || sqlerrm;
4183 	set_context(NULL, g_error);
4184 	--table_delete;
4185 END Evaluate_One_Check;
4186 
4187 
4188 --
4189 -- Evaluate_Blocks1
4190 --   Loop through all the effective building blocks and evaluate the results
4191 --   for each customer.
4192 --   if block_id is null, party_id is null and account_id is null
4193 --
4194 PROCEDURE Evaluate_Blocks1
4195 (
4196     p_up_total      IN OUT NOCOPY NUMBER ,
4197     p_ip_total      IN OUT NOCOPY NUMBER ,
4198     p_ua_total      IN OUT NOCOPY NUMBER ,
4199     p_ia_total      IN OUT NOCOPY NUMBER
4200 ) IS
4201 
4202   blk_id		NUMBER;
4203   blk_name		Varchar2(240);
4204   sql_stmt		Varchar2(2000);
4205   curr_code		Varchar2(15);
4206   bparty_id		Number;
4207   bacct_id		Number;
4208   truncate_flag		Varchar2(1):= 'N';
4209 
4210   l_for_insert		varchar2(1) := 'Y';
4211   l_for_party		varchar2(1) := 'Y';
4212 
4213   v_party_in_sql	Number := 0;
4214   v_acct_in_sql		Number := 0;
4215 
4216 /* added this variable for Bug 1937730*/
4217   v_party_id            Number;
4218 
4219 
4220    -- cursor to run all blocks
4221    CURSOR blocks_csr IS
4222       SELECT block_id, sql_stmnt, currency_code
4223       FROM csc_prof_blocks_b a
4224       WHERE exists ( Select b.block_id
4225 	     From csc_prof_check_rules_b b
4226 	     where b.block_id 	      = a.block_id
4227 		or b.expr_to_block_id = a.block_id)
4228       AND  Sysdate BETWEEN Nvl(start_date_active, Sysdate)
4229 		AND Nvl(end_date_active, Sysdate)
4230 		AND block_level IN ('PARTY','ACCOUNT');
4231 
4232    -- cursor to update all results of a party
4233    CURSOR bparty_csr IS
4234       SELECT party_id
4235       FROM hz_parties
4236       WHERE status='A'
4237       AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
4238       -- Person, ORG added for 1850508
4239 
4240    -- cursor to update all results of an account
4241 /* added this condition party_id=v_party_id for Bug 1937730*/
4242    CURSOR baccount_csr IS
4243       SELECT party_id, cust_account_id
4244       FROM hz_cust_accounts
4245       WHERE  party_id=v_party_id
4246       AND  status = 'A' ;
4247 
4248     -- Added for 1850508
4249     cid 	number;
4250     val		VARCHAR2(240) := null;
4251 
4252 BEGIN
4253   -- Loop through blocks for party level
4254   BEGIN
4255    OPEN blocks_csr;
4256    LOOP
4257       FETCH blocks_csr INTO blk_id, sql_stmt, curr_code;
4258       EXIT WHEN blocks_csr%notfound;
4259 
4260       -- for Bug 1935015 changed instr(sql_stmt..) to INSTR(lower(sql_stmt)..)
4261       v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
4262       v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
4263 
4264 /* This begin, end exception is added mainly for exception handing for Bug 19800
4265 04*/
4266 
4267      Begin
4268 
4269            -- IF ((v_party_in_sql <> 0) and (v_acct_in_sql <> 0)) Then
4270 	   -- Loop through per party
4271 	   -- Added for 1850508
4272            -- dbms_output.put_line('Evaluate blocks1  Opening and Parsing.PARTY Level.'||to_char(blk_id));
4273 	   cid := dbms_sql.open_cursor;
4274 	   dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
4275 	   dbms_sql.define_column(cid, 1, val, 240);
4276 
4277 	   OPEN bparty_csr;
4278 	   LOOP
4279 		FETCH bparty_csr INTO bparty_id;
4280 		EXIT WHEN bparty_csr%notfound;
4281 
4282 		Evaluate_One_Block(truncate_flag, blk_id, bparty_id,
4283 			null, sql_stmt, curr_code,
4284 	          p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
4285 
4286  /* added this condition for Bug 1937730*/
4287                   v_party_id:=bparty_id;
4288 
4289                  If (v_acct_in_sql <> 0)  then -- Added for 1850508
4290                       -- If acct is not present as bind variable, the sql might return wrong
4291                       -- rows (party level counts) at account leve.
4292                       --p_old_block_id:=null;
4293 
4294                       -- dbms_output.put_line('Evaluate blocks1  Opening and Parsing. ACCTLevel.'||to_char(blk_id));
4295 
4296 
4297                        OPEN baccount_csr;
4298                        LOOP
4299                            FETCH baccount_csr
4300                            INTO bparty_id, bacct_id;
4301                            EXIT WHEN baccount_csr%notfound;
4302 
4303                            Evaluate_One_Block(truncate_flag, blk_id, bparty_id,
4304                            bacct_id,sql_stmt, curr_code,p_up_total, p_ip_total,
4305                            p_ua_total, p_ia_total,cid);
4306                       END LOOP;
4307                       CLOSE baccount_csr;
4308 
4309       END IF; -- Added for 1850508
4310 
4311 	    END LOOP;
4312 	    CLOSE bparty_csr;
4313 	    IF (dbms_sql.is_open(cid)) THEN
4314 	      dbms_sql.close_cursor(cid);
4315 	    end if;
4316             -- END IF;
4317 
4318    Exception
4319         When others then
4320           IF (dbms_sql.is_open(cid)) THEN
4321               dbms_sql.close_cursor(cid);
4322           end if;
4323 
4324           set_context('Evaluate_Blocks1', blk_id, bparty_id);
4325           g_error := sqlcode || ' ' || sqlerrm;
4326           set_context(NULL, g_error);
4327    End;
4328 
4329 
4330    END LOOP;
4331    CLOSE blocks_csr;
4332 
4333    -- check if there are still records to be inserted
4334    IF p_ip_total <> 0 THEN
4335 	l_for_insert := 'Y';
4336 	l_for_party  := 'Y';
4337 	Insert_Update_Block_Results
4338 		(p_ip_total, l_for_insert, l_for_party);
4339 	p_ip_total :=0;
4340    END IF;
4341    -- check if there are still records to be updated
4342    IF p_up_total <> 0 THEN
4343 	l_for_insert := 'N';
4344 	l_for_party  := 'Y';
4345 	Insert_Update_Block_Results
4346 		(p_up_total, l_for_insert, l_for_party);
4347 	p_up_total :=0;
4348    END IF;
4349 
4350 
4351    EXCEPTION
4352       WHEN OTHERS THEN
4353        IF (blocks_csr%isopen) THEN
4354 	  CLOSE blocks_csr;
4355        END IF;
4356        IF (bparty_csr%isopen) THEN
4357 	   CLOSE bparty_csr;
4358        END IF;
4359        IF (baccount_csr%isopen) THEN
4360            CLOSE baccount_csr;
4361        END IF;
4362 
4363        set_context('Evaluate_Blocks', blk_id, bparty_id);
4364        g_error := sqlcode || ' ' || sqlerrm;
4365        set_context(NULL, g_error);
4366        --set_context(NULL, Sqlerrm);
4367        table_delete;
4368 
4369        RAISE;
4370   END;
4371 
4372    -- check if there are still records to be inserted
4373    IF p_ia_total <> 0 THEN
4374 	l_for_insert := 'Y';
4375 	l_for_party  := 'N';
4376 
4377 	Insert_Update_Block_Results
4378 		(p_ia_total, l_for_insert, l_for_party);
4379 	p_ia_total :=0;
4380    END IF;
4381 
4382    -- check if there are still records to be updated
4383    IF p_ua_total <> 0 THEN
4384 	l_for_insert := 'N';
4385 	l_for_party  := 'N';
4386 	Insert_Update_Block_Results
4387 		(p_ua_total, l_for_insert, l_for_party);
4388 	p_ua_total :=0;
4389    END IF;
4390 
4391 END Evaluate_Blocks1;
4392 
4393 --  This procedure evaluates the blocks
4394 --  for which the batch sql statement is NULL and select_type is 'B' (Variable)
4395 PROCEDURE Evaluate_Blocks1_No_Batch
4396 (
4397     p_up_total      IN OUT NOCOPY NUMBER ,
4398     p_ip_total      IN OUT NOCOPY NUMBER ,
4399     p_ua_total      IN OUT NOCOPY NUMBER ,
4400     p_ia_total      IN OUT NOCOPY NUMBER
4401 ) IS
4402 
4403   blk_id		Number;
4404   blk_name		Varchar2(240);
4405   sql_stmt		Varchar2(2000);
4406   curr_code		Varchar2(15);
4407   bparty_id		Number;
4408   bacct_id		Number;
4409   truncate_flag		Varchar2(1):= 'N';
4410 
4411   l_for_insert		varchar2(1) := 'Y';
4412   l_for_party		varchar2(1) := 'Y';
4413 
4414   v_party_in_sql	Number := 0;
4415   v_acct_in_sql		Number := 0;
4416   v_party_id            Number;
4417 
4418    -- cursor to run all blocks for all checks present in that group
4419    CURSOR blocks_csr IS
4420       SELECT block_id, sql_stmnt, currency_code
4421         FROM csc_prof_blocks_b a
4422        WHERE EXISTS ( SELECT null
4423                         FROM csc_prof_checks_b b
4424                        WHERE b.select_block_id = a.block_id
4425                          AND b.select_type = 'B'
4426                          AND check_id IN (SELECT check_id FROM csc_prof_group_checks))
4427          AND  SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
4428                           AND Nvl(end_date_active, SYSDATE)
4429          AND  batch_sql_stmnt IS NULL;
4430 
4431    -- cursor to update all results of a party
4432    CURSOR bparty_csr IS
4433       SELECT party_id
4434       FROM hz_parties
4435       WHERE status='A'
4436       AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
4437 
4438    -- cursor to update all results of an account
4439    CURSOR baccount_csr IS
4440       SELECT party_id, cust_account_id
4441       FROM hz_cust_accounts
4442       WHERE  party_id=v_party_id
4443       AND  status = 'A' ;
4444 
4445     cid 	number;
4446     val		VARCHAR2(240) := null;
4447 
4448 BEGIN
4449   -- Loop through blocks for party level
4450    BEGIN
4451       OPEN blocks_csr;
4452       LOOP
4453          FETCH blocks_csr INTO blk_id, sql_stmt, curr_code;
4454          EXIT WHEN blocks_csr%notfound;
4455 
4456          v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
4457          v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
4458 
4459          Begin
4460             cid := dbms_sql.open_cursor;
4461             dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
4462             dbms_sql.define_column(cid, 1, val, 240);
4463 
4464             OPEN bparty_csr;
4465             LOOP
4466                FETCH bparty_csr INTO bparty_id;
4467                EXIT WHEN bparty_csr%notfound;
4468 
4469                Evaluate_One_Block(truncate_flag, blk_id, bparty_id,
4470 		  null, sql_stmt, curr_code, p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
4471 
4472                v_party_id:=bparty_id;
4473 
4474                If (v_acct_in_sql <> 0)  then
4475                   OPEN baccount_csr;
4476                   LOOP
4477                      FETCH baccount_csr
4478                       INTO bparty_id, bacct_id;
4479                      EXIT WHEN baccount_csr%notfound;
4480 
4481                      Evaluate_One_Block(truncate_flag, blk_id,
4482                            bparty_id,bacct_id,sql_stmt, curr_code,
4483                            p_up_total, p_ip_total,p_ua_total,
4484                            p_ia_total,cid);
4485                   END LOOP;
4486                   CLOSE baccount_csr;
4487 
4488                END IF; -- Added for 1850508
4489             END LOOP;
4490             CLOSE bparty_csr;
4491 
4492             IF (dbms_sql.is_open(cid)) THEN
4493                dbms_sql.close_cursor(cid);
4494             end if;
4495 
4496          Exception
4497             When others then
4498                IF (dbms_sql.is_open(cid)) THEN
4499                   dbms_sql.close_cursor(cid);
4500                end if;
4501                set_context('Evaluate_Blocks4_No_Batch', blk_id, bparty_id);
4502                g_error := sqlcode || ' ' || sqlerrm;
4503                set_context(NULL, g_error);
4504          End;
4505 
4506       END LOOP;
4507       CLOSE blocks_csr;
4508 
4509    -- check if there are still records to be inserted
4510       IF p_ip_total <> 0 THEN
4511          l_for_insert := 'Y';
4512          l_for_party  := 'Y';
4513          Insert_Update_Block_Results
4514 		(p_ip_total, l_for_insert, l_for_party);
4515          p_ip_total :=0;
4516       END IF;
4517    -- check if there are still records to be updated
4518       IF p_up_total <> 0 THEN
4519          l_for_insert := 'N';
4520          l_for_party  := 'Y';
4521          Insert_Update_Block_Results
4522              (p_up_total, l_for_insert, l_for_party);
4523          p_up_total :=0;
4524       END IF;
4525 
4526    EXCEPTION
4527       WHEN OTHERS THEN
4528          IF (blocks_csr%isopen) THEN
4529             CLOSE blocks_csr;
4530          END IF;
4531          IF (bparty_csr%isopen) THEN
4532             CLOSE bparty_csr;
4533          END IF;
4534 
4535          IF (baccount_csr%isopen) THEN
4536            CLOSE baccount_csr;
4537          END IF;
4538 
4539          IF (dbms_sql.is_open(cid)) THEN
4540             dbms_sql.close_cursor(cid);
4541          end if;
4542          set_context('Evaluate_Blocks4_No_Batch', blk_id, bparty_id);
4543          g_error := sqlcode || ' ' || sqlerrm;
4544          set_context(NULL, g_error);
4545          table_delete;
4546          RAISE;
4547    END;
4548 
4549    -- check if there are still records to be inserted
4550    IF p_ia_total <> 0 THEN
4551 	l_for_insert := 'Y';
4552 	l_for_party  := 'N';
4553 
4554 	Insert_Update_Block_Results
4555 		(p_ia_total, l_for_insert, l_for_party);
4556 	p_ia_total :=0;
4557    END IF;
4558 
4559    -- check if there are still records to be updated
4560    IF p_ua_total <> 0 THEN
4561 	l_for_insert := 'N';
4562 	l_for_party  := 'N';
4563 	Insert_Update_Block_Results
4564 		(p_ua_total, l_for_insert, l_for_party);
4565 	p_ua_total :=0;
4566    END IF;
4567 
4568 END Evaluate_Blocks1_No_Batch;
4569 --
4570 -- Evaluate_Blocks2
4571 --   Loop through all the effective building blocks and evaluate the results
4572 --   for given customer.
4573 --   if block_id is not null, party_id is not null or account_id is not null
4574 --
4575 PROCEDURE Evaluate_Blocks2
4576   ( p_block_id		IN NUMBER,
4577     p_party_id		IN NUMBER,
4578     p_acct_id		IN NUMBER,
4579     p_up_total      IN OUT NOCOPY NUMBER ,
4580     p_ip_total      IN OUT NOCOPY NUMBER ,
4581     p_ua_total      IN OUT NOCOPY NUMBER ,
4582     p_ia_total      IN OUT NOCOPY NUMBER ) IS
4583 
4584   blk_id		NUMBER;
4585   blk_name		Varchar2(240);
4586   sql_stmt		Varchar2(2000);
4587   curr_code		Varchar2(15);
4588   truncate_flag		Varchar2(1) := 'N';
4589 
4590   l_for_insert		varchar2(1) := 'Y';
4591   l_for_party		varchar2(1) := 'Y';
4592 
4593   v_party_in_sql	Number := 0;
4594   v_acct_in_sql		Number := 0;
4595 
4596 /*  added these variable for Bug 1937730*/
4597   bparty_id             Number;
4598   bacct_id              Number;
4599   v_party_id            Number;
4600   cid                   Number;
4601   val                   Varchar2(240) := null;
4602 
4603 
4604  -- cursor to run a specific block
4605  CURSOR blocks_csr IS
4606     SELECT block_id, sql_stmnt, currency_code
4607     FROM csc_prof_blocks_b
4608     WHERE block_id = p_block_id
4609     AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
4610 	AND Nvl(end_date_active, Sysdate));
4611 
4612   -- cursor to update all results of an account
4613 /* added this condition party_id=v_party_id for Bug 1937730*/
4614    CURSOR baccount_csr IS
4615       SELECT party_id, cust_account_id
4616       FROM hz_cust_accounts
4617       WHERE  party_id=v_party_id
4618       AND  status = 'A' ;
4619 
4620 
4621 BEGIN
4622   -- Loop through the given block_id for party level
4623 
4624    OPEN blocks_csr;
4625    FETCH blocks_csr INTO blk_id, sql_stmt, curr_code;
4626 
4627    IF blocks_csr%found THEN
4628       CLOSE blocks_csr;
4629 
4630     -- for Bug 1935015 changed instr(sql_stmt..) to INSTR(lower(sql_stmt)..)
4631 
4632       v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
4633       v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
4634 
4635     --  IF ((v_party_in_sql <> 0) and (v_acct_in_sql <> 0)) Then
4636 /* Commented this if condition for Bug1937730*/
4637 --	IF (p_acct_id IS NULL) THEN
4638 	    -- P_CID is null as cursor should be parsed each time.
4639 	    Evaluate_One_Block(truncate_flag, blk_id, p_party_id,
4640 			null, sql_stmt, curr_code,
4641 	          p_up_total, p_ip_total, p_ua_total, p_ia_total,NULL );
4642 
4643 	   -- check if there are still records to be inserted
4644 	   IF p_ip_total <> 0 THEN
4645 		l_for_insert := 'Y';
4646 		l_for_party  := 'Y';
4647 		Insert_Update_Block_Results
4648 			(p_ip_total, l_for_insert, l_for_party);
4649 		p_ip_total :=0;
4650 	   END IF;
4651 	   -- check if there are still records to be updated
4652 	   IF p_up_total <> 0 THEN
4653 		l_for_insert := 'N';
4654 		l_for_party  := 'Y';
4655 		Insert_Update_Block_Results
4656 			(p_up_total, l_for_insert, l_for_party);
4657 		p_up_total :=0;
4658 	   END IF;
4659 
4660 /* added this condition for Bug 1937730*/
4661 --	ELSIF (p_acct_id IS NOT NULL) THEN
4662 
4663 /* This begin, end exception is added mainly for exception handing for Bug 19800
4664 04*/
4665 
4666 Begin
4667 	   -- P_CID is null as cursor should be parsed
4668            If (v_acct_in_sql <> 0)  then -- Added for 1850508
4669                       -- If acct is not present as bind variable, the sql might return wrong
4670                       -- rows (party level counts) at account leve.
4671                       --p_old_block_id:=null;
4672 
4673                       -- dbms_output.put_line('Evaluate blocks1  Opening and Parsing. ACCTLevel.'||to_char(blk_id));
4674 
4675                        cid := dbms_sql.open_cursor;
4676                        dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
4677                        dbms_sql.define_column(cid, 1, val, 240);
4678 
4679                        /* changed bparty_id to p_party_id for bug 5351401 */
4680                        v_party_id := p_party_id;
4681 
4682                        OPEN baccount_csr;
4683                        LOOP
4684                            FETCH baccount_csr
4685                            INTO bparty_id, bacct_id;
4686                            EXIT WHEN baccount_csr%notfound;
4687 
4688                            Evaluate_One_Block(truncate_flag, blk_id,
4689                            bparty_id,bacct_id,sql_stmt, curr_code,
4690                            p_up_total, p_ip_total,p_ua_total, p_ia_total
4691                            ,cid);
4692                       END LOOP;
4693                       CLOSE baccount_csr;
4694 
4695                       IF (dbms_sql.is_open(cid)) THEN
4696                               dbms_sql.close_cursor(cid);
4697                       End if;
4698 
4699             END IF; -- Added for 1850508
4700 
4701 /*	   Evaluate_One_Block(truncate_flag, blk_id, p_party_id,
4702 			p_acct_id, sql_stmt, curr_code,
4703 	          p_up_total, p_ip_total, p_ua_total, p_ia_total,NULL );
4704 */
4705 
4706 	   -- check if there are still records to be inserted
4707 Exception
4708         When others then
4709 
4710           IF (dbms_sql.is_open(cid)) THEN
4711                               dbms_sql.close_cursor(cid);
4712           End if;
4713 
4714           set_context('Evaluate_Blocks2', blk_id, bparty_id);
4715           g_error := sqlcode || ' ' || sqlerrm;
4716           set_context(NULL, g_error);
4717 End;
4718 
4719 	   IF p_ia_total <> 0 THEN
4720 		l_for_insert := 'Y';
4721 		l_for_party  := 'N';
4722 		Insert_Update_Block_Results
4723 			(p_ia_total, l_for_insert, l_for_party);
4724 		p_ia_total :=0;
4725 	   END IF;
4726 	   -- check if there are still records to be updated
4727 	   IF p_ua_total <> 0 THEN
4728 		l_for_insert := 'N';
4729 		l_for_party  := 'N';
4730 		Insert_Update_Block_Results
4731 			(p_ua_total, l_for_insert, l_for_party);
4732 		p_ua_total :=0;
4733 	   END IF;
4734 --	END IF;
4735    --   END IF;  --((v_party_in_sql <> 0) and (v_acct_in_sql <> 0))
4736    ELSE
4737       CLOSE blocks_csr;
4738    END IF;
4739 
4740    EXCEPTION
4741       WHEN OTHERS THEN
4742        IF (blocks_csr%isopen) THEN
4743 	  CLOSE blocks_csr;
4744        END IF;
4745        set_context('Evaluate_Blocks2', blk_id, p_party_id, p_acct_id);
4746        g_error := sqlcode || ' ' || sqlerrm;
4747        set_context(NULL, g_error);
4748 
4749 END Evaluate_Blocks2;
4750 
4751 --
4752 -- Evaluate_Blocks4 -- Added for 1850508
4753 --   When Group Id is given but not party_id or Account_id
4754 --   Calculate for All Parties, Accounts * For all checks present in the group
4755 --
4756 PROCEDURE Evaluate_Blocks4
4757 (
4758     p_up_total      IN OUT NOCOPY NUMBER ,
4759     p_ip_total      IN OUT NOCOPY NUMBER ,
4760     p_ua_total      IN OUT NOCOPY NUMBER ,
4761     p_ia_total      IN OUT NOCOPY NUMBER ,
4762     p_group_id      IN     NUMBER
4763 ) IS
4764 
4765   blk_id		Number;
4766   blk_name		Varchar2(240);
4767   sql_stmt		Varchar2(2000);
4768   curr_code		Varchar2(15);
4769   bparty_id		Number;
4770   bacct_id		Number;
4771   truncate_flag		Varchar2(1):= 'N';
4772 
4773   l_for_insert		varchar2(1) := 'Y';
4774   l_for_party		varchar2(1) := 'Y';
4775 
4776   v_party_in_sql	Number := 0;
4777   v_acct_in_sql		Number := 0;
4778 
4779 /* added this variable for Bug 1937730*/
4780 
4781   v_party_id            Number;
4782 
4783 
4784    -- cursor to run all blocks for all checks present in that group
4785    CURSOR blocks_csr IS
4786       SELECT block_id, sql_stmnt, currency_code
4787       FROM csc_prof_blocks_b a
4788       WHERE exists ( Select b.block_id
4789 	     From csc_prof_check_rules_b b
4790 	     where (b.block_id 	      = a.block_id
4791 		or b.expr_to_block_id = a.block_id)
4792 	     And check_id in (Select check_id from csc_prof_group_checks
4793 				where group_id = p_group_id))
4794       AND  Sysdate BETWEEN Nvl(start_date_active, Sysdate)
4795 		AND Nvl(end_date_active, Sysdate)
4796 		AND block_level IN ('PARTY','ACCOUNT');
4797 
4798    -- cursor to update all results of a party
4799    CURSOR bparty_csr IS
4800       SELECT party_id
4801       FROM hz_parties
4802       WHERE status='A'
4803       AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
4804       -- Person, ORG added for 1850508
4805 
4806 /* added this condition party_id=v_party_id for Bug 1937730*/
4807    -- cursor to update all results of an account
4808    CURSOR baccount_csr IS
4809       SELECT party_id, cust_account_id
4810       FROM hz_cust_accounts
4811       WHERE  party_id=v_party_id
4812       AND  status = 'A' ;
4813 
4814     -- Added for 1850508
4815     cid 	number;
4816     val		VARCHAR2(240) := null;
4817 
4818 BEGIN
4819   -- Loop through blocks for party level
4820   BEGIN
4821    OPEN blocks_csr;
4822    LOOP
4823       FETCH blocks_csr INTO blk_id, sql_stmt, curr_code;
4824       EXIT WHEN blocks_csr%notfound;
4825 
4826       -- for Bug 1935015 changed instr(sql_stmt..) to INSTR(lower(sql_stmt)..)
4827       v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
4828       v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
4829 
4830 /* This begin, end exception is added mainly for exception handing for Bug 19800
4831 04*/
4832 
4833 Begin
4834 
4835       -- IF ((v_party_in_sql <> 0) and (v_acct_in_sql <> 0)) Then
4836       -- Loop through per party
4837       -- Added for 1850508
4838       -- dbms_output.put_line('Evaluate blocks4 Opening and Parsing.PARTY Level.'||to_char(blk_id));
4839 
4840       cid := dbms_sql.open_cursor;
4841       dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
4842       dbms_sql.define_column(cid, 1, val, 240);
4843 
4844       OPEN bparty_csr;
4845       LOOP
4846 	FETCH bparty_csr INTO bparty_id;
4847 	EXIT WHEN bparty_csr%notfound;
4848 
4849 	  Evaluate_One_Block(truncate_flag, blk_id, bparty_id,
4850 		  null, sql_stmt, curr_code, p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
4851 
4852  /* added this condition for Bug 1937730*/
4853            v_party_id:=bparty_id;
4854 
4855            If (v_acct_in_sql <> 0)  then -- Added for 1850508
4856                       -- If acct is not present as bind variable, the sql might return wrong
4857                       -- rows (party level counts) at account leve.
4858                       --p_old_block_id:=null;
4859 
4860                       -- dbms_output.put_line('Evaluate blocks1  Opening and Parsing. ACCTLevel.'||to_char(blk_id));
4861 
4862 
4863                        OPEN baccount_csr;
4864                        LOOP
4865                            FETCH baccount_csr
4866                            INTO bparty_id, bacct_id;
4867                            EXIT WHEN baccount_csr%notfound;
4868 
4869                            Evaluate_One_Block(truncate_flag, blk_id,
4870                            bparty_id,bacct_id,sql_stmt, curr_code,
4871                            p_up_total, p_ip_total,p_ua_total,
4872                            p_ia_total,cid);
4873                       END LOOP;
4874                       CLOSE baccount_csr;
4875 
4876       END IF; -- Added for 1850508
4877 
4878       END LOOP;
4879       CLOSE bparty_csr;
4880       IF (dbms_sql.is_open(cid)) THEN
4881         dbms_sql.close_cursor(cid);
4882       end if;
4883       -- END IF;
4884 Exception
4885 
4886         When others then
4887 
4888           IF (dbms_sql.is_open(cid)) THEN
4889                 dbms_sql.close_cursor(cid);
4890           end if;
4891           set_context('Evaluate_Blocks4', blk_id, bparty_id);
4892           g_error := sqlcode || ' ' || sqlerrm;
4893           set_context(NULL, g_error);
4894 End;
4895 
4896    END LOOP;
4897    CLOSE blocks_csr;
4898 
4899    -- check if there are still records to be inserted
4900    IF p_ip_total <> 0 THEN
4901 	l_for_insert := 'Y';
4902 	l_for_party  := 'Y';
4903 	Insert_Update_Block_Results
4904 		(p_ip_total, l_for_insert, l_for_party);
4905 	p_ip_total :=0;
4906    END IF;
4907    -- check if there are still records to be updated
4908    IF p_up_total <> 0 THEN
4909 	l_for_insert := 'N';
4910 	l_for_party  := 'Y';
4911 	Insert_Update_Block_Results
4912 		(p_up_total, l_for_insert, l_for_party);
4913 	p_up_total :=0;
4914    END IF;
4915 
4916 
4917    EXCEPTION
4918       WHEN OTHERS THEN
4919        IF (blocks_csr%isopen) THEN
4920 	  CLOSE blocks_csr;
4921        END IF;
4922        IF (bparty_csr%isopen) THEN
4923 	   CLOSE bparty_csr;
4924        END IF;
4925 
4926        IF (baccount_csr%isopen) THEN
4927            CLOSE baccount_csr;
4928        END IF;
4929 
4930        IF (dbms_sql.is_open(cid)) THEN
4931            dbms_sql.close_cursor(cid);
4932        end if;
4933        set_context('Evaluate_Blocks4', blk_id, bparty_id);
4934        g_error := sqlcode || ' ' || sqlerrm;
4935        set_context(NULL, g_error);
4936        --set_context(NULL, Sqlerrm);
4937        table_delete;
4938        RAISE;
4939   END;
4940 
4941    -- check if there are still records to be inserted
4942    IF p_ia_total <> 0 THEN
4943 	l_for_insert := 'Y';
4944 	l_for_party  := 'N';
4945 
4946 	Insert_Update_Block_Results
4947 		(p_ia_total, l_for_insert, l_for_party);
4948 	p_ia_total :=0;
4949    END IF;
4950 
4951    -- check if there are still records to be updated
4952    IF p_ua_total <> 0 THEN
4953 	l_for_insert := 'N';
4954 	l_for_party  := 'N';
4955 	Insert_Update_Block_Results
4956 		(p_ua_total, l_for_insert, l_for_party);
4957 	p_ua_total :=0;
4958    END IF;
4959 
4960 END Evaluate_Blocks4;
4961 
4962 --  This procedure evaluates the blocks
4963 --  for which the batch sql statement is NULL and select_type is 'B' (Variable)
4964 -- Group_id is not null
4965 PROCEDURE Evaluate_Blocks4_No_Batch
4966 (
4967     p_up_total      IN OUT NOCOPY NUMBER ,
4968     p_ip_total      IN OUT NOCOPY NUMBER ,
4969     p_ua_total      IN OUT NOCOPY NUMBER ,
4970     p_ia_total      IN OUT NOCOPY NUMBER ,
4971     p_group_id      IN     NUMBER
4972 ) IS
4973 
4974   blk_id		Number;
4975   blk_name		Varchar2(240);
4976   sql_stmt		Varchar2(2000);
4977   curr_code		Varchar2(15);
4978   bparty_id		Number;
4979   bacct_id		Number;
4980   truncate_flag		Varchar2(1):= 'N';
4981 
4982   l_for_insert		varchar2(1) := 'Y';
4983   l_for_party		varchar2(1) := 'Y';
4984 
4985   v_party_in_sql	Number := 0;
4986   v_acct_in_sql		Number := 0;
4987   v_party_id            Number;
4988 
4989    -- cursor to run all blocks for all checks present in that group
4990    CURSOR blocks_csr IS
4991       SELECT block_id, sql_stmnt, currency_code
4992         FROM csc_prof_blocks_b a
4993        WHERE EXISTS ( SELECT null
4994                         FROM csc_prof_checks_b b
4995                        WHERE b.select_block_id = a.block_id
4996                          AND b.select_type = 'B'
4997                          AND check_id IN (SELECT check_id FROM csc_prof_group_checks
4998                                            WHERE group_id = p_group_id))
4999          AND  SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5000                           AND Nvl(end_date_active, SYSDATE)
5001          AND  batch_sql_stmnt IS NULL;
5002 
5003    -- cursor to update all results of a party
5004    CURSOR bparty_csr IS
5005       SELECT party_id
5006       FROM hz_parties
5007       WHERE status='A'
5008       AND  PARTY_TYPE IN ('PERSON','ORGANIZATION');
5009 
5010    -- cursor to update all results of an account
5011    CURSOR baccount_csr IS
5012       SELECT party_id, cust_account_id
5013       FROM hz_cust_accounts
5014       WHERE  party_id=v_party_id
5015       AND  status = 'A' ;
5016 
5017     cid 	number;
5018     val		VARCHAR2(240) := null;
5019 
5020 BEGIN
5021   -- Loop through blocks for party level
5022    BEGIN
5023       OPEN blocks_csr;
5024       LOOP
5025          FETCH blocks_csr INTO blk_id, sql_stmt, curr_code;
5026          EXIT WHEN blocks_csr%notfound;
5027 
5028          v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
5029          v_acct_in_sql  := INSTR(lower(sql_stmt),':cust_account_id',1);
5030 
5031          Begin
5032             cid := dbms_sql.open_cursor;
5033             dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
5034             dbms_sql.define_column(cid, 1, val, 240);
5035 
5036             OPEN bparty_csr;
5037             LOOP
5038                FETCH bparty_csr INTO bparty_id;
5039                EXIT WHEN bparty_csr%notfound;
5040 
5041                Evaluate_One_Block(truncate_flag, blk_id, bparty_id,
5042 		  null, sql_stmt, curr_code, p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
5043 
5044                v_party_id:=bparty_id;
5045 
5046                If (v_acct_in_sql <> 0)  then
5047                   OPEN baccount_csr;
5048                   LOOP
5049                      FETCH baccount_csr
5050                       INTO bparty_id, bacct_id;
5051                      EXIT WHEN baccount_csr%notfound;
5052 
5053                      Evaluate_One_Block(truncate_flag, blk_id,
5054                            bparty_id,bacct_id,sql_stmt, curr_code,
5055                            p_up_total, p_ip_total,p_ua_total,
5056                            p_ia_total,cid);
5057                   END LOOP;
5058                   CLOSE baccount_csr;
5059 
5060                END IF; -- Added for 1850508
5061             END LOOP;
5062             CLOSE bparty_csr;
5063 
5064             IF (dbms_sql.is_open(cid)) THEN
5065                dbms_sql.close_cursor(cid);
5066             end if;
5067 
5068          Exception
5069             When others then
5070                IF (dbms_sql.is_open(cid)) THEN
5071                   dbms_sql.close_cursor(cid);
5072                end if;
5073                set_context('Evaluate_Blocks4_No_Batch', blk_id, bparty_id);
5074                g_error := sqlcode || ' ' || sqlerrm;
5075                set_context(NULL, g_error);
5076          End;
5077 
5078       END LOOP;
5079       CLOSE blocks_csr;
5080 
5081    -- check if there are still records to be inserted
5082       IF p_ip_total <> 0 THEN
5083          l_for_insert := 'Y';
5084          l_for_party  := 'Y';
5085          Insert_Update_Block_Results
5086 		(p_ip_total, l_for_insert, l_for_party);
5087          p_ip_total :=0;
5088       END IF;
5089    -- check if there are still records to be updated
5090       IF p_up_total <> 0 THEN
5091          l_for_insert := 'N';
5092          l_for_party  := 'Y';
5093          Insert_Update_Block_Results
5094              (p_up_total, l_for_insert, l_for_party);
5095          p_up_total :=0;
5096       END IF;
5097 
5098    EXCEPTION
5099       WHEN OTHERS THEN
5100          IF (blocks_csr%isopen) THEN
5101             CLOSE blocks_csr;
5102          END IF;
5103          IF (bparty_csr%isopen) THEN
5104             CLOSE bparty_csr;
5105          END IF;
5106 
5107          IF (baccount_csr%isopen) THEN
5108            CLOSE baccount_csr;
5109          END IF;
5110 
5111          IF (dbms_sql.is_open(cid)) THEN
5112             dbms_sql.close_cursor(cid);
5113          end if;
5114          set_context('Evaluate_Blocks4_No_Batch', blk_id, bparty_id);
5115          g_error := sqlcode || ' ' || sqlerrm;
5116          set_context(NULL, g_error);
5117          table_delete;
5118          RAISE;
5119    END;
5120 
5121    -- check if there are still records to be inserted
5122    IF p_ia_total <> 0 THEN
5123 	l_for_insert := 'Y';
5124 	l_for_party  := 'N';
5125 
5126 	Insert_Update_Block_Results
5127 		(p_ia_total, l_for_insert, l_for_party);
5128 	p_ia_total :=0;
5129    END IF;
5130 
5131    -- check if there are still records to be updated
5132    IF p_ua_total <> 0 THEN
5133 	l_for_insert := 'N';
5134 	l_for_party  := 'N';
5135 	Insert_Update_Block_Results
5136 		(p_ua_total, l_for_insert, l_for_party);
5137 	p_ua_total :=0;
5138    END IF;
5139 
5140 END Evaluate_Blocks4_No_Batch;
5141 
5142 PROCEDURE Evaluate_Blocks5
5143   ( p_block_id		IN NUMBER,
5144     p_party_id		IN NUMBER,
5145     p_up_total      IN OUT NOCOPY NUMBER ,
5146     p_ip_total      IN OUT NOCOPY NUMBER ,
5147     p_ua_total      IN OUT NOCOPY NUMBER ,
5148     p_ia_total      IN OUT NOCOPY NUMBER ) IS
5149 
5150   v_blk_id		NUMBER;
5151   v_blk_name		Varchar2(240);
5152   v_sql_stmt		Varchar2(2000);
5153   v_curr_code		Varchar2(15);
5154   v_truncate_flag		Varchar2(1) := 'N';
5155 
5156   l_for_insert		varchar2(1) := 'Y';
5157   l_for_party		varchar2(1) := 'Y';
5158 
5159   v_party_in_sql	Number := 0;
5160   v_acct_in_sql		Number := 0;
5161 
5162   bparty_id             Number;
5163   bacct_id              Number;
5164   v_party_id            Number;
5165   cid                   Number;
5166   val                   Varchar2(240) := null;
5167 
5168 
5169  -- cursor to run a specific block
5170  CURSOR blocks_csr(c_block_id IN NUMBER) IS
5171     SELECT block_id, sql_stmnt, currency_code
5172     FROM csc_prof_blocks_b
5173     WHERE block_id = c_block_id
5174     AND block_level in( 'CONTACT','EMPLOYEE')
5175     AND (Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5176 	 AND Nvl(end_date_active, Sysdate));
5177 
5178 BEGIN
5179   -- Loop through the given block_id for party level
5180     OPEN blocks_csr(p_block_id);
5181     FETCH blocks_csr INTO v_blk_id,v_sql_stmt,v_curr_code;
5182     IF blocks_csr%found THEN
5183 	 Evaluate_One_Block(v_truncate_flag, v_blk_id, p_party_id,
5184 			null, v_sql_stmt, v_curr_code, p_up_total, p_ip_total, p_ua_total, p_ia_total,NULL );
5185 
5186 	   -- check if there are still records to be inserted
5187 	   IF p_ip_total <> 0 THEN
5188 		l_for_insert := 'Y';
5189 		l_for_party  := 'Y';
5190 		Insert_Update_Block_Results
5191 			(p_ip_total, l_for_insert, l_for_party);
5192 		p_ip_total :=0;
5193 	   END IF;
5194 	   -- check if there are still records to be updated
5195 	   IF p_up_total <> 0 THEN
5196 		l_for_insert := 'N';
5197 		l_for_party  := 'Y';
5198 		Insert_Update_Block_Results
5199 			(p_up_total, l_for_insert, l_for_party);
5200 		p_up_total :=0;
5201 	   END IF;
5202       END IF;
5203       CLOSE blocks_csr;
5204 EXCEPTION
5205       WHEN OTHERS THEN
5206        IF (blocks_csr%isopen) THEN
5207 	    CLOSE blocks_csr;
5208        END IF;
5209        set_context('Evaluate_Blocks5', v_blk_id, p_party_id, null);
5210        g_error := sqlcode || ' ' || sqlerrm;
5211        set_context(NULL, g_error);
5212 END Evaluate_Blocks5;
5213 
5214 PROCEDURE Evaluate_Blocks_Rel
5215 (
5216     p_up_total      IN OUT NOCOPY NUMBER ,
5217     p_ip_total      IN OUT NOCOPY NUMBER ,
5218     p_ua_total      IN OUT NOCOPY NUMBER ,
5219     p_ia_total      IN OUT NOCOPY NUMBER ,
5220     p_group_id      IN NUMBER DEFAULT NULL,
5221     p_no_batch_sql  IN VARCHAR2 DEFAULT NULL,
5222     p_rule_only     IN VARCHAR2 DEFAULT NULL
5223 ) IS
5224 
5225 
5226   truncate_flag		Varchar2(1):= 'N';
5227 
5228   l_for_insert		varchar2(1) := 'Y';
5229   l_for_party		varchar2(1) := 'Y';
5230 
5231   v_party_in_sql	Number := 0;
5232   v_acct_in_sql		Number := 0;
5233 
5234   v_party_id            Number;
5235   v_block_id            Number;
5236 
5237   v_block_curvar  blocks_curtype;
5238   v_rec_var  r_blk_rectype;
5239 
5240    CURSOR relparty_csr IS
5241       SELECT party_id
5242       FROM hz_parties
5243       WHERE status='A'
5244       AND  PARTY_TYPE = 'PARTY_RELATIONSHIP';
5245 
5246     cid 	number;
5247     val		VARCHAR2(240) := null;
5248 
5249 BEGIN
5250    BEGIN
5251    IF p_group_id IS NULL THEN
5252       IF p_no_batch_sql = 'Y' THEN
5253          OPEN v_block_curvar FOR
5254          SELECT block_id, sql_stmnt, currency_code
5255            FROM csc_prof_blocks_b a
5256           WHERE EXISTS ( SELECT null
5257                            FROM csc_prof_checks_b b
5258                           WHERE b.select_block_id = a.block_id
5259                             AND b.select_type = 'B'
5260                             AND check_id IN (SELECT check_id FROM csc_prof_group_checks))
5261             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5262                             AND Nvl(end_date_active, SYSDATE)
5263             AND batch_sql_stmnt IS NULL
5264             AND block_level = 'CONTACT';
5265       ELSIF p_rule_only = 'Y' THEN
5266          OPEN v_block_curvar FOR
5267          SELECT block_id, sql_stmnt, currency_code
5268            FROM csc_prof_blocks_b a
5269           WHERE exists ( SELECT b.block_id
5270                            FROM csc_prof_check_rules_b b, csc_prof_checks_b c
5271                           WHERE (b.block_id  = a.block_id
5272                                  or b.expr_to_block_id = a.block_id)
5273                             AND c.select_type = 'T'
5274                             AND b.check_id = c.check_id)
5275             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5276             AND Nvl(end_date_active, Sysdate)
5277             AND block_level ='CONTACT';
5278       ELSE
5279          OPEN v_block_curvar FOR
5280          SELECT block_id, sql_stmnt, currency_code
5281            FROM csc_prof_blocks_b a
5282           WHERE exists ( Select b.block_id
5283                            From csc_prof_check_rules_b b
5284                           where b.block_id  = a.block_id
5285                              or b.expr_to_block_id = a.block_id)
5286             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5287             AND Nvl(end_date_active, Sysdate)
5288             AND block_level ='CONTACT';
5289       END IF;
5290    ELSE
5291       IF p_no_batch_sql = 'Y' THEN
5292          OPEN v_block_curvar FOR
5293          SELECT block_id, sql_stmnt, currency_code
5294            FROM csc_prof_blocks_b a
5295           WHERE EXISTS ( SELECT null
5296                            FROM csc_prof_checks_b b
5297                           WHERE b.select_block_id = a.block_id
5298                             AND b.select_type = 'B'
5299                             AND check_id IN (SELECT check_id FROM csc_prof_group_checks
5300                                               WHERE group_id = p_group_id))
5301             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5302                             AND Nvl(end_date_active, SYSDATE)
5303             AND batch_sql_stmnt IS NULL
5304             AND block_level = 'CONTACT';
5305       ELSIF p_rule_only = 'Y' THEN
5306          OPEN v_block_curvar FOR
5307          SELECT block_id, sql_stmnt, currency_code
5308          FROM csc_prof_blocks_b a
5309          WHERE EXISTS ( SELECT b.block_id
5310                           FROM csc_prof_check_rules_b b, csc_prof_checks_b c
5311                          WHERE (b.block_id = a.block_id
5312                                 OR b.expr_to_block_id = a.block_id)
5313                            AND c.select_type = 'T'
5314                            AND b.check_id = c.check_id
5315                            AND b.check_id IN (SELECT check_id from csc_prof_group_checks
5316                                              WHERE group_id = p_group_id))
5317           AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5318           AND Nvl(end_date_active, Sysdate)
5319           AND block_level = 'CONTACT';
5320       ELSE
5321          OPEN v_block_curvar FOR
5322          SELECT block_id, sql_stmnt, currency_code
5323            FROM csc_prof_blocks_b a
5324           WHERE EXISTS ( SELECT b.block_id
5325                            FROM csc_prof_check_rules_b b
5326                           WHERE (b.block_id = a.block_id
5327                                  or b.expr_to_block_id = a.block_id)
5328            AND check_id IN (Select check_id from csc_prof_group_checks
5329                              where group_id = p_group_id))
5330            AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5331            AND Nvl(end_date_active, Sysdate)
5332            AND block_level ='CONTACT';
5333       END IF;
5334 
5335    END IF;
5336 
5337    LOOP
5338       FETCH v_block_curvar INTO v_rec_var;
5339       EXIT WHEN v_block_curvar%notfound;
5340       v_party_in_sql := INSTR(lower(v_rec_var.sql_stmnt),':party_id',1);
5341       v_block_id := v_rec_var.block_id;
5342       BEGIN
5343 	      cid := dbms_sql.open_cursor;
5344 	      dbms_sql.parse(cid, v_rec_var.sql_stmnt, dbms_sql.native);
5345 	      dbms_sql.define_column(cid, 1, val, 240);
5346 
5347 	      OPEN relparty_csr;
5348 	      LOOP
5349 		   FETCH relparty_csr INTO v_party_id;
5350 		   EXIT WHEN relparty_csr%notfound;
5351 
5352 		   Evaluate_One_Block(truncate_flag, v_block_id, v_party_id,
5353 			null, v_rec_var.sql_stmnt, v_rec_var.currency,
5354 	          p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
5355 	      END LOOP;
5356 	      CLOSE relparty_csr;
5357 
5358 	      IF (dbms_sql.is_open(cid)) THEN
5359 	        dbms_sql.close_cursor(cid);
5360 	      END IF;
5361 
5362      EXCEPTION
5363      WHEN others THEN
5364           IF (dbms_sql.is_open(cid)) THEN
5365               dbms_sql.close_cursor(cid);
5366           END IF;
5367 
5368           set_context('Evaluate_Blocks_Rel', v_block_id, v_party_id);
5369           g_error := sqlcode || ' ' || sqlerrm;
5370           set_context(NULL, g_error);
5371      END;
5372 
5373    END LOOP;
5374    CLOSE v_block_curvar;
5375 
5376    -- check if there are still records to be inserted
5377    IF p_ip_total <> 0 THEN
5378 	l_for_insert := 'Y';
5379 	l_for_party  := 'Y';
5380 	Insert_Update_Block_Results
5381 		(p_ip_total, l_for_insert, l_for_party);
5382 	p_ip_total :=0;
5383    END IF;
5384    -- check if there are still records to be updated
5385    IF p_up_total <> 0 THEN
5386 	l_for_insert := 'N';
5387 	l_for_party  := 'Y';
5388 	Insert_Update_Block_Results
5389 		(p_up_total, l_for_insert, l_for_party);
5390 	p_up_total :=0;
5391    END IF;
5392 
5393 
5394    EXCEPTION
5395       WHEN OTHERS THEN
5396        IF (v_block_curvar%isopen) THEN
5397 	     CLOSE v_block_curvar;
5398        END IF;
5399        IF (relparty_csr%isopen) THEN
5400 	      CLOSE relparty_csr;
5401        END IF;
5402 
5403        set_context('Evaluate_Blocks_Rel', v_block_id, v_party_id);
5404        g_error := sqlcode || ' ' || sqlerrm;
5405        set_context(NULL, g_error);
5406        table_delete;
5407        RAISE;
5408   END;
5409 
5410 END Evaluate_Blocks_Rel;
5411 
5412 PROCEDURE Evaluate_Checks_Rel
5413   ( errbuf	OUT	NOCOPY VARCHAR2,
5414     retcode	OUT	NOCOPY NUMBER,
5415     p_group_id  IN NUMBER   DEFAULT NULL,
5416     p_no_batch_sql  IN VARCHAR2 DEFAULT NULL,
5417     p_rule_only     IN VARCHAR2 DEFAULT NULL ) IS
5418 
5419   chk_id		Number;
5420   chk_name		Varchar2(240);
5421   cparty_id		Number;
5422   sel_type		Varchar2(3);
5423   sel_blk_id		Number;
5424   data_type		Varchar2(90);
5425   fmt_mask		Varchar2(90);
5426   rule			Varchar2(32767);
5427 
5428   chk_u_l_flag          Varchar2(3);
5429   Thd_grade             Varchar2(9);
5430 
5431   truncate_flag		Varchar2(1) := 'N';
5432   acct_flag		Varchar2(1);
5433 
5434   blk_id		Number 		:= null;
5435   blk_name		Varchar2(240)	:= null;
5436   sql_stmt		Varchar2(2000)	:= null;
5437   curr_code		Varchar2(15)	:= null;
5438 
5439   v_party_in_sql	Number := 0;
5440 
5441   l_for_insert		varchar2(1) := 'Y';
5442   l_for_party		varchar2(1) := 'Y';
5443   l_up_total		Number := 0;
5444   l_ip_total		Number := 0;
5445   l_ua_total		Number := 0;
5446   l_ia_total		Number := 0;
5447 
5448   v_party_id            Number;
5449   v_check_level         Varchar2(10);
5450 
5451   v_checks_curvar  checks_curtype;
5452   v_rec_var  r_chk_rectype;
5453 
5454   CURSOR block_csr IS
5455       SELECT block_id, sql_stmnt, currency_code
5456       FROM csc_prof_blocks_b a
5457       WHERE a.block_id = sel_blk_id;
5458 
5459    CURSOR crelparty_csr IS
5460       SELECT party_id
5461       FROM hz_parties
5462       WHERE status='A'
5463       AND  party_type = 'PARTY_RELATIONSHIP';
5464 
5465     cid 	number;
5466     val		VARCHAR2(240) := null;
5467 
5468 BEGIN
5469    l_ip_total := 0;
5470    l_up_total := 0;
5471    l_ia_total := 0;
5472    l_ua_total := 0;
5473    IF p_group_id IS NULL THEN
5474       IF p_no_batch_sql = 'Y' THEN
5475          OPEN v_checks_curvar FOR
5476          SELECT check_id, select_type, select_block_id,
5477                 data_type, format_mask, check_upper_lower_flag,
5478                 threshold_grade, check_level
5479            FROM csc_prof_checks_b a
5480           WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks)
5481             AND select_type = 'B'
5482             AND check_level = 'CONTACT'
5483             AND EXISTS (SELECT null
5484                           FROM csc_prof_blocks_b b
5485                          WHERE a.select_block_id = b.block_id
5486                            AND b.batch_sql_stmnt IS NULL)
5487             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5488                             AND Nvl(end_date_active, SYSDATE);
5489       ELSIF p_rule_only = 'Y' THEN
5490          OPEN v_checks_curvar FOR
5491          SELECT check_id, select_type, select_block_id,
5492                 data_type, format_mask,check_upper_lower_flag,threshold_grade,
5493                 check_level
5494            FROM csc_prof_checks_b
5495           WHERE check_level ='CONTACT'
5496             AND select_type = 'T'
5497             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5498                 AND Nvl(end_date_active, Sysdate);
5499       ELSE
5500          OPEN v_checks_curvar FOR
5501          SELECT check_id, select_type, select_block_id,
5502                 data_type, format_mask,check_upper_lower_flag,threshold_grade,
5503                 check_level
5504            FROM csc_prof_checks_b
5505           WHERE check_level ='CONTACT'
5506             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5507                 AND Nvl(end_date_active, Sysdate);
5508       END IF;
5509    ELSE
5510       IF p_no_batch_sql = 'Y' THEN
5511          OPEN v_checks_curvar FOR
5512          SELECT check_id, select_type, select_block_id,
5513                 data_type, format_mask,check_upper_lower_flag,
5514 	        threshold_grade, check_level
5515            FROM csc_prof_checks_b a
5516           WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
5517                               WHERE group_id = p_group_id)
5518             AND select_type = 'B'
5519             AND check_level = 'CONTACT'
5520             AND EXISTS (SELECT null
5521                           FROM csc_prof_blocks_b b
5522                          WHERE a.select_block_id = b.block_id
5523                            AND b.batch_sql_stmnt IS NULL)
5524             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5525                             AND Nvl(end_date_active, SYSDATE);
5526       ELSIF p_rule_only = 'Y' THEN
5527          OPEN v_checks_curvar FOR
5528           SELECT check_id, select_type, select_block_id,
5529                  data_type, format_mask,check_upper_lower_flag,threshold_grade,
5530                  check_level
5531             FROM csc_prof_checks_b
5532            WHERE check_level = 'CONTACT'
5533              AND select_type = 'T'
5534              AND check_id in (select check_id from csc_prof_group_checks
5535                                where group_id = p_group_id)
5536              And Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5537 	     AND Nvl(end_date_active, Sysdate);
5538       ELSE
5539          OPEN v_checks_curvar FOR
5540           SELECT check_id, select_type, select_block_id,
5541                  data_type, format_mask,check_upper_lower_flag,threshold_grade,
5542                  check_level
5543             FROM csc_prof_checks_b
5544            WHERE check_level = 'CONTACT'
5545              AND check_id in (select check_id from csc_prof_group_checks
5546                                where group_id = p_group_id)
5547              And Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5548 	     AND Nvl(end_date_active, Sysdate);
5549       END IF;
5550    END IF;
5551    LOOP
5552        FETCH v_checks_curvar INTO v_rec_var;
5553         sel_type := v_rec_var.select_type;
5554         chk_id := v_rec_var.check_id;
5555         sel_blk_id := v_rec_var.select_block_id;
5556         v_check_level:= v_rec_var.check_level;
5557         data_type:=v_rec_var.data_type;
5558         fmt_mask:=v_rec_var.format_mask;
5559         chk_u_l_flag:= v_rec_var.check_upper_lower_flag;
5560         thd_grade := v_rec_var.threshold_grade;
5561 
5562        EXIT WHEN v_checks_curvar%notfound;
5563        IF (sel_type = 'T') THEN
5564    	   build_rule('N',chk_id,v_check_level, rule);
5565        ELSIF (sel_type = 'B') THEN
5566 	      Open block_csr;
5567 	      Fetch block_csr INTO blk_id, sql_stmt, curr_code;
5568 	      Close block_csr;
5569 
5570 	     IF sql_stmt IS NOT NULL Then
5571 	       v_party_in_sql := INSTR(lower(sql_stmt),':party_id',1);
5572 	     Else
5573 	       v_party_in_sql := 0;
5574 	     End if;
5575 	   END IF;
5576 
5577       BEGIN
5578         IF ((sel_type='B' ) OR  (sel_type='T') ) THEN
5579            cid := dbms_sql.open_cursor;
5580 	        IF (sel_type = 'B') THEN
5581 	   	    dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
5582 	        ELSIF (sel_type = 'T') then
5583            	 dbms_sql.parse(cid, rule, dbms_sql.native);
5584 	        END IF;
5585 	        dbms_sql.define_column(cid,1,val,240);
5586 
5587     	    OPEN crelparty_csr;
5588 	       LOOP
5589 	        FETCH crelparty_csr INTO cparty_id;
5590 	        EXIT WHEN crelparty_csr%notfound;
5591                 Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
5592 		      sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
5593 		      curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
5594 	       END LOOP;
5595 	       CLOSE crelparty_csr;
5596  	      IF (dbms_sql.is_open(cid)) THEN
5597 	          dbms_sql.close_cursor(cid);
5598 	      END IF;
5599         END IF;
5600       Exception
5601         When others then
5602           IF (dbms_sql.is_open(cid)) THEN
5603               dbms_sql.close_cursor(cid);
5604           end if;
5605           set_context('Evaluate_Checks_Rel',
5606                 'chk_id=>'||to_char(chk_id),
5607                 'party_id=>'||to_char(cparty_id),
5608                 'account_id=>'||NULL);
5609           g_error := sqlcode || ' ' || sqlerrm;
5610           set_context(NULL, g_error);
5611     End;
5612 
5613    END LOOP;
5614    CLOSE v_checks_curvar;
5615 
5616 
5617    -- check if there are still records to be inserted
5618    IF l_ip_total <> 0 THEN
5619 	l_for_insert := 'Y';
5620 	l_for_party  := 'Y';
5621 	Insert_Update_Check_Results
5622 		(l_ip_total, l_for_insert, l_for_party);
5623 	l_ip_total :=0;
5624    END IF;
5625    -- check if there are still records to be updated
5626    IF l_up_total <> 0 THEN
5627 	l_for_insert := 'N';
5628 	l_for_party  := 'Y';
5629 	Insert_Update_Check_Results
5630 		(l_up_total, l_for_insert, l_for_party);
5631 	l_up_total :=0;
5632    END IF;
5633 
5634    COMMIT;
5635 
5636    -- Return 0 for successful completion, 1 for warnings, 2 for error
5637    IF (error_flag) THEN
5638       errbuf := Sqlerrm;
5639       retcode := 2;
5640    ELSIF (warning_msg <> '') THEN
5641       errbuf := warning_msg;
5642       retcode := 1;
5643    ELSE
5644       errbuf := '';
5645       retcode := 0;
5646    END IF;
5647 
5648    IF (debug) THEN
5649       fnd_file.close;
5650    END IF;
5651 
5652    EXCEPTION
5653       WHEN OTHERS THEN
5654          ROLLBACK;
5655          IF (v_checks_curvar%isopen) THEN
5656 	    CLOSE v_checks_curvar;
5657 	 END IF;
5658 	 IF (crelparty_csr%isopen) THEN
5659 	    CLOSE crelparty_csr;
5660 	 END IF;
5661 
5662 	 IF (debug) THEN
5663 	    fnd_file.close;
5664 	 END IF;
5665          errbuf := Sqlerrm;
5666          retcode := 2;
5667 
5668 	 g_error := sqlcode || ' ' || sqlerrm;
5669 	 fnd_file.put_line(fnd_file.log , g_error);
5670 
5671 END Evaluate_Checks_Rel;
5672 
5673 /* R12 Employee HelpDesk Modifications */
5674 
5675 PROCEDURE Evaluate_Blocks_Emp
5676 (
5677     p_up_total      IN OUT NOCOPY NUMBER ,
5678     p_ip_total      IN OUT NOCOPY NUMBER ,
5679     p_ua_total      IN OUT NOCOPY NUMBER ,
5680     p_ia_total      IN OUT NOCOPY NUMBER ,
5681     p_group_id      IN NUMBER DEFAULT NULL,
5682     p_no_batch_sql  IN VARCHAR2 DEFAULT NULL,
5683     p_rule_only     IN VARCHAR2 DEFAULT NULL
5684 ) IS
5685 
5686 
5687   truncate_flag		Varchar2(1):= 'N';
5688 
5689   l_for_insert		varchar2(1) := 'Y';
5690   l_for_party		varchar2(1) := 'Y';
5691 
5692   v_employee_in_sql	Number := 0;
5693 
5694 
5695   v_party_id            Number;
5696   v_block_id            Number;
5697 
5698   v_block_curvar  blocks_curtype;
5699   v_rec_var  r_blk_rectype;
5700 
5701    CURSOR employee_csr IS
5702       SELECT person_id
5703       FROM per_workforce_current_x;
5704 
5705 
5706     cid 	number;
5707     val		VARCHAR2(240) := null;
5708 
5709 BEGIN
5710    BEGIN
5711   IF p_group_id IS NULL THEN
5712       IF p_no_batch_sql = 'Y' THEN
5713          OPEN v_block_curvar FOR
5714          SELECT block_id, sql_stmnt, currency_code
5715            FROM csc_prof_blocks_b a
5716           WHERE EXISTS ( SELECT null
5717                            FROM csc_prof_checks_b b
5718                           WHERE b.select_block_id = a.block_id
5719                             AND b.select_type = 'B'
5720                             AND check_id IN (SELECT check_id FROM csc_prof_group_checks))
5721 			   AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5722                             AND Nvl(end_date_active, SYSDATE)
5723 		            AND batch_sql_stmnt IS NULL
5724                             AND block_level = 'EMPLOYEE';
5725       ELSIF p_rule_only = 'Y' THEN
5726          OPEN v_block_curvar FOR
5727          SELECT block_id, sql_stmnt, currency_code
5728            FROM csc_prof_blocks_b a
5729           WHERE exists ( SELECT b.block_id
5730                            FROM csc_prof_check_rules_b b, csc_prof_checks_b c
5731                           WHERE (b.block_id  = a.block_id
5732                                  or b.expr_to_block_id = a.block_id)
5733                             AND c.select_type = 'T'
5734                             AND b.check_id = c.check_id)
5735                             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5736                             AND Nvl(end_date_active, Sysdate)
5737                             AND block_level ='EMPLOYEE';
5738       ELSE
5739          OPEN v_block_curvar FOR
5740          SELECT block_id, sql_stmnt, currency_code
5741            FROM csc_prof_blocks_b a
5742           WHERE exists ( Select b.block_id
5743                            From csc_prof_check_rules_b b
5744                           where b.block_id  = a.block_id
5745                              or b.expr_to_block_id = a.block_id)
5746                            AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5747                            AND Nvl(end_date_active, Sysdate)
5748                            AND block_level ='EMPLOYEE';
5749       END IF;
5750   ELSE
5751       IF p_no_batch_sql = 'Y' THEN
5752          OPEN v_block_curvar FOR
5753          SELECT block_id, sql_stmnt, currency_code
5754            FROM csc_prof_blocks_b a
5755           WHERE EXISTS ( SELECT null
5756                            FROM csc_prof_checks_b b
5757                           WHERE b.select_block_id = a.block_id
5758                             AND b.select_type = 'B'
5759                             AND check_id IN (SELECT check_id FROM csc_prof_group_checks
5760                                               WHERE group_id = p_group_id))
5761                             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5762                             AND Nvl(end_date_active, SYSDATE)
5763                             AND batch_sql_stmnt IS NULL
5764                             AND block_level = 'EMPLOYEE';
5765       ELSIF p_rule_only = 'Y' THEN
5766          OPEN v_block_curvar FOR
5767          SELECT block_id, sql_stmnt, currency_code
5768          FROM csc_prof_blocks_b a
5769          WHERE EXISTS ( SELECT b.block_id
5770                           FROM csc_prof_check_rules_b b, csc_prof_checks_b c
5771                          WHERE (b.block_id = a.block_id
5772                                 OR b.expr_to_block_id = a.block_id)
5773                            AND c.select_type = 'T'
5774                            AND b.check_id = c.check_id
5775                            AND b.check_id IN (SELECT check_id from csc_prof_group_checks
5776                                              WHERE group_id = p_group_id))
5777                            AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5778                            AND Nvl(end_date_active, Sysdate)
5779                            AND block_level = 'EMPLOYEE';
5780       ELSE
5781          OPEN v_block_curvar FOR
5782          SELECT block_id, sql_stmnt, currency_code
5783            FROM csc_prof_blocks_b a
5784           WHERE EXISTS ( SELECT b.block_id
5785                            FROM csc_prof_check_rules_b b
5786                           WHERE (b.block_id = a.block_id
5787                                  or b.expr_to_block_id = a.block_id)
5788                           AND check_id IN (Select check_id from csc_prof_group_checks
5789                              where group_id = p_group_id))
5790                           AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5791                           AND Nvl(end_date_active, Sysdate)
5792                           AND block_level ='EMPLOYEE';
5793       END IF;
5794 
5795    END IF;
5796 
5797    LOOP
5798       FETCH v_block_curvar INTO v_rec_var;
5799       EXIT WHEN v_block_curvar%notfound;
5800       v_employee_in_sql := INSTR(lower(v_rec_var.sql_stmnt),':employee_id',1);
5801       v_block_id := v_rec_var.block_id;
5802       BEGIN
5803 	      cid := dbms_sql.open_cursor;
5804 	      dbms_sql.parse(cid, v_rec_var.sql_stmnt, dbms_sql.native);
5805 	      dbms_sql.define_column(cid, 1, val, 240);
5806 
5807 	      OPEN employee_csr;
5808 	      LOOP
5809 		   FETCH employee_csr INTO v_party_id;
5810 		   EXIT WHEN employee_csr%notfound;
5811 
5812 		   Evaluate_One_Block(truncate_flag, v_block_id, v_party_id,
5813 			null, v_rec_var.sql_stmnt, v_rec_var.currency,
5814 	          p_up_total, p_ip_total, p_ua_total, p_ia_total,cid);
5815 	      END LOOP;
5816 	      CLOSE employee_csr;
5817 
5818 	      IF (dbms_sql.is_open(cid)) THEN
5819 	        dbms_sql.close_cursor(cid);
5820 	      END IF;
5821 
5822      EXCEPTION
5823      WHEN others THEN
5824           IF (dbms_sql.is_open(cid)) THEN
5825               dbms_sql.close_cursor(cid);
5826           END IF;
5827 
5828           set_context('Evaluate_Blocks_Emp', v_block_id, v_party_id);
5829           g_error := sqlcode || ' ' || sqlerrm;
5830           set_context(NULL, g_error);
5831      END;
5832 
5833    END LOOP;
5834    CLOSE v_block_curvar;
5835 
5836    -- check if there are still records to be inserted
5837    IF p_ip_total <> 0 THEN
5838 	l_for_insert := 'Y';
5839 	l_for_party  := 'Y';
5840 	Insert_Update_Block_Results
5841 		(p_ip_total, l_for_insert, l_for_party);
5842 	p_ip_total :=0;
5843    END IF;
5844    -- check if there are still records to be updated
5845    IF p_up_total <> 0 THEN
5846 	l_for_insert := 'N';
5847 	l_for_party  := 'Y';
5848 	Insert_Update_Block_Results
5849 		(p_up_total, l_for_insert, l_for_party);
5850 	p_up_total :=0;
5851    END IF;
5852 
5853 
5854    EXCEPTION
5855       WHEN OTHERS THEN
5856        IF (v_block_curvar%isopen) THEN
5857 	     CLOSE v_block_curvar;
5858        END IF;
5859        IF (employee_csr%isopen) THEN
5860 	      CLOSE employee_csr;
5861        END IF;
5862 
5863        set_context('Evaluate_Blocks_Emp', v_block_id, v_party_id);
5864        g_error := sqlcode || ' ' || sqlerrm;
5865        set_context(NULL, g_error);
5866        table_delete;
5867        RAISE;
5868   END;
5869 
5870 END Evaluate_Blocks_Emp;
5871 
5872 PROCEDURE Evaluate_Checks_Emp
5873   ( errbuf	OUT	NOCOPY VARCHAR2,
5874     retcode	OUT	NOCOPY NUMBER,
5875     p_group_id  IN NUMBER   DEFAULT NULL,
5876     p_no_batch_sql  IN VARCHAR2 DEFAULT NULL,
5877     p_rule_only     IN VARCHAR2 DEFAULT NULL ) IS
5878 
5879   chk_id		Number;
5880   chk_name		Varchar2(240);
5881   cparty_id		Number;
5882   sel_type		Varchar2(3);
5883   sel_blk_id		Number;
5884   data_type		Varchar2(90);
5885   fmt_mask		Varchar2(90);
5886   rule			Varchar2(32767);
5887 
5888   chk_u_l_flag          Varchar2(3);
5889   Thd_grade             Varchar2(9);
5890 
5891   truncate_flag		Varchar2(1) := 'N';
5892   acct_flag		Varchar2(1);
5893 
5894   blk_id		Number 		:= null;
5895   blk_name		Varchar2(240)	:= null;
5896   sql_stmt		Varchar2(2000)	:= null;
5897   curr_code		Varchar2(15)	:= null;
5898 
5899 
5900   v_employee_in_sql     Number :=0;
5901 
5902   l_for_insert		varchar2(1) := 'Y';
5903   l_for_party		varchar2(1) := 'Y';
5904   l_up_total		Number := 0;
5905   l_ip_total		Number := 0;
5906   l_ua_total		Number := 0;
5907   l_ia_total		Number := 0;
5908 
5909   v_party_id            Number;
5910   v_check_level         Varchar2(10);
5911 
5912   v_checks_curvar  checks_curtype;
5913   v_rec_var  r_chk_rectype;
5914 
5915   CURSOR block_csr IS
5916       SELECT block_id, sql_stmnt, currency_code
5917       FROM csc_prof_blocks_b a
5918       WHERE a.block_id = sel_blk_id;
5919 
5920    CURSOR employee_csr IS
5921       SELECT person_id
5922       FROM per_workforce_current_x;
5923 
5924 
5925     cid 	number;
5926     val		VARCHAR2(240) := null;
5927 
5928 BEGIN
5929    l_ip_total := 0;
5930    l_up_total := 0;
5931    l_ia_total := 0;
5932    l_ua_total := 0;
5933    IF p_group_id IS NULL THEN
5934       IF p_no_batch_sql = 'Y' THEN
5935          OPEN v_checks_curvar FOR
5936          SELECT check_id, select_type, select_block_id,
5937                 data_type, format_mask, check_upper_lower_flag,
5938                 threshold_grade, check_level
5939            FROM csc_prof_checks_b a
5940            WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks)
5941             AND select_type = 'B'
5942             AND check_level = 'EMPLOYEE'
5943             AND EXISTS (SELECT null
5944                           FROM csc_prof_blocks_b b
5945                          WHERE a.select_block_id = b.block_id
5946                            AND b.batch_sql_stmnt IS NULL)
5947             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5948                             AND Nvl(end_date_active, SYSDATE);
5949       ELSIF p_rule_only = 'Y' THEN
5950          OPEN v_checks_curvar FOR
5951          SELECT check_id, select_type, select_block_id,
5952                 data_type, format_mask,check_upper_lower_flag,threshold_grade,
5953                 check_level
5954            FROM csc_prof_checks_b
5955           WHERE check_level ='EMPLOYEE'
5956             AND select_type = 'T'
5957             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5958                 AND Nvl(end_date_active, Sysdate);
5959       ELSE
5960          OPEN v_checks_curvar FOR
5961          SELECT check_id, select_type, select_block_id,
5962                 data_type, format_mask,check_upper_lower_flag,threshold_grade,
5963                 check_level
5964            FROM csc_prof_checks_b
5965           WHERE check_level ='EMPLOYEE'
5966             AND Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5967                 AND Nvl(end_date_active, Sysdate);
5968       END IF;
5969    ELSE
5970       IF p_no_batch_sql = 'Y' THEN
5971          OPEN v_checks_curvar FOR
5972          SELECT check_id, select_type, select_block_id,
5973                 data_type, format_mask,check_upper_lower_flag,
5974 	        threshold_grade, check_level
5975            FROM csc_prof_checks_b a
5976           WHERE check_id IN (SELECT check_id FROM csc_prof_group_checks
5977                               WHERE group_id = p_group_id)
5978             AND select_type = 'B'
5979             AND check_level = 'EMPLOYEE'
5980             AND EXISTS (SELECT null
5981                           FROM csc_prof_blocks_b b
5982                          WHERE a.select_block_id = b.block_id
5983                            AND b.batch_sql_stmnt IS NULL)
5984             AND SYSDATE BETWEEN Nvl(start_date_active, SYSDATE)
5985                             AND Nvl(end_date_active, SYSDATE);
5986       ELSIF p_rule_only = 'Y' THEN
5987          OPEN v_checks_curvar FOR
5988           SELECT check_id, select_type, select_block_id,
5989                  data_type, format_mask,check_upper_lower_flag,threshold_grade,
5990                  check_level
5991             FROM csc_prof_checks_b
5992            WHERE check_level = 'EMPLOYEE'
5993              AND select_type = 'T'
5994              AND check_id in (select check_id from csc_prof_group_checks
5995                                where group_id = p_group_id)
5996              And Sysdate BETWEEN Nvl(start_date_active, Sysdate)
5997 	     AND Nvl(end_date_active, Sysdate);
5998       ELSE
5999          OPEN v_checks_curvar FOR
6000           SELECT check_id, select_type, select_block_id,
6001                  data_type, format_mask,check_upper_lower_flag,threshold_grade,
6002                  check_level
6003             FROM csc_prof_checks_b
6004            WHERE check_level = 'EMPLOYEE'
6005              AND check_id in (select check_id from csc_prof_group_checks
6006                                where group_id = p_group_id)
6007              And Sysdate BETWEEN Nvl(start_date_active, Sysdate)
6008 	     AND Nvl(end_date_active, Sysdate);
6009       END IF;
6010    END IF;
6011 
6012    LOOP
6013        FETCH v_checks_curvar INTO v_rec_var;
6014         sel_type := v_rec_var.select_type;
6015         chk_id := v_rec_var.check_id;
6016         sel_blk_id := v_rec_var.select_block_id;
6017         v_check_level:= v_rec_var.check_level;
6018         data_type:=v_rec_var.data_type;
6019         fmt_mask:=v_rec_var.format_mask;
6020         chk_u_l_flag:= v_rec_var.check_upper_lower_flag;
6021         thd_grade := v_rec_var.threshold_grade;
6022 
6023        EXIT WHEN v_checks_curvar%notfound;
6024        IF (sel_type = 'T') THEN
6025    	   build_rule('N',chk_id,v_check_level, rule);
6026        ELSIF (sel_type = 'B') THEN
6027 	      Open block_csr;
6028 	      Fetch block_csr INTO blk_id, sql_stmt, curr_code;
6029 	      Close block_csr;
6030 
6031 	     IF sql_stmt IS NOT NULL Then
6032 	       v_employee_in_sql := INSTR(lower(sql_stmt),':employee_id',1);
6033 	     Else
6034 	       v_employee_in_sql := 0;
6035 	     End if;
6036 	   END IF;
6037 
6038       BEGIN
6039 
6040         IF ((sel_type='B' ) OR  (sel_type='T') ) THEN
6041            cid := dbms_sql.open_cursor;
6042 
6043 
6044 	     IF (sel_type='B') THEN
6045 
6046                 dbms_sql.parse(cid, sql_stmt, dbms_sql.native);
6047 	      ELSIF (sel_type = 'T') THEN
6048 	         dbms_sql.parse(cid, rule, dbms_sql.native);
6049              END IF;
6050 
6051     	        dbms_sql.define_column(cid,1,val,240);
6052     	    OPEN employee_csr;
6053 
6054 	       LOOP
6055 	        FETCH employee_csr INTO cparty_id;
6056 	        EXIT WHEN employee_csr%notfound;
6057                 Evaluate_One_Check(truncate_flag, chk_id, cparty_id, null,v_check_level,
6058 		      sel_type, sel_blk_id,data_type, fmt_mask,chk_u_l_flag,Thd_grade, rule, blk_id, sql_stmt,
6059 		      curr_code, l_up_total, l_ip_total, l_ua_total, l_ia_total ,cid);
6060 	       END LOOP;
6061 	       CLOSE employee_csr;
6062  	      IF (dbms_sql.is_open(cid)) THEN
6063 	          dbms_sql.close_cursor(cid);
6064 	      END IF;
6065         END IF;
6066 
6067 
6068           IF (dbms_sql.is_open(cid)) THEN
6069               dbms_sql.close_cursor(cid);
6070           end if;
6071 
6072     End;
6073 
6074    END LOOP;
6075    CLOSE v_checks_curvar;
6076 
6077 
6078 
6079    -- check if there are still records to be inserted
6080    IF l_ip_total <> 0 THEN
6081 	l_for_insert := 'Y';
6082 	l_for_party  := 'Y';
6083 	Insert_Update_Check_Results
6084 		(l_ip_total, l_for_insert, l_for_party);
6085 	l_ip_total :=0;
6086    END IF;
6087    -- check if there are still records to be updated
6088    IF l_up_total <> 0 THEN
6089 	l_for_insert := 'N';
6090 	l_for_party  := 'Y';
6091 	Insert_Update_Check_Results
6092 		(l_up_total, l_for_insert, l_for_party);
6093 	l_up_total :=0;
6094    END IF;
6095 
6096    COMMIT;
6097 
6098    -- Return 0 for successful completion, 1 for warnings, 2 for error
6099    IF (error_flag) THEN
6100       errbuf := Sqlerrm;
6101       retcode := 2;
6102    ELSIF (warning_msg <> '') THEN
6103       errbuf := warning_msg;
6104       retcode := 1;
6105    ELSE
6106       errbuf := '';
6107       retcode := 0;
6108    END IF;
6109 
6110    IF (debug) THEN
6111       fnd_file.close;
6112    END IF;
6113 
6114    EXCEPTION
6115       WHEN OTHERS THEN
6116          ROLLBACK;
6117          IF (v_checks_curvar%isopen) THEN
6118 	    CLOSE v_checks_curvar;
6119 	 END IF;
6120 	 IF (employee_csr%isopen) THEN
6121 	    CLOSE employee_csr;
6122 	 END IF;
6123 
6124 	 IF (debug) THEN
6125 	    fnd_file.close;
6126 	 END IF;
6127          errbuf := Sqlerrm;
6128          retcode := 2;
6129 
6130 	 g_error := sqlcode || ' ' || sqlerrm;
6131 	 fnd_file.put_line(fnd_file.log , g_error);
6132 
6133 END Evaluate_Checks_Emp;
6134 
6135 /* End of R12 Employee HelpDesk Modifications */
6136 --
6137 -- Evaluate_One_Block
6138 --   Execute dynamic SQL to evaluate the given building block and store the
6139 --   result in the CSC_PROF_BLOCK_RESULTS table.
6140 -- IN
6141 --   blk_id 	- profile check building block identifier
6142 --   party_id 	- customer identifier for which building block is evaluated
6143 --   acct_id 	- account id
6144 --   sql_stmt 	- sql statement to execute dynamically
6145 --   P_CID 	- Cursor passed from calling routine to avoid re-parsing the same sql statement
6146 --
6147 PROCEDURE Evaluate_One_Block
6148   ( p_truncate_flag	IN VARCHAR2,
6149     p_blk_id		IN NUMBER,
6150     p_party_id		IN NUMBER,
6151     p_acct_id		IN NUMBER,
6152     p_sql_stmt		IN VARCHAR2,
6153     p_curr_code		IN VARCHAR2,
6154     p_up_total      IN OUT NOCOPY NUMBER ,
6155     p_ip_total      IN OUT NOCOPY NUMBER ,
6156     p_ua_total      IN OUT NOCOPY NUMBER ,
6157     p_ia_total      IN OUT NOCOPY NUMBER ,
6158     p_cid	    IN	NUMBER) IS
6159 
6160      cid		NUMBER;
6161      val		VARCHAR2(80);
6162      curr_code		VARCHAR2(15);
6163      dummy		NUMBER;
6164 
6165      l_for_insert	varchar2(1) := 'Y';
6166      l_for_party	varchar2(1) := 'Y';
6167 
6168      v_party_count	Number := 0;
6169      v_account_count	Number := 0;
6170 
6171      v_party_in_sql	Number := 0;
6172      v_acct_in_sql	Number := 0;
6173      v_emp_in_sql Number := 0;
6174 /*
6175      -- for party level
6176      Cursor party_block_crs IS
6177 	Select count(*)
6178 	From csc_prof_block_results
6179 	Where block_id 	= p_blk_id
6180 	And party_id 	= p_party_id
6181 	And cust_account_id IS NULL;
6182 
6183      -- for account level
6184      Cursor account_block_crs IS
6185 	Select count(*)
6186 	From csc_prof_block_results
6187 	Where block_id 	= p_blk_id
6188 	And party_id 	= p_party_id
6189 	And cust_account_id = p_acct_id;
6190 */
6191 
6192 BEGIN
6193 
6194 
6195       Begin
6196 
6197         -- dbms_output.put_line('Inside evaluate_one_block .p_cid.'||to_char(p_cid));
6198 
6199 	 -- P_CID is the Cursor to avoid reparsing the sql stmt
6200 	 -- P_CID would not be null when engine runs for more than 1 party (e.g. evaluate_checks1)
6201 	 -- P_CID would be null when engine is being run for 1 party (e.g. evaluate_checks2)
6202 
6203 	 if p_cid is null then
6204 	  	cid := dbms_sql.open_cursor;
6205 	        dbms_sql.parse(cid, p_sql_stmt, dbms_sql.native);
6206 	        dbms_sql.define_column(cid, 1, val, 240);
6207 	 else
6208 	  	cid := p_cid;
6209 	 end if;
6210 
6211           -- Added for 1850508
6212           -- if p_old_block_id!=p_blk_id OR p_old_block_id is null then
6213                 -- p_old_block_id:=p_blk_id;
6214           -- End If;
6215 
6216  	  -- Check for existence of variables before binding
6217 
6218         -- for Bug 1935015 changed instr(sql_stmt..) to INSTR(lower(sql_stmt)..)
6219           IF p_sql_stmt IS NOT NULL Then
6220               v_party_in_sql := INSTR(lower(p_sql_stmt),':party_id',1);
6221               v_acct_in_sql  := INSTR(lower(p_sql_stmt),':cust_account_id',1);
6222 	      v_emp_in_sql  := INSTR(lower(p_sql_stmt),':employee_id',1);
6223           Else
6224               v_party_in_sql := 0;
6225               v_acct_in_sql  := 0;
6226 	      v_emp_in_sql   := 0;
6227           End if;
6228 
6229          -- For Bug 1935015 commented this if statement and created 2 variables
6230          -- v_party_in_sql and v_acct_in_sql and used them in the if stmt.
6231 
6232 	  --if INSTR(lower(p_sql_stmt),':party_id',1)  > 0 then
6233           if v_party_in_sql  > 0 then
6234 		 dbms_sql.bind_variable(cid, ':party_id', p_party_id);
6235 	  end if;
6236 
6237 	  --if INSTR(lower(p_sql_stmt),':cust_account_id',1)  > 0 then
6238           if v_acct_in_sql  > 0 then
6239 		 dbms_sql.bind_variable(cid, ':cust_account_id', p_acct_id);
6240 	  end if;
6241 
6242 	  if v_emp_in_sql  > 0 then
6243 		 dbms_sql.bind_variable(cid, ':employee_id', p_party_id);
6244 	  end if;
6245 
6246 
6247 	  /***********************
6248 	  dbms_sql.bind_variable(cid, ':party_id', p_party_id);
6249 	  dbms_sql.bind_variable(cid, ':cust_account_id', p_acct_id);
6250 	  ***************/
6251 
6252 	  dummy := dbms_sql.execute_and_fetch(cid);
6253 
6254 	  dbms_sql.column_value(cid, 1, val);
6255 	  if p_cid is null then
6256 	  	dbms_sql.close_cursor(cid);
6257 	  end if;
6258 
6259       Exception
6260 	When Others Then
6261 		-- dbms_output.put_line('Exception Others in Blocks...');
6262 	     if p_cid is null then
6263 		IF (dbms_sql.is_open(cid)) THEN
6264 		     dbms_sql.close_cursor(cid);
6265 		end if;
6266 	     end if;
6267 	     val := 0;
6268       End;
6269 
6270       IF p_acct_id IS NULL THEN
6271 	 IF p_truncate_flag = 'N' THEN
6272            begin
6273               select 1 into v_party_count from csc_prof_block_results
6274               where block_id = p_blk_id
6275               and party_id = p_party_id
6276               and cust_account_id is null;
6277            exception
6278               when no_data_found then
6279                  v_party_count := 0;
6280               when others then
6281                 v_party_count := null;
6282             end;
6283   /*
6284 	    OPEN party_block_crs;
6285 	    FETCH party_block_crs INTO v_party_count;
6286 	    IF party_block_crs%notfound THEN
6287 	       v_party_count := 0;
6288 	    END IF;
6289 	    CLOSE party_block_crs;
6290    */
6291 	 ELSE
6292 	   v_party_count := 0;
6293 	 END IF;
6294 
6295 	 IF v_party_count = 0 THEN
6296 	    p_ip_total := p_ip_total + 1;
6297 
6298 	    -- assign values to insert party
6299 	    ip_block_id(p_ip_total) := p_blk_id;
6300 	    ip_party_id(p_ip_total) := p_party_id;
6301 	    ip_account_id(p_ip_total) := NULL;
6302 	    ip_value(p_ip_total) := val;
6303 	    ip_currency(p_ip_total) := p_curr_code;
6304 
6305 	    IF p_ip_total = 1000 THEN
6306 		l_for_insert := 'Y';
6307 		l_for_party  := 'Y';
6308 		Insert_Update_Block_Results
6309 			(p_ip_total, l_for_insert, l_for_party);
6310 		p_ip_total :=0;
6311 	    END IF;
6312 
6313 	 ELSIF v_party_count = 1 THEN
6314 	    p_up_total := p_up_total + 1;
6315 
6316 	    -- assign values to update party tables
6317 	    up_block_id(p_up_total) := p_blk_id;
6318 	    up_party_id(p_up_total) := p_party_id;
6319 	    up_account_id(p_up_total) := NULL;
6320 	    up_value(p_up_total) := val;
6321 	    up_currency(p_up_total) := p_curr_code;
6322 
6323 	    IF p_up_total = 1000 THEN
6324 		l_for_insert := 'N';
6325 		l_for_party  := 'Y';
6326 		Insert_Update_Block_Results
6327 			(p_up_total, l_for_insert, l_for_party);
6328 		p_up_total := 0;
6329 	    END IF;
6330 
6331 	 END IF;
6332 
6333       ELSE
6334 	 IF p_truncate_flag = 'N' THEN
6335             begin
6336               select 1 into v_account_count from csc_prof_block_results
6337               where block_id = p_blk_id
6338               and party_id = p_party_id
6339               and cust_account_id = p_acct_id;
6340             exception when no_data_found then
6341                 v_account_count := 0;
6342             when others then
6343                 v_account_count := null;
6344             end;
6345 
6346 /*	    OPEN account_block_crs;
6347 	    FETCH account_block_crs INTO v_account_count;
6348 	    IF account_block_crs%notfound THEN
6349 	       v_account_count := 0;
6350 	    END IF;
6351 	    CLOSE account_block_crs;
6352  */
6353 	 ELSE
6354 	   v_account_count := 0;
6355 	 END IF;
6356 
6357 	 IF v_account_count = 0 THEN
6358 	    p_ia_total := p_ia_total + 1;
6359 
6360 	    -- assign values to insert
6361 	    ia_block_id(p_ia_total) := p_blk_id;
6362 	    ia_party_id(p_ia_total) := p_party_id;
6363 	    ia_account_id(p_ia_total) := p_acct_id;
6364 	    ia_value(p_ia_total) := val;
6365 	    ia_currency(p_ia_total) := p_curr_code;
6366 
6367 	    IF p_ia_total = 1000 THEN
6368 		l_for_insert := 'Y';
6369 		l_for_party  := 'N';
6370 		Insert_Update_Block_Results
6371 			(p_ia_total, l_for_insert, l_for_party);
6372 		p_ia_total := 0;
6373 	    END IF;
6374 
6375 	 ELSIF v_account_count = 1 THEN
6376 	    p_ua_total := p_ua_total + 1;
6377 
6378 	    -- assign values to update party tables
6379 	    ua_block_id(p_ua_total) := p_blk_id;
6380 	    ua_party_id(p_ua_total) := p_party_id;
6381 	    ua_account_id(p_ua_total) := p_acct_id;
6382 	    ua_value(p_ua_total) := val;
6383 	    ua_currency(p_ua_total) := p_curr_code;
6384 
6385 	    IF p_ua_total = 1000 THEN
6386 		l_for_insert := 'N';
6387 		l_for_party  := 'N';
6388 		Insert_Update_Block_Results
6389 			(p_ua_total, l_for_insert, l_for_party);
6390 		p_ua_total := 0;
6391 	    END IF;
6392 
6393 	 END IF;
6394       END IF;
6395 
6396 
6397       EXCEPTION
6398         -- If an exception is raised, close cursor before exiting
6399         WHEN OTHERS THEN
6400 		-- dbms_output.put_line('Exception Others in Blocks...');
6401 	   if p_cid is null then
6402 		   IF (dbms_sql.is_open(cid)) THEN
6403 			dbms_sql.close_cursor(cid);
6404 		   END IF;
6405 	   end if;
6406 	   set_context('Evaluate_One_Block',
6407 			  'blk_id=>'||to_char(p_blk_id),
6408 			  'party_id=>'||to_char(p_party_id),
6409 			  'account_id=>'||to_char(p_acct_id));
6410            g_error := sqlcode || ' ' || sqlerrm;
6411            set_context(NULL, g_error);
6412 
6413 
6414 END Evaluate_One_Block;
6415 
6416 
6417 --
6418 -- Insert or Update Records into Csc_Prof_Block_Results Table
6419 -- IN
6420 --    p_count	   - the number of records to be inserted or updated
6421 --    p_for_party  - flag to check if the insert or update is for party or account
6422 --    p_for_insert - flag to check if for insert or update.
6423 --
6424 PROCEDURE Insert_Update_Block_Results
6425 	( p_count	IN Number,
6426 	  p_for_insert	IN Varchar2,
6427 	  p_for_party	IN Varchar2) IS
6428 
6429 TABLESEGMENT_FULL                EXCEPTION;
6430 INDEXSEGMENT_FULL                EXCEPTION;
6431 SNAPSHOT_TOO_OLD						EXCEPTION;
6432 
6433 PRAGMA EXCEPTION_INIT(TABLESEGMENT_FULL, -1653);
6434 PRAGMA EXCEPTION_INIT(INDEXSEGMENT_FULL, -1654);
6435 PRAGMA EXCEPTION_INIT(SNAPSHOT_TOO_OLD, -1555);
6436 
6437 Begin
6438    -- Default user and login IDs
6439    --user_id  := fnd_global.user_id;
6440    --login_id := fnd_global.login_id;
6441 
6442    IF p_for_party = 'Y' THEN
6443 	-- PARTY level insert or update of records
6444 	IF p_for_insert = 'Y' THEN
6445 	   -- Insert Records into Csc_Prof_Block_Results Table
6446 	   FORALL i IN 1..p_count
6447 		INSERT INTO Csc_Prof_Block_Results
6448 		  ( block_results_id
6449 		    , block_id
6450 		    , party_id
6451 		    , cust_account_id
6452 		    , value
6453 		    , currency_code
6454 		    , created_by
6455 		    , creation_date
6456 		    , last_updated_by
6457 		    , last_update_date
6458 		    , last_update_login)
6459 		  VALUES
6460 		   (csc_prof_block_results_s.nextval
6461 		    , ip_block_id(i)
6462 		    , ip_party_id(i)
6463 		    , ip_account_id(i)
6464 		    , ip_value(i)
6465 		    , ip_currency(i)
6466 		    , FND_GLOBAL.USER_ID
6467 		    , Sysdate
6468 		    , FND_GLOBAL.USER_ID
6469 		    , Sysdate
6470 		    , FND_GLOBAL.CONC_LOGIN_ID );
6471 
6472 		ip_block_id.DELETE;
6473 		ip_party_id.DELETE;
6474 		ip_account_id.DELETE;
6475 		ip_value.DELETE;
6476 		ip_currency.DELETE;
6477 	ELSE
6478 	    FORALL i IN 1..p_count
6479 		UPDATE Csc_Prof_Block_Results
6480 		Set value = up_value(i)
6481 		   , currency_code = up_currency(i)
6482 		   , last_updated_by = FND_GLOBAL.USER_ID
6483 		   , last_update_date = sysdate
6484 		   , last_update_login = FND_GLOBAL.CONC_LOGIN_ID
6485 		Where block_id = up_block_id(i)
6486 		And party_id = up_party_id(i);
6487 
6488 		up_block_id.DELETE;
6489 		up_party_id.DELETE;
6490 		up_account_id.DELETE;
6491 		up_value.DELETE;
6492 		up_currency.DELETE;
6493 	END IF;
6494    ELSE
6495 	-- ACCOUNT level insert or update of records
6496 	IF p_for_insert = 'Y' THEN
6497 	   -- Insert Records into Csc_Prof_Block_Results Table
6498 	   FORALL i IN 1..p_count
6499 		INSERT INTO Csc_Prof_Block_Results
6500 		  ( block_results_id
6501 		    , block_id
6502 		    , party_id
6503 		    , cust_account_id
6504 		    , value
6505 		    , currency_code
6506 		    , created_by
6507 		    , creation_date
6508 		    , last_updated_by
6509 		    , last_update_date
6510 		    , last_update_login)
6511 		  VALUES
6512 		   (csc_prof_block_results_s.nextval
6513 		    , ia_block_id(i)
6514 		    , ia_party_id(i)
6515 		    , ia_account_id(i)
6516 		    , ia_value(i)
6517 		    , ia_currency(i)
6518 		    , FND_GLOBAL.USER_ID
6519 		    , Sysdate
6520 		    , FND_GLOBAL.USER_ID
6521 		    , Sysdate
6522 		    , FND_GLOBAL.CONC_LOGIN_ID );
6523 
6524 		ia_block_id.DELETE;
6525 		ia_party_id.DELETE;
6526 		ia_account_id.DELETE;
6527 		ia_value.DELETE;
6528 		ia_currency.DELETE;
6529 	ELSE
6530 	    FORALL i IN 1..p_count
6531 		UPDATE Csc_Prof_Block_Results
6532 		Set value = ua_value(i)
6533 		   , currency_code = ua_currency(i)
6534 		   , last_updated_by = FND_GLOBAL.USER_ID
6535 		   , last_update_date = sysdate
6536 		   , last_update_login = FND_GLOBAL.CONC_LOGIN_ID
6537 		Where block_id = ua_block_id(i)
6538 		And party_id = ua_party_id(i)
6539 		And cust_account_id = ua_account_id(i);
6540 
6541 		ua_block_id.DELETE;
6542 		ua_party_id.DELETE;
6543 		ua_account_id.DELETE;
6544 		ua_value.DELETE;
6545 		ua_currency.DELETE;
6546 	END IF;
6547    END IF;
6548 
6549    commit;
6550 
6551 exception
6552        when Indexsegment_full then
6553              g_error := sqlcode || ' ' || sqlerrm;
6554              fnd_file.put_line(fnd_file.log , g_error);
6555              App_Exception.raise_exception;
6556 
6557         when Tablesegment_full then
6558              g_error := sqlcode || ' ' || sqlerrm;
6559              fnd_file.put_line(fnd_file.log , g_error);
6560              App_Exception.raise_exception;
6561 
6562         WHEN SNAPSHOT_TOO_OLD THEN
6563              g_error := sqlcode || ' ' || sqlerrm;
6564              fnd_file.put_line(fnd_file.log,g_error);
6565              App_Exception.raise_exception;
6566 
6567 	when Others then
6568 	    table_delete;
6569 	     g_error := sqlcode || ' ' || sqlerrm;
6570 	     fnd_file.put_line(fnd_file.log , g_error);
6571 
6572 END Insert_Update_Block_Results;
6573 
6574 --
6575 -- Insert or Update Records into Csc_Prof_Check_Results Table
6576 -- IN
6577 --    p_count	   - the number of records to be inserted or updated
6578 --    p_for_party  - flag to check if the insert or update is for party or account
6579 --    p_for_insert - flag to check if for insert or update.
6580 --
6581 PROCEDURE Insert_Update_Check_Results
6582 	( p_count	IN Number,
6583 	  p_for_insert	IN Varchar2,
6584 	  p_for_party	IN Varchar2) IS
6585 
6586 TABLESEGMENT_FULL                EXCEPTION;
6587 INDEXSEGMENT_FULL                  EXCEPTION;
6588 SNAPSHOT_TOO_OLD               EXCEPTION;
6589 
6590 PRAGMA EXCEPTION_INIT(TABLESEGMENT_FULL, -1653);
6591 PRAGMA EXCEPTION_INIT(INDEXSEGMENT_FULL, -1654);
6592 PRAGMA EXCEPTION_INIT(SNAPSHOT_TOO_OLD, -1555);
6593 Begin
6594    -- Default user and login IDs
6595    --user_id  := fnd_global.user_id;
6596    --login_id := fnd_global.login_id;
6597 
6598 
6599    IF p_for_party = 'Y' THEN
6600 	-- PARTY level insert or update of records
6601 	IF p_for_insert = 'Y' THEN
6602 	   -- Insert Records into Csc_Prof_Check_Results Table
6603 
6604 	   FORALL  i IN 1..p_count
6605 		INSERT INTO Csc_Prof_Check_Results
6606 		  ( check_results_id
6607 		    , check_id
6608 		    , party_id
6609 		    , cust_account_id
6610 		    , value
6611                     , results_threshold_flag
6612 		    , currency_code
6613 		    , grade
6614                     , rating_code
6615                     , color_code
6616 		    , created_by
6617 		    , creation_date
6618 		    , last_updated_by
6619 		    , last_update_date
6620 		    , last_update_login)
6621 		  VALUES
6622 		   (csc_prof_check_results_s.nextval
6623 		    , ip_check_id(i)
6624 		    , ip_party_id(i)
6625 		    , ip_account_id(i)
6626 		    , ip_value(i)
6627                     , ip_results(i)
6628 		    , ip_currency(i)
6629 		    , ip_grade(i)
6630                     , ip_rating_code(i)
6631                     , ip_color_code(i)
6632 		    , FND_GLOBAL.USER_ID
6633 		    , Sysdate
6634 		    , FND_GLOBAL.USER_ID
6635 		    , Sysdate
6636 		    , FND_GLOBAL.CONC_LOGIN_ID );
6637 
6638 		ip_check_id.DELETE;
6639 		ip_party_id.DELETE;
6640 		ip_account_id.DELETE;
6641 		ip_value.DELETE;
6642 		ip_currency.DELETE;
6643 		ip_grade.DELETE;
6644                 ip_rating_code.DELETE;
6645                 ip_color_code.DELETE;
6646                 ip_results.DELETE;
6647 
6648 	ELSE
6649 	    FORALL i IN 1..p_count
6650 		UPDATE Csc_Prof_Check_Results
6651 		Set value = up_value(i)
6652                    , results_threshold_flag = up_results(i)
6653 		   , currency_code = up_currency(i)
6654 		   , grade = up_grade(i)
6655                    , rating_code = up_rating_code(i)
6656                    , color_code  = up_color_code(i)
6657 		   , last_updated_by = FND_GLOBAL.USER_ID
6658 		   , last_update_date = sysdate
6659 		   , last_update_login = FND_GLOBAL.CONC_LOGIN_ID
6660 		Where check_id = up_check_id(i)
6661 		And party_id = up_party_id(i)
6662 		And cust_account_id IS NULL;
6663 
6664 		up_check_id.DELETE;
6665 		up_party_id.DELETE;
6666 		up_account_id.DELETE;
6667 		up_value.DELETE;
6668 		up_currency.DELETE;
6669 		up_grade.DELETE;
6670                 up_rating_code.DELETE;
6671                 up_color_code.DELETE;
6672                 up_results.DELETE;
6673 
6674 	END IF;
6675    ELSE
6676 	-- ACCOUNT level insert or update of records
6677 	IF p_for_insert = 'Y' THEN
6678 	   -- Insert Records into Csc_Prof_Check_Results Table
6679 
6680 	   FORALL i IN 1..p_count
6681 		INSERT INTO Csc_Prof_Check_Results
6682 		  ( check_results_id
6683 		    , check_id
6684 		    , party_id
6685 		    , cust_account_id
6686 		    , value
6687                     , results_threshold_flag
6688 		    , currency_code
6689 		    , grade
6690                     , rating_code
6691                     , color_code
6692 		    , created_by
6693 		    , creation_date
6694 		    , last_updated_by
6695 		    , last_update_date
6696 		    , last_update_login)
6697 		  VALUES
6698 		   (csc_prof_check_results_s.nextval
6699 		    , ia_check_id(i)
6700 		    , ia_party_id(i)
6701 		    , ia_account_id(i)
6702 		    , ia_value(i)
6703                     , ia_results(i)
6704 		    , ia_currency(i)
6705 		    , ia_grade(i)
6706                     , ia_rating_code(i)
6707                     , ia_color_code(i)
6708 		    , FND_GLOBAL.USER_ID
6709 		    , Sysdate
6710 		    , FND_GLOBAL.USER_ID
6711 		    , Sysdate
6712 		    , FND_GLOBAL.CONC_LOGIN_ID );
6713 
6714 		ia_check_id.DELETE;
6715 		ia_party_id.DELETE;
6716 		ia_account_id.DELETE;
6717 		ia_value.DELETE;
6718 		ia_currency.DELETE;
6719 		ia_grade.DELETE;
6720                 ia_rating_code.DELETE;
6721                 ia_color_code.DELETE;
6722                 ia_results.DELETE;
6723 
6724 	ELSE
6725 	    FORALL i IN 1..p_count
6726 		UPDATE Csc_Prof_Check_Results
6727 		Set value = ua_value(i)
6728                    , results_threshold_flag = ua_results(i)
6729 		   , currency_code = ua_currency(i)
6730 		   , grade = ua_grade(i)
6731                    , rating_code = ua_rating_code(i)
6732                    , color_code = ua_color_code(i)
6733 		   , last_updated_by = FND_GLOBAL.USER_ID
6734 		   , last_update_date = sysdate
6735 		   , last_update_login = FND_GLOBAL.CONC_LOGIN_ID
6736 		Where check_id = ua_check_id(i)
6737 		And party_id = ua_party_id(i)
6738 		And cust_account_id = ua_account_id(i);
6739 
6740 		ua_check_id.DELETE;
6741 		ua_party_id.DELETE;
6742 		ua_account_id.DELETE;
6743 		ua_value.DELETE;
6744 		ua_currency.DELETE;
6745 		ua_grade.DELETE;
6746                 ua_rating_code.DELETE;
6747                 ua_color_code.DELETE;
6748                 ua_results.DELETE;
6749 	END IF;
6750    END IF;
6751 
6752    commit;
6753 
6754 exception
6755 
6756         when Tablesegment_full then
6757              g_error := sqlcode || ' ' || sqlerrm;
6758              fnd_file.put_line(fnd_file.log , g_error);
6759              App_Exception.raise_exception;
6760 
6761        when Indexsegment_full then
6762              g_error := sqlcode || ' ' || sqlerrm;
6763              fnd_file.put_line(fnd_file.log , g_error);
6764              App_Exception.raise_exception;
6765 
6766         when SNAPSHOT_TOO_OLD THEN
6767              g_error := sqlcode || ' ' || sqlerrm;
6768              fnd_file.put_line(fnd_file.log,g_error);
6769              App_Exception.raise_exception;
6770 	when Others then
6771 	     table_delete;
6772 	     g_error := sqlcode || ' ' || sqlerrm;
6773 	     fnd_file.put_line(fnd_file.log , g_error);
6774 
6775 END Insert_Update_Check_Results;
6776 
6777 
6778 /*******************************************
6779   UPDATE_JIT_STATUS
6780   Added this procedure for JIT enhancement -- Bug 4535407
6781   Updates the columns jit_status, jit_err_code in CCT_MEDIA_ITEMS.
6782   Called from CSC_PROF_JIT
6783 ********************************************/
6784 
6785 PROCEDURE update_jit_status
6786    ( p_status        VARCHAR2 DEFAULT NULL,
6787      p_err_code      NUMBER DEFAULT NULL,
6788      p_media_item_id NUMBER
6789    )
6790 IS
6791    PRAGMA AUTONOMOUS_TRANSACTION;
6792 BEGIN
6793    UPDATE CCT_MEDIA_ITEMS
6794       SET jit_status = p_status,
6795       jit_err_code = p_err_code
6796    WHERE media_item_id = p_media_item_id;
6797    COMMIT;
6798 END update_jit_status;
6799 
6800 
6801 /*******************************************
6802   CSC_PROF_JIT
6803   Added this procedure for JIT enhancement -- Bug 4535407
6804   Called from OTM java code
6805   Calls profile engine for the party_id passed from OTM.
6806   OTM passes the key-value pair in a VARRAY (cct_keyvalue_varr)
6807 ********************************************/
6808 
6809 PROCEDURE csc_prof_jit
6810 ( p_key_value_varr IN  cct_keyvalue_varr,
6811   p_init_msg_list  IN  VARCHAR2 := FND_API.G_FALSE,
6812   p_critical_flag  IN  VARCHAR2 DEFAULT NULL,
6813   x_return_status  OUT NOCOPY VARCHAR2,
6814   x_msg_count      OUT NOCOPY NUMBER,
6815   x_msg_data       OUT NOCOPY VARCHAR2
6816  )
6817 IS
6818    l_media_item_id NUMBER;
6819    l_party_id      NUMBER;
6820    l_hidden_party_id     NUMBER;
6821    l_rel_id        NUMBER;
6822    l_acct_id       NUMBER;
6823    l_resp_id       NUMBER;
6824    l_emp_id        NUMBER;
6825    l_resp_appl_id  NUMBER;
6826    l_party_type    VARCHAR2(30);
6827    l_form_name     VARCHAR2(30) := 'CSCCCCRC';
6828    l_view_by_acct  VARCHAR2(255);
6829    l_view_by       VARCHAR2(255);
6830    l_acct_new_old  VARCHAR2(255);
6831    l_show_active_acct  VARCHAR2(255);
6832    l_status        VARCHAR2(30);
6833    l_group_id      NUMBER;
6834    l_which_ivr     VARCHAR2(30);
6835 
6836    l_media_exists VARCHAR2(1);
6837    l_party_exists VARCHAR2(1);
6838    l_rel_exists   VARCHAR2(1);
6839    l_acct_exists  VARCHAR2(1);
6840    l_resp_exists  VARCHAR2(1);
6841    l_resp_appl_exists VARCHAR2(1);
6842    l_emp_exists   VARCHAR2(1);
6843    l_which_ivr_exists  VARCHAR2(1);
6844    l_contact_type VARCHAR2(30);
6845    l_critical_flag VARCHAR2(1);
6846 
6847    l_party_rec  CSC_UTILS.dashboard_Rec_Type;
6848 
6849    l_api_name       VARCHAR2(30) := 'CSC_PROF_JIT';
6850    l_jit_prg_status VARCHAR2(30) := 'PROGRESS';
6851    l_jit_err_status VARCHAR2(30) := 'ERROR';
6852    l_jit_complete_status VARCHAR2(30) := 'COMPLETED';
6853    l_sql_code       NUMBER;
6854 
6855    CURSOR chk_status IS
6856       SELECT jit_status
6857         FROM CCT_MEDIA_ITEMS
6858        WHERE media_item_id = l_media_item_id;
6859 
6860    CURSOR group_crs IS
6861       SELECT a.dashboard_group_id
6862         FROM csc_prof_module_groups a, csc_prof_groups_b b
6863        WHERE a.dashboard_group_id = b.group_id
6864          AND a.party_type IN (l_party_type, 'ALL')
6865          AND a.form_function_name = l_form_name
6866          AND (((a.responsibility_id = l_resp_id AND a.resp_appl_id = l_resp_appl_id)
6867                 AND a.responsibility_id IS NOT NULL)
6868               OR a.responsibility_id IS NULL)
6869          AND TRUNC(SYSDATE) BETWEEN TRUNC(NVL(b.start_date_active, SYSDATE))
6870          AND TRUNC(NVL(b.end_date_active, SYSDATE))
6871       ORDER BY a.party_type desc, a.responsibility_id;
6872 
6873    CURSOR get_party_type IS
6874       SELECT party_type
6875         FROM hz_parties
6876        WHERE party_id = l_party_id;
6877 
6878    CURSOR get_acct_latest IS
6879       SELECT cust_account_id
6880         FROM hz_cust_accounts
6881        WHERE party_id = l_party_id
6882          AND ((status = 'A' AND l_show_active_acct = 'Y')
6883                OR (l_show_active_acct = 'N'))
6884          AND status NOT IN ('M', 'D')
6885       ORDER BY creation_date DESC;
6886 
6887    CURSOR get_acct_oldest IS
6888       SELECT cust_account_id
6889         FROM hz_cust_accounts
6890        WHERE party_id = l_party_id
6891          AND ((status = 'A' AND l_show_active_acct = 'Y')
6892                OR (l_show_active_acct = 'N'))
6893          AND status NOT IN ('M', 'D')
6894       ORDER BY creation_date;
6895 
6896    CURSOR get_cust_from_cont IS
6897       SELECT obj_party_id, obj_party_type
6898         FROM csc_hz_parties_rel_v
6899        WHERE rel_party_id = l_party_id;
6900 
6901 BEGIN
6902    IF FND_API.to_Boolean( p_init_msg_list ) THEN
6903       FND_MSG_PUB.initialize;
6904    END IF;
6905 
6906    x_return_status := FND_API.G_RET_STS_SUCCESS;
6907 
6908    /* get values from varray parameter p_key_value_varr */
6909    l_media_item_id := CCT_COLLECTION_UTIL_PUB.Get
6910                       ( p_key_value_varr => p_key_value_varr,
6911                         p_key => 'occtMediaItemID',
6912                         x_key_exists => l_media_exists);
6913 
6914    l_party_id := CCT_COLLECTION_UTIL_PUB.Get
6915                       ( p_key_value_varr => p_key_value_varr,
6916                         p_key => 'PARTY_ID',
6917                         x_key_exists => l_party_exists);
6918 
6919    l_rel_id := CCT_COLLECTION_UTIL_PUB.Get
6920                       ( p_key_value_varr => p_key_value_varr,
6921                         p_key => 'REL_PARTY_ID',
6922                         x_key_exists => l_rel_exists);
6923 
6924    l_acct_id := CCT_COLLECTION_UTIL_PUB.Get
6925                       ( p_key_value_varr => p_key_value_varr,
6926                         p_key => 'CUST_ACCOUNT_ID',
6927                         x_key_exists => l_acct_exists);
6928 
6929    l_resp_id := CCT_COLLECTION_UTIL_PUB.Get
6930                       ( p_key_value_varr => p_key_value_varr,
6931                         p_key => 'occtRespID',
6932                         x_key_exists => l_resp_exists);
6933 
6934    l_resp_appl_id := CCT_COLLECTION_UTIL_PUB.Get
6935                       ( p_key_value_varr => p_key_value_varr,
6936                         p_key => 'occtAppID',
6937                         x_key_exists => l_resp_appl_exists);
6938 
6939    l_emp_id := CCT_COLLECTION_UTIL_PUB.Get
6940                       ( p_key_value_varr => p_key_value_varr,
6941                         p_key => 'employeeID',
6942                         x_key_exists => l_emp_exists);
6943 
6944    l_which_ivr := CCT_COLLECTION_UTIL_PUB.Get
6945                       ( p_key_value_varr => p_key_value_varr,
6946                         p_key => 'WhichIVR',
6947                         x_key_exists => l_which_ivr_exists);
6948 
6949 
6950    IF (l_media_item_id IS NULL
6951        OR (l_party_id IS NULL AND l_emp_id is NULL)
6952        OR l_resp_id IS NULL
6953        OR l_resp_appl_id IS NULL) THEN
6954       RETURN;
6955    END IF;
6956 
6957    OPEN chk_status;
6958    FETCH chk_status INTO l_status;
6959 
6960    /* OTM updates jit_status to null before calling this procedure.
6961       IF screenpop happens when the call to this procedure is in queue, then
6962       forms would have populated jit_status column. In such cases return back
6963    */
6964 
6965    IF l_status IS NOT NULL OR chk_status%NOTFOUND THEN
6966       RETURN;
6967    END IF;
6968    CLOSE chk_status;
6969 
6970    update_jit_status
6971      ( p_status => l_jit_prg_status,
6972        p_err_code => NULL,
6973        p_media_item_id => l_media_item_id );
6974 
6975    /* get the value of auto refresh PO if not passed from OTM */
6976    IF p_critical_flag IS NULL THEN
6977       l_critical_flag := FND_PROFILE.value_specific
6978                     ( name => 'CSC_DASHBOARD_AUTO_REFRESH',
6979                       responsibility_id => l_resp_id,
6980                       application_id => l_resp_appl_id,
6981                       user_id => -999
6982                     );
6983    ELSE
6984       l_critical_flag := p_critical_flag;
6985    END IF;
6986 
6987    /* profile option for defaulting view by in CC */
6988    l_view_by := FND_PROFILE.value_specific
6989                     ( name => 'CSC_CC_DEFAULT_VIEW_BY',
6990                       responsibility_id => l_resp_id,
6991                       application_id => l_resp_appl_id,
6992                       user_id => -999
6993                     );
6994    /* Employee HelpDesk Changes
6995    If emp_id is not null
6996      If view_by is Customer - then get hidden customer's id from Profile Option -process for customer
6997      If view_by is Contact - then process for employee
6998     elsif party_id is not null
6999       existing logic
7000     */
7001 IF l_emp_id IS NOT NULL AND l_which_ivr ='Employee' THEN
7002       IF l_view_by = 'CUSTOMER' THEN ---Refresh only for hidden customer
7003 		l_hidden_party_id := FND_PROFILE.value_specific
7004 			     ( name => 'CS_SR_DEFAULT_CUSTOMER_NAME',
7005 			       responsibility_id => l_resp_id,
7006 			       application_id => l_resp_appl_id,
7007                                user_id => -999
7008                               );
7009                   /* Refresh for Customer only if Profile Option CS_SR_DEFAULT_CUSTOMER_NAME returns a value */
7010            IF l_hidden_party_id IS NOT NULL THEN
7011 		  /* profile option for view_by_account in dashboard tab */
7012 	        l_view_by_acct := FND_PROFILE.value_specific
7013 		              ( name => 'CSC_DASHBOARD_TO_QUERY_BY_PARTY_OR_ACCOUNT',
7014 			        responsibility_id => l_resp_id,
7015 				application_id => l_resp_appl_id,
7016 	                        user_id => -999
7017 		               );
7018 
7019 	      /* if view_by_account is yes, check whether account_id is passed.
7020 		 If not passed, then check whether only one account exists for the customer.
7021 	         If yes, use this account.
7022 		 Else get account_id based on profile option CSC_CC_DEFAULT_ACCT */
7023 
7024 		IF l_view_by_acct = 'ACCOUNT' THEN
7025 	         IF l_acct_id IS NULL THEN
7026 		    l_show_active_acct := FND_PROFILE.value_specific
7027                                     ( name => 'CSC_CONTACT_CENTER_SHOW_ACTIVE_ACCOUNTS',
7028                                       responsibility_id => l_resp_id,
7029                                       application_id => l_resp_appl_id,
7030                                       user_id => -999
7031                                     );
7032 	            BEGIN
7033 		       SELECT cust_account_id
7034 			 INTO l_acct_id
7035 	                 FROM hz_cust_accounts
7036 		        WHERE party_id = l_party_id
7037 			  AND ((status = 'A' AND l_show_active_acct = 'Y') OR (l_show_active_acct = 'N'))
7038 	                  AND status NOT IN ('M', 'D');
7039 		    EXCEPTION
7040 	               WHEN OTHERS THEN
7041 		          l_acct_id := NULL;
7042 	            END;
7043 
7044 		    IF l_acct_id IS NULL THEN
7045 	               l_acct_new_old := FND_PROFILE.value_specific
7046                                        ( name => 'CSC_CC_DEFAULT_ACCT',
7047                                          responsibility_id => l_resp_id,
7048                                          application_id => l_resp_appl_id,
7049                                          user_id => -999
7050                                        );
7051 
7052 		       IF l_acct_new_old = 'Y' THEN
7053 			  OPEN get_acct_oldest;
7054 	                  FETCH get_acct_oldest INTO l_acct_id;
7055 		          CLOSE get_acct_oldest;
7056 	               ELSIF l_acct_new_old = 'L' THEN
7057 		          OPEN get_acct_latest;
7058 			  FETCH get_acct_latest INTO l_acct_id;
7059 	                  CLOSE get_acct_latest;
7060 		       END IF;
7061 	            END IF; /* l_acct_id is null -- inner*/
7062 		 END IF; /* l_acct_id is null -- outer */
7063 	        END IF; /* l_view_by_acct = 'Y' */
7064 
7065       /* If user hook for dashboard group is enabled, call user hook to get group_id.
7066          Else use the existing logic from setup form to get group_id */
7067 
7068      IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7069          l_party_rec.Cust_Party_Id  := l_hidden_party_id;
7070          l_party_rec.Cust_Account_Id  := l_acct_id;
7071 
7072          CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7073          l_group_id := l_party_rec.group_id;
7074       ELSE
7075          OPEN group_crs;
7076          FETCH group_crs INTO l_group_id;
7077             IF (group_crs%notfound) THEN
7078                CLOSE group_crs;
7079                l_form_name := 'CSCCCCDB';
7080                OPEN group_crs;
7081                FETCH group_crs into l_group_id;
7082                CLOSE group_Crs;
7083             ELSE
7084                CLOSE group_crs;
7085             END IF;
7086       END IF;
7087 
7088       /* if err_code is -20001, Contact Center will display message that says that no group is attached */
7089       IF l_group_id IS NULL THEN
7090          update_jit_status
7091             ( p_status => l_jit_err_status,
7092               p_err_code => -20001,
7093               p_media_item_id => l_media_item_id );
7094           RETURN;
7095       END IF;
7096 
7097       CSC_PROFILE_ENGINE_PKG.run_engine_jit
7098              ( p_party_id => l_hidden_party_id,
7099                p_acct_id => l_acct_id,
7100                p_group_id => l_group_id,
7101                p_critical_flag => l_critical_flag,
7102 	       p_party_type => 'CUSTOMER');
7103 	    END IF; /* l_hidden_party_id is not null */
7104 
7105       ELSIF l_view_by = 'CONTACT' THEN --Refresh for employee
7106 
7107        IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7108             l_party_rec.Cust_Party_Id  := l_emp_id;
7109             l_party_rec.Cust_Party_Type  := upper(l_which_ivr);
7110 
7111 
7112             CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7113             l_group_id := l_party_rec.group_id;
7114          ELSE
7115 
7116             OPEN group_crs;
7117             FETCH group_crs INTO l_group_id;
7118                IF (group_crs%notfound) THEN
7119                   CLOSE group_crs;
7120                   l_form_name := 'CSCCCCDB';
7121                   OPEN group_crs;
7122                   FETCH group_crs into l_group_id;
7123                   CLOSE group_Crs;
7124                ELSE
7125                   CLOSE group_crs;
7126                END IF;
7127         END IF;
7128 
7129          IF l_group_id IS NULL THEN
7130             update_jit_status
7131             ( p_status => l_jit_err_status,
7132               p_err_code => -20001,
7133               p_media_item_id => l_media_item_id );
7134              RETURN;
7135          END IF;
7136 
7137 	 CSC_PROFILE_ENGINE_PKG.run_engine_jit
7138              ( p_party_id => l_emp_id,
7139                p_acct_id => NULL,
7140                p_group_id => l_group_id,
7141                p_critical_flag => l_critical_flag,
7142                p_party_type => 'EMPLOYEE');
7143 
7144       END IF; /* l_view_by for HelpDesk Context */
7145 
7146 ELSIF l_emp_id IS NOT NULL AND l_which_ivr ='SR' THEN
7147        l_contact_type := FND_PROFILE.value_specific
7148 		              ( name => 'CSC_CC_DEFAULT_CONTACT_TYPE',
7149 			        responsibility_id => l_resp_id,
7150 				application_id => l_resp_appl_id,
7151 	                        user_id => -999
7152 		               );
7153 
7154           IF l_view_by = 'CUSTOMER' THEN
7155              --refresh dashboard for customer using l_party_id
7156 	    IF l_party_id IS NOT NULL THEN
7157 		  /* profile option for view_by_account in dashboard tab */
7158 	        l_view_by_acct := FND_PROFILE.value_specific
7159 		              ( name => 'CSC_DASHBOARD_TO_QUERY_BY_PARTY_OR_ACCOUNT',
7160 			        responsibility_id => l_resp_id,
7161 				application_id => l_resp_appl_id,
7162 	                        user_id => -999
7163 		               );
7164 
7165 	      /* if view_by_account is yes, check whether account_id is passed.
7166 		 If not passed, then check whether only one account exists for the customer.
7167 	         If yes, use this account.
7168 		 Else get account_id based on profile option CSC_CC_DEFAULT_ACCT */
7169 
7170 		IF l_view_by_acct = 'ACCOUNT' THEN
7171 	         IF l_acct_id IS NULL THEN
7172 		    l_show_active_acct := FND_PROFILE.value_specific
7173                                     ( name => 'CSC_CONTACT_CENTER_SHOW_ACTIVE_ACCOUNTS',
7174                                       responsibility_id => l_resp_id,
7175                                       application_id => l_resp_appl_id,
7176                                       user_id => -999
7177                                     );
7178 	            BEGIN
7179 		       SELECT cust_account_id
7180 			 INTO l_acct_id
7181 	                 FROM hz_cust_accounts
7182 		        WHERE party_id = l_party_id
7183 			  AND ((status = 'A' AND l_show_active_acct = 'Y') OR (l_show_active_acct = 'N'))
7184 	                  AND status NOT IN ('M', 'D');
7185 		    EXCEPTION
7186 	               WHEN OTHERS THEN
7187 		          l_acct_id := NULL;
7188 	            END;
7189 
7190 		    IF l_acct_id IS NULL THEN
7191 	               l_acct_new_old := FND_PROFILE.value_specific
7192                                        ( name => 'CSC_CC_DEFAULT_ACCT',
7193                                          responsibility_id => l_resp_id,
7194                                          application_id => l_resp_appl_id,
7195                                          user_id => -999
7196                                        );
7197 
7198 		       IF l_acct_new_old = 'Y' THEN
7199 			  OPEN get_acct_oldest;
7200 	                  FETCH get_acct_oldest INTO l_acct_id;
7201 		          CLOSE get_acct_oldest;
7202 	               ELSIF l_acct_new_old = 'L' THEN
7203 		          OPEN get_acct_latest;
7204 			  FETCH get_acct_latest INTO l_acct_id;
7205 	                  CLOSE get_acct_latest;
7206 		       END IF;
7207 	            END IF; /* l_acct_id is null -- inner*/
7208 		 END IF; /* l_acct_id is null -- outer */
7209 	        END IF; /* l_view_by_acct = 'Y' */
7210 
7211       /* If user hook for dashboard group is enabled, call user hook to get group_id.
7212          Else use the existing logic from setup form to get group_id */
7213 
7214      IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7215          l_party_rec.Cust_Party_Id  := l_hidden_party_id;
7216          l_party_rec.Cust_Account_Id  := l_acct_id;
7217 
7218          CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7219          l_group_id := l_party_rec.group_id;
7220       ELSE
7221          OPEN group_crs;
7222          FETCH group_crs INTO l_group_id;
7223             IF (group_crs%notfound) THEN
7224                CLOSE group_crs;
7225                l_form_name := 'CSCCCCDB';
7226                OPEN group_crs;
7227                FETCH group_crs into l_group_id;
7228                CLOSE group_Crs;
7229             ELSE
7230                CLOSE group_crs;
7231             END IF;
7232       END IF;
7233 
7234       /* if err_code is -20001, Contact Center will display message that says that no group is attached */
7235       IF l_group_id IS NULL THEN
7236          update_jit_status
7237             ( p_status => l_jit_err_status,
7238               p_err_code => -20001,
7239               p_media_item_id => l_media_item_id );
7240           RETURN;
7241       END IF;
7242 
7243       CSC_PROFILE_ENGINE_PKG.run_engine_jit
7244              ( p_party_id => l_party_id,
7245                p_acct_id => l_acct_id,
7246                p_group_id => l_group_id,
7247                p_critical_flag => l_critical_flag,
7248 	       p_party_type => 'CUSTOMER');
7249     END IF; /* l_party_id is not null */
7250 
7251     ELSIF l_view_by = 'CONTACT' and l_contact_type ='EMPLOYEE' THEN
7252 
7253        IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7254             l_party_rec.Cust_Party_Id  := l_emp_id;
7255             l_party_rec.Cust_Party_Type  := 'EMPLOYEE';
7256 
7257 
7258             CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7259             l_group_id := l_party_rec.group_id;
7260          ELSE
7261 
7262             OPEN group_crs;
7263             FETCH group_crs INTO l_group_id;
7264                IF (group_crs%notfound) THEN
7265                   CLOSE group_crs;
7266                   l_form_name := 'CSCCCCDB';
7267                   OPEN group_crs;
7268                   FETCH group_crs into l_group_id;
7269                   CLOSE group_Crs;
7270                ELSE
7271                   CLOSE group_crs;
7272                END IF;
7273         END IF;
7274 
7275          IF l_group_id IS NULL THEN
7276             update_jit_status
7277             ( p_status => l_jit_err_status,
7278               p_err_code => -20001,
7279               p_media_item_id => l_media_item_id );
7280              RETURN;
7281          END IF;
7282 
7283 	 CSC_PROFILE_ENGINE_PKG.run_engine_jit
7284              ( p_party_id => l_emp_id,
7285                p_acct_id => NULL,
7286                p_group_id => l_group_id,
7287                p_critical_flag => l_critical_flag,
7288                p_party_type => 'EMPLOYEE');
7289 
7290     ELSIF l_view_by = 'CONTACT' and l_contact_type ='CUSTOMER' THEN
7291 	 --refresh dashboard for contact (use party_id to fetch contact_id for refreshing)
7292          OPEN get_party_type;
7293            FETCH get_party_type INTO l_party_type;
7294          CLOSE get_party_type;
7295 
7296 	  /* if view_by is contact and contact_id is not passed, don't process */
7297       IF l_party_type = 'PARTY_RELATIONSHIP' THEN
7298         IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7299             l_party_rec.Cust_Party_Id  := l_party_id;
7300             l_party_rec.Cust_Party_Type  := l_party_type;
7301             l_party_rec.Cust_Account_Id  := l_acct_id;
7302 
7303             CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7304             l_group_id := l_party_rec.group_id;
7305          ELSE
7306 
7307             OPEN group_crs;
7308             FETCH group_crs INTO l_group_id;
7309                IF (group_crs%notfound) THEN
7310                   CLOSE group_crs;
7311                   l_form_name := 'CSCCCCDB';
7312                   OPEN group_crs;
7313                   FETCH group_crs into l_group_id;
7314                   CLOSE group_Crs;
7315                ELSE
7316                   CLOSE group_crs;
7317                END IF;
7318         END IF;
7319 
7320          IF l_group_id IS NULL THEN
7321             update_jit_status
7322             ( p_status => l_jit_err_status,
7323               p_err_code => -20001,
7324               p_media_item_id => l_media_item_id );
7325              RETURN;
7326          END IF;
7327 
7328 	 CSC_PROFILE_ENGINE_PKG.run_engine_jit
7329              ( p_party_id => l_party_id,
7330                p_acct_id => NULL,
7331                p_group_id => l_group_id,
7332                p_critical_flag => l_critical_flag,
7333 	       p_party_type => 'CUSTOMER');
7334       END IF;
7335     END IF;
7336 
7337 ELSIF  l_party_id IS NOT NULL THEN
7338 
7339    OPEN get_party_type;
7340    FETCH get_party_type INTO l_party_type;
7341    CLOSE get_party_type;
7342 
7343    IF l_view_by = 'CUSTOMER' THEN
7344 
7345       /* if view by is customer and contact_id is passed,
7346          get customer_id using contact_id */
7347       IF l_party_type = 'PARTY_RELATIONSHIP' THEN
7348          OPEN get_cust_from_cont;
7349          FETCH get_cust_from_cont into l_party_id, l_party_type;
7350 	 CLOSE get_cust_from_cont;
7351       END IF;
7352 
7353       /* profile option for view_by_account in dashboard tab */
7354       l_view_by_acct := FND_PROFILE.value_specific
7355                         ( name => 'CSC_DASHBOARD_TO_QUERY_BY_PARTY_OR_ACCOUNT',
7356                           responsibility_id => l_resp_id,
7357                           application_id => l_resp_appl_id,
7358                           user_id => -999
7359                         );
7360 
7361       /* if view_by_account is yes, check whether account_id is passed.
7362          If not passed, then check whether only one account exists for the customer.
7363          If yes, use this account.
7364          Else get account_id based on profile option CSC_CC_DEFAULT_ACCT */
7365 
7366       IF l_view_by_acct = 'ACCOUNT' THEN
7367          IF l_acct_id IS NULL THEN
7368             l_show_active_acct := FND_PROFILE.value_specific
7369                                     ( name => 'CSC_CONTACT_CENTER_SHOW_ACTIVE_ACCOUNTS',
7370                                       responsibility_id => l_resp_id,
7371                                       application_id => l_resp_appl_id,
7372                                       user_id => -999
7373                                     );
7374             BEGIN
7375                SELECT cust_account_id
7376                  INTO l_acct_id
7377                  FROM hz_cust_accounts
7378                 WHERE party_id = l_party_id
7379                   AND ((status = 'A' AND l_show_active_acct = 'Y') OR (l_show_active_acct = 'N'))
7380                   AND status NOT IN ('M', 'D');
7381             EXCEPTION
7382                WHEN OTHERS THEN
7383                   l_acct_id := NULL;
7384             END;
7385 
7386             IF l_acct_id IS NULL THEN
7387                l_acct_new_old := FND_PROFILE.value_specific
7388                                        ( name => 'CSC_CC_DEFAULT_ACCT',
7389                                          responsibility_id => l_resp_id,
7390                                          application_id => l_resp_appl_id,
7391                                          user_id => -999
7392                                        );
7393 
7394                IF l_acct_new_old = 'Y' THEN
7395                   OPEN get_acct_oldest;
7396                   FETCH get_acct_oldest INTO l_acct_id;
7397                   CLOSE get_acct_oldest;
7398                ELSIF l_acct_new_old = 'L' THEN
7399                   OPEN get_acct_latest;
7400                   FETCH get_acct_latest INTO l_acct_id;
7401                   CLOSE get_acct_latest;
7402                END IF;
7403             END IF; /* l_acct_id is null -- inner*/
7404          END IF; /* l_acct_id is null -- outer */
7405       END IF; /* l_view_by_acct = 'Y' */
7406 
7407       /* If user hook for dashboard group is enabled, call user hook to get group_id.
7408          Else use the existing logic from setup form to get group_id */
7409 
7410      IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7411          l_party_rec.Cust_Party_Id  := l_party_id;
7412          l_party_rec.Cust_Party_Type  := l_party_type;
7413          l_party_rec.Cust_Account_Id  := l_acct_id;
7414 
7415          CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7416          l_group_id := l_party_rec.group_id;
7417       ELSE
7418          OPEN group_crs;
7419          FETCH group_crs INTO l_group_id;
7420             IF (group_crs%notfound) THEN
7421                CLOSE group_crs;
7422                l_form_name := 'CSCCCCDB';
7423                OPEN group_crs;
7424                FETCH group_crs into l_group_id;
7425                CLOSE group_Crs;
7426             ELSE
7427                CLOSE group_crs;
7428             END IF;
7429       END IF;
7430 
7431       /* if err_code is -20001, Contact Center will display message that says that no group is attached */
7432       IF l_group_id IS NULL THEN
7433          update_jit_status
7434             ( p_status => l_jit_err_status,
7435               p_err_code => -20001,
7436               p_media_item_id => l_media_item_id );
7437           RETURN;
7438       END IF;
7439 
7440       CSC_PROFILE_ENGINE_PKG.run_engine_jit
7441              ( p_party_id => l_party_id,
7442                p_acct_id => l_acct_id,
7443                p_group_id => l_group_id,
7444                p_critical_flag => l_critical_flag,
7445 	       p_party_type => 'CUSTOMER');
7446 
7447    ELSIF l_view_by = 'CONTACT' THEN
7448 
7449       /* if view_by is contact and contact_id is not passed, don't process */
7450       IF l_party_type = 'PARTY_RELATIONSHIP' THEN
7451         IF JTF_USR_HKS.ok_to_execute('CSC_DASHBOARD_GROUP_CUHK', 'GET_DASHBOARD_GROUP_PRE', 'B', 'C') THEN
7452             l_party_rec.Cust_Party_Id  := l_party_id;
7453             l_party_rec.Cust_Party_Type  := l_party_type;
7454             l_party_rec.Cust_Account_Id  := l_acct_id;
7455 
7456             CSC_DASHBOARD_GROUP_CUHK.get_dashboard_group_pre(l_party_rec);
7457             l_group_id := l_party_rec.group_id;
7458          ELSE
7459 
7460             OPEN group_crs;
7461             FETCH group_crs INTO l_group_id;
7462                IF (group_crs%notfound) THEN
7463                   CLOSE group_crs;
7464                   l_form_name := 'CSCCCCDB';
7465                   OPEN group_crs;
7466                   FETCH group_crs into l_group_id;
7467                   CLOSE group_Crs;
7468                ELSE
7469                   CLOSE group_crs;
7470                END IF;
7471         END IF;
7472 
7473          IF l_group_id IS NULL THEN
7474             update_jit_status
7475             ( p_status => l_jit_err_status,
7476               p_err_code => -20001,
7477               p_media_item_id => l_media_item_id );
7478              RETURN;
7479          END IF;
7480 
7481 	 CSC_PROFILE_ENGINE_PKG.run_engine_jit
7482              ( p_party_id => l_party_id,
7483                p_acct_id => NULL,
7484                p_group_id => l_group_id,
7485                p_critical_flag => l_critical_flag,
7486 	       p_party_type => 'CUSTOMER');
7487       END IF;
7488    END IF; /* l_view_by */
7489 END IF; /* l_party_id or l_emp_id is null */
7490 
7491    update_jit_status
7492       ( p_status => l_jit_complete_status,
7493         p_err_code => NULL,
7494         p_media_item_id => l_media_item_id );
7495 
7496 EXCEPTION
7497    WHEN OTHERS THEN
7498       l_sql_code := sqlcode;
7499 
7500       update_jit_status
7501         ( p_status => l_jit_err_status,
7502           p_err_code => l_sql_code,
7503           p_media_item_id => l_media_item_id );
7504 
7505       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7506 
7507       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7508          FND_MSG_PUB.Add_Exc_Msg
7509            ( p_pkg_name => G_PKG_NAME,
7510              p_procedure_name => l_api_name );
7511       END IF;
7512 
7513       FND_MSG_PUB.Count_And_Get
7514         ( p_count => x_msg_count,
7515           p_data => x_msg_data );
7516 
7517 END csc_prof_jit;
7518 
7519 
7520 /*******************************************
7521   GET_PROFILE_VALUE_RESP
7522   Added this procedure for JIT enhancement -- Bug 4535407
7523   Returns Profile Option value at the responsibility level.
7524   This function has been added as API fnd_profile.value_specific is
7525   not defined at form level FND_PROFILE package (pld)
7526 ********************************************/
7527 
7528 FUNCTION get_profile_value_resp
7529    ( p_profile_name VARCHAR2,
7530      p_resp_id      NUMBER,
7531      p_resp_appl_id NUMBER,
7532      p_user_id      NUMBER
7533    )
7534 RETURN VARCHAR2
7535 IS
7536    l_prof_value VARCHAR2(255);
7537 BEGIN
7538    l_prof_value := FND_PROFILE.value_specific
7539                     ( name => p_profile_name,
7540                       responsibility_id => p_resp_id,
7541                       application_id => p_resp_appl_id,
7542                       user_id => p_user_id
7543                     );
7544    RETURN l_prof_value;
7545 END get_profile_value_resp;
7546 
7547 /******************************
7548  * Begin Utilities Definition *
7549  ******************************/
7550 
7551 --
7552 -- Build_Rule
7553 --   Construct the rule as a SQL statement for an indicator check
7554 -- IN
7555 --   check_id - profile check identifier
7556 -- OUT
7557 --   rule - sql statement that returns 0 or 1 row (0 for false, 1 for true)
7558 --
7559 PROCEDURE Build_Rule
7560   ( acct_flag		IN 	VARCHAR2,
7561     chk_id		IN	NUMBER,
7562     chk_level           IN      VARCHAR2,
7563     rule		OUT	NOCOPY VARCHAR2 )
7564   IS
7565 
7566      v_blk_id     Number;
7567      v_blk_level  Varchar2(10);
7568      CURSOR rules_csr IS
7569 	SELECT logical_operator, left_paren, block_id, comparison_operator,
7570 		       expression, expr_to_block_id, right_paren
7571 	FROM csc_prof_check_rules_vl
7572 	WHERE check_id = chk_id;
7573 
7574       cursor blk_crs is
7575           select block_level from
7576              csc_prof_blocks_b
7577           where block_id=v_blk_id;
7578 
7579 BEGIN
7580    --
7581    -- Construct indicator check rule as a SQL statement as follows:
7582    --   SELECT 1
7583    --     FROM dual
7584    --     WHERE {condition}
7585    --     <logical_operator> {condition}
7586    --     ...
7587    --
7588    -- A {condition} has the following form:
7589    --   <left_paren> EXISTS ( {subquery} ) <right_paren>
7590    --
7591    -- A {subquery} has the following three forms:
7592    --   SELECT 1
7593    --     FROM csc_prof_block_results
7594    --     WHERE block_id = <block_id>
7595    --     AND party_id = <party_id>
7596    --     AND value <comparison_operator> [<expression1> [AND <expression2>]]
7597    --
7598   rule := 'SELECT 1 FROM dual WHERE';
7599 
7600   IF chk_level = 'ACCOUNT' THEN
7601 
7602     FOR rules_rec IN rules_csr LOOP
7603       v_blk_id:=rules_rec.block_id;
7604       open blk_crs;
7605       fetch blk_crs into v_blk_level;
7606       close blk_crs;
7607       if v_blk_level='PARTY' then
7608       rule := rule || ' ' || rules_rec.logical_operator || ' ' ||
7609 		rules_rec.left_paren ||
7610 		'EXISTS (SELECT 1 FROM csc_prof_block_results WHERE block_id = ' ||
7611      		rules_rec.block_id || ' AND party_id = :party_id' ||
7612 		' AND cust_account_id IS NULL AND value ' || rules_rec.comparison_operator;
7613 
7614 	IF rules_rec.expression IS NOT NULL  THEN
7615 	   IF (rules_rec.comparison_operator NOT IN ('IS NULL', 'IS NOT NULL')) THEN
7616 	       rule := rule || ' ' || rules_rec.expression;
7617 	   END IF;
7618 	ELSE
7619 		rule := rule || '(SELECT value FORM csc_prof_block_results WHERE block_id = '||
7620 			rules_rec.expr_to_block_id || ' AND cust_account_id IS NULL )';
7621 	END IF;
7622 
7623       rule := rule || ')' || rules_rec.right_paren;
7624 
7625     ELSIF v_blk_level='ACCOUNT' then
7626 
7627       rule := rule || ' ' || rules_rec.logical_operator || ' ' ||
7628 		rules_rec.left_paren ||
7629 		'EXISTS (SELECT 1 FROM csc_prof_block_results WHERE block_id = ' ||
7630      		rules_rec.block_id || ' AND party_id = :party_id' ||
7631 		' AND cust_account_id = :cust_account_id' ||
7632 	 	' AND value ' || rules_rec.comparison_operator;
7633 
7634      IF rules_rec.expression IS NOT NULL  THEN
7635         IF (rules_rec.comparison_operator NOT IN ('IS NULL', 'IS NOT NULL')) THEN
7636 	       rule := rule || ' ' || rules_rec.expression;
7637         END IF;
7638      ELSE
7639         rule := rule || '(SELECT value FORM csc_prof_block_results WHERE block_id = '
7640            ||
7641 			rules_rec.expr_to_block_id ||  ' AND party_id = :party_id' ||
7642 			' AND cust_account_id = :cust_account_id)' ;
7643      END IF;
7644 
7645       rule := rule || ')' || rules_rec.right_paren;
7646 end if;
7647      END LOOP;
7648 
7649   ELSIF (chk_level='PARTY' OR chk_level='CONTACT' or chk_level='EMPLOYEE') THEN
7650 
7651     FOR rules_rec IN rules_csr LOOP
7652       rule := rule || ' ' || rules_rec.logical_operator || ' ' ||
7653 		rules_rec.left_paren ||
7654 		'EXISTS (SELECT 1 FROM csc_prof_block_results WHERE block_id = ' ||
7655      		rules_rec.block_id || ' AND party_id = :party_id' ||
7656 		' AND cust_account_id IS NULL AND value ' || rules_rec.comparison_operator;
7657 
7658 	IF rules_rec.expression IS NOT NULL  THEN
7659 	   IF (rules_rec.comparison_operator NOT IN ('IS NULL', 'IS NOT NULL')) THEN
7660 	       rule := rule || ' ' || rules_rec.expression;
7661 	   END IF;
7662 	ELSE
7663 		rule := rule || '(SELECT value FORM csc_prof_block_results WHERE block_id = '||
7664 			rules_rec.expr_to_block_id || ' AND cust_account_id IS NULL )';
7665 	END IF;
7666 
7667       rule := rule || ')' || rules_rec.right_paren;
7668     END LOOP;
7669 
7670   END IF;
7671 
7672 END Build_Rule;
7673 
7674 
7675 --
7676 -- Set_Context
7677 --   Set procedure context (for stack trace).
7678 -- IN
7679 --   proc_name - procedure/function name
7680 --   arg1 - first IN argument
7681 --   argn - n'th IN argument
7682 --
7683 PROCEDURE Set_Context
7684   ( proc_name	IN	VARCHAR2,
7685     arg1	IN	VARCHAR2 DEFAULT '*none*',
7686     arg2	IN	VARCHAR2 DEFAULT '*none*',
7687     arg3	IN	VARCHAR2 DEFAULT '*none*',
7688     arg4	IN	VARCHAR2 DEFAULT '*none*',
7689     arg5	IN	VARCHAR2 DEFAULT '*none*' )
7690    IS
7691 BEGIN
7692 
7693    -- Start with procedure name.
7694    IF (proc_name IS NOT NULL) THEN
7695       fnd_file.put(FND_FILE.LOG, proc_name||'(');
7696    END IF;
7697 
7698    -- Add all defined args.
7699    IF (arg1 <> '*none*') THEN
7700       fnd_file.put(FND_FILE.LOG, arg1);
7701    END IF;
7702    IF (arg2 <> '*none*') THEN
7703       fnd_file.put(FND_FILE.LOG, ', '||arg2);
7704    END IF;
7705    IF (arg3 <> '*none*') THEN
7706       fnd_file.put(FND_FILE.LOG, ', '||arg3);
7707    END IF;
7708    IF (arg4 <> '*none*') THEN
7709       fnd_file.put(FND_FILE.LOG, ', '||arg4);
7710    END IF;
7711    IF (arg5 <> '*none*') THEN
7712       fnd_file.put(FND_FILE.LOG, ', '||arg5);
7713    END IF;
7714 
7715    IF (proc_name IS NOT NULL) THEN
7716       fnd_file.put_line(FND_FILE.LOG, ')');
7717     ELSE
7718       fnd_file.new_line(FND_FILE.LOG);
7719    END IF;
7720 
7721   EXCEPTION
7722    WHEN UTL_FILE.INVALID_FILEHANDLE THEN
7723       fnd_message.set_name('CSC', 'CSC_PROFILE_INVALID_FILEHANDLE');
7724       warning_msg := fnd_message.get;
7725    WHEN UTL_FILE.INVALID_OPERATION THEN
7726       fnd_message.set_name('CSC', 'CSC_PROFILE_INVALID_OPERATION');
7727       warning_msg := fnd_message.get;
7728    WHEN UTL_FILE.WRITE_ERROR THEN
7729       fnd_message.set_name('CSC', 'CSC_PROFILE_WRITE_ERROR');
7730       warning_msg := fnd_message.get;
7731 END Set_Context;
7732 
7733 
7734 --
7735 -- Utility to delete all records in the tables
7736 --
7737 PROCEDURE Table_Delete IS
7738 Begin
7739 
7740    IP_Block_Id.delete;
7741    IP_Check_Id.delete;
7742    IP_Party_Id.delete;
7743    IP_Account_Id.delete;
7744    IP_Value.delete;
7745    IP_Currency.delete;
7746 
7747    UP_Grade.delete;
7748    UP_Block_Id.delete;
7749    UP_Check_Id.delete;
7750    UP_Party_Id.delete;
7751    UP_Account_Id.delete;
7752    UP_Value.delete;
7753    UP_Currency.delete;
7754    UP_Grade.delete;
7755 
7756    IA_Block_Id.delete;
7757    IA_Check_Id.delete;
7758    IA_Party_Id.delete;
7759    IA_Account_Id.delete;
7760    IA_Value.delete;
7761    IA_Currency.delete;
7762 
7763    UA_Grade.delete;
7764    UA_Block_Id.delete;
7765    UA_Check_Id.delete;
7766    UA_Party_Id.delete;
7767    UA_Account_Id.delete;
7768    UA_Value.delete;
7769    UA_Currency.delete;
7770    UA_Grade.delete;
7771 
7772    -- Relationship Plan tables
7773    plan_id_plan_table.delete;
7774    check_id_plan_table.delete;
7775    party_id_plan_table.delete;
7776    account_id_plan_table.delete;
7777 
7778 
7779 END Table_Delete;
7780 
7781 FUNCTION  Calc_Threshold
7782 (  p_val VARCHAR2,
7783    p_low_val VARCHAR2,
7784    p_high_val VARCHAR2,
7785    p_data_type VARCHAR2,
7786    p_chk_u_l_flag VARCHAR2
7787 )
7788 RETURN VARCHAR2
7789 IS
7790    RESULT VARCHAR2(3);
7791    val    VARCHAR2(240) := null;
7792 BEGIN
7793    IF p_low_val is NULL AND p_high_val IS NULL THEN
7794       RETURN 'Y';
7795    END IF;
7796 
7797    IF  p_data_type IN ('NUMBER', 'DATE') THEN
7798       IF p_data_type = 'NUMBER' THEN
7799          IF p_val IS NULL Then
7800             val := '0';
7801          ELSE
7802             val := p_val;
7803          END IF;
7804 
7805          IF p_chk_u_l_flag ='U' THEN
7806               IF to_number(val) > to_number(p_high_val) THEN
7807                   Result := 'Y';
7808               Else
7809                   Result := 'N';
7810               End If;
7811            Elsif p_chk_u_l_flag = 'L' Then
7812                If to_number(val) < to_number(p_low_val) then
7813                   Result := 'Y';
7814                 Else
7815                   Result := 'N';
7816                 End If;
7817            Else
7818                  Result := 'N';
7819            End If;
7820 
7821         ELSE
7822            IF val IS NOT NULL THEN
7823                If p_chk_u_l_flag = 'U' Then
7824                    If val > p_high_val then
7825                       Result := 'Y';
7826                    Else
7827                       Result := 'N';
7828                    End If;
7829                Elsif p_chk_u_l_flag = 'L' Then
7830                    If val < p_low_val then
7831                        Result := 'Y';
7832                    Else
7833                        Result := 'N';
7834                    End If;
7835                Else
7836                     Result := 'N';
7837                End If;
7838            End if;
7839       END IF;
7840    END IF;
7841    RETURN RESULT;
7842 END Calc_Threshold;
7843 
7844 FUNCTION Format_Mask
7845 (   p_curr_code   VARCHAR2,
7846     p_data_type   VARCHAR2,
7847     p_val         VARCHAR2,
7848     p_fmt_mask VARCHAR2
7849 )
7850 RETURN VARCHAR2
7851 IS
7852    val VARCHAR2(240);
7853    v_format_date DATE;
7854 BEGIN
7855    val := p_val;
7856    IF (p_curr_code IS NULL OR p_curr_code = '') THEN
7857       IF (p_fmt_mask IS NOT NULL OR p_fmt_mask <> '') THEN
7858           IF (p_data_type = 'NUMBER') THEN
7859              val := To_char(To_number(nvl(p_val, '0')), p_fmt_mask);
7860 	  ELSIF (p_data_type = 'DATE') THEN
7861              v_format_date := to_date(p_val,'DD-MM-YYYY');
7862              val := To_char(v_format_date, p_fmt_mask);
7863           END IF;
7864       END IF;
7865    END IF;
7866 
7867    IF p_data_type = 'NUMBER' AND val IS NULL THEN
7868       val := '0';
7869    END IF;
7870 
7871    RETURN val;
7872 END Format_Mask;
7873 
7874 FUNCTION rating_color
7875   (p_chk_id NUMBER,
7876    p_party_id NUMBER,
7877    p_account_id NUMBER,
7878    p_val VARCHAR2,
7879    p_data_type VARCHAR2,
7880    p_column VARCHAR2,
7881    p_count NUMBER
7882   )
7883 RETURN VARCHAR2
7884 IS
7885    v_val NUMBER;
7886    val   VARCHAR2(240) := p_val;
7887    v_color_code VARCHAR2(240);
7888    v_rating_code VARCHAR2(240);
7889    grd VARCHAR2(240);
7890 BEGIN
7891    IF nvl(g_check_id, -99) = nvl(p_chk_id, -99)
7892       AND nvl(g_party_id, -99) = nvl(p_party_id, -99)
7893       AND nvl(g_account_id, -99) = nvl(p_account_id, -99)
7894       AND nvl(g_value, -99) = nvl(p_val, -99)
7895    THEN
7896       NULL;
7897    ELSE
7898       IF p_count > 0 THEN
7899          IF (p_data_type IN ('NUMBER', 'DATE')) THEN
7900             IF p_data_type = 'NUMBER' Then
7901 	             IF val IS NULL Then
7902 	  	            val := '0';
7903 	             END IF;
7904 	             v_val := to_number(val);
7905 	             val := to_char(v_val);
7906 
7907                FOR a in 1..p_count LOOP
7908                   IF v_val BETWEEN nvl(rating_tbl(a).low_value, v_val) AND nvl(rating_tbl(a).high_value, v_val) THEN
7909                      v_color_code := rating_tbl(a).color_code;
7910                      v_rating_code := rating_tbl(a).rating_code;
7911                      grd := rating_tbl(a).grade;
7912                      EXIT;
7913                   END IF;
7914                END LOOP;
7915             ELSE
7916                IF val IS NOT NULL THEN
7917                   FOR a IN 1..p_count LOOP
7918                      IF val BETWEEN nvl(rating_tbl(a).low_value, val) AND nvl(rating_tbl(a).high_value, val) THEN
7919                         v_color_code := rating_tbl(a).color_code;
7920                         v_rating_code := rating_tbl(a).rating_code;
7921                         grd := rating_tbl(a).grade;
7922                         EXIT;
7923                      END IF;
7924                   END LOOP;
7925                END IF;
7926             END IF;
7927          END IF;
7928       END IF;
7929 
7930       /* populate the global variables */
7931       g_check_id := p_chk_id;
7932       g_party_id := p_party_id;
7933       g_account_id := p_account_id;
7934       g_value := p_val;
7935       g_color_code := v_color_code;
7936       g_rating := v_rating_code;
7937       g_grade := grd;
7938 
7939    END IF;
7940 
7941    IF p_column = 'COLOR' THEN
7942       RETURN g_color_code;
7943    ELSIF p_column = 'RATING' THEN
7944       RETURN g_rating;
7945    ELSIF p_column = 'GRADE' THEN
7946       RETURN g_grade;
7947    END IF;
7948 
7949 END rating_color;
7950 
7951 /* This procedure reverts back to the state before the start of the concurrent program */
7952 PROCEDURE Handle_Exception IS
7953    -- varlables for getting CSC schema name
7954    v_schema_status VARCHAR2(1);
7955    v_industry      VARCHAR2(1);
7956    v_schema_name   VARCHAR2(30);
7957    v_get_appl      BOOLEAN;
7958 BEGIN
7959    v_get_appl :=  FND_INSTALLATION.GET_APP_INFO('CSC', v_schema_status, v_industry, v_schema_name);
7960 
7961 
7962    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N2 REBUILD NOLOGGING';
7963    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N3 REBUILD NOLOGGING';
7964    EXECUTE IMMEDIATE 'ALTER INDEX '|| v_schema_name ||'.CSC_PROF_CHECK_RESULTS_N4 REBUILD NOLOGGING';
7965 
7966    EXECUTE IMMEDIATE 'ALTER TABLE ' || v_schema_name || '.CSC_PROF_CHECK_RESULTS LOGGING';
7967 END Handle_Exception;
7968 
7969 
7970 /******************************
7971  *  End Utilities Definition  *
7972  ******************************/
7973 
7974 END CSC_Profile_Engine_PKG;