DBA Data[Home] [Help]

PACKAGE BODY: APPS.CN_FORMULA_GEN_PKG

Source


1 PACKAGE BODY CN_FORMULA_GEN_PKG AS
2 -- $Header: cnfmgenb.pls 120.15.12000000.5 2007/09/26 18:23:44 achanda ship $
3 
4 G_PKG_NAME                  CONSTANT VARCHAR2(30) := 'CN_FORMULA_GEN_PKG';
5 
6 TYPE str_tbl_type IS TABLE OF VARCHAR2(80) INDEX BY BINARY_INTEGER;
7 TYPE id_tbl_type  IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
8 TYPE commission_clmns_tbl_type  IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
9 
10 -- following type def added for Formula Perf 11.5.10 Enhancments
11 TYPE exp_tbl_clmn_names_type IS record
12                              (exp_type_name     VARCHAR2(3),
13                               calc_sql_exp_id   cn_calc_sql_exps.calc_sql_exp_id%TYPE,
14                               table_alias       cn_objects.name%TYPE,
15                               table_name        cn_objects.name%type,
16                               table_object_id   cn_objects.object_id%TYPE,
17                               schema            cn_objects.schema%TYPE,
18                               column_object_id  cn_objects.object_id%TYPE,
19                               column_alias      cn_objects.name%TYPE,
20                               column_name       cn_objects.schema%TYPE,
21                               variable_name     VARCHAR2(61),
22                               alias_added	BOOLEAN
23                               );
24 
25 
26 
27 TYPE exp_tbl_names_type IS record
28                              (exp_type_name     VARCHAR2(3),
29                               calc_sql_exp_id   cn_calc_sql_exps.calc_sql_exp_id%TYPE,
30                               table_alias       cn_objects.name%TYPE,
31                               table_name        cn_objects.name%TYPE,
32                               table_object_id   cn_objects.object_id%TYPE,
33                               schema            cn_objects.schema%TYPE,
34                               variable_name     VARCHAR2(61),
35                               column_name_list  VARCHAR2(32000)
36                               );
37 
38 TYPE comm_tbl_clmn_names_type IS record
39                              (table_alias       cn_objects.name%TYPE,
40                               table_name        cn_objects.name%TYPE,
41                               column_name       cn_objects.schema%TYPE,
42                               column_alias      cn_objects.name%TYPE);
43 
44 
45 
46 
47 TYPE exp_tbl_names_tbl_type IS TABLE OF exp_tbl_names_type INDEX BY BINARY_INTEGER;
48 
49 TYPE exp_tbl_dtls_tbl_type IS TABLE OF exp_tbl_clmn_names_type INDEX BY BINARY_INTEGER;
50 
51 TYPE parsed_elmnts_tbl_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
52 
53 TYPE exp_other_tabused_tbl_type IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
54 
55 TYPE comm_tbl_clmn_nms_tbl_type IS TABLE OF comm_tbl_clmn_names_type INDEX BY BINARY_INTEGER;
56 
57 g_org_id                    cn_calc_formulas.org_id%TYPE;
58 g_formula_id                cn_calc_formulas.calc_formula_id%TYPE;
59 g_trx_group_code            cn_calc_formulas.trx_group_code%TYPE;
60 g_itd_flag                  cn_calc_formulas.itd_flag%TYPE;
61 g_cumulative_flag           cn_calc_formulas.cumulative_flag%TYPE;
62 g_perf_measure_id           cn_calc_formulas.perf_measure_id%TYPE;
63 g_split_flag                cn_calc_formulas.split_flag%TYPE;
64 g_number_dim                cn_calc_formulas.number_dim%TYPE;
65 g_formula_type              cn_calc_formulas.formula_type%TYPE;
66 g_rollover_flag             VARCHAR2(1) := 'N';
67 g_cumulative_input_no       NUMBER := 1;
68 
69 g_pe_reference_tbl          str_tbl_type;
70 g_pe_id_tbl                 id_tbl_type;
71 g_no_trx_flag               BOOLEAN := FALSE;
72 
73 g_rate_flag                 BOOLEAN := FALSE;
74 g_external_table_id         NUMBER;
75 
76 g_pq_target_flag            BOOLEAN := FALSE;
77 g_pq_payment_flag           BOOLEAN := FALSE;
78 g_spq_target_flag           BOOLEAN := FALSE;
79 g_spq_payment_flag          BOOLEAN := FALSE;
80 
81 -- following global variables added for Formula Perf  11.5.10 Enhancments
82 
83 -- store expression table column details
84 g_exp_tbl_dtls_tbl          exp_tbl_dtls_tbl_type;
85 
86 -- stores expression table xref details
87 g_tbl_names_tbl             exp_tbl_names_tbl_type;
88 
89 -- stores a list of unique table names referred to by this formula
90 g_uniq_tbl_names_tbl        exp_tbl_names_tbl_type;
91 
92 --table to indicate whether a expression used anyother table
93 -- other than the standard table
94 g_other_tabused_tbl         exp_other_tabused_tbl_type;
95 
96 --table to indicate whether a expression uses any non pl/sql function like decode
97 g_non_plsql_func_used_tbl   exp_other_tabused_tbl_type;
98 
99 --table to hold column names of commission header and lines
100 g_comm_tbl_clmn_nms_tbl     comm_tbl_clmn_nms_tbl_type;
101 
102 g_ch_flag                   BOOLEAN := FALSE;
103 
104 --sequence of the input expression which matches with the perf expression
105 g_perf_input_expr_seq       NUMBER := 0;
106 
107 -- +======================================================================+
108 -- +                   Procedure Parse                                    +
109 -- + Procedure Added for 11.5.10 Peformance Enhancment                    +
110 -- + Parse breaks string delimited by '|' into member elements and        +
111 -- + returns the elements in an array.                                    +
112 -- +======================================================================+
113 
114 PROCEDURE parse( x_strtosplit       IN VARCHAR2 ,
115                  x_parsed_elmts_tbl OUT NOCOPY parsed_elmnts_tbl_type) IS
116     bigstr   varchar2(15000) := x_strtosplit;
117     smlstr   varchar2(15000);
118     idxval   number;
119     counter  number := 1;
120 BEGIN
121     LOOP
122        idxval:= NVL(instr( bigstr, '|' ),0);
123        IF idxval = 0 THEN
124           smlstr:= bigstr;
125        ELSE
126           smlstr:= substr( bigstr, 1, idxval - 1 );
127           bigstr:= substr( bigstr, idxval + 1 );
128        END IF;
129        x_parsed_elmts_tbl(counter) := smlstr;
130        counter := counter +1;
131 
132        IF idxval = 0 THEN
133           EXIT;
134        END IF ;
135     END LOOP;
136 exception
137   when others then
138     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
139       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
140                      'cn.plsql.cn_formula_gen_pkg.parse.exception',
141          	          sqlerrm);
142     end if;
143     raise;
144 END parse;
145 
146 
147 -- +======================================================================+
148 -- +                   Procedure init_tab_column_list                     +
149 -- + Procedure Added for 11.5.10 Peformance Enhancment                    +
150 -- + Process input,output,perf expressions                                +
151 -- + populate the table names  columns used into g_exp_tbl_dtls_tbl       +
152 -- + populate the uniq table names   into g_uniq_tbl_names_tbl            +
153 -- + populate the table names   used into g_tbl_names_tbl                 +
154 -- +======================================================================+
155 PROCEDURE init_tab_column_list (p_formula_id  IN NUMBER) IS
156 CURSOR formula_expressions IS
157 SELECT formula_exps.exp_type_name exp_type_name,
158        dbms_lob.substr(piped_sql_from) sql_from,
159        dbms_lob.substr(piped_sql_select) sql_select,
160        cse.CALC_SQL_EXP_ID CALC_SQL_EXP_ID
161 FROM cn_calc_sql_exps_all cse,(SELECT 'PRF' exp_type_name,perf_measure_id exp_id
162                                   FROM cn_calc_formulas_all
163                                   WHERE calc_formula_id = p_formula_id
164                                     AND org_id = g_org_id
165                                   UNION ALL
166                                   SELECT 'OUT' exp_type_name,output_exp_id exp_id
167                                   FROM cn_calc_formulas_all
168                                   WHERE calc_formula_id = p_formula_id
169                                     AND org_id = g_org_id
170                                   UNION ALL
171                                   SELECT 'INP' exp_type_name,calc_sql_exp_id exp_id
172                                   FROM cn_formula_inputs_all
173                                   WHERE calc_formula_id = p_formula_id
174                                     AND org_id = g_org_id) formula_exps
175 WHERE cse.CALC_SQL_EXP_ID = formula_exps.exp_id;
176 
177 -- get list of tables which can be used for expression building
178 CURSOR osc_elements IS
179     SELECT user_name,schema, name, alias, object_id
180       FROM cn_objects_all
181      WHERE calc_eligible_flag = 'Y'
182        AND object_type in ('TBL', 'VIEW')
183        AND user_name is not null
184        AND object_id < 0
185        AND name like 'CN%'
186        AND org_id = g_org_id
187    ORDER BY user_name;
188 
189 -- get list of columns which can be used in expression building
190 CURSOR table_columns(p_table_id number) is
191     SELECT user_name, name ,object_id ,alias
192       FROM cn_objects_all
193      WHERE table_id = p_table_id
194        AND calc_formula_flag = 'Y'
195        AND object_type = 'COL'
196        AND org_id = g_org_id
197   ORDER BY user_name;
198 
199 --get alias of commlines table
200 CURSOR comm_line_alias is
201     SELECT alias
202       FROM cn_objects_all
203      WHERE name = 'CN_COMMISSION_LINES'
204        AND object_type in ('TBL', 'VIEW')
205        AND org_id = g_org_id;
206 
207 
208 l_parsed_elmnts_tbl    parsed_elmnts_tbl_type;
209 l_parsed_clmn_tbl      parsed_elmnts_tbl_type;
210 l_variable_name        VARCHAR2(70);
211 counter_1              NUMBER(10) := 1;
212 counter_2              NUMBER(10) := 1;
213 counter_3              NUMBER(10) := 1;
214 counter_4              NUMBER(10) := 1;
215 l_table_object_id      cn_objects.object_id%type;
216 l_comm_tbl_clmn_names_tbl comm_tbl_clmn_names_type;
217 l_comm_line_alias      VARCHAR2(100);
218 
219 -- declare null variables for intialization
220 -- fix for bug 3203673
221 l_null_exp_tbl_dtls_tbl          exp_tbl_dtls_tbl_type;
222 l_null_tbl_names_tbl             exp_tbl_names_tbl_type;
223 l_null_uniq_tbl_names_tbl        exp_tbl_names_tbl_type;
224 l_null_other_tabused_tbl         exp_other_tabused_tbl_type;
225 l_null_non_plsql_func_used_tbl   exp_other_tabused_tbl_type;
226 l_null_comm_tbl_clmn_nms_tbl     comm_tbl_clmn_nms_tbl_type;
227 
228 
229 -- Add all the columns of commission lines and header which has to be passed to
230 -- cn_formula_common_pkg.update_trx
231 g_comm_clmns_names  VARCHAR2(32000) :=
232 'COMMISSION_LINE_ID|COMMISSION_HEADER_ID|CREDITED_SALESREP_ID|SRP_PLAN_ASSIGN_ID|QUOTA_ID|CREDIT_TYPE_ID|PROCESSED_DATE|'||
233 'PROCESSED_PERIOD_ID|PAY_PERIOD_ID|COMMISSION_AMOUNT|COMMISSION_RATE|RATE_TIER_ID|TIER_SPLIT|INPUT_ACHIEVED|' ||
234 'OUTPUT_ACHIEVED|PERF_ACHIEVED|POSTING_STATUS|PENDING_STATUS|CREATED_DURING|TRX_TYPE|ERROR_REASON|STATUS' ;
235 
236 BEGIN
237 -- intialize all the global variables so that multiple calls
238 -- from same session does not give unexpected results.
239 -- fix for bug 3203673
240 g_exp_tbl_dtls_tbl        := l_null_exp_tbl_dtls_tbl;
241 g_tbl_names_tbl           := l_null_tbl_names_tbl;
242 g_uniq_tbl_names_tbl      := l_null_uniq_tbl_names_tbl;
243 g_other_tabused_tbl       := l_null_other_tabused_tbl;
244 g_non_plsql_func_used_tbl := l_null_non_plsql_func_used_tbl;
245 g_comm_tbl_clmn_nms_tbl   := l_null_comm_tbl_clmn_nms_tbl;
246 g_ch_flag                 := FALSE;
247 g_perf_input_expr_seq     := 0;
248 
249 OPEN comm_line_alias;
250 FETCH comm_line_alias INTO l_comm_line_alias;
251 CLOSE comm_line_alias;
252 
253 -- convert all the columns which was intialized into the string
254 -- g_comm_clmns_names into a pl/sql table and then add it to
255 -- l_comm_tbl_clmn_names_tbl
256 parse(g_comm_clmns_names,l_parsed_elmnts_tbl);
257 FOR i in 1..l_parsed_elmnts_tbl.COUNT LOOP
258   l_comm_tbl_clmn_names_tbl.table_name  := 'CN_COMMISSION_LINES';
259   l_comm_tbl_clmn_names_tbl.table_alias := l_comm_line_alias;
260   l_comm_tbl_clmn_names_tbl.column_name := l_parsed_elmnts_tbl(i);
261 
262   g_comm_tbl_clmn_nms_tbl(counter_4) := l_comm_tbl_clmn_names_tbl;
263   counter_4 := counter_4 +1;
264 END LOOP;
265 
266 FOR expression_rec IN  formula_expressions LOOP
267     counter_1 := 1;
268     -- get list of tables used in the expression
269     parse(expression_rec.sql_from,l_parsed_elmnts_tbl);
270     FOR table_rec IN osc_elements LOOP
271         --for every table in the list of seeded tables check whether it is used in the
272         --expression if yes populate details into g_tbl_names_tbl ,g_uniq_tbl_names_tbl
273         --and g_exp_tbl_dtls_tbl plsql table.
274         FOR i in 1..l_parsed_elmnts_tbl.COUNT LOOP
275            IF INSTR(l_parsed_elmnts_tbl(i),table_rec.name ||' '||table_rec.alias) > 0 THEN
276               g_tbl_names_tbl(counter_1).calc_sql_exp_id := expression_rec.calc_sql_exp_id;
277               g_tbl_names_tbl(counter_1).exp_type_name   := expression_rec.exp_type_name;
278               g_tbl_names_tbl(counter_1).table_name      := table_rec.name;
279               g_tbl_names_tbl(counter_1).table_object_id := table_rec.object_id;
280               g_tbl_names_tbl(counter_1).schema          := table_rec.schema;
281               g_tbl_names_tbl(counter_1).table_alias     := table_rec.alias;
282 
283               --if commission header is used set the g_ch_flag to true.
284               IF LOWER(table_rec.name) = LOWER('CN_COMMISSION_HEADERS') THEN
285                  g_ch_flag  := TRUE;
286               END IF;
287 
288 
289               IF LENGTH(REPLACE(table_rec.name,'_',NULL)) > 24 THEN
290                  l_variable_name := 'g_'||lower(substr(REPLACE(table_rec.name,'_',NULL),1,24))||'_rec';
291               ELSE
292                  l_variable_name := 'g_'||lower(REPLACE(table_rec.name,'_',NULL)) ||'_rec';
293               END IF;
294               g_tbl_names_tbl(counter_1).variable_name     := l_variable_name;
295 
296 
297               IF NOT g_uniq_tbl_names_tbl.EXISTS(table_rec.object_id) THEN
298                  g_uniq_tbl_names_tbl(table_rec.object_id).table_name      := table_rec.name;
299                  g_uniq_tbl_names_tbl(table_rec.object_id).schema          := table_rec.schema;
300                  g_uniq_tbl_names_tbl(table_rec.object_id).table_alias     := table_rec.alias;
301                  g_uniq_tbl_names_tbl(table_rec.object_id).variable_name   := l_variable_name;
302               END IF;
303               --get list of columns used in this tables and populate l_parsed_clmn_tbl
304               parse(expression_rec.sql_select,l_parsed_clmn_tbl);
305               FOR c in 1..l_parsed_clmn_tbl.COUNT LOOP
306                   FOR column_rec IN table_columns(table_rec.object_id) LOOP
307                      IF l_parsed_clmn_tbl(c) = table_rec.alias||'.'||column_rec.name or
308                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||',') > 0 or
309                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||')') > 0 or
310                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||'+') > 0 or
311                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||'-') > 0 or
312                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||'*') > 0 or
313                         instr(l_parsed_clmn_tbl(c), table_rec.alias|| '.'||column_rec.name||'/') > 0
314                      THEN
315                         g_exp_tbl_dtls_tbl(counter_2).exp_type_name    :=  expression_rec.exp_type_name;
316                         g_exp_tbl_dtls_tbl(counter_2).CALC_SQL_EXP_ID  :=  expression_rec.CALC_SQL_EXP_ID;
317                         g_exp_tbl_dtls_tbl(counter_2).table_alias      :=  table_rec.alias;
318                         g_exp_tbl_dtls_tbl(counter_2).table_name       :=  table_rec.name;
319                         g_exp_tbl_dtls_tbl(counter_2).table_object_id  :=  table_rec.object_id;
320                         g_exp_tbl_dtls_tbl(counter_2).schema           :=  table_rec.schema;
321                         g_exp_tbl_dtls_tbl(counter_2).column_object_id :=  column_rec.object_id;
325                         IF LENGTH(REPLACE(table_rec.alias,'_',NULL)) > 24 THEN
322                         g_exp_tbl_dtls_tbl(counter_2).column_alias     :=  column_rec.alias  ;
323                         g_exp_tbl_dtls_tbl(counter_2).column_name      :=  column_rec.name;
324 
326                            l_variable_name := 'g_'||lower(substr(REPLACE(table_rec.name,'_',NULL),1,24))
327                                                         ||'_rec.'||column_rec.name;
328                         ELSE
329                            l_variable_name := 'g_'||lower(REPLACE(table_rec.name,'_',NULL))
330                                                         ||'_rec.'||column_rec.name;
331                         END IF;
332 
333                         g_exp_tbl_dtls_tbl(counter_2).variable_name      :=   l_variable_name;
334                         counter_2 := counter_2 + 1;
335 
336                         -- build a comma seperated list of column names for this table
337                         IF NVL(INSTR(g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list||',',
338                                 table_rec.alias||'.'||column_rec.name||','),0) = 0 THEN
339 
340                            IF NVL(length(g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list),0) > 0         THEN
341                               g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list :=
342                               g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list ||',';
343                            END IF ;
344                            g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list :=
345                                   g_uniq_tbl_names_tbl(table_rec.object_id).column_name_list
346                                   ||table_rec.alias||'.'||column_rec.name;
347                         END IF;
348 
349 
350 
351                         -- if the column belongs to commission lines or header add it to
352                         -- g_comm_tbl_clmn_nms_tbl plsql table
353 /*
354                         IF(INSTR(table_rec.name,'CN_COMMISSION_HEADERS') >0 OR
355                            INSTR(table_rec.name,'CN_COMMISSION_LINES') >0 ) AND
356                            INSTR(g_comm_clmns_names||'|',column_rec.name||'|') = 0
357                         THEN
358 */
359                         IF((INSTR(table_rec.name,'CN_COMMISSION_LINES') >0 OR
360                             INSTR(table_rec.name,'CN_COMMISSION_HEADERS') >0) AND
361                            INSTR(g_comm_clmns_names||'|',column_rec.name||'|') = 0)
362                         THEN
363                            l_comm_tbl_clmn_names_tbl.table_name  := table_rec.name;
364                            l_comm_tbl_clmn_names_tbl.table_alias := table_rec.alias;
365                            l_comm_tbl_clmn_names_tbl.column_name := column_rec.name;
366 			   l_comm_tbl_clmn_names_tbl.column_alias := null;
367                            g_exp_tbl_dtls_tbl(counter_2 - 1).alias_added := false;
368 
369                            g_comm_tbl_clmn_nms_tbl(counter_4) := l_comm_tbl_clmn_names_tbl;
370 
371                            -- add it to the g_comm_clmns_names so that we can check whether it
372                            -- is already added.
373                            g_comm_clmns_names := g_comm_clmns_names ||'|'||column_rec.name;
374                            counter_4 := counter_4 +1;
375                         ELSIF (INSTR(table_rec.name,'CN_COMMISSION_HEADERS') >0 AND
376                                INSTR(g_comm_clmns_names||'|',column_rec.name||'|') < 329)
377                         THEN
378                             g_exp_tbl_dtls_tbl(counter_2 - 1).alias_added := true;
379                             IF (INSTR(g_comm_clmns_names||'|',table_rec.alias||'_'||column_rec.name||'|') = 0) THEN
380                                l_comm_tbl_clmn_names_tbl.table_name  := table_rec.name;
381                                l_comm_tbl_clmn_names_tbl.table_alias := table_rec.alias;
382                                l_comm_tbl_clmn_names_tbl.column_name := column_rec.name;
383                                l_comm_tbl_clmn_names_tbl.column_alias := table_rec.alias||'_'||column_rec.name;
384 
385 
386                                g_comm_tbl_clmn_nms_tbl(counter_4) := l_comm_tbl_clmn_names_tbl;
387 
388                                -- add it to the g_comm_clmns_names so that we can check whether it
389                                -- is already added.
390                                g_comm_clmns_names := g_comm_clmns_names ||'|'||table_rec.alias||'_'||column_rec.name;
391                                counter_4 := counter_4 +1;
392                             END IF;
393                         END IF;
394                      END IF;
395                   END LOOP;
396 
397               END LOOP;
398               counter_1 := counter_1 + 1;
399            END IF;
400 
401          END LOOP;
402 
403     END LOOP;
404 
405     --if no of tables parsed and added to the list is less then no of tables parsed
406     --then some non standard table is used set the flag g_other_tabused_tbl to indicate this
407     IF l_parsed_elmnts_tbl.COUNT > counter_1 THEN
408         g_other_tabused_tbl(expression_rec.CALC_SQL_EXP_ID) := 'Y';
409     ELSE
410         IF NOT g_other_tabused_tbl.EXISTS(expression_rec.CALC_SQL_EXP_ID) THEN
411             g_other_tabused_tbl(expression_rec.CALC_SQL_EXP_ID) := 'N';
412         END IF;
413     END IF;
414     --if non plsql function is used set the flag to Y
415     IF  INSTR(LOWER(expression_rec.sql_select),'decode(') >0 THEN
416           IF NOT g_non_plsql_func_used_tbl.EXISTS(expression_rec.calc_sql_exp_id) THEN
420           IF NOT g_non_plsql_func_used_tbl.EXISTS(expression_rec.calc_sql_exp_id) THEN
417                     g_non_plsql_func_used_tbl(expression_rec.calc_sql_exp_id) := 'Y';
418                  END IF;
419     ELSE
421                    g_non_plsql_func_used_tbl(expression_rec.calc_sql_exp_id) := 'N';
422           END IF;
423     END IF;
424 END LOOP;
425 
426 exception
427   when others then
428     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
429       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
430                      'cn.plsql.cn_formula_gen_pkg.init_tab_column_list.exception',
431          	          sqlerrm);
432     end if;
433     raise;
434 END init_tab_column_list;
435 
436 
437 -- return the smaller number if both <> 0.
438 PROCEDURE get_min ( p_min IN OUT NOCOPY number, p_max number) IS
439 BEGIN
440    IF p_min =0 and p_max <> 0 THEN
441       p_min := p_max;
442     ELSIF p_min <> 0 and p_max <> 0 THEN
443       IF p_min > p_max THEN
444          p_min := p_max;
445       END IF;
446    END IF;
447 END;
448 
449 -- lower a string except the sections that are contained in single quotes
450 function lower_str(p_str varchar2) return varchar2 is
451   l_str  varchar2(8000) := p_str;
452   l_pos1 pls_integer;
453   l_pos2 pls_integer;
454   x_str varchar2(8000) := '';
455 begin
456   l_pos1 := instr(l_str, '''', 1);
457   l_pos2 := instr(l_str, '''', l_pos1+1);
458   while (l_pos1 > 0) loop
459     x_str := x_str || lower(substr(l_str, 1, l_pos1)) || substr(l_str, l_pos1+1, l_pos2-l_pos1);
460     l_str := substr(l_str, l_pos2+1);
461     l_pos1 := instr(l_str, '''', 1);
462     l_pos2 := instr(l_str, '''', l_pos1+1);
463   end loop;
464   x_str := x_str || lower(l_str);
465   return x_str;
466 exception
467   when others then
468     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
469       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
470                      'cn.plsql.cn_formula_gen_pkg.lower_str.exception',
471          	          sqlerrm);
472     end if;
473     raise;
474 end;
475 
476 -- search the next occurence of delimiter '+ - * / ( ) ' in sql_select portion and return the position
477 FUNCTION search_delimiter_select ( p_input_str varchar2, p_start number)
478   RETURN  number IS
479      l_position_min         NUMBER ;
480      l_position         NUMBER;
481 BEGIN
482    l_position_min := instr( p_input_str, '*', p_start) ;
483    l_position := instr(p_input_str, '-', p_start);
484    get_min(l_position_min, l_position);
485 
486    l_position := instr(p_input_str, '+', p_start);
487    get_min(l_position_min, l_position);
488 
489    l_position := instr(p_input_str, '/', p_start);
490    get_min(l_position_min, l_position);
491 
492    l_position := instr(p_input_str, '(', p_start);
493    get_min(l_position_min, l_position);
494 
495    l_position := instr(p_input_str, ')', p_start);
496    get_min(l_position_min, l_position);
497 
498    l_position := instr(p_input_str, ',', p_start);
499    get_min(l_position_min, l_position);
500 
501    return l_position_min;
502 END;
503 
504 
505 -- search the next occurence of delimiter ', ' in sql_from portion and return the position
506 FUNCTION search_delimiter_from ( p_input_str varchar2, p_start  number) RETURN
507   NUMBER IS
508      l_position_min        number :=0;
509      l_position          NUMBER;
510 BEGIN
511    l_position := instr(p_input_str, ',', p_start);
512    get_min(l_position_min, l_position);
513    return l_position_min;
514 END;
515 
516 -- search the next occurence of delimiter 'and ' in sql_where portion and return the position
517 FUNCTION search_delimiter_where ( p_input_str varchar2, p_start number)
518   RETURN  number IS
519      l_position_min        number :=0;
520      l_position         NUMBER;
521 BEGIN
522    l_position := instr(p_input_str, 'and', p_start);
523    get_min(l_position_min, l_position);
524    return l_position_min;
525 END;
526 
527 -- search the next occurence of delimiter empty space in COMMENT and return the position
528 FUNCTION search_delimiter_comment ( p_input_str varchar2, p_start number)
529   RETURN  number IS
530      l_position_min        number :=0;
531      l_position         NUMBER;
532 BEGIN
533    l_position := instr(p_input_str, ' ', p_start);
534    get_min(l_position_min, l_position);
535    return l_position_min;
536 END search_delimiter_comment ;
537 
538 -- split the long sql statement into pieces less than 80 characters and return the position
539 PROCEDURE split_long_sql ( body_code        IN OUT NOCOPY cn_utils.code_type,
540                            p_input_str      VARCHAR2  ,
541                            sql_type   VARCHAR2        )
542   IS
543      l_length NUMBER;    /* total length of input string */
544      l_start  NUMBER;    /* the start position of current split */
545      l_next   NUMBER;    /* position of next delimiter */
546      l_next_prev NUMBER; /* position of previous delimiter */
547      l_limit  NUMBER;    /* the upper boundary of current split */
548 
549      l_sql_segment_length NUMBER := 80;
550 BEGIN
551    l_start := 1;
552    l_limit := l_start + l_sql_segment_length;
553 
557 
554    l_length := Length(p_input_str);
555    l_next := l_start;
556    l_next_prev := l_start;
558    WHILE l_limit < l_length LOOP
559       WHILE l_next < l_limit LOOP
560          /* the postion of l_next delimiter is not beyong the upper boudaryyet  */
561          l_next_prev := l_next;
562 
563          IF sql_type = 'SELECT' THEN
564             l_next := search_delimiter_select(p_input_str, l_next_prev+1 );
565           ELSIF sql_type = 'FROM' THEN
566             l_next := search_delimiter_from(p_input_str, l_next_prev+1 );
567           ELSIF sql_type = 'WHERE' THEN
568             l_next := search_delimiter_where(p_input_str, l_next_prev+1 );
569           ELSIF sql_type = 'COMMENT' THEN
570             l_next := search_delimiter_comment(p_input_str, l_next_prev+1 );
571          END IF;
572 
573          IF l_next = 0 THEN  /* no more delimiter */
574             EXIT;
575          END IF;
576       END LOOP;
577 
578       IF sql_type = 'COMMENT' THEN
579          cn_utils.appindcr(body_code, '-- ' || substr(p_input_str, l_start,
580                            l_next_prev -  l_start) );
581        ELSE
582          cn_utils.appindcr(body_code, substr(p_input_str, l_start,
583                                              l_next_prev - l_start));
584       END IF;
585 
586       l_start := l_next_prev ;
587       l_limit := l_start + l_sql_segment_length;
588 
589       IF l_next = 0 THEN  /* no more delimiter */
590          EXIT;
591       END IF;
592    END LOOP;
593 
594    IF sql_type = 'COMMENT' THEN
595       cn_utils.appindcr(body_code, '--' || substr(p_input_str, l_start,
596                         l_length -  l_start  + 1));
597     ELSE
598       cn_utils.appindcr(body_code, substr(p_input_str, l_start,
599                                           l_length - l_start  + 1));
600    END IF;
601 END split_long_sql;
602 
603 -- initialize the procedure boilerplate
604 PROCEDURE proc_init_boilerplate (code                IN OUT NOCOPY cn_utils.code_type,
605                                  procedure_name                cn_obj_procedures_v.name%TYPE,
606                                  description                cn_obj_procedures_v.description%TYPE)
607   IS
608      X_userid        VARCHAR2(20);
609 BEGIN
610    SELECT user INTO X_userid FROM sys.dual;
611 
612    cn_utils.appendcr(code, '--');
613    cn_utils.appendcr(code, '-- Procedure Name');
614    cn_utils.appendcr(code, '--   ' || procedure_name);
615    cn_utils.appendcr(code, '-- Purpose');
616    split_long_sql(code, description, 'COMMENT');
617    cn_utils.appendcr(code, '-- History');
618    cn_utils.appendcr(code, '--   ' || SYSDATE || '          ' || X_userid || '     Created');
619    cn_utils.appendcr(code, '--');
620 END proc_init_boilerplate;
621 
622 -- initialize the procedure
623 PROCEDURE proc_init(procedure_name                cn_obj_procedures_v.name%TYPE,
624                     description                cn_obj_procedures_v.description%TYPE,
625                     parameter_list                cn_obj_procedures_v.parameter_list%TYPE,
626                     procedure_type                cn_obj_procedures_v.procedure_type%TYPE,
627                     return_type                cn_obj_procedures_v.return_type%TYPE,
628                     package_id                cn_obj_procedures_v.package_id%TYPE,
629                     repository_id                cn_obj_procedures_v.repository_id%TYPE,
630                     spec_code        IN OUT NOCOPY cn_utils.code_type,
631                     body_code        IN OUT NOCOPY cn_utils.code_type) IS
632 BEGIN
633     -- Generate boilerplate comments
634     proc_init_boilerplate(spec_code, procedure_name, description);
635     proc_init_boilerplate(body_code, procedure_name, description);
636 
637     -- Generate procedure header and parameters in both spec and body
638     IF (procedure_type = 'P') THEN
639       IF (parameter_list IS NOT NULL) THEN
640          split_long_sql(spec_code, 'PROCEDURE ' || procedure_name ||
641                         ' (' || parameter_list || ')', 'FROM');
642          split_long_sql(body_code, 'PROCEDURE ' || procedure_name ||
643                         ' (' || parameter_list || ')', 'FROM');
644       ELSE
645          cn_utils.appendcr(spec_code, 'PROCEDURE ' || procedure_name);
646          cn_utils.appendcr(body_code, 'PROCEDURE ' || procedure_name);
647       END IF;
648      ELSIF (procedure_type = 'F') THEN
649        IF (parameter_list IS NOT NULL) THEN
650           split_long_sql(spec_code, 'FUNCTION ' || procedure_name ||
651                          ' (' || parameter_list || ')', 'FROM');
652           split_long_sql(body_code, 'FUNCTION ' || procedure_name ||
653                          ' (' || parameter_list || ')', 'FROM');
654         ELSE
655           cn_utils.appendcr(spec_code, 'FUNCTION ' || procedure_name);
656           cn_utils.appendcr(body_code, 'FUNCTION ' || procedure_name);
657        END IF;
658     END IF;
659 
660     IF (procedure_type = 'F') THEN
661       cn_utils.appendcr(spec_code, ' RETURN ' || return_type);
662       cn_utils.appendcr(body_code, ' RETURN ' || return_type);
663     END IF;
664 
665     cn_utils.appendcr(spec_code, ';');
666     cn_utils.appendcr(spec_code);
667     cn_utils.appendcr(body_code, ' IS');
668 END proc_init;
669 
670 --   initialize global variables in this package
671 PROCEDURE generate_init(p_formula_id cn_calc_formulas.calc_formula_id%TYPE) IS
675    p1      pls_integer;       -- temporary position pointer
672    i       pls_integer := 0;  -- index into PL/SQL tables
673    b       pls_integer;       -- beginning position of an occurence of xxxxPE.
674    l       pls_integer;       -- length of sql_select
676    p2      pls_integer;       -- temporary position pointer
677 
678    CURSOR exprs IS
679       SELECT dbms_lob.substr(piped_sql_select) sql_select
680         FROM cn_calc_sql_exps_all
681         WHERE calc_sql_exp_id IN (SELECT perf_measure_id
682                                   FROM cn_calc_formulas_all
683                                   WHERE calc_formula_id = p_formula_id
684                                     AND org_id = g_org_id
685                                   UNION ALL
686                                   SELECT output_exp_id
687                                   FROM cn_calc_formulas_all
688                                   WHERE calc_formula_id = p_formula_id
689                                     AND org_id = g_org_id
690                                   UNION ALL
691                                   SELECT calc_sql_exp_id
692                                   FROM cn_formula_inputs_all
693                                   WHERE calc_formula_id = p_formula_id
694                                     AND org_id = g_org_id);
695    CURSOR exprs2 IS
696       SELECT dbms_lob.substr(piped_sql_select) sql_select
697         FROM cn_calc_sql_exps_all
698         WHERE calc_sql_exp_id IN (SELECT output_exp_id
699                                   FROM cn_calc_formulas_all
700                                   WHERE calc_formula_id = p_formula_id
701                                     AND org_id = g_org_id
702                                   UNION ALL
703                                   SELECT calc_sql_exp_id
704                                   FROM cn_formula_inputs_all
705                                   WHERE calc_formula_id = p_formula_id
706                                     AND org_id = g_org_id);
707 
708    -- Added for 11.5.10 Performance Enhancments
709    CURSOR perf_measure_input_seq_cur IS
710       SELECT rate_dim_sequence
711       FROM   cn_formula_inputs_all
712       WHERE  calc_formula_id = p_formula_id
713       AND    calc_sql_exp_id = g_perf_measure_id;
714 BEGIN
715   SELECT calc_formula_id, trx_group_code, itd_flag, cumulative_flag, perf_measure_id, split_flag,
716          number_dim, formula_type
717     INTO g_formula_id, g_trx_group_code, g_itd_flag, g_cumulative_flag, g_perf_measure_id, g_split_flag,
718          g_number_dim, g_formula_type
719     FROM cn_calc_formulas_all
720    WHERE calc_formula_id = p_formula_id
721      AND org_id = g_org_id;
722 
723   g_pe_reference_tbl.delete;
724   g_pe_id_tbl.delete;
725   g_no_trx_flag := FALSE;
726   g_cumulative_input_no := 1;
727   g_rollover_flag := 'N';
728 
729   -- Added for 11.5.10 Performance Enhancments
730   OPEN perf_measure_input_seq_cur;
731   FETCH perf_measure_input_seq_cur INTO g_perf_input_expr_seq;
732   CLOSE perf_measure_input_seq_cur;
733 
734   FOR expr IN exprs LOOP
735      IF (instr(expr.sql_select, 'CSPQ.TOTAL_ROLLOVER', 1,1) > 0) THEN
736         g_rollover_flag := 'Y';
737      END IF;
738 
739      l := length(expr.sql_select);
740      b := 1;
741 
742      LOOP
743         b := instr(expr.sql_select, 'PE.', b, 1);
744 
745         IF (b = 0) THEN EXIT; END IF;
746         IF not(substr(expr.sql_select, b-1, 1) between '0' and '9') THEN EXIT; END IF;
747 
748         p1 := instr(expr.sql_select, '(', (b-l), 1);
749         p2 := instr(expr.sql_select, ')', b, 1);
750         g_pe_reference_tbl(i) := substr(expr.sql_select, p1+1, p2-p1-1);
751 
752         FOR j IN 0..(i-1) LOOP
753            IF (g_pe_reference_tbl(j) = g_pe_reference_tbl(i)) THEN
754               g_pe_reference_tbl.DELETE(i);
755               EXIT;
756             ELSIF (j = (i-1)) THEN
757               i := i + 1;
758            END IF;
759         END LOOP;
760 
761         IF (i = 0) THEN
762            i := 1;
763         END IF;
764         b := b + 4;
765      END LOOP;
766   END LOOP;
767 
768   -- get ids
769   IF (g_pe_reference_tbl.COUNT > 0) THEN
770      FOR i IN g_pe_reference_tbl.first..g_pe_reference_tbl.last LOOP
771         g_pe_id_tbl(i) := substr(g_pe_reference_tbl(i), 1, (instr(g_pe_reference_tbl(i), 'P', 1, 1) - 1));
772      END LOOP;
773   END IF;
774 
775   IF (g_formula_type = 'C' AND g_pe_reference_tbl.COUNT > 0) THEN
776      g_no_trx_flag := TRUE;
777      FOR expr IN exprs2 LOOP
778         IF (instr(expr.sql_select,  'CL.', 1, 1) = 1 OR
779             instr(expr.sql_select, '|CL.', 1, 1) > 0 OR
780             instr(expr.sql_select, '(CL.', 1, 1) > 0 OR
781             instr(expr.sql_select, '+CL.', 1, 1) > 0 OR
782             instr(expr.sql_select, '-CL.', 1, 1) > 0 OR
783             instr(expr.sql_select, '*CL.', 1, 1) > 0 OR
784             instr(expr.sql_select, '/CL.', 1, 1) > 0 OR
785             instr(expr.sql_select,  'CH.', 1, 1) = 1 OR
786             instr(expr.sql_select, '|CH.', 1, 1) > 0 OR
787             instr(expr.sql_select, '(CH.', 1, 1) > 0 OR
788             instr(expr.sql_select, '+CH.', 1, 1) > 0 OR
789             instr(expr.sql_select, '-CH.', 1, 1) > 0 OR
790             instr(expr.sql_select, '*CH.', 1, 1) > 0 OR
791             instr(expr.sql_select, '/CH.', 1, 1) > 0 OR
792             instr(expr.sql_select, 'p_commission_line_id', 1, 1) > 0)
793           THEN
794            g_no_trx_flag := FALSE;
795            EXIT;
799 EXCEPTION
796         END IF;
797      END LOOP;
798   END IF;
800   WHEN OTHERS THEN
801     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
802       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
803                      'cn.plsql.cn_formula_gen_pkg.generate_init.exception',
804          	          sqlerrm);
805     end if;
806     raise;
807 END;
808 
809 --   Get the object_id in cn_objects for formula, if not exist, create it.
810 PROCEDURE check_create_object(x_name                cn_objects.name%TYPE,
811                               x_object_type        cn_objects.object_type%TYPE,
812                               x_object_id        IN OUT NOCOPY cn_objects.object_id%TYPE,
813                               x_repository_id cn_repositories.repository_id%TYPE)
814   IS
815      dummy        NUMBER;
816      x_rowid        ROWID;
817 BEGIN
818    -- check whether formula package exist in cn_objects
819    SELECT  COUNT(*)
820      INTO  dummy
821      FROM cn_objects_all
822      WHERE name = x_name
823      AND object_type = x_object_type
824      AND org_id = g_org_id;
825 
826    IF dummy = 0 THEN
827       x_object_id := cn_utils.get_object_id;
828 
829       cn_objects_pkg.insert_row( x_rowid                   => x_rowid,
830                                  x_object_id               => x_object_id,
831                                  x_org_id                  => g_org_id,
832                                  x_dependency_map_complete => 'N',
833                                  x_name                    => x_name,
834                                  x_description             => null,
835                                  x_object_type             => x_object_type,
836                                  x_repository_id           => X_repository_id,
837                                  x_next_synchronization_date => null,
838                                  x_synchronization_frequency => null,
839                                  x_object_status           => 'A',
840                                  x_object_value            => NULL );
841 
842     ELSIF dummy = 1 THEN
843       SELECT  object_id INTO  x_object_id
844         FROM  cn_objects_all
845         WHERE  name = x_name
846         AND  object_type = x_object_type
847         AND org_id = g_org_id;
848    END IF;
849 EXCEPTION
850   WHEN OTHERS THEN
851     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
852       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
853                      'cn.plsql.cn_formula_gen_pkg.check_create_object.exception',
854          	          sqlerrm);
855     end if;
856     raise;
857 END check_create_object;
858 
859 --   get the table alias
860 FUNCTION get_table_alias (p_input_from VARCHAR2, p_table_name VARCHAR2 )
861   RETURN VARCHAR2 IS
862      x_table_alias  VARCHAR2(30);
863      l_table_position NUMBER;
864      l_comma_position NUMBER;
865      l_space_position NUMBER;
866 BEGIN
867    l_table_position := instr(p_input_from, p_table_name);
868 
869    IF l_table_position > 0 THEN
870       l_space_position := instr(p_input_from, ' ', l_table_position);
871       l_comma_position := instr(p_input_from, ',', l_table_position);
872 
873       IF l_comma_position = 0 THEN
874          l_comma_position := Length(p_input_from) + 1;
875       END IF;
876       x_table_alias := rtrim(ltrim(substr(p_input_from, l_space_position, l_comma_position-l_space_position), ' '), ' ');
877       RETURN lower(x_table_alias);
878     ELSE
879       RETURN NULL;
880    END IF ;
881 END get_table_alias;
882 
883 
884 --   get the table alias from cn_objects
885 FUNCTION get_table_alias_from_cn (p_table_name VARCHAR2 )
886   RETURN VARCHAR2 IS
887      x_table_alias  VARCHAR2(30);
888      CURSOR p_table_alias_csr(l_table_name VARCHAR2) IS
889         SELECT alias
890           FROM cn_objects_all
891           WHERE name = Upper(l_table_name)
892           AND object_type = 'TBL'
893           AND org_id = g_org_id;
894 BEGIN
895    OPEN p_table_alias_csr(p_table_name);
896    FETCH p_table_alias_csr INTO x_table_alias;
897    CLOSE p_table_alias_csr;
898 
899    RETURN lower(x_table_alias);
900 END get_table_alias_from_cn;
901 
902 --   check whether the sql_segment already exists
903 FUNCTION check_sql_stmt_existence (p_sql_select VARCHAR2,
904                                    p_sql_stmt   VARCHAR2 )
905   RETURN BOOLEAN IS
906 BEGIN
907    IF instr(p_sql_select, p_sql_stmt) > 0 THEN
908       RETURN TRUE;
909     ELSE
910       RETURN FALSE;
911    END IF;
912 END check_sql_stmt_existence;
913 
914 -- Build WHERE clause for cn_commission_lines
915 PROCEDURE make_calc_type(p_line_alias VARCHAR2,
916                          p_header_alias VARCHAR2,
917                          x_sql_where IN OUT NOCOPY VARCHAR2 )
918   IS
919      l_sql_stmt     VARCHAR2(1000);
920 BEGIN
921    l_sql_stmt := ' and (( g_calc_type = ''FORECAST'' and '|| p_line_alias ||'.trx_type = ''FORECAST'') ';
922    l_sql_stmt := l_sql_stmt || ' or (g_calc_type = ''BONUS'' and '|| p_line_alias ||'.trx_type = ''BONUS'') ';
923    l_sql_stmt := l_sql_stmt || ' or (g_calc_type = ''COMMISSION'' and '|| p_line_alias || '.trx_type not in (''BONUS'', ''FORECAST'', ''GRP''))) ';
924    IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
925       x_sql_where := x_sql_where || l_sql_stmt;
926    END IF;
927 END make_calc_type;
931                                       p_header_alias VARCHAR2,
928 
929 --       Build WHERE clause for cn_commission_lines
930 PROCEDURE make_srp_plan_pe_hid_pid_st(p_line_alias VARCHAR2,
932                                       x_sql_where IN OUT NOCOPY VARCHAR2 )
933   IS
934      l_sql_stmt     VARCHAR2(1000);
935 BEGIN
936      l_sql_stmt := ' and '|| p_line_alias || '.credited_salesrep_id = p_salesrep_id';
937      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
938         x_sql_where := x_sql_where || l_sql_stmt;
939      END IF;
940 
941      l_sql_stmt := ' and '|| p_line_alias || '.srp_plan_assign_id = p_srp_plan_assign_id';
942      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
943         x_sql_where := x_sql_where || l_sql_stmt;
944      END IF;
945 
946      l_sql_stmt := ' and '|| p_line_alias || '.quota_id = p_quota_id';
947      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
948         x_sql_where := x_sql_where || l_sql_stmt;
949      END IF;
950 
951      if (p_header_alias is not null) then
952      l_sql_stmt := ' and '|| p_header_alias || '.commission_header_id = ' || p_line_alias || '.commission_header_id';
953      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
954         x_sql_where := x_sql_where || l_sql_stmt;
955      END IF;
956      end if;
957 
958      l_sql_stmt := ' and '|| p_line_alias || '.processed_period_id between p_start_period_id and p_period_id';
959      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
960         x_sql_where := x_sql_where || l_sql_stmt;
961      END IF;
962 
963      l_sql_stmt := ' and ' || p_line_alias || '.status = ''CALC'' ';
964      IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
965         x_sql_where := x_sql_where || l_sql_stmt;
966      END IF;
967 END make_srp_plan_pe_hid_pid_st;
968 
969 --       Build WHERE clause for cn_commission_lines
970 PROCEDURE handle_comm_lines_where( x_sql_select IN OUT NOCOPY VARCHAR2,
971                                    x_sql_from IN OUT NOCOPY VARCHAR2 ,
972                                    x_sql_where IN OUT NOCOPY VARCHAR2 )
973   IS
974      l_line_alias  VARCHAR2(30);
975      l_header_alias VARCHAR2(30);
976      l_sql_stmt     VARCHAR2(1000);
977 BEGIN
978      -- Check if cn_commission_lines in FROM clause
979      l_line_alias := get_table_alias (x_sql_from, 'cn_commission_lines');
980      IF l_line_alias IS NOT NULL THEN
981         -- for individual transaction
982         IF g_trx_group_code = 'INDIVIDUAL' THEN
983            l_sql_stmt := ' and ' || l_line_alias || '.commission_line_id = p_commission_line_id';
984 
985            IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
986               x_sql_where := x_sql_where || l_sql_stmt;
987            END IF;
988 
989          ELSIF g_trx_group_code = 'GROUP' THEN
990            -- Group By Case: for all transaction
991            -- get header table alias
992            IF check_sql_stmt_existence(x_sql_from, 'cn_commission_headers') THEN
993               l_header_alias := get_table_alias (x_sql_from, 'cn_commission_headers');
994             ELSE -- comm_header not in sql_from yet, add it and get its alias
995               l_header_alias := get_table_alias_from_cn('cn_commission_headers');
996               x_sql_from := x_sql_from || ', cn_commission_headers ' || l_header_alias;
997            END IF ;
998 
999            make_srp_plan_pe_hid_pid_st(l_line_alias, l_header_alias, x_sql_where);
1000            make_calc_type(l_line_alias, l_header_alias, x_sql_where);
1001 
1002         END IF; -- end of 'group by'
1003     elsif (g_trx_group_code = 'GROUP' and instr(x_sql_select, 'p_commission_line_id', 1, 1) > 0) then
1004 
1005       l_line_alias := get_table_alias_from_cn('cn_commission_lines');
1006       x_sql_from := x_sql_from || ', cn_commission_lines ' || l_line_alias;
1007       x_sql_select := replace(x_sql_select, 'p_commission_line_id', l_line_alias || '.commission_line_id');
1008 
1009 	   make_srp_plan_pe_hid_pid_st(l_line_alias, l_header_alias, x_sql_where);
1010 	   make_calc_type(l_line_alias, l_header_alias, x_sql_where);
1011      END IF; -- end of l_line_alias existence
1012 END handle_comm_lines_where;
1013 
1014 --       Build WHERE clause for cn_commission_headers if chosen
1015 PROCEDURE handle_comm_headers_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1016                                      x_sql_from IN OUT NOCOPY VARCHAR2 ,
1017                                      x_sql_where IN OUT NOCOPY VARCHAR2 )
1018   IS
1019      l_line_alias  VARCHAR2(30);
1020      l_header_alias VARCHAR2(30);
1021      l_sql_stmt     VARCHAR2(1000);
1022 BEGIN
1023      -- Check if cn_commission_headers in FROM clause
1024      l_header_alias := get_table_alias (x_sql_from, 'cn_commission_headers');
1025 
1026      IF l_header_alias IS NOT NULL THEN
1027         -- get the alias for cn_commisson_lines
1028         IF check_sql_stmt_existence(x_sql_from, 'cn_commission_lines') THEN
1029            l_line_alias := get_table_alias (x_sql_from, 'cn_commission_lines');
1030          ELSE -- comm_lines not in sql_from yet, add it and get its alias
1031            l_line_alias := get_table_alias_from_cn('cn_commission_lines');
1032            x_sql_from := x_sql_from || ', cn_commission_lines ' || l_line_alias;
1033         END IF ;
1034 
1035         -- for individual transaction
1036         IF g_trx_group_code = 'INDIVIDUAL' THEN
1037            l_sql_stmt := ' and ' || l_line_alias || '.commission_line_id = p_commission_line_id';
1038 
1039            IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1040               x_sql_where := x_sql_where || l_sql_stmt;
1041            END IF;
1042 
1043            l_sql_stmt := ' and '|| l_header_alias || '.commission_header_id' || ' = ' || l_line_alias ||'.commission_header_id';
1044            IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1045               x_sql_where := x_sql_where || l_sql_stmt;
1046            END IF;
1047          ELSIF g_trx_group_code = 'GROUP' THEN
1048            -- Group By Case: for all transaction
1049            make_srp_plan_pe_hid_pid_st(l_line_alias, l_header_alias, x_sql_where);
1050            make_calc_type(l_line_alias, l_header_alias, x_sql_where);
1051         END IF; -- end of 'group by'
1052      END IF; -- end of l_line_alias existence
1053 END handle_comm_headers_where;
1054 
1055 --       Build WHERE clause for cn_quotas if chosen
1056 PROCEDURE handle_cn_quotas_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1057                                   x_sql_from IN OUT NOCOPY VARCHAR2 ,
1058                                   x_sql_where IN OUT NOCOPY VARCHAR2 )
1059   IS
1060      l_quota_alias  VARCHAR2(30);
1061      l_p_quota_alias VARCHAR2(30);
1062      l_sql_stmt     VARCHAR2(1000);
1063 BEGIN
1064      g_pq_payment_flag := FALSE;
1065      g_pq_target_flag  := FALSE;
1066 
1067      l_quota_alias := get_table_alias (x_sql_from, 'cn_quotas');
1068 
1069      IF l_quota_alias IS NOT NULL THEN
1073         END IF;
1070         l_sql_stmt := ' and '|| l_quota_alias || '.quota_id = ' || 'p_quota_id';
1071         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1072            x_sql_where := x_sql_where || l_sql_stmt;
1074 
1075         IF g_itd_flag = 'Y' THEN
1076            -- g_itd_flag = 'Y', replace cn_quota.target with cn_period_quotas.itd_target
1077 
1078            IF instr(x_sql_select, l_quota_alias||'.target') > 0  THEN
1079               g_pq_target_flag := TRUE;
1080 
1081               x_sql_select := replace( x_sql_select, l_quota_alias ||'.target', '1' );
1082            END IF;
1083 
1084            IF instr(x_sql_select, l_quota_alias||'.payment_amount') > 0 THEN
1085               g_pq_payment_flag := TRUE;
1086 
1087               -- get the alias for cn_period_quotas
1088               IF check_sql_stmt_existence(x_sql_from, 'cn_period_quotas') THEN
1089                  l_p_quota_alias := get_table_alias(x_sql_from, 'cn_period_quotas');
1090                ELSE -- period_quotas not in sql_from yet, add it and get its alias
1091                  l_p_quota_alias := get_table_alias_from_cn('cn_period_quotas');
1092                  x_sql_from := x_sql_from || ', cn_period_quotas ' || l_p_quota_alias;
1093               END IF ;
1094 
1095               l_sql_stmt := ' and '|| l_p_quota_alias ||'.quota_id' || ' = p_quota_id';
1096               IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1097                  x_sql_where := x_sql_where || l_sql_stmt;
1098               END IF;
1099 
1100               l_sql_stmt := ' and '|| l_p_quota_alias ||'.period_id' || ' = p_period_id';
1101               IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1102                  x_sql_where := x_sql_where || l_sql_stmt;
1103               END IF;
1104 
1105               x_sql_select := replace( x_sql_select,
1106                                        l_quota_alias ||'.payment_amount',
1107                                        l_p_quota_alias ||'.itd_payment' );
1108            END IF; -- there is cn_quotas.target/payment_amount selected
1109         END IF ;-- itd = 'Y'
1110      END IF;
1111 END handle_cn_quotas_where;
1112 
1113 --       Build WHERE clause for cn_srp_period_quotas if chosen
1114 PROCEDURE handle_srp_p_quotas_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1115                                      x_sql_from IN OUT NOCOPY VARCHAR2 ,
1116                                      x_sql_where IN OUT NOCOPY VARCHAR2 )
1117   IS
1118      l_sp_quota_alias  VARCHAR2(30);
1119      l_sql_stmt     VARCHAR2(1000);
1120 BEGIN
1121      g_spq_payment_flag := FALSE;
1122      g_spq_target_flag  := FALSE;
1123 
1124      l_sp_quota_alias := get_table_alias(x_sql_from, 'cn_srp_period_quotas');
1125 
1126      IF l_sp_quota_alias IS NOT NULL THEN
1127         l_sql_stmt := ' and '|| l_sp_quota_alias || '.salesrep_id = ' || 'p_salesrep_id';
1128         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1129            x_sql_where := x_sql_where || l_sql_stmt;
1130         END IF;
1131 
1132         l_sql_stmt := ' and '|| l_sp_quota_alias ||'.quota_id' || ' = p_quota_id';
1133         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1134            x_sql_where := x_sql_where || l_sql_stmt;
1135         END IF;
1136 
1137         l_sql_stmt := ' and '|| l_sp_quota_alias ||'.period_id' || ' = p_period_id';
1138         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1139            x_sql_where := x_sql_where || l_sql_stmt;
1140         END IF;
1141 
1142         l_sql_stmt := ' and '|| l_sp_quota_alias ||'.srp_plan_assign_id' || ' = p_srp_plan_assign_id';
1143         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1144            x_sql_where := x_sql_where || l_sql_stmt;
1145         END IF;
1146 
1147         -- itd = 'Y' and
1148         IF g_itd_flag = 'Y' THEN
1149 
1150            IF instr(x_sql_select, l_sp_quota_alias||'.period_payment') > 0  THEN
1151               g_spq_payment_flag := TRUE;
1152 
1153               x_sql_select := replace( x_sql_select, l_sp_quota_alias ||'.period_payment', l_sp_quota_alias ||'.itd_payment' );
1154             ELSIF (instr(x_sql_select, l_sp_quota_alias || '.itd_payment') > 0) THEN
1155               g_spq_payment_flag := TRUE;
1156            END IF;
1157 
1158            IF instr(x_sql_select, l_sp_quota_alias||'.target_amount') > 0 THEN
1159               g_spq_target_flag := TRUE;
1160 
1161               IF (g_pq_payment_flag OR g_spq_payment_flag or g_no_trx_flag) THEN
1162                 x_sql_select := replace( x_sql_select, l_sp_quota_alias ||'.target_amount', l_sp_quota_alias ||'.itd_payment' );
1163               else
1164                 x_sql_select := replace( x_sql_select, l_sp_quota_alias ||'.target_amount', '1' );
1165               end if;
1166             ELSIF (instr(x_sql_select, l_sp_quota_alias || '.itd_target') > 0) THEN
1167               g_spq_target_flag := TRUE;
1168 
1169               if (g_pq_payment_flag OR g_spq_payment_flag or g_no_trx_flag) then
1170                 null;
1171               else
1172                 x_sql_select := REPLACE( x_sql_select, l_sp_quota_alias || '.itd_target', '1');
1173               end if;
1174 
1175               IF (g_rollover_flag = 'Y') THEN
1176                  x_sql_select := REPLACE(x_sql_select, l_sp_quota_alias || '.total_rollover', 0);
1177               END IF;
1178            END IF;
1179         END IF;
1180      END IF;
1181 END handle_srp_p_quotas_where;
1182 
1183 --       Build WHERE clause for cn_srp_quota_assigns if chosen
1184 PROCEDURE handle_srp_q_assigns_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1188      l_sq_assign_alias  VARCHAR2(30);
1185                                       x_sql_from IN OUT NOCOPY VARCHAR2 ,
1186                                       x_sql_where IN OUT NOCOPY VARCHAR2 )
1187   IS
1189      l_sql_stmt     VARCHAR2(1000);
1190 BEGIN
1191      l_sq_assign_alias := get_table_alias(x_sql_from, 'cn_srp_quota_assigns');
1192 
1193      IF l_sq_assign_alias IS NOT NULL THEN
1194         l_sql_stmt := ' and '|| l_sq_assign_alias ||'.quota_id' || ' = p_quota_id';
1195         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1196            x_sql_where := x_sql_where || l_sql_stmt;
1197         END IF;
1198 
1199         l_sql_stmt := ' and '|| l_sq_assign_alias ||'.srp_plan_assign_id' || ' = p_srp_plan_assign_id';
1200         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1201            x_sql_where := x_sql_where || l_sql_stmt;
1202         END IF;
1203 
1204         IF (g_itd_flag = 'Y' AND instr(x_sql_select, l_sq_assign_alias || '.payment_amount') > 0) THEN
1205            g_spq_payment_flag := TRUE;
1206         END IF;
1207      END IF;
1208 END handle_srp_q_assigns_where;
1209 
1210 --       Build WHERE clause for cn_srp_plan_assigns if chosen
1211 PROCEDURE handle_srp_p_assigns_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1212                                       x_sql_from IN OUT NOCOPY VARCHAR2 ,
1213                                       x_sql_where IN OUT NOCOPY VARCHAR2 )
1214   IS
1215      l_sp_assign_alias  VARCHAR2(30);
1216      l_sql_stmt     VARCHAR2(1000);
1217 BEGIN
1218      l_sp_assign_alias := get_table_alias(x_sql_from, 'cn_srp_plan_assigns');
1219 
1220      IF l_sp_assign_alias IS NOT NULL THEN
1221         l_sql_stmt := ' and '|| l_sp_assign_alias ||'.srp_plan_assign_id' || ' = p_srp_plan_assign_id';
1222         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1223            x_sql_where := x_sql_where || l_sql_stmt;
1224         END IF;
1225      END IF;
1226 END handle_srp_p_assigns_where;
1227 
1228 --       Build WHERE clause for cn_salesreps if chosen
1229 PROCEDURE handle_cn_salesreps_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1230                                      x_sql_from IN OUT NOCOPY VARCHAR2 ,
1231                                      x_sql_where IN OUT NOCOPY VARCHAR2 )
1232   IS
1233      l_srp_alias  VARCHAR2(30);
1234      l_sql_stmt     VARCHAR2(1000);
1235 BEGIN
1236      l_srp_alias := get_table_alias(x_sql_from, 'cn_salesreps');
1237 
1238      IF l_srp_alias IS NOT NULL THEN
1239         l_sql_stmt := ' and '|| l_srp_alias ||'.salesrep_id' || ' = p_salesrep_id';
1240         l_sql_stmt := ' and '|| l_srp_alias ||'.org_id' || ' = g_org_id';
1241         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1242            x_sql_where := x_sql_where || l_sql_stmt;
1243         END IF;
1244      END IF;
1245 END handle_cn_salesreps_where;
1246 
1247 --       Build WHERE clause for cn_srp_periods if chosen
1248 PROCEDURE handle_cn_srp_periods_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1249                                        x_sql_from IN OUT NOCOPY VARCHAR2 ,
1250                                        x_sql_where IN OUT NOCOPY VARCHAR2 )
1251   IS
1252      l_srp_alias  VARCHAR2(30);
1253      l_sql_stmt     VARCHAR2(1000);
1254 BEGIN
1255      l_srp_alias := get_table_alias(x_sql_from, 'cn_srp_periods');
1256 
1257      IF l_srp_alias IS NOT NULL THEN
1258         l_sql_stmt := ' and '|| l_srp_alias ||'.salesrep_id' || ' = p_salesrep_id';
1259         l_sql_stmt := l_sql_stmt || ' and '|| l_srp_alias ||'.period_id' || ' = p_period_id';
1260         l_sql_stmt := l_sql_stmt || ' and '|| l_srp_alias ||'.credit_type_id' || ' = p_credit_type_id';
1261         l_sql_stmt := l_sql_stmt || ' and '|| l_srp_alias ||'.role_id' || ' = p_role_id';
1262         l_sql_stmt := l_sql_stmt || ' and '|| l_srp_alias ||'.org_id' || ' = g_org_id';
1263 
1264         IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1265            x_sql_where := x_sql_where || l_sql_stmt;
1266         END IF;
1267      END IF;
1268 END handle_cn_srp_periods_where;
1269 
1270 --       Build WHERE clause if any external table is included
1271 PROCEDURE separate_tbl_alias ( p_input_sql   VARCHAR2,
1272                                p_start       NUMBER,
1273                                x_table_name  OUT NOCOPY VARCHAR2,
1274                                x_table_alias OUT NOCOPY VARCHAR2,
1275                                x_end_flag    OUT NOCOPY BOOLEAN ,
1276                                x_new_start   OUT NOCOPY NUMBER    )
1277   IS
1278      l_position_space NUMBER;
1279      l_position_comma NUMBER;
1280 BEGIN
1281      IF (p_start = 1) THEN
1282         l_position_space := instr(p_input_sql, ' ', p_start, 2);
1283       ELSE
1284         l_position_space := instr(p_input_sql, ' ', p_start);
1285         IF (l_position_space = p_start) THEN
1286            l_position_space := instr(p_input_sql, ' ', p_start + 1);
1287         END IF;
1288      END IF;
1289      l_position_comma := instr(p_input_sql, ',', p_start);
1290 
1291      IF l_position_comma = 0 THEN
1292         -- the search has reach the end
1293         x_end_flag := TRUE;
1294 
1295         IF l_position_space > 0 THEN
1296            if (p_start = 1) then
1297               x_table_name := trim(both ' ' FROM substr(p_input_sql, 6, (l_position_space - 6)));
1298             else
1299               x_table_name := trim(both ' ' FROM substr(p_input_sql, p_start, (l_position_space - p_start)) );
1300            end if;
1304       ELSE
1301            x_table_alias := trim( both ' ' FROM substr(p_input_sql, l_position_space+1, (Length(p_input_sql) - l_position_space + 1)));
1302         END IF;
1303 
1305         x_end_flag := FALSE;
1306 
1307         if (p_start = 1) then
1308            x_table_name := trim(both ' ' FROM substr(p_input_sql, 6, (l_position_space - 6)));
1309          else
1310            x_table_name := trim(both ' ' FROM substr(p_input_sql, p_start, (l_position_space - p_start)) );
1311         end if;
1312         x_table_alias := trim(both ' ' FROM substr(p_input_sql, l_position_space, l_position_comma - l_position_space) );
1313         x_new_start := l_position_comma + 1;
1314      END IF;
1315 END separate_tbl_alias;
1316 
1317 --       Build WHERE clause if any external table is included
1318 PROCEDURE handle_external_tables( x_sql_select IN OUT NOCOPY VARCHAR2,
1319                                   x_sql_from IN OUT NOCOPY VARCHAR2 ,
1320                                   x_sql_where IN OUT NOCOPY VARCHAR2 )
1321   IS
1322      l_sql_stmt VARCHAR2(1000);
1323      l_table_name VARCHAR2(30);
1324      l_table_alias VARCHAR2(30);
1325      l_end_flag    BOOLEAN;
1326      l_start_position NUMBER;
1327 
1328      CURSOR l_all_column_pairs_csr(l_calc_ext_table_id NUMBER)IS
1329         SELECT lower(obj1.name) internal_column_name, lower(obj2.name) external_column_name
1330           FROM cn_calc_ext_tbl_dtls_all detail,
1331           cn_objects_all obj1,
1332           cn_objects_all obj2
1333           WHERE detail.calc_ext_table_id = l_calc_ext_table_id
1334           AND obj1.object_id = detail.internal_column_id
1335           AND obj1.org_id = detail.org_id
1336           AND obj2.object_id = detail.external_column_id
1337           AND obj2.org_id = detail.org_id;
1338 
1339      CURSOR l_ext_table_csr IS
1340         SELECT map.calc_ext_table_id,
1341           lower(obj.name) internal_table_name,
1342           trim( both ' ' FROM lower(obj.alias) )  internal_table_alias,
1343           lower(l_table_name) external_table_name,
1344           lower(l_table_alias) external_table_alias
1345           FROM cn_objects_all obj,
1346           cn_calc_ext_tables_all map
1347           WHERE  lower(map.alias) = l_table_alias
1348           AND map.org_id = g_org_id
1349           AND obj.object_id = map.internal_table_id
1350           AND obj.org_id = map.org_id;
1351 BEGIN
1352      l_end_flag := FALSE;
1353      l_start_position := 1;
1354 
1355      WHILE l_end_flag <> TRUE LOOP
1356         separate_tbl_alias( x_sql_from,
1357                             l_start_position+0,
1358                             l_table_name,
1359                             l_table_alias,
1360                             l_end_flag,
1361                             l_start_position   );
1362 
1363         FOR l_table IN l_ext_table_csr LOOP
1364            -- if external table found in x_sql_from, check if the internal table name not in x_sql_from yet, add it
1365            IF NOT check_sql_stmt_existence(x_sql_from, l_table.internal_table_name) THEN
1366               l_sql_stmt := NULL;
1367               l_sql_stmt := ' , '|| l_table.internal_table_name || ' ' || l_table.internal_table_alias;
1368               x_sql_from := x_sql_from || l_sql_stmt;
1369            END IF;
1370 
1371            -- add join condition for this relationship
1372            FOR l_pair IN l_all_column_pairs_csr(l_table.calc_ext_table_id) LOOP
1373               l_sql_stmt := ' and ' || l_table.internal_table_alias || '.' ||
1374                 l_pair.internal_column_name || ' = ' || l_table.external_table_alias || '.' || l_pair.external_column_name ;
1375               IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1376                  x_sql_where := x_sql_where || l_sql_stmt;
1377               END IF;
1378            END LOOP;
1379         END LOOP;
1380      END LOOP;
1381 END handle_external_tables;
1382 
1383 --Build order by clause if any external table is included in bonus type formula
1384 PROCEDURE handle_bonus_ex_tbl_orderby( x_sql_select IN OUT NOCOPY VARCHAR2,
1385                                        x_sql_from IN OUT NOCOPY VARCHAR2 ,
1386                                        x_sql_where IN OUT NOCOPY VARCHAR2,
1387                                        p_mode  VARCHAR2 )
1388   IS
1389      l_table_name VARCHAR2(30);
1390      l_table_alias VARCHAR2(30);
1391      l_end_flag    BOOLEAN;
1392      l_start_position NUMBER;
1393 
1394      l_sql_stmt VARCHAR2(1000);
1395      l_counter NUMBER := 0;
1396      l_sql_select VARCHAR2(4000);
1397      l_sql_where VARCHAR2(1000);
1398 
1399      CURSOR l_all_columns_csr IS
1400         SELECT  col.table_id, lower(col.name) column_name
1401           FROM cn_calc_ext_tables_all map,
1402           cn_objects_all col
1403           WHERE map.alias = l_table_alias
1404           AND map.org_id = g_org_id
1405           AND col.table_id = map.external_table_id
1406           AND col.org_id = map.org_id
1407           AND col.object_type = 'COL'
1408           AND primary_key = 'Y'
1409           AND position IS NOT NULL
1410             ORDER BY position;
1411 
1412 BEGIN
1413      -- assume only one external table will be used. p_mode can be 'OUTPUT', 'PERF', 'INPUT1', 'INPUT'
1414      l_end_flag := FALSE;
1415      l_start_position := 1;
1416 
1417      WHILE l_end_flag <> TRUE LOOP
1418         separate_tbl_alias( x_sql_from,
1419                             l_start_position+0,
1420                             l_table_name,
1421                             l_table_alias,
1425         FOR l_col IN l_all_columns_csr LOOP
1422                             l_end_flag,
1423                             l_start_position   );
1424 
1426            -- if external table found in x_sql_from
1427            l_counter := 1;
1428 
1429            IF p_mode = 'INPUT1' THEN
1430               g_external_table_id := l_col.table_id;
1431            END IF;
1432 
1433            IF p_mode = 'INPUT0' THEN
1434               IF l_all_columns_csr%rowcount = 1 THEN
1435                  l_sql_select := 'select ' ||  l_table_alias || '.'||  l_col.column_name ;
1436                ELSE
1437                  l_sql_select := l_sql_select || ', ' || l_table_alias || '.'||  l_col.column_name ;
1438               END IF;
1439            END IF;
1440 
1441            IF p_mode = 'INPUT0 ' THEN
1442               IF l_all_columns_csr%rowcount = 1 THEN
1443                  l_sql_stmt :=  ' order by ' || l_table_alias || '.'|| l_col.column_name ;
1444                ELSIF l_all_columns_csr%rowcount > 1 THEN
1445                  l_sql_stmt :=  l_sql_stmt || '  ,' || l_table_alias || '.'|| l_col.column_name;
1446               END IF;
1447             ELSE
1448               l_sql_where := l_sql_where || ' and ' || l_table_alias || '.' || l_col.column_name || ' = ' || 'l_parameter_'||
1449                 To_char(l_all_columns_csr%rowcount);
1450            END IF;
1451         END LOOP;
1452         EXIT WHEN l_counter = 1;
1453      END LOOP;
1454 
1455      x_sql_where := x_sql_where || l_sql_where || l_sql_stmt;
1456      IF p_mode = 'INPUT0' THEN
1457         x_sql_select := l_sql_select;
1458       ELSE
1459         x_sql_select := x_sql_select || l_sql_select;
1460      END IF;
1461 exception
1462   when others then
1463     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1464       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
1465                      'cn.plsql.cn_formula_gen_pkg.handle_bonus_ex_tbl_orderby.exception',
1466          	          sqlerrm);
1467     end if;
1468     raise;
1469 END handle_bonus_ex_tbl_orderby;
1470 
1471 --       take care of RateResult in output_sql_select
1472 PROCEDURE handle_output_sql_select( x_sql_select IN OUT NOCOPY VARCHAR2,
1473                                     x_sql_from IN OUT NOCOPY VARCHAR2 ,
1474                                     x_sql_where IN OUT NOCOPY VARCHAR2 )
1475   IS
1476      l_position   NUMBER;
1477      l_operator_position NUMBER;
1478 BEGIN
1479      -- Find the place of RateResult
1480      l_position := instr(x_sql_select, 'rateresult');
1481 
1482      IF l_position > 0 THEN
1483         -- In ITD case, need to cumulate outputportion without RateResult
1484         IF (g_itd_flag = 'Y') THEN --IF g_itd_flag = 'Y' OR g_trx_group_code = 'GROUP' THEN
1485            l_operator_position := search_delimiter_select(x_sql_select, l_position);
1486 
1487            IF l_operator_position = 0 THEN
1488               -- there is only 'rateresult' found in output, nothing else
1489               x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1490             ELSIF (g_pq_payment_flag OR g_spq_payment_flag) THEN
1491 	      x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1492             ELSE
1493               x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, l_operator_position - l_position +1 ), ' ');
1494            END IF;
1495          ELSE
1496            x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1497         END IF;
1498      END IF;
1499 
1500      x_sql_select := replace(x_sql_select, 'cspq.input_achieved_itd', '(g_input_achieved_itd(1) + g_input_achieved)');
1501 END handle_output_sql_select;
1502 
1503 -- take care of modifying the sql_from and contruction sql_where
1504 PROCEDURE construct_sql_from_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1505                                     x_sql_from IN OUT NOCOPY VARCHAR2 ,
1506                                     x_sql_where IN OUT NOCOPY VARCHAR2 ) IS
1507 BEGIN
1508      handle_external_tables(x_sql_select, x_sql_from, x_sql_where);
1509      handle_comm_lines_where(x_sql_select, x_sql_from, x_sql_where);
1510      handle_comm_headers_where(x_sql_select, x_sql_from, x_sql_where);
1511      handle_cn_quotas_where(x_sql_select, x_sql_from, x_sql_where);
1512      handle_cn_srp_periods_where(x_sql_select, x_sql_from, x_sql_where);
1513      handle_srp_p_quotas_where(x_sql_select, x_sql_from, x_sql_where);
1514      handle_srp_q_assigns_where(x_sql_select, x_sql_from, x_sql_where);
1515      handle_srp_p_assigns_where(x_sql_select, x_sql_from, x_sql_where);
1516      handle_cn_salesreps_where( x_sql_select, x_sql_from, x_sql_where);
1517 END construct_sql_from_where;
1518 
1519 --   create the global variables for the formula package
1520 PROCEDURE  pkg_variables(spec_code        IN OUT NOCOPY cn_utils.code_type,
1521                          body_code        IN OUT NOCOPY cn_utils.code_type )  IS
1522 
1523 -- Added for 11.5.10 Performance Enhancments
1524 l_counter              NUMBER(15);
1525 l_variable_declaration VARCHAR2(1000);
1526 l_table_object_id      cn_objects.object_id%type;
1527 
1528 BEGIN
1529      cn_utils.appendcr(body_code);
1530      cn_utils.appindcr(body_code, '  g_commission_payed_ptd      NUMBER;');
1531      cn_utils.appindcr(body_code, '  g_commission_payed_itd      NUMBER;');
1532      cn_utils.appindcr(body_code, '  g_input_achieved_ptd        cn_formula_common_pkg.num_table_type;');
1536      cn_utils.appindcr(body_code, '  g_perf_achieved_ptd         NUMBER;');
1533      cn_utils.appindcr(body_code, '  g_input_achieved_itd        cn_formula_common_pkg.num_table_type;');
1534      cn_utils.appindcr(body_code, '  g_output_achieved_ptd       NUMBER;');
1535      cn_utils.appindcr(body_code, '  g_output_achieved_itd       NUMBER;');
1537      cn_utils.appindcr(body_code, '  g_perf_achieved_itd         NUMBER;');
1538      cn_utils.appindcr(body_code, '  g_rollover_flag             VARCHAR2(1) := ' || ''''||g_rollover_flag||''''||';');
1539      cn_utils.appindcr(body_code, '  g_intel_calc_flag           VARCHAR2(1);');
1540      cn_utils.appindcr(body_code, '  g_calc_type                 VARCHAR2(30);');
1541      cn_utils.appindcr(body_code, '  g_select_status_flag        VARCHAR2(30);');
1542      cn_utils.appindcr(body_code, '  g_formula_id                NUMBER := ' || g_formula_id || ' ; ');
1543      cn_utils.appindcr(body_code, '  g_number_dim                NUMBER := ' || g_number_dim || ' ; ');
1544      cn_utils.appindcr(body_code, '  g_split_flag                VARCHAR2(1) := ' || ''''|| g_split_flag ||''''||' ; ');
1545      cn_utils.appindcr(body_code, '  g_trx_group_code            VARCHAR2(30) := '|| ''''|| g_trx_group_code ||''''||' ; ');
1546      cn_utils.appindcr(body_code, '  g_itd_flag                  VARCHAR2(1) := ' || ''''|| g_itd_flag ||''''||' ; ');
1547      cn_utils.appindcr(body_code, '  g_input_achieved            NUMBER;');
1548      cn_utils.appindcr(body_code, '  g_output_achieved           NUMBER;');
1549      cn_utils.appindcr(body_code, '  g_org_id                    NUMBER := ' || g_org_id || ';');
1550 
1551 
1552      -- Added for 11.5.10 Performance Enhancments
1553      -- Declare record variable for each table accessed in input/output/perf expressions
1554      l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
1555      FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
1556         IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
1557            INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
1558 
1559                 l_variable_declaration :=  g_uniq_tbl_names_tbl(l_table_object_id).variable_name;
1560                 l_variable_declaration := l_variable_declaration||'                       '
1561                                           ||g_uniq_tbl_names_tbl(l_table_object_id).table_name
1562                                           ||'%ROWTYPE;';
1563                 cn_utils.appindcr(body_code,'  '|| l_variable_declaration);
1564         END IF;
1565         l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
1566      END LOOP;
1567 
1568      -- Added for 11.5.10 Performance Enhancments
1569      -- Declare record type to hold all columns fetched from CH and CL tables
1570      cn_utils.appendcr(body_code);
1571       cn_utils.appindcr(body_code ,'TYPE comm_type IS RECORD ');
1572       cn_utils.appindcr(body_code ,'(');
1573       FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
1574 
1575           IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
1576            cn_utils.appindcr(body_code ,'          '||nvl(g_comm_tbl_clmn_nms_tbl(i).column_alias, g_comm_tbl_clmn_nms_tbl(i).column_name)||'            '||g_comm_tbl_clmn_nms_tbl(i).table_name||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||'%TYPE,'  );
1577           ELSE
1578            cn_utils.appindcr(body_code ,'          '||nvl(g_comm_tbl_clmn_nms_tbl(i).column_alias, g_comm_tbl_clmn_nms_tbl(i).column_name)||'            '||g_comm_tbl_clmn_nms_tbl(i).table_name||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||'%TYPE'  );
1579           END IF;
1580 
1581       END LOOP;
1582 
1583       cn_utils.appindcr(body_code ,');');
1584       cn_utils.appindcr(body_code ,' g_commission_rec                comm_type ;');
1585 
1586 
1587 
1588      -- create package variables for pe references
1589      IF (g_pe_reference_tbl.COUNT > 0) THEN
1590         FOR i IN g_pe_reference_tbl.first..g_pe_reference_tbl.last LOOP
1591            cn_utils.appendcr(body_code, '  g_'||REPLACE(g_pe_reference_tbl(i), '.', '_')||'      NUMBER;');
1592         END LOOP;
1593      END IF;
1594      cn_utils.appendcr(body_code);
1595 END pkg_variables;
1596 
1597 PROCEDURE convert_clob_to_string ( p_clob_loc clob, x_string OUT NOCOPY VARCHAR2) IS
1598      l_amount NUMBER;
1599 BEGIN
1600      l_amount := dbms_lob.getlength(p_clob_loc);
1601      dbms_lob.read( p_clob_loc, l_amount, 1 , x_string);
1602 
1603      IF (g_pe_id_tbl.COUNT > 0) THEN
1604         FOR i IN g_pe_id_tbl.first..g_pe_id_tbl.last LOOP
1605            x_string := REPLACE(x_string, g_pe_id_tbl(i)||'PE.', 'g_'||g_pe_id_tbl(i)||'PE_');
1606         END LOOP;
1607      END IF;
1608 END convert_clob_to_string;
1609 
1610 --   construct the get_input procedure for the formula package.
1611 PROCEDURE get_input (         spec_code        IN OUT NOCOPY cn_utils.code_type,
1612                         body_code        IN OUT NOCOPY cn_utils.code_type )
1613   IS
1614     procedure_name        cn_obj_procedures_v.name%TYPE;
1615     procedure_desc        cn_obj_procedures_v.description%TYPE;
1616     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
1617     package_spec_id        cn_obj_packages_v.package_id%TYPE;
1618     x_repository_id        cn_repositories.repository_id%TYPE;
1619 
1620     l_input_sql_select        varchar2(8000);
1621     l_input_sql_from        varchar2(4000);
1622     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
1623 
1624     l_input_sql_select_clob clob;
1625     l_input_sql_from_clob   clob;
1626 
1627     l_counter NUMBER;
1628     l_dim_unit_code VARCHAR2(30);
1629 
1630     CURSOR l_mul_inputs_csr IS
1634           AND org_id = g_org_id
1631        SELECT rate_dim_sequence, calc_sql_exp_id, nvl(split_flag, 'N') split_flag, nvl(cumulative_flag, 'N') cumulative_flag
1632          FROM cn_formula_inputs_all
1633         WHERE calc_formula_id = g_formula_id
1635         ORDER BY rate_dim_sequence;
1636 
1637     -- cursor to get the dim_unit_code
1638     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
1639        SELECT dim_unit_code
1640          FROM cn_rate_dimensions_all
1641         WHERE rate_dimension_id = (SELECT rate_dimension_id
1642                                      FROM cn_rate_sch_dims_all
1643                                     WHERE rate_dim_sequence = p_rate_dim_sequence
1644                                       AND rate_schedule_id = (SELECT rate_schedule_id
1645                                                                 FROM cn_rt_formula_asgns_all
1646                                                                WHERE calc_formula_id = g_formula_id
1647                                                                  AND org_id = g_org_id
1648                                                                  AND ROWNUM = 1));
1649 
1650     CURSOR l_sql_select_from_csr (l_calc_sql_exp_id NUMBER) IS
1651        SELECT  sql_select input_sql_select, sql_from input_sql_from
1652          FROM  cn_calc_sql_exps_all
1653          WHERE calc_sql_exp_id = l_calc_sql_exp_id;
1654 
1655 BEGIN
1656      procedure_name := 'get_input';
1657      procedure_desc := 'This procedure is to calculate the input';
1658      parameter_list := 'p_commission_line_id NUMBER, p_salesrep_id NUMBER,' ||
1659        'p_period_id NUMBER, p_quota_id    NUMBER, p_srp_plan_assign_id NUMBER,' ||
1660        'p_processed_date DATE, x_mul_input_tbl IN OUT NOCOPY cn_formula_common_pkg.mul_input_tbl_type';
1661      IF g_trx_group_code = 'GROUP' THEN
1662         parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2, p_start_period_id NUMBER';
1663      END IF;
1664 
1665      proc_init(procedure_name, procedure_desc, parameter_list,
1666                'P', null , package_spec_id, x_repository_id,
1667                spec_code, body_code);
1668 
1669      cn_utils.appindcr(body_code, '  l_input              NUMBER;');
1670      cn_utils.appindcr(body_code, '  l_input_string     VARCHAR2(30);');
1671      cn_utils.appindcr(body_code, '  l_itd_target       NUMBER;');
1672      cn_utils.appendcr(body_code);
1673      cn_utils.appendcr(body_code, 'BEGIN');
1674 
1675      IF g_trx_group_code = 'INDIVIDUAL' THEN
1676         l_counter := 1;
1677         FOR l_mul_input IN l_mul_inputs_csr LOOP
1678            OPEN dim_type(l_mul_input.rate_dim_sequence);
1679            FETCH dim_type INTO l_dim_unit_code;
1680            CLOSE dim_type;
1681 
1682            l_input_sql_where  := 'WHERE 1=1 ';
1683 
1684            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1685            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1686            CLOSE l_sql_select_from_csr;
1687 
1688            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1689            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1690            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1691            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1692 
1693            -- if other tables other than the standard tables are used in
1694            -- the input expression we will retain the select statment in
1695            -- get input othewise we will replace it with a expression using
1696            -- global variable which are prepopulated in calculate_quota
1697            IF g_other_tabused_tbl(l_mul_input.calc_sql_exp_id) = 'Y' THEN
1698 
1699               construct_sql_from_where (l_input_sql_select,
1700                                         l_input_sql_from,
1701                                         l_input_sql_where );
1702               split_long_sql( body_code, l_input_sql_select, 'SELECT');
1703 
1704               IF (l_dim_unit_code = 'STRING') THEN
1705                  cn_utils.appindcr(body_code, ' into l_input_string ');
1706                ELSE
1707                  cn_utils.appindcr(body_code, '   into l_input ');
1708               END IF;
1709               split_long_sql( body_code, l_input_sql_from, 'FROM');
1710               split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1711            ELSE
1712               -- Added for 11.5.10 Performance Enhancments
1713               -- Replace the select with a expression which uses the prefetched column values
1714               -- held in record variables
1715 
1716               -- Added the call to below procedure for bugfix 3574402
1717               construct_sql_from_where (l_input_sql_select,
1718 	                                              l_input_sql_from,
1719 	                                              l_input_sql_where );
1720 
1721 
1722               IF g_non_plsql_func_used_tbl(l_mul_input.calc_sql_exp_id) = 'N' THEN
1723                       IF (l_dim_unit_code = 'STRING') THEN
1724                           cn_utils.appindcr(body_code, ' l_input_string := ');
1725                       ELSE
1726                           cn_utils.appindcr(body_code, 'l_input := ');
1727                       END IF;
1728               ELSE
1729                      cn_utils.appindcr(body_code,'SELECT ');
1730               END IF;
1731               -- add the select clause of the expression with column names replaced with
1732               -- global package variables
1733               FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
1734                  IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = l_mul_input.calc_sql_exp_id THEN
1738                                                                    g_exp_tbl_dtls_tbl(i).column_name),
1735                     IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
1736                        g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
1737                        l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1739                                                                    g_exp_tbl_dtls_tbl(i).variable_name);
1740 
1741                     ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
1742             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
1743             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
1744             			boolena varriable
1745             			*/
1746             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
1747             	                       l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1748                                                                                g_exp_tbl_dtls_tbl(i).column_name),
1749                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
1750             			else
1751             	                       l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1752                                                                                g_exp_tbl_dtls_tbl(i).column_name),
1753                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
1754             			end if;
1755                     ELSE
1756                        l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1757                                                                    g_exp_tbl_dtls_tbl(i).column_name),
1758                                                                    'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
1759                     END IF;
1760                  END IF;
1761               END LOOP;
1762               -- if non plsq function like DECODE is used we cannot use just an expression
1763               -- so select expression from dual;
1764               IF g_non_plsql_func_used_tbl(l_mul_input.calc_sql_exp_id) = 'N' THEN
1765                  -- fix for bug 3187576
1766                  --cn_utils.appindcr(body_code,REPLACE(l_input_sql_select,'select',NULL)||';');
1767                  split_long_sql( body_code, REPLACE(l_input_sql_select,'select',NULL)||';', 'SELECT');
1768 
1769               ELSE
1770                  -- fix for bug 3187576
1771                  --cn_utils.appindcr(body_code,REPLACE(l_input_sql_select,'select',NULL));
1772                  split_long_sql( body_code, REPLACE(l_input_sql_select,'select',NULL), 'SELECT');
1773 
1774                  IF (l_dim_unit_code = 'STRING') THEN
1775                               cn_utils.appindcr(body_code, ' into l_input_string ');
1776                  ELSE
1777                               cn_utils.appindcr(body_code, '   into l_input ');
1778                  END IF;
1779                  cn_utils.appindcr(body_code, '   FROM  DUAL; ');
1780               END IF;
1781             END IF;
1782 
1783            cn_utils.appendcr(body_code);
1784            cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1785            cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter ||').rate_dim_sequence := ' || l_mul_input.rate_dim_sequence || ' ; ' );
1786 
1787            IF (l_dim_unit_code = 'STRING') THEN
1788               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').input_string := l_input_string;' );
1789             ELSE
1790               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').input_amount := l_input;' );
1791               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter ||').amount := l_input;' );
1792            END IF;
1793 
1794            IF (l_mul_input.cumulative_flag = 'N') THEN --IF g_cumulative_flag = 'N'  THEN
1795               -- 1.single input with non accumulative
1796               -- 2.multiple inputs case is always non accumulative
1797               IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN -- need to split
1798                  cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1799                ELSE -- non cumulative with no split
1800                  cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := l_input;' );
1801               END IF;
1802             ELSE -- single input with cumulative_flag ON. we need to distinguish
1803               IF (g_cumulative_input_no = 1) THEN
1804                  g_cumulative_input_no := l_counter;
1805               END IF;
1806 
1807               IF g_itd_flag = 'N' THEN
1808                  IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN -- need to split
1809                     cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('||l_mul_input.rate_dim_sequence||');' );
1810                   ELSE
1811                     cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('||l_mul_input.rate_dim_sequence||') + l_input;' );
1812                  END IF;
1813                ELSE -- g_itd_flag = 'Y'
1814                  cn_utils.appendcr(body_code);
1815                  IF g_pq_target_flag OR g_spq_target_flag  THEN
1816                     IF g_pq_target_flag THEN
1820 
1817                        cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
1818                        cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
1819                     END IF;
1821                     IF g_spq_target_flag THEN
1822                        cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
1823                        cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
1824                        cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
1825                     END IF;
1826 
1827                     cn_utils.appendcr(body_code);
1828 
1829                     IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1830                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := (l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||')) ');
1831                        cn_utils.appindcr(body_code, '     /l_itd_target;' );
1832                        cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1833                      ELSE
1834                        --cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input / l_itd_target; ');
1835                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').base_amount := (l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||'))');
1836                        cn_utils.appindcr(body_code, '      /l_itd_target;' );
1837                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := x_mul_input_tbl('|| l_counter || ').base_amount; ');
1838                     END IF;
1839                   ELSE
1840                     IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1841                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||');' );
1842                        cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1843                      ELSE
1844                        --cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input; ');
1845                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').base_amount := l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||');' );
1846                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := x_mul_input_tbl('|| l_counter || ').base_amount; ');
1847                     END IF;
1848                  END IF;
1849               END IF;
1850            END IF;
1851            cn_utils.appendcr(body_code);
1852            l_counter := l_counter+1;
1853         END LOOP;
1854       ELSE -- g_trx_group_code = 'GROUP'
1855         cn_utils.appindcr(body_code, ' IF p_commission_line_id IS NOT NULL THEN ');
1856         cn_utils.appendcr(body_code);
1857 
1858         g_trx_group_code := 'INDIVIDUAL';
1859         l_counter :=1;
1860         FOR l_mul_input IN l_mul_inputs_csr LOOP
1861            l_input_sql_where  := 'WHERE 1=1 ';
1862 
1863            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1864            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1865            CLOSE l_sql_select_from_csr;
1866 
1867            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1868            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1869            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1870            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1871 
1872            construct_sql_from_where (l_input_sql_select,
1873                                      l_input_sql_from,
1874                                      l_input_sql_where );
1875 
1876            split_long_sql( body_code, l_input_sql_select, 'SELECT');
1877            cn_utils.appindcr(body_code, '   into l_input ');
1878            split_long_sql( body_code, l_input_sql_from, 'FROM');
1879            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1880 
1881 
1882            cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1883 
1884         END LOOP;
1885         cn_utils.appindcr(body_code, ' ELSE  ');
1886         cn_utils.appendcr(body_code);
1887 
1888         g_trx_group_code := 'GROUP';
1889         l_counter :=1;
1890         FOR l_mul_input IN l_mul_inputs_csr LOOP
1891 
1892            l_input_sql_where  := 'WHERE 1=1 ';
1893 
1894            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1895            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1896            CLOSE l_sql_select_from_csr;
1897 
1898            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1899            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1900            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1901            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1902 
1903            construct_sql_from_where (l_input_sql_select,
1904                                      l_input_sql_from,
1905                                      l_input_sql_where );
1906 
1907            cn_utils.appindcr(body_code, ' BEGIN ');
1908            split_long_sql( body_code, l_input_sql_select, 'SELECT');
1909            cn_utils.appindcr(body_code, '   into l_input ');
1910            split_long_sql( body_code, l_input_sql_from, 'FROM');
1911            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1912            cn_utils.appendcr(body_code);
1916            cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
1913            cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1914            cn_utils.appendcr(body_code);
1915            cn_utils.appindcr(body_code, ' EXCEPTION WHEN OTHERS THEN ');
1917            cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
1918            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_input.exception'', ');
1919            cn_utils.appindcr(body_code, '	          sqlerrm); ');
1920            cn_utils.appindcr(body_code, '   end if; ');
1921            cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_input: ''); ');
1922            cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
1923            cn_utils.appindcr(body_code, '   raise; ');
1924            cn_utils.appindcr(body_code, ' END; ');
1925            cn_utils.appendcr(body_code);
1926            cn_utils.appindcr(body_code, '  l_input := nvl(l_input,0); ');
1927            cn_utils.appindcr(body_code, '  x_mul_input_tbl('||
1928                              l_counter ||').rate_dim_sequence := '
1929                              || l_mul_input.rate_dim_sequence || ' ; ' );
1930            cn_utils.appendcr(body_code);
1931            cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1932                              ').input_amount := l_input; ');
1933            cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1934                              ').amount := l_input; ');
1935 
1936            IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1937               cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1938                                 ').base_amount := 0; ');
1939             ELSE
1940               cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1941                                 ').base_amount := l_input; ');
1942            END IF;
1943 
1944 
1945            cn_utils.appindcr(body_code, 'g_input_achieved := x_mul_input_tbl(1).input_amount; ');
1946 
1947            l_counter := l_counter+1;
1948         END LOOP;
1949         cn_utils.appindcr(body_code, ' END IF;  ');
1950      END IF;
1951 
1952      if (g_trx_group_code <> 'GROUP') then
1953        cn_utils.appindcr(body_code, 'g_input_achieved := x_mul_input_tbl(1).input_amount; ');
1954      end if;
1955 
1956      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
1957      cn_utils.appindcr(body_code, '  if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
1958      cn_utils.appindcr(body_code, '     FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
1959      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_input.exception'', ');
1960      cn_utils.appindcr(body_code, '	          sqlerrm); ');
1961      cn_utils.appindcr(body_code, '  end if; ');
1962      cn_utils.appindcr(body_code, '  cn_message_pkg.debug(''Exception occurs in get_input: ''); ');
1963      cn_utils.appindcr(body_code, '  cn_message_pkg.debug(sqlerrm); ');
1964      cn_utils.appindcr(body_code, '  raise; ');
1965 
1966      cn_utils.proc_end( procedure_name, 'N', body_code );
1967 EXCEPTION
1968   when others then
1969     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1970       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
1971                      'cn.plsql.cn_formula_gen_pkg.get_input.exception',
1972          	          sqlerrm);
1973     end if;
1974     raise;
1975 END get_input;
1976 
1977 --   construct the get_commission procedure for the formula package.
1978 PROCEDURE get_commission (spec_code        IN OUT NOCOPY cn_utils.code_type,
1979                           body_code        IN OUT NOCOPY cn_utils.code_type )
1980 IS
1981     procedure_name        cn_obj_procedures_v.name%TYPE;
1982     procedure_desc        cn_obj_procedures_v.description%TYPE;
1983     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
1984     package_spec_id        cn_obj_packages_v.package_id%TYPE;
1985     x_repository_id        cn_repositories.repository_id%TYPE;
1986 
1987     l_output_sql_select        varchar2(8000);
1988     l_output_sql_from        varchar2(4000);
1989     l_output_sql_where   varchar2(4000) := 'WHERE 1=1 ';
1990 
1991     l_operator_position NUMBER;
1992     l_operator          VARCHAR2(1);
1993 
1994     l_output_sql_select_clob clob;
1995     l_output_sql_from_clob   clob;
1996     l_out_calc_sql_exp_id   cn_calc_sql_exps.calc_sql_exp_id%TYPE;
1997 
1998     CURSOR l_sql_select_from_csr IS
1999        SELECT calc_sql_exp_id,
2000               sql_select output_sql_select,
2001               sql_from output_sql_from
2002          FROM cn_calc_sql_exps_all
2003         WHERE calc_sql_exp_id = (SELECT output_exp_id
2004                                    FROM cn_calc_formulas_all
2005                                   WHERE calc_formula_id = g_formula_id
2006                                     AND org_id = g_org_id);
2007 
2008 BEGIN
2009      procedure_name := 'get_commission';
2010      procedure_desc := 'This procedure is to calculate the commission';
2011      parameter_list := 'p_commission_line_id NUMBER, p_salesrep_id NUMBER, p_period_id NUMBER, p_quota_id NUMBER, p_srp_plan_assign_id NUMBER, p_rate NUMBER';
2012      IF g_trx_group_code = 'GROUP' THEN
2013        parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2, p_start_period_id NUMBER';
2014      END IF;
2015 
2016      proc_init(procedure_name, procedure_desc, parameter_list,'F', 'NUMBER', package_spec_id, x_repository_id,spec_code, body_code);
2017 
2018      cn_utils.appindcr(body_code, '  l_commission              NUMBER;');
2022 
2019      cn_utils.appindcr(body_code, '  l_output              NUMBER;');
2020      cn_utils.appendcr(body_code);
2021      cn_utils.appendcr(body_code, 'BEGIN');
2023      IF g_trx_group_code = 'INDIVIDUAL' THEN
2024         OPEN l_sql_select_from_csr;
2025         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2026         CLOSE l_sql_select_from_csr;
2027 
2028         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2029         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2030         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2031         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2032 
2033         -- found out whether rateresult is used in output sql and what's the operator if any
2034         g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
2035 
2036         l_operator_position := search_delimiter_select(l_output_sql_select, 1);
2037         IF l_operator_position > 0 THEN
2038            l_operator := substr(l_output_sql_select, l_operator_position, 1);
2039         END IF;
2040 
2041         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2042         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2043 
2044         -- Added for 11.5.10 Performance Enhancments
2045         -- if other tables other than the standard tables are used in
2046         -- the output expression we will retain the select statment in
2047         -- otherwise Replace the select with a expression which uses
2048         -- the prefetched column values held in record variables
2049 
2050         IF g_other_tabused_tbl(l_out_calc_sql_exp_id) = 'Y' THEN
2051            split_long_sql( body_code, l_output_sql_select, 'SELECT');
2052            cn_utils.appindcr(body_code, '   into l_commission ');
2053            split_long_sql( body_code, l_output_sql_from, 'FROM');
2054            split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2055         ELSE
2056            IF g_non_plsql_func_used_tbl(l_out_calc_sql_exp_id) = 'N' THEN
2057               cn_utils.appindcr(body_code, 'l_commission := ');
2058            ELSE
2059               cn_utils.appindcr(body_code,'SELECT ');
2060            END IF;
2061            FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
2062               IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = l_out_calc_sql_exp_id THEN
2063                  IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
2064                      g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
2065                      l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2066                                                                    g_exp_tbl_dtls_tbl(i).column_name),
2067                                                                    g_exp_tbl_dtls_tbl(i).variable_name);
2068                  ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
2069             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
2070             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
2071             			boolena varriable
2072             			*/
2073             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
2074             	                       l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2075                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2076                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
2077             			else
2078             	                       l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2079                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2080                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2081             			end if;
2082                  ELSE
2083                      l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2084                                                                    g_exp_tbl_dtls_tbl(i).column_name),
2085                                                                    'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2086                  END IF;
2087               END IF;
2088            END LOOP;
2089            IF g_non_plsql_func_used_tbl(l_out_calc_sql_exp_id) = 'N' THEN
2090               -- fix for bug 3187576
2091               --cn_utils.appindcr(body_code,REPLACE(l_output_sql_select,'select',NULL)||';');
2092               split_long_sql( body_code, REPLACE(l_output_sql_select,'select',NULL)||';', 'SELECT');
2093            ELSE
2094               -- fix for bug 3187576
2095               --cn_utils.appindcr(body_code,REPLACE(l_output_sql_select,'select',NULL));
2096               split_long_sql( body_code, REPLACE(l_output_sql_select,'select',NULL), 'SELECT');
2097               cn_utils.appindcr(body_code, '   into l_commission ');
2098               cn_utils.appindcr(body_code, '   FROM  DUAL; ');
2099            END IF;
2100         END IF;
2101 
2102         cn_utils.appendcr(body_code);
2103         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2104 
2105         IF g_itd_flag = 'Y' THEN
2106            IF g_pq_payment_flag OR g_spq_payment_flag THEN
2107               -- OR g_no_trx_flag THEN
2108               -- since itd_payment is used, we don't need to accumulate output_achieved
2112               cn_utils.appindcr(body_code, '  g_output_achieved := l_commission; ');
2109               cn_utils.appindcr(body_code, '  g_output_achieved := 0; ');
2110               cn_utils.appindcr(body_code, '  l_commission := l_commission - '|| ' g_commission_payed_itd ;' );
2111             ELSE -- we need to accumulate the output
2113               -- if x_rate is used in output
2114               IF g_rate_flag THEN
2115                  IF l_operator_position > 0 THEN
2116                     cn_utils.appindcr(body_code, '  l_commission := p_rate '||l_operator||
2117                                       ' (g_output_achieved_itd + g_output_achieved) - g_commission_payed_itd;');
2118                   ELSE
2119                     cn_utils.appindcr(body_code, '  l_commission := p_rate - '|| 'g_commission_payed_itd ;' );
2120                  END IF;
2121                ELSE
2122                  cn_utils.appindcr(body_code, '  l_commission := g_output_achieved_itd + g_output_achieved - g_commission_payed_itd ;');
2123               END IF;
2124            END IF;
2125         END IF;
2126      ELSE  -- group by case
2127         cn_utils.appindcr(body_code, '  IF p_commission_line_id IS NOT NULL THEN ');
2128         cn_utils.appendcr(body_code);
2129         -- construct the code for testing trx by trx
2130         g_trx_group_code := 'INDIVIDUAL';
2131         l_output_sql_where := 'WHERE 1=1 ';
2132 
2133         OPEN l_sql_select_from_csr;
2134         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2135         CLOSE l_sql_select_from_csr;
2136 
2137         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2138         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2139         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2140         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2141 
2142         -- found out whether rateresult is used in output sql and what's the operator if any
2143         g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
2144 
2145         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2146         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2147 
2148         split_long_sql( body_code, l_output_sql_select, 'SELECT');
2149         cn_utils.appindcr(body_code, '   into l_commission ');
2150         split_long_sql( body_code, l_output_sql_from, 'FROM');
2151         split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2152         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2153         cn_utils.appindcr(body_code, '  ELSE                          ');
2154         cn_utils.appendcr(body_code);
2155         -- construct the code for computing the output and commission
2156         g_trx_group_code := 'GROUP';
2157         l_output_sql_where := 'WHERE 1=1 ';
2158 
2159         OPEN l_sql_select_from_csr;
2160         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2161         CLOSE l_sql_select_from_csr;
2162 
2163         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2164         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2165         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2166         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2167 
2168         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2169         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2170 
2171         cn_utils.appindcr(body_code, ' BEGIN ');
2172         split_long_sql( body_code, l_output_sql_select, 'SELECT');
2173         cn_utils.appindcr(body_code, '   into l_commission ');
2174         split_long_sql( body_code, l_output_sql_from, 'FROM');
2175         split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2176         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2177         cn_utils.appendcr(body_code);
2178         cn_utils.appindcr(body_code, 'EXCEPTION WHEN NO_DATA_FOUND THEN ');
2179         cn_utils.appindcr(body_code, '    l_commission := nvl(l_commission,0); ');
2180         cn_utils.appindcr(body_code, ' when others then ');
2181         cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2182         cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2183         cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_commission.exception'', ');
2184         cn_utils.appindcr(body_code, '	          sqlerrm); ');
2185         cn_utils.appindcr(body_code, '   end if; ');
2186         cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_commission: ''); ');
2187         cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2188         cn_utils.appindcr(body_code, '   raise; ');
2189         cn_utils.appindcr(body_code, 'END;');
2190         cn_utils.appendcr(body_code);
2191         cn_utils.appindcr(body_code, '      g_output_achieved_ptd := '||'l_commission - g_output_achieved_itd ;' );
2192         cn_utils.appindcr(body_code, '      g_output_achieved_itd := l_commission; ');
2193         cn_utils.appendcr(body_code);
2194         cn_utils.appindcr(body_code, '  END IF; ' );
2195      END IF;
2196 
2197      cn_utils.appindcr(body_code, '  return l_commission; '        );
2198 
2199      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
2200      cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2201      cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2205      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_commission: ''); ');
2202      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_commission.exception'', ');
2203      cn_utils.appindcr(body_code, '	          sqlerrm); ');
2204      cn_utils.appindcr(body_code, '   end if; ');
2206      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2207      cn_utils.appindcr(body_code, '   raise; ');
2208 
2209      cn_utils.proc_end( procedure_name, 'N', body_code );
2210 EXCEPTION
2211   when others then
2212     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
2213       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
2214                      'cn.plsql.cn_formula_gen_pkg.get_commission.exception',
2215          	          sqlerrm);
2216     end if;
2217     raise;
2218 END get_commission;
2219 
2220 --construct the get_perf procedure for the formula package.
2221 PROCEDURE get_perf (spec_code        IN OUT NOCOPY cn_utils.code_type,
2222                     body_code        IN OUT NOCOPY cn_utils.code_type )
2223 IS
2224     procedure_name        cn_obj_procedures_v.name%TYPE;
2225     procedure_desc        cn_obj_procedures_v.description%TYPE;
2226     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
2227     package_spec_id        cn_obj_packages_v.package_id%TYPE;
2228     x_repository_id        cn_repositories.repository_id%TYPE;
2229 
2230     l_perf_sql_select        varchar2(8000);
2231     l_perf_sql_from        varchar2(4000);
2232     l_perf_sql_where   varchar2(4000) := 'WHERE 1=1 ';
2233 
2234     l_perf_sql_select_clob  clob;
2235     l_perf_sql_from_clob        clob;
2236     l_input_sql_exp_id          cn_calc_sql_exps.calc_sql_exp_id%TYPE;
2237 
2238     CURSOR l_perf_select_from_csr IS
2239         select sql_select, sql_from
2240           from cn_calc_sql_exps_all
2241           where calc_sql_exp_id = g_perf_measure_id;
2242 
2243     CURSOR l_input_select_from_csr IS
2244        SELECT calc_sql_exp_id,
2245               sql_select input_sql_select,
2246               sql_from input_sql_from
2247          FROM cn_calc_sql_exps_all
2248          WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
2249                                   FROM cn_formula_inputs_all
2250                                   WHERE calc_formula_id = g_formula_id
2251                                   AND org_id = g_org_id
2252                                   AND rate_dim_sequence = 1);
2253 
2254 BEGIN
2255      procedure_name := 'get_perf';
2256      procedure_desc := 'This procedure is to accumulate performance measure.';
2257      parameter_list := 'p_commission_line_id NUMBER, p_salesrep_id NUMBER,' ||
2258        'p_period_id NUMBER, p_quota_id NUMBER, p_srp_plan_assign_id NUMBER, p_start_date DATE';
2259      IF g_trx_group_code = 'GROUP' THEN
2260         parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2 ' ||
2261           ', p_start_period_id NUMBER';
2262      END IF;
2263 
2264      IF g_formula_type = 'B' THEN
2265         parameter_list := parameter_list || ',p_credit_type_id NUMBER, '||
2266           'p_role_id NUMBER';
2267      END IF;
2268 
2269      proc_init(procedure_name, procedure_desc, parameter_list,'F', 'NUMBER' ,
2270                package_spec_id, x_repository_id,spec_code, body_code);
2271 
2272      cn_utils.appindcr(body_code, '  l_perf              NUMBER;');
2273      cn_utils.appendcr(body_code);
2274      cn_utils.appendcr(body_code, 'BEGIN');
2275 
2276      IF g_trx_group_code = 'INDIVIDUAL' THEN
2277         IF g_perf_measure_id IS NOT NULL THEN
2278            OPEN l_perf_select_from_csr;
2279            FETCH l_perf_select_from_csr
2280              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2281            CLOSE l_perf_select_from_csr;
2282 
2283            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2284            l_perf_sql_select := lower_str('select ' || l_perf_sql_select);
2285            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2286            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2287 
2288          ELSE   /* default to be the input with the lowest input_sequence */
2289            OPEN l_input_select_from_csr;
2290            FETCH l_input_select_from_csr
2291            INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2292            CLOSE l_input_select_from_csr;
2293 
2294            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2295            l_perf_sql_select := lower_str('select ' || l_perf_sql_select);
2296            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2297            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2298         END IF;
2299 
2300 
2301         construct_sql_from_where(l_perf_sql_select,
2302                                  l_perf_sql_from,
2303                                  l_perf_sql_where     );
2304         -- Added for 11.5.10 Performance Enhancments
2305         -- Replace the select with a expression which uses
2306         -- the prefetched column values held in record variables
2307         IF g_other_tabused_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'Y' THEN
2308            split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2309            cn_utils.appindcr(body_code, '   into l_perf ');
2310            split_long_sql( body_code, l_perf_sql_from, 'FROM');
2311            split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2312         ELSE
2313            IF g_non_plsql_func_used_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'N' THEN
2314                    cn_utils.appindcr(body_code, 'l_perf := ');
2318            FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
2315            ELSE
2316                    cn_utils.appindcr(body_code,'SELECT ');
2317            END IF;
2319               IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = NVL(g_perf_measure_id,l_input_sql_exp_id) THEN
2320                  IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
2321                    g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
2322                        l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2323                                                                 g_exp_tbl_dtls_tbl(i).column_name),
2324                                                                 g_exp_tbl_dtls_tbl(i).variable_name);
2325                  ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
2326             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
2327             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
2328             			boolena varriable
2329             			*/
2330             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
2331             	                       l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2332                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2333                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
2334             			else
2335             	                       l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2336                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2337                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2338             			end if;
2339                  ELSE
2340                        l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2341                                                                 g_exp_tbl_dtls_tbl(i).column_name),
2342                                                                 'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2343                  END IF;
2344               END IF;
2345            END LOOP;
2346            IF g_non_plsql_func_used_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'N' THEN
2347               -- fix for bug 3187576
2348               --cn_utils.appindcr(body_code,REPLACE(l_perf_sql_select,'select',NULL)||';');
2349               split_long_sql( body_code, REPLACE(l_perf_sql_select,'select',NULL)||';', 'SELECT');
2350            ELSE
2351               -- fix for bug 3187576
2352               --cn_utils.appindcr(body_code,REPLACE(l_perf_sql_select,'select',NULL));
2353               split_long_sql( body_code, REPLACE(l_perf_sql_select,'select',NULL), 'SELECT');
2354               cn_utils.appindcr(body_code, '   into l_perf ');
2355               cn_utils.appindcr(body_code, '   FROM  DUAL; ');
2356            END IF;
2357         END IF;
2358         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2359      ELSE -- group by case
2360             cn_utils.appindcr(body_code, '  IF p_commission_line_id IS NOT NULL THEN ');
2361         cn_utils.appendcr(body_code);
2362         -- construct the code for testing trx by trx
2363         g_trx_group_code := 'INDIVIDUAL';
2364         l_perf_sql_where := 'WHERE 1=1 ';
2365 
2366         IF g_perf_measure_id IS NOT NULL THEN
2367            OPEN l_perf_select_from_csr;
2368            FETCH l_perf_select_from_csr
2369              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2370            CLOSE l_perf_select_from_csr;
2371 
2372            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2373            l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
2374            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2375            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2376 
2377          ELSE   /* default to be the input with the lowest input_sequence */
2378            OPEN l_input_select_from_csr;
2379            FETCH l_input_select_from_csr
2380              INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2381            CLOSE l_input_select_from_csr;
2382 
2383            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2384            l_perf_sql_select := lower_str('select ' || l_perf_sql_select );
2385            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2386            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2387 
2388         END IF;
2389         construct_sql_from_where(l_perf_sql_select,
2390                                  l_perf_sql_from,
2391                                  l_perf_sql_where     );
2392 
2393         split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2394         cn_utils.appindcr(body_code, '   into l_perf ');
2395         split_long_sql( body_code, l_perf_sql_from, 'FROM');
2396         split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2397 
2398         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2399 
2400         cn_utils.appindcr(body_code, ' ELSE                          ');
2401         cn_utils.appendcr(body_code);
2402         -- construct the code for computing the perf
2403         g_trx_group_code := 'GROUP';
2404         l_perf_sql_where := 'WHERE 1=1 ';
2405 
2406         IF g_perf_measure_id IS NOT NULL THEN
2407            OPEN l_perf_select_from_csr;
2411 
2408            FETCH l_perf_select_from_csr
2409              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2410            CLOSE l_perf_select_from_csr;
2412            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2413            l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
2414            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2415            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2416 
2417          ELSE   /* default to be the input with the lowest input_sequence */
2418            OPEN l_input_select_from_csr;
2419            FETCH l_input_select_from_csr
2420              INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2421            CLOSE l_input_select_from_csr;
2422 
2423            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2424            l_perf_sql_select := lower_str('select ' || l_perf_sql_select );
2425            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2426            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2427         END IF;
2428         construct_sql_from_where(l_perf_sql_select,
2429                                  l_perf_sql_from,
2430                                  l_perf_sql_where     );
2431 
2432         cn_utils.appindcr(body_code, '   BEGIN ');
2433         split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2434         cn_utils.appindcr(body_code, '   into l_perf ');
2435         split_long_sql( body_code, l_perf_sql_from, 'FROM');
2436         split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2437         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2438         cn_utils.appindcr(body_code, '   EXCEPTION WHEN NO_DATA_FOUND THEN ');
2439         cn_utils.appindcr(body_code, '      l_perf := nvl(l_perf,0); ');
2440         cn_utils.appindcr(body_code, '      WHEN others then ');
2441         cn_utils.appindcr(body_code, '        if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2442         cn_utils.appindcr(body_code, '          FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2443         cn_utils.appindcr(body_code, '             ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_perf.exception'', ');
2444         cn_utils.appindcr(body_code, '	            sqlerrm); ');
2445         cn_utils.appindcr(body_code, '        end if; ');
2446         cn_utils.appindcr(body_code, '        cn_message_pkg.debug(''Exception occurs in get_perf: ''); ');
2447         cn_utils.appindcr(body_code, '        cn_message_pkg.debug(sqlerrm); ');
2448         cn_utils.appindcr(body_code, '        raise; ');
2449         cn_utils.appindcr(body_code, '   END;');
2450         cn_utils.appendcr(body_code);
2451         cn_utils.appindcr(body_code, '  END IF;  ');
2452      END IF;
2453      cn_utils.appendcr(body_code);
2454      cn_utils.appindcr(body_code, '  return l_perf;        ');
2455 
2456      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
2457      cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2458      cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2459      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_perf.exception'', ');
2460      cn_utils.appindcr(body_code, '	          sqlerrm); ');
2461      cn_utils.appindcr(body_code, '   end if; ');
2462      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_perf: ''); ');
2463      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2464      cn_utils.appindcr(body_code, '   raise; ');
2465 
2466      cn_utils.proc_end( procedure_name, 'N', body_code );
2467 EXCEPTION
2468   when others then
2469     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
2470       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
2471                      'cn.plsql.cn_formula_gen_pkg.get_perf.exception',
2472          	          sqlerrm);
2473     end if;
2474     raise;
2475 END get_perf;
2476 
2477 --   construct the call to cn_formula_common_pkg.calculate_init;
2478 PROCEDURE calc_init (spec_code        IN OUT NOCOPY cn_utils.code_type,
2479                      body_code        IN OUT NOCOPY cn_utils.code_type )
2480 IS
2481 BEGIN
2482     cn_utils.appendcr(body_code);
2483     cn_utils.appindcr(body_code, '  cn_formula_common_pkg.calculate_init( p_srp_plan_assign_id,' ||' p_salesrep_id, ' );
2484     cn_utils.appindcr(body_code, '              p_period_id, p_quota_id,  p_start_date, ');
2485     cn_utils.appindcr(body_code, '                     p_process_all_flag,  g_intel_calc_flag, g_calc_type,');
2486     cn_utils.appindcr(body_code, '              g_trx_group_code, g_itd_flag, g_rollover_flag,');
2487     cn_utils.appindcr(body_code, '              g_commission_payed_ptd, g_commission_payed_itd,');
2488     cn_utils.appindcr(body_code, '              g_input_achieved_ptd, g_input_achieved_itd,');
2489     cn_utils.appindcr(body_code, '              g_output_achieved_ptd, g_output_achieved_itd,');
2490     cn_utils.appindcr(body_code, '              g_perf_achieved_ptd, g_perf_achieved_itd,');
2491     cn_utils.appindcr(body_code, '              g_select_status_flag);');
2492     cn_utils.appendcr(body_code);
2493 
2494     -- resolve pe references
2495     IF (g_pe_reference_tbl.COUNT > 0) THEN
2496        FOR i IN g_pe_reference_tbl.first..g_pe_reference_tbl.last LOOP
2497           cn_utils.appendcr(body_code, '  select ' || REPLACE(g_pe_reference_tbl(i), g_pe_id_tbl(i)||'PE.', ''));
2498           cn_utils.appendcr(body_code, '    into g_' || REPLACE(g_pe_reference_tbl(i), '.', '_'));
2499           cn_utils.appendcr(body_code, '    from cn_srp_period_quotas');
2500           cn_utils.appendcr(body_code, '   where srp_plan_assign_id = p_srp_plan_assign_id');
2504        END LOOP;
2501           cn_utils.appendcr(body_code, '     and period_id = p_period_id');
2502           cn_utils.appendcr(body_code, '     and quota_id = ' || g_pe_id_tbl(i) || ';');
2503           cn_utils.appendcr(body_code);
2505     END IF;
2506 
2507 END calc_init;
2508 
2509 --   construct the call to cn_formula_common_pkg.calculate_roll;
2510 PROCEDURE calc_roll (spec_code        IN OUT NOCOPY cn_utils.code_type,
2511                      body_code        IN OUT NOCOPY cn_utils.code_type )
2512 IS
2513      l_sql_select VARCHAR2(8000);
2514 
2515      CURSOR exps IS
2516         SELECT dbms_lob.substr(sql_select) sql_select
2517           FROM cn_calc_sql_exps_all
2518           WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
2519                                     FROM cn_formula_inputs_all
2520                                    WHERE calc_formula_id = g_formula_id
2521                                    AND org_id = g_org_id
2522                                    AND rate_dim_sequence = (SELECT MIN(rate_dim_sequence)
2523                                                             FROM cn_formula_inputs_all
2524                                                             WHERE calc_formula_id = g_formula_id
2525                                                             AND org_id = g_org_id
2526                                                             AND cumulative_flag = 'Y'));
2527 BEGIN
2528    OPEN exps;
2529    FETCH exps INTO l_sql_select;
2530    CLOSE exps;
2531 
2532    IF (g_cumulative_flag = 'Y') THEN
2533       IF (instr(l_sql_select, '/CSQA.TARGET', 1, 1) > 0 OR
2534           instr(l_sql_select, '/(CSQA.TARGET+CSPQ.TOTAL_ROLLOVER)', 1, 1) > 0 OR
2535           instr(l_sql_select, '/(CSPQ.TOTAL_ROLLOVER+CSQA.TARGET)', 1, 1) > 0) THEN
2536          cn_utils.appendcr(body_code);
2537          cn_utils.appendcr(body_code, ' SELECT csqa.target + nvl(cspq.total_rollover, 0)');
2538          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2539          cn_utils.appendcr(body_code, '   FROM cn_srp_quota_assigns_all csqa, cn_srp_period_quotas_all cspq ');
2540          cn_utils.appendcr(body_code, '  WHERE csqa.srp_plan_assign_id = p_srp_plan_assign_id ');
2541          cn_utils.appendcr(body_code, '    AND csqa.quota_id = p_quota_id ');
2542          cn_utils.appendcr(body_code, '    AND cspq.srp_plan_assign_id = p_srp_plan_assign_id ');
2543          cn_utils.appendcr(body_code, '    AND cspq.quota_id = p_quota_id ');
2544          cn_utils.appendcr(body_code, '    AND cspq.period_id = p_period_id; ');
2545          cn_utils.appendcr(body_code);
2546          cn_utils.appendcr(body_code, ' l_rollover := l_rollover * (1 - g_input_achieved_itd(' || g_cumulative_input_no ||') ); ');
2547 
2548        ELSIF (instr(l_sql_select, '/CSPQ.ITD_TARGET', 1, 1) > 0 OR
2549               instr(l_sql_select, '/(CSPQ.ITD_TARGET+CSPQ.TOTAL_ROLLOVER)', 1, 1) > 0 OR
2550               instr(l_sql_select, '/(CSPQ.TOTAL_ROLLOVER+CSPQ.ITD_TARGET)', 1, 1) > 0) THEN
2551          cn_utils.appendcr(body_code);
2552          cn_utils.appendcr(body_code, ' SELECT cspq.itd_target + nvl(cspq.total_rollover, 0)');
2553          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2554          cn_utils.appendcr(body_code, '   FROM cn_srp_period_quotas_all cspq ');
2555          cn_utils.appendcr(body_code, '  WHERE cspq.srp_plan_assign_id = p_srp_plan_assign_id ');
2556          cn_utils.appendcr(body_code, '    AND cspq.quota_id = p_quota_id ');
2557          cn_utils.appendcr(body_code, '    AND cspq.period_id = p_period_id; ');
2558          cn_utils.appendcr(body_code);
2559          cn_utils.appendcr(body_code, ' l_rollover := l_rollover * (1 - g_input_achieved_itd(' || g_cumulative_input_no ||') ); ');
2560 
2561        ELSIF (g_itd_flag = 'Y') THEN
2562          cn_utils.appendcr(body_code);
2563          cn_utils.appendcr(body_code, ' SELECT cspq.itd_target - g_input_achieved_itd(' || g_cumulative_input_no || ') ');
2564          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2565          cn_utils.appendcr(body_code, '   FROM cn_srp_period_quotas_all cspq ');
2566          cn_utils.appendcr(body_code, '  WHERE cspq.srp_plan_assign_id = p_srp_plan_assign_id ');
2567          cn_utils.appendcr(body_code, '    AND cspq.quota_id = p_quota_id ');
2568          cn_utils.appendcr(body_code, '    AND cspq.period_id = p_period_id; ');
2569        ELSE
2570          cn_utils.appendcr(body_code);
2571          cn_utils.appendcr(body_code, ' SELECT csqa.target - g_input_achieved_itd(' || g_cumulative_input_no || ') ');
2572          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2573          cn_utils.appendcr(body_code, '   FROM cn_srp_quota_assigns_all csqa ');
2574          cn_utils.appendcr(body_code, '  WHERE csqa.srp_plan_assign_id = p_srp_plan_assign_id ');
2575          cn_utils.appendcr(body_code, '    AND csqa.quota_id = p_quota_id; ');
2576 
2577       END IF;
2578    END IF;
2579 
2580    cn_utils.appindcr(body_code, '  cn_formula_common_pkg.calculate_roll( p_salesrep_id,'||
2581                      'p_period_id, p_quota_id,');
2582    cn_utils.appindcr(body_code, '             p_srp_plan_assign_id,  p_calc_type,');
2583    cn_utils.appindcr(body_code, '             g_input_achieved_ptd, g_input_achieved_itd,');
2584    cn_utils.appindcr(body_code, '             g_output_achieved_ptd, g_output_achieved_itd,');
2585    cn_utils.appindcr(body_code, '             g_perf_achieved_ptd, g_perf_achieved_itd, ');
2586    cn_utils.appindcr(body_code, '             l_rollover );');
2587    cn_utils.appendcr(body_code);
2588 END calc_roll;
2589 
2590 --   construct the cursor for individual case
2591 PROCEDURE individual_cursor (spec_code        IN OUT NOCOPY cn_utils.code_type,
2592                              body_code        IN OUT NOCOPY cn_utils.code_type )         IS
2593 BEGIN
2594     cn_utils.appendcr(body_code);
2595     cn_utils.appindcr(body_code, '  CURSOR l_lines_csr IS  ');
2599     -- Add column names of CH and CL which are used in the input/output/perf expression
2596     cn_utils.appindcr(body_code, '    SELECT ');
2597 
2598     -- Added for 11.5.10 Performance Enhancments
2600     FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
2601       IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
2602           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||',');
2603       ELSE
2604           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name);
2605       END IF;
2606     END LOOP;
2607 
2608     -- Changed for 11.5.10 Performance Enhancments
2609     -- only if CH is used add the table in the from clause
2610     IF g_ch_flag THEN
2611         cn_utils.appindcr(body_code, '    FROM cn_commission_lines_all cl, cn_commission_headers_all ch ');
2612     ELSE
2613         cn_utils.appindcr(body_code, '    FROM cn_commission_lines_all cl');
2614     END IF;
2615 
2616     cn_utils.appindcr(body_code, '    WHERE cl.credited_salesrep_id = p_salesrep_id            ');
2617     cn_utils.appindcr(body_code, '      AND cl.quota_id = p_quota_id                           ');
2618     cn_utils.appindcr(body_code, '      AND cl.srp_plan_assign_id = p_srp_plan_assign_id              ');
2619     cn_utils.appindcr(body_code, '      AND cl.processed_period_id = p_period_id            ');
2620     cn_utils.appindcr(body_code, '      AND cl.processed_date >= p_start_date               ');
2621 
2622 
2623     -- Changed for 11.5.10 Performance Enhancments
2624     -- only if CH is used add the table in the where clause
2625     IF g_ch_flag THEN
2626       cn_utils.appindcr(body_code, '      AND ch.commission_header_id = cl.commission_header_id');
2627     END IF;
2628     cn_utils.appindcr(body_code, '      AND substr(cl.pre_processed_code, 4,1) = ''C''  ');
2629     cn_utils.appindcr(body_code, '      AND ( (g_select_status_flag = ''PCX'' and              ');
2630     cn_utils.appindcr(body_code, '              cl.status in (''POP'', ''CALC'', ''XCALC'') )   ');
2631     cn_utils.appindcr(body_code, '         OR (g_select_status_flag = ''P'' and cl.status = ''POP'') )');
2632     cn_utils.appindcr(body_code, '      AND (( g_calc_type = ''FORECAST'' and                  ');
2633     cn_utils.appindcr(body_code, '              cl.trx_type = ''FORECAST'')                 ');
2634     cn_utils.appindcr(body_code, '           OR (g_calc_type = ''BONUS'' and  cl.trx_type = ''BONUS'' )');
2635     cn_utils.appindcr(body_code, '           OR (g_calc_type = ''COMMISSION'' and              ');
2636     cn_utils.appindcr(body_code, '               cl.trx_type NOT IN (''BONUS'',''FORECAST'',''GRP'') )) ');
2637     cn_utils.appindcr(body_code, '    ORDER by cl.processed_date        asc ');
2638     cn_utils.appindcr(body_code, '              ,cl.commission_line_id      asc ');
2639     cn_utils.appindcr(body_code, '           ;                              ');
2640     cn_utils.appendcr(body_code);
2641 END individual_cursor;
2642 
2643 --   construct the code to update global variables
2644 PROCEDURE update_variables(spec_code        IN OUT NOCOPY cn_utils.code_type,
2645                            body_code        IN OUT NOCOPY cn_utils.code_type )
2646 IS
2647 BEGIN
2648      cn_utils.appendcr(body_code);
2649      IF g_itd_flag = 'Y' THEN
2650         cn_utils.appindcr(body_code, '   g_output_achieved_ptd := g_output_achieved_ptd + g_output_achieved ;' );
2651         cn_utils.appindcr(body_code, '   g_output_achieved_itd := g_output_achieved_itd + g_output_achieved; ' );
2652      END IF;
2653      cn_utils.appindcr(body_code, '   g_perf_achieved_ptd := g_perf_achieved_ptd+ l_perf; ');
2654      cn_utils.appindcr(body_code, '   g_perf_achieved_itd := g_perf_achieved_itd+ l_perf; ');
2655 
2656      FOR i IN 1..g_number_dim LOOP
2657         cn_utils.appindcr(body_code, '   g_input_achieved_ptd('||i||') := g_input_achieved_ptd('||i||') + l_input('||i||');        ');
2658         cn_utils.appindcr(body_code, '   g_input_achieved_itd('||i||') := g_input_achieved_itd('||i||') + l_input('||i||');        ');
2659      END LOOP;
2660 
2661      cn_utils.appindcr(body_code, '   g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
2662      cn_utils.appindcr(body_code, '   g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
2663      cn_utils.appendcr(body_code);
2664 END update_variables;
2665 
2666 --   construct the calculate_quota procdure which will be invoked from the dispatcher in calc engine
2667 PROCEDURE calculate_quota (spec_code        IN OUT NOCOPY cn_utils.code_type,
2668                            body_code        IN OUT NOCOPY cn_utils.code_type )
2669 IS
2670     procedure_name        cn_obj_procedures_v.name%TYPE;
2671     procedure_desc        cn_obj_procedures_v.description%TYPE;
2672     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
2673     package_spec_id        cn_obj_packages_v.package_id%TYPE;
2674     x_repository_id        cn_repositories.repository_id%TYPE;
2675 
2676     l_rate_dim_sequence  NUMBER;
2677     l_output_sql_select        varchar2(8000);
2678     l_output_sql_select_clob clob;
2679 
2680 
2681     l_input_sql_select        varchar2(8000);
2682     l_input_sql_from        varchar2(4000);
2683     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
2684     l_input_sql_select_clob clob;
2685     l_input_sql_from_clob   clob;
2686 
2687     l_operator_position NUMBER;
2688     l_operator          VARCHAR2(1);
2689 
2690     l_counter NUMBER(15);
2691     l_variable_declaration VARCHAR2(400);
2692     l_table_object_id       cn_objects.object_id%type;
2693 
2694     CURSOR itd_inputs IS
2698           AND org_id = g_org_id
2695        SELECT calc_sql_exp_id, rate_dim_sequence, split_flag, cumulative_flag
2696          FROM cn_formula_inputs_all
2697         WHERE calc_formula_id = g_formula_id
2699         ORDER BY rate_dim_sequence;
2700 BEGIN
2701      procedure_name := 'calculate_quota';
2702      procedure_desc := 'This procedure is the hook to the calculation engine';
2703 
2704      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, p_period_id NUMBER, ';
2705      parameter_list := parameter_list || 'p_start_date DATE, p_quota_id NUMBER, ';
2706      parameter_list := parameter_list || 'p_process_all_flag VARCHAR2, p_intel_calc_flag VARCHAR2, ';
2707      parameter_list := parameter_list || ' p_calc_type VARCHAR2, p_credit_type_id NUMBER, x_latest_processed_date OUT NOCOPY DATE  ';
2708 
2709      proc_init(procedure_name, procedure_desc, parameter_list,
2710                'P', null , package_spec_id, x_repository_id,
2711                spec_code, body_code);
2712 
2713      cn_utils.appindcr(body_code, '  l_mul_input_tbl            cn_formula_common_pkg.mul_input_tbl_type; ');
2714      cn_utils.appindcr(body_code, '  l_rate                     NUMBER;');
2715      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
2716      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
2717      cn_utils.appindcr(body_code, '  l_input                    cn_formula_common_pkg.num_table_type; ');
2718      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
2719      cn_utils.appindcr(body_code, '  l_perf                     NUMBER; ');
2720      cn_utils.appindcr(body_code, '  l_itd_target               NUMBER; ');
2721      cn_utils.appindcr(body_code, '  l_itd_payment              NUMBER; ');
2722      cn_utils.appindcr(body_code, '  l_rollover                 NUMBER := 0; ');
2723      cn_utils.appindcr(body_code, '  l_debug_flag               VARCHAR2(1) := fnd_profile.value(''CN_DEBUG''); ');
2724      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
2725      cn_utils.appindcr(body_code, '  l_error_reason             VARCHAR2(150); ');
2726      cn_utils.appindcr(body_code, '  l_name                     VARCHAR2(255); ');
2727      cn_utils.appindcr(body_code, '  l_trx_rec_old              cn_formula_common_pkg.trx_rec_type; ');
2728      cn_utils.appindcr(body_code, '  l_trx_rec_new              cn_formula_common_pkg.trx_rec_type; ');
2729      cn_utils.appindcr(body_code, '  l_trx_rec_null             cn_formula_common_pkg.trx_rec_type; ');
2730 
2731      IF g_trx_group_code = 'GROUP' THEN
2732         cn_utils.appindcr(body_code, '  l_endofinterval_flag       VARCHAR2(1); ');
2733         cn_utils.appindcr(body_code, '  l_start_period_id          NUMBER(15); ');
2734         cn_utils.appindcr(body_code, '  l_grp_trx_rec              cn_formula_common_pkg.trx_rec_type; ');
2735      END IF;
2736      cn_utils.appendcr(body_code);
2737 
2738      --  constrcut the cursor to loop through trxs
2739      IF (NOT(g_no_trx_flag)) THEN
2740         individual_cursor(spec_code, body_code);
2741      END IF;
2742 
2743 
2744      -- Added for 11.5.10 Performance Enhancments
2745      -- Declare cursors which will fetch all columns of tables
2746      -- used in input/output/perf expressions.
2747      IF g_trx_group_code = 'INDIVIDUAL' THEN
2748         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
2749         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
2750            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
2751               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
2752                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
2753                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
2754                ELSE
2755                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
2756                END IF;
2757                cn_utils.appendcr(body_code);
2758                cn_utils.appindcr(body_code, '  CURSOR '||l_variable_declaration||'  IS');
2759                l_input_sql_where  := 'WHERE 1=1 ';
2760                l_input_sql_select := lower_str( '    select ' ||g_uniq_tbl_names_tbl(l_table_object_id).column_name_list);
2761                l_input_sql_from := lower( '   from ' ||g_uniq_tbl_names_tbl(l_table_object_id).table_name||' '||
2762                                                     g_uniq_tbl_names_tbl(l_table_object_id).table_alias);
2763                construct_sql_from_where (l_input_sql_select,
2764                                              l_input_sql_from,
2765                                          l_input_sql_where );
2766                --split_long_sql( body_code, l_input_sql_select, 'SELECT');
2767                cn_utils.appindcr(body_code, 'SELECT * ');
2768 
2769                split_long_sql( body_code, l_input_sql_from, 'FROM');
2770                split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
2771            END IF;
2772            l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
2773         END LOOP;
2774      END IF;
2775 
2776 
2777      cn_utils.appendcr(body_code);
2778      cn_utils.appendcr(body_code, 'BEGIN');
2779      cn_utils.appindcr(body_code, '  g_intel_calc_flag := p_intel_calc_flag;');
2780      cn_utils.appindcr(body_code, '  g_calc_type := p_calc_type;');
2781      calc_init(spec_code, body_code);
2782 
2783      FOR i IN 1..g_number_dim LOOP
2784    	  cn_utils.appindcr(body_code, '  l_input('||i||') := 0;        ');
2785      END LOOP;
2786 
2787      -- Added for 11.5.10 Performance Enhancments
2791         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
2788      -- Declare open fetch statment which will fetch all columns of tables
2789      -- used in input/output/perf expressions.into global variables
2790      IF g_trx_group_code = 'INDIVIDUAL' THEN
2792         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
2793            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
2794               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
2795 
2796                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
2797                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
2798                ELSE
2799                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
2800                END IF;
2801                cn_utils.appendcr(body_code);
2802                cn_utils.appindcr(body_code, '  OPEN '||l_variable_declaration||' ;' );
2803                cn_utils.appindcr(body_code, '  FETCH '||l_variable_declaration||'  INTO ' ||g_uniq_tbl_names_tbl(l_table_object_id).variable_name||' ;' );
2804 
2805                cn_utils.appindcr(body_code, '  CLOSE '||l_variable_declaration||' ;' );
2806 
2807             END IF;
2808             l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
2809          END LOOP;
2810       END IF;
2811 
2812 
2813      IF (g_trx_group_code = 'INDIVIDUAL' AND NOT(g_no_trx_flag)) THEN
2814         -- for individual case we don't need to accumulate output_achieved
2815         cn_utils.appindcr(body_code, '  Open l_lines_csr; ');
2816         cn_utils.appindcr(body_code, '  LOOP ');
2817         cn_utils.appindcr(body_code, '   l_trx_rec_new := l_trx_rec_null; ');
2818         cn_utils.appindcr(body_code, '   FETCH l_lines_csr into g_commission_rec; ');
2819         cn_utils.appindcr(body_code, '     EXIT WHEN l_lines_csr%notfound; ');
2820         cn_utils.appendcr(body_code);
2821         cn_utils.appindcr(body_code, '   BEGIN ');
2822         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_LINE_ID    :=  g_commission_rec.COMMISSION_LINE_ID;        ');
2823         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_HEADER_ID  :=  g_commission_rec.COMMISSION_HEADER_ID;        ');
2824         cn_utils.appindcr(body_code ,'     l_trx_rec_old.SALESREP_ID           :=  g_commission_rec.CREDITED_SALESREP_ID;         ');
2825         cn_utils.appindcr(body_code ,'     l_trx_rec_old.SRP_PLAN_ASSIGN_ID    :=  g_commission_rec.SRP_PLAN_ASSIGN_ID;          ');
2826         cn_utils.appindcr(body_code ,'     l_trx_rec_old.QUOTA_ID              :=  g_commission_rec.QUOTA_ID;                    ');
2827         cn_utils.appindcr(body_code ,'     l_trx_rec_old.CREDIT_TYPE_ID        :=  g_commission_rec.CREDIT_TYPE_ID;              ');
2828         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PROCESSED_DATE        :=  g_commission_rec.PROCESSED_DATE;              ');
2829         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PROCESSED_PERIOD_ID   :=  g_commission_rec.PROCESSED_PERIOD_ID;         ');
2830         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PAY_PERIOD_ID         :=  g_commission_rec.PAY_PERIOD_ID;               ');
2831         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_AMOUNT     :=  g_commission_rec.COMMISSION_AMOUNT;           ');
2832         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_RATE       :=  g_commission_rec.COMMISSION_RATE;             ');
2833         cn_utils.appindcr(body_code ,'     l_trx_rec_old.RATE_TIER_ID          :=  g_commission_rec.RATE_TIER_ID;                ');
2834         cn_utils.appindcr(body_code ,'     l_trx_rec_old.TIER_SPLIT            :=  g_commission_rec.TIER_SPLIT;                  ');
2835         cn_utils.appindcr(body_code ,'     l_trx_rec_old.INPUT_ACHIEVED        :=  g_commission_rec.INPUT_ACHIEVED;              ');
2836         cn_utils.appindcr(body_code ,'     l_trx_rec_old.OUTPUT_ACHIEVED       :=  g_commission_rec.OUTPUT_ACHIEVED;             ');
2837         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PERF_ACHIEVED         :=  g_commission_rec.PERF_ACHIEVED;               ');
2838         cn_utils.appindcr(body_code ,'     l_trx_rec_old.POSTING_STATUS        :=  g_commission_rec.POSTING_STATUS;              ');
2839         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PENDING_STATUS        :=  g_commission_rec.PENDING_STATUS;              ');
2840         cn_utils.appindcr(body_code ,'     l_trx_rec_old.CREATED_DURING        :=  g_commission_rec.CREATED_DURING;              ');
2841         cn_utils.appindcr(body_code ,'     l_trx_rec_old.TRX_TYPE              :=  g_commission_rec.TRX_TYPE;                    ');
2842         cn_utils.appindcr(body_code ,'     l_trx_rec_old.ERROR_REASON          :=  g_commission_rec.ERROR_REASON;               ');
2843         cn_utils.appindcr(body_code ,'     l_trx_rec_old.STATUS                   :=  g_commission_rec.STATUS;                         ');
2844 
2845         cn_utils.appindcr(body_code, '     get_input(l_trx_rec_old.commission_line_id, p_salesrep_id, ');
2846         cn_utils.appindcr(body_code, '                p_period_id, p_quota_id, ');
2847         cn_utils.appindcr(body_code, '                p_srp_plan_assign_id, l_trx_rec_old.processed_date, ');
2848         cn_utils.appindcr(body_code, '                l_mul_input_tbl  );');
2849 
2850         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2851         cn_utils.appindcr(body_code, '       cn_message_pkg.debug('' ''); ');
2852         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Transaction (line ID='' || l_trx_rec_old.commission_line_id||'')'' );');
2853         FOR i IN 1..g_number_dim LOOP
2854            cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount || l_mul_input_tbl('||i||').input_string );');
2855         END LOOP;
2859         IF g_rate_flag THEN
2856         cn_utils.appindcr(body_code, '     end if; ');
2857         cn_utils.appendcr(body_code);
2858 
2860            cn_utils.appindcr(body_code, '     cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
2861            cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
2862            cn_utils.appindcr(body_code, '                 l_trx_rec_old.processed_date, g_number_dim,l_mul_input_tbl, ');
2863            cn_utils.appindcr(body_code, '                 g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
2864 
2865            cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2866            cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Commission rate='' || l_rate);');
2867            cn_utils.appindcr(body_code, '     end if; ');
2868         END IF;
2869 
2870         cn_utils.appendcr(body_code);
2871         cn_utils.appindcr(body_code, '     l_commission := get_commission( l_trx_rec_old.commission_line_id,');
2872         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
2873         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id,        l_rate); ');
2874         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2875         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Output='' || l_commission);');
2876         cn_utils.appindcr(body_code, '     end if; ');
2877 
2878         IF g_perf_input_expr_seq >0 THEN
2879                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
2880 
2881         ELSIF g_perf_measure_id IS  NULL THEN
2882                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
2883 
2884         ELSE
2885                 cn_utils.appindcr(body_code, '     l_perf := get_perf(l_trx_rec_old.commission_line_id, p_salesrep_id,');
2886                 cn_utils.appindcr(body_code, '                          p_period_id, p_quota_id, ');
2887                 cn_utils.appindcr(body_code, '                          p_srp_plan_assign_id, l_trx_rec_old.processed_date);');
2888 
2889                 cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2890                 cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
2891                 cn_utils.appindcr(body_code, '     end if; ');
2892         END IF;
2893 
2894         FOR i IN 1..g_number_dim LOOP
2895            cn_utils.appindcr(body_code, '       l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
2896         END LOOP;
2897 
2898         cn_utils.appindcr(body_code, '     x_latest_processed_date := l_trx_rec_old.processed_date;    ');
2899         cn_utils.appendcr(body_code);
2900         cn_utils.appindcr(body_code, '     l_trx_rec_new.status := ''CALC''; ');
2901         cn_utils.appindcr(body_code, '     l_trx_rec_new.credit_type_id := p_credit_type_id; ');
2902         cn_utils.appindcr(body_code, '     l_trx_rec_new.commission_amount := l_commission; ');
2903         cn_utils.appindcr(body_code, '     l_trx_rec_new.commission_rate := l_rate; ');
2904         cn_utils.appindcr(body_code, '     l_trx_rec_new.rate_tier_id := l_rate_tier_id ; ');
2905         cn_utils.appindcr(body_code, '     l_trx_rec_new.tier_split := l_tier_split ; ');
2906         IF g_number_dim > 1 THEN
2907            cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
2908          ELSE
2909            cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
2910         END IF;
2911         IF g_itd_flag = 'Y' THEN
2912            cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := g_output_achieved ; ');
2913          ELSE
2914            --  output_achieved = 0 since no need to accumulate output for individual non itd case
2915            cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := 0 ; ');
2916         END IF;
2917         cn_utils.appindcr(body_code, '     l_trx_rec_new.perf_achieved := l_perf ; ');
2918         cn_utils.appendcr(body_code);
2919         -- update package variables
2920         update_variables(spec_code, body_code);
2921         cn_utils.appindcr(body_code, '   EXCEPTION when others then        ');
2922         cn_utils.appindcr(body_code, '     l_trx_rec_new.error_reason := substr(sqlerrm,1,150); ');
2923         cn_utils.appindcr(body_code, '     l_trx_rec_new.status := ''XCALC'' ; ');
2924         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
2925         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
2926         cn_utils.appindcr(body_code, '   END;   ');
2927         cn_utils.appendcr(body_code);
2928         cn_utils.appindcr(body_code, '   cn_formula_common_pkg.update_trx(l_trx_rec_old, l_trx_rec_new) ; ');
2929         cn_utils.appindcr(body_code, '  END LOOP;');
2930         cn_utils.appindcr(body_code, '  CLOSE l_lines_csr; ');
2931         cn_utils.appendcr(body_code);
2932 
2933         -- need to create 'ITD' trx if there is no calc trx in this period
2934         IF g_itd_flag = 'Y' THEN
2935            cn_utils.appindcr(body_code, '  IF cn_formula_common_pkg.check_itd_calc_trx( p_salesrep_id, ');
2936            cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, p_period_id, p_quota_id ) = FALSE THEN ');
2937            cn_utils.appindcr(body_code, '    BEGIN ');
2938            -- get input
2939            cn_utils.appendcr(body_code);
2940 
2941            -- if there is more than one input, take care of the non-cumulative inputs
2942            IF g_number_dim > 1 THEN
2943              cn_utils.appindcr(body_code, '       g_commission_rec := null; ');
2947              cn_utils.appindcr(body_code, '                 l_mul_input_tbl  );');
2944              cn_utils.appindcr(body_code, '       get_input(null, p_salesrep_id, ');
2945              cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id, ');
2946              cn_utils.appindcr(body_code, '                 p_srp_plan_assign_id, l_trx_rec_old.processed_date, ');
2948 
2949 			 FOR i IN 1..g_number_dim LOOP
2950                cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount || l_mul_input_tbl('||i||').input_string );');
2951              END LOOP;
2952              cn_utils.appendcr(body_code);
2953            END IF;
2954 
2955            FOR itd_input IN itd_inputs LOOP
2956               cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').rate_dim_sequence := '
2957                                 || itd_input.rate_dim_sequence || ';' );
2958 
2959               SELECT  sql_select input_sql_select, sql_from input_sql_from
2960                 INTO l_input_sql_select_clob, l_input_sql_from_clob
2961                 FROM cn_calc_sql_exps_all
2962                 WHERE calc_sql_exp_id = itd_input.calc_sql_exp_id
2963 				  AND org_id = g_org_id;
2964 
2965               convert_clob_to_string( l_input_sql_select_clob, l_input_sql_select );
2966               l_input_sql_select := lower_str( 'select ' || l_input_sql_select);
2967               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
2968               l_input_sql_from := lower( 'from ' || l_input_sql_from );
2969 
2970               construct_sql_from_where (l_input_sql_select,
2971                                         l_input_sql_from,
2972                                         l_input_sql_where );
2973 
2974 
2975               IF g_pq_target_flag OR g_spq_target_flag  THEN
2976                  -- get itd_target
2977                  IF g_pq_target_flag THEN
2978                     cn_utils.appindcr(body_code, '      l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
2979                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
2980                  END IF;
2981 
2982                  IF g_spq_target_flag THEN
2983                     cn_utils.appindcr(body_code, '      l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
2984                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
2985                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
2986                  END IF;
2987 
2988                  cn_utils.appendcr(body_code);
2989 
2990                  IF itd_input.split_flag <> 'N' THEN
2991                     cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := 0;' );
2992                   ELSE
2993                     IF itd_input.cumulative_flag = 'Y' THEN
2994                       cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := g_input_achieved_itd('
2995                                       ||itd_input.rate_dim_sequence||') / l_itd_target;' );
2996                     ELSE
2997                       cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount / l_itd_target;' );
2998 					END IF;
2999                  END IF;
3000 
3001                  IF itd_input.cumulative_flag = 'Y' THEN
3002                    cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount := g_input_achieved_itd('
3003                                    ||itd_input.rate_dim_sequence||')/l_itd_target;' );
3004                  ELSE
3005                    cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount := l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount/l_itd_target;' );
3006 				 END IF;
3007                ELSE
3008                  IF itd_input.split_flag <> 'N' THEN
3009                     cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := 0;' );
3010                   ELSE
3011                     IF itd_input.cumulative_flag = 'Y' THEN
3012                       cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := g_input_achieved_itd('
3013                                       ||itd_input.rate_dim_sequence||');' );
3014 					END IF;
3015                  END IF;
3016 
3017                  IF itd_input.cumulative_flag = 'Y' THEN
3018                    cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount := g_input_achieved_itd('
3019                                    ||itd_input.rate_dim_sequence||');' );
3020                  END IF;
3021               END IF;
3022            END LOOP;
3023 
3024            -- get processed date
3025            cn_utils.appendcr(body_code);
3026            cn_utils.appindcr(body_code, '      SELECT least(p.end_date,nvl(spa.end_date,p.end_date),nvl(q.end_date,p.end_date)) ');
3027            cn_utils.appindcr(body_code, '        INTO l_processed_date ');
3028            cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3029            cn_utils.appindcr(body_code, '       WHERE p.period_id = p_period_id ');
3030            cn_utils.appindcr(body_code, '         AND p.org_id = spa.org_id ');
3031            cn_utils.appindcr(body_code, '         AND spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3032            cn_utils.appindcr(body_code, '         AND q.quota_id = p_quota_id; ');
3033            -- get rates
3034            IF g_rate_flag THEN
3038               cn_utils.appindcr(body_code, '                 g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
3035               cn_utils.appindcr(body_code, '      cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
3036               cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
3037               cn_utils.appindcr(body_code, '                 l_processed_date, g_number_dim,l_mul_input_tbl, ');
3039            END IF;
3040 
3041            -- get output
3042            cn_utils.appendcr(body_code);
3043            IF g_itd_flag = 'Y' THEN
3044               SELECT  sql_select output_sql_select
3045                 INTO l_output_sql_select_clob
3046                 FROM cn_calc_sql_exps_all
3047                 WHERE org_id = g_org_id
3048 				  AND calc_sql_exp_id = (SELECT output_exp_id
3049                                          FROM  cn_calc_formulas_all
3050                                          WHERE  calc_formula_id = g_formula_id
3051 										   AND org_id = g_org_id);
3052 
3053               convert_clob_to_string( l_output_sql_select_clob, l_output_sql_select );
3054               l_output_sql_select := lower_str( 'select ' || l_output_sql_select);
3055 
3056               g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
3057 
3058               l_operator_position := search_delimiter_select(l_output_sql_select, 1);
3059               IF l_operator_position > 0 THEN
3060                  l_operator := substr(l_output_sql_select, l_operator_position, 1);
3061               END IF;
3062 
3063               SELECT  sql_select input_sql_select, sql_from input_sql_from
3064                 INTO l_input_sql_select_clob, l_input_sql_from_clob
3065                 FROM cn_calc_sql_exps_all
3066                 WHERE org_id = g_org_id
3067 				  AND calc_sql_exp_id = (SELECT output_exp_id
3068                                          FROM  cn_calc_formulas_all
3069                                          WHERE  calc_formula_id = g_formula_id
3070 										   AND org_id = g_org_id);
3071 
3072               convert_clob_to_string( l_input_sql_select_clob, l_input_sql_select );
3073               l_input_sql_select := lower_str( 'select ' || l_input_sql_select);
3074               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3075               l_input_sql_from := lower( 'from ' || l_input_sql_from );
3076 
3077               construct_sql_from_where (l_input_sql_select,
3078                                         l_input_sql_from,
3079                                         l_input_sql_where );
3080 
3081               IF g_pq_payment_flag OR g_spq_payment_flag THEN
3082                  -- get itd_payment
3083                  IF g_pq_payment_flag THEN
3084                     cn_utils.appindcr(body_code, '      l_itd_payment := cn_formula_common_pkg.get_pq_itd_payment ');
3085                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
3086                  END IF;
3087 
3088                  IF g_spq_payment_flag THEN
3089                     cn_utils.appindcr(body_code, '      l_itd_payment := cn_formula_common_pkg.get_spq_itd_payment ');
3090                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
3091                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
3092                  END IF;
3093 
3094            IF g_rate_flag THEN
3095                     IF l_operator_position > 0 THEN
3096             -- clku bug 2877815, call get-commission to calculate ITD results correctly
3097                cn_utils.appindcr(body_code, ' l_commission := get_commission( l_trx_rec_old.commission_line_id, ');
3098                cn_utils.appindcr(body_code, '                                 p_salesrep_id, p_period_id, p_quota_id, ');
3099                cn_utils.appindcr(body_code, '                                 p_srp_plan_assign_id,        l_rate);');
3100 
3101                     END IF;
3102                   ELSE
3103             -- clku bug 2877815, call get-commission to calculate ITD results correctly
3104                     cn_utils.appindcr(body_code, '       l_commission := get_commission( l_trx_rec_old.commission_line_id, ');
3105             cn_utils.appindcr(body_code, '                                 p_salesrep_id, p_period_id, p_quota_id, ');
3106             cn_utils.appindcr(body_code, '                                 p_srp_plan_assign_id,        l_rate); ');
3107 
3108 
3109                  END IF;
3110                ELSE
3111                  -- if x_rate is used in output
3112                  IF g_rate_flag THEN
3113                     IF l_operator_position > 0 THEN
3114                        cn_utils.appindcr(body_code, '      l_commission := l_rate '||
3115                                          l_operator ||' g_output_achieved_itd ');
3116                        cn_utils.appindcr(body_code, '                   - g_commission_payed_itd ;' );
3117                      ELSE
3118                        cn_utils.appindcr(body_code, '      l_commission := l_rate - '||
3119                                          ' g_commission_payed_itd ;' );
3120                     END IF;
3121                   ELSE
3122                     cn_utils.appindcr(body_code, '      l_commission := g_output_achieved_itd '||
3123                                       '- g_commission_payed_itd ;' );
3124                  END IF;
3125               END IF;
3126            END IF;
3127 
3128            -- create itd trx
3129            cn_utils.appendcr(body_code);
3133            cn_utils.appindcr(body_code, '      l_trx_rec_new.salesrep_id := p_salesrep_id; ');
3130            cn_utils.appindcr(body_code, '      l_trx_rec_new := l_trx_rec_null; ');
3131            cn_utils.appindcr(body_code, '      l_trx_rec_new.status := ''CALC''; ');
3132              cn_utils.appindcr(body_code, '      l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3134            cn_utils.appindcr(body_code, '      l_trx_rec_new.created_during := ''CALC''; ');
3135            cn_utils.appindcr(body_code, '      l_trx_rec_new.srp_plan_assign_id := p_srp_plan_assign_id; ');
3136            cn_utils.appindcr(body_code, '      l_trx_rec_new.quota_id := p_quota_id; ');
3137            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_date := l_processed_date; ');
3138            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_period_id := p_period_id; ');
3139            cn_utils.appindcr(body_code, '      l_trx_rec_new.pay_period_id :=  p_period_id; ');
3140            cn_utils.appindcr(body_code, '      l_trx_rec_new.posting_status := ''UNPOSTED''; ');
3141            cn_utils.appindcr(body_code, '      l_trx_rec_new.pending_status := null; ');
3142            cn_utils.appindcr(body_code, '      l_trx_rec_new.trx_type := ''ITD'' ; ');
3143            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_amount := l_commission ;');
3144            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_rate := l_rate ; ');
3145            cn_utils.appindcr(body_code, '      l_trx_rec_new.rate_tier_id := l_rate_tier_id; ');
3146            cn_utils.appindcr(body_code, '      l_trx_rec_new.tier_split := l_tier_split ; ');
3147            cn_utils.appindcr(body_code, '      l_trx_rec_new.input_achieved := 0; ');
3148            cn_utils.appindcr(body_code, '      l_trx_rec_new.output_achieved:= 0; ');
3149            cn_utils.appindcr(body_code, '      l_trx_rec_new.perf_achieved := 0; ');
3150            cn_utils.appendcr(body_code);
3151            cn_utils.appindcr(body_code, '      cn_formula_common_pkg.create_trx(l_trx_rec_new); ');
3152            cn_utils.appendcr(body_code);
3153            cn_utils.appindcr(body_code, '      g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3154            cn_utils.appindcr(body_code, '      g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3155            cn_utils.appindcr(body_code, '    EXCEPTION WHEN OTHERS THEN ');
3156            cn_utils.appindcr(body_code, '      if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3157            cn_utils.appindcr(body_code, '        FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3158            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3159            cn_utils.appindcr(body_code, '	          sqlerrm); ');
3160            cn_utils.appindcr(body_code, '      end if; ');
3161            cn_utils.appindcr(body_code, '      cn_message_pkg.debug( ''Failed to create ITD commission line'' ); ');
3162            cn_utils.appindcr(body_code, '    END ; ');
3163            cn_utils.appindcr(body_code, '  END IF; ');
3164            cn_utils.appendcr(body_code);
3165         END IF;
3166       ELSIF (g_trx_group_code = 'GROUP' AND NOT(g_no_trx_flag)) THEN
3167         cn_utils.appindcr(body_code, '  l_endofinterval_flag := ''N'';                          ');
3168         cn_utils.appindcr(body_code, '  Open l_lines_csr; ');
3169         cn_utils.appindcr(body_code, '  LOOP ');
3170         cn_utils.appindcr(body_code, '   l_trx_rec_new := l_trx_rec_null; ');
3171         cn_utils.appindcr(body_code, '   FETCH l_lines_csr into g_commission_rec; ');
3172         cn_utils.appindcr(body_code, '     EXIT WHEN l_lines_csr%notfound; ');
3173         cn_utils.appindcr(body_code, '   BEGIN ');
3174         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_LINE_ID    :=  g_commission_rec.COMMISSION_LINE_ID;        ');
3175         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_HEADER_ID  :=  g_commission_rec.COMMISSION_HEADER_ID;        ');
3176         cn_utils.appindcr(body_code ,'l_trx_rec_old.SALESREP_ID  :=  g_commission_rec.CREDITED_SALESREP_ID;         ');
3177         cn_utils.appindcr(body_code ,'l_trx_rec_old.SRP_PLAN_ASSIGN_ID    :=  g_commission_rec.SRP_PLAN_ASSIGN_ID;          ');
3178         cn_utils.appindcr(body_code ,'l_trx_rec_old.QUOTA_ID              :=  g_commission_rec.QUOTA_ID;                    ');
3179         cn_utils.appindcr(body_code ,'l_trx_rec_old.CREDIT_TYPE_ID        :=  g_commission_rec.CREDIT_TYPE_ID;              ');
3180         cn_utils.appindcr(body_code ,'l_trx_rec_old.PROCESSED_DATE        :=  g_commission_rec.PROCESSED_DATE;              ');
3181         cn_utils.appindcr(body_code ,'l_trx_rec_old.PROCESSED_PERIOD_ID   :=  g_commission_rec.PROCESSED_PERIOD_ID;         ');
3182         cn_utils.appindcr(body_code ,'l_trx_rec_old.PAY_PERIOD_ID         :=  g_commission_rec.PAY_PERIOD_ID;               ');
3183         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_AMOUNT     :=  g_commission_rec.COMMISSION_AMOUNT;           ');
3184         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_RATE       :=  g_commission_rec.COMMISSION_RATE;             ');
3185         cn_utils.appindcr(body_code ,'l_trx_rec_old.RATE_TIER_ID          :=  g_commission_rec.RATE_TIER_ID;                ');
3186         cn_utils.appindcr(body_code ,'l_trx_rec_old.TIER_SPLIT            :=  g_commission_rec.TIER_SPLIT;                  ');
3187         cn_utils.appindcr(body_code ,'l_trx_rec_old.INPUT_ACHIEVED        :=  g_commission_rec.INPUT_ACHIEVED;              ');
3188         cn_utils.appindcr(body_code ,'l_trx_rec_old.OUTPUT_ACHIEVED       :=  g_commission_rec.OUTPUT_ACHIEVED;             ');
3189         cn_utils.appindcr(body_code ,'l_trx_rec_old.PERF_ACHIEVED         :=  g_commission_rec.PERF_ACHIEVED;               ');
3190         cn_utils.appindcr(body_code ,'l_trx_rec_old.POSTING_STATUS        :=  g_commission_rec.POSTING_STATUS;              ');
3194         cn_utils.appindcr(body_code ,'l_trx_rec_old.ERROR_REASON          :=  g_commission_rec.ERROR_REASON;               ');
3191         cn_utils.appindcr(body_code ,'l_trx_rec_old.PENDING_STATUS        :=  g_commission_rec.PENDING_STATUS;              ');
3192         cn_utils.appindcr(body_code ,'l_trx_rec_old.CREATED_DURING        :=  g_commission_rec.CREATED_DURING;              ');
3193         cn_utils.appindcr(body_code ,'l_trx_rec_old.TRX_TYPE              :=  g_commission_rec.TRX_TYPE;                    ');
3195         cn_utils.appindcr(body_code ,'l_trx_rec_old.STATUS                   :=  g_commission_rec.STATUS;                         ');
3196 
3197         cn_utils.appindcr(body_code, '    get_input(l_trx_rec_old.commission_line_id, p_salesrep_id, ');
3198         cn_utils.appindcr(body_code, '              p_period_id, p_quota_id, ');
3199         cn_utils.appindcr(body_code, '              p_srp_plan_assign_id, p_start_date, ');
3200         cn_utils.appindcr(body_code, '              l_mul_input_tbl, l_endofinterval_flag, null);');
3201         cn_utils.appendcr(body_code);
3202         cn_utils.appindcr(body_code, '    l_commission := get_commission(l_trx_rec_old.commission_line_id,');
3203         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
3204         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id, l_rate, ');
3205         cn_utils.appindcr(body_code, '                  l_endofinterval_flag, null);');
3206         cn_utils.appendcr(body_code);
3207         IF g_perf_input_expr_seq >0 THEN
3208                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3209 
3210         ELSIF g_perf_measure_id IS  NULL THEN
3211                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3212 
3213         ELSE
3214                    cn_utils.appindcr(body_code, '    l_perf := get_perf(l_trx_rec_old.commission_line_id, p_salesrep_id,');
3215                 cn_utils.appindcr(body_code, '                 p_period_id,p_quota_id, p_srp_plan_assign_id, ');
3216                 cn_utils.appindcr(body_code, '                 p_start_date, l_endofinterval_flag, null);');
3217 
3218                 cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3219                 cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3220                 cn_utils.appindcr(body_code, '     end if; ');
3221         END IF;
3222 
3223         cn_utils.appindcr(body_code, '    x_latest_processed_date := l_trx_rec_old.processed_date;    ');
3224         cn_utils.appendcr(body_code);
3225         cn_utils.appindcr(body_code, '    l_trx_rec_new.status := ''CALC''; ');
3226         cn_utils.appindcr(body_code, '    l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3227         cn_utils.appendcr(body_code);
3228         cn_utils.appindcr(body_code, '   EXCEPTION when others then        ');
3229         cn_utils.appindcr(body_code, '    l_trx_rec_new.error_reason := substr(sqlerrm,1,150); ');
3230         cn_utils.appindcr(body_code, '    l_trx_rec_new.status := ''XCALC'' ; ');
3231 		cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
3232         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3233         cn_utils.appindcr(body_code, '   END;   ');
3234         cn_utils.appendcr(body_code);
3235         cn_utils.appindcr(body_code, '   cn_formula_common_pkg.update_trx(l_trx_rec_old, l_trx_rec_new) ; ');
3236         cn_utils.appindcr(body_code, '  END LOOP;  ');
3237         cn_utils.appindcr(body_code, '  CLOSE l_lines_csr; ');
3238         cn_utils.appendcr(body_code);
3239         cn_utils.appindcr(body_code, '    l_start_period_id := ' );
3240         cn_utils.appindcr(body_code, '        cn_formula_common_pkg.get_start_period_id( '||
3241                           'p_quota_id, p_period_id);');
3242         cn_utils.appendcr(body_code);
3243         cn_utils.appindcr(body_code, '  IF cn_formula_common_pkg.EndOfInterval(p_quota_id, '||
3244                           'p_period_id) THEN ');
3245         cn_utils.appindcr(body_code, '    l_endofinterval_flag := ''Y''; ');
3246         cn_utils.appindcr(body_code, '  END IF;  ');
3247 
3248         -- get processed date
3249         cn_utils.appendcr(body_code);
3250         cn_utils.appindcr(body_code, '      SELECT least(p.end_date,nvl(spa.end_date,p.end_date),nvl(q.end_date,p.end_date)) ');
3251         cn_utils.appindcr(body_code, '        INTO l_processed_date ');
3252         cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3253         cn_utils.appindcr(body_code, '       WHERE p.period_id = p_period_id ');
3254         cn_utils.appindcr(body_code, '         AND spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3255         cn_utils.appindcr(body_code, '         AND p.org_id = spa.org_id ');
3256         cn_utils.appindcr(body_code, '         AND q.quota_id = p_quota_id; ');
3257 
3258         cn_utils.appendcr(body_code);
3259         cn_utils.appindcr(body_code, ' BEGIN ');
3260         cn_utils.appindcr(body_code, '  get_input(null, p_salesrep_id, p_period_id,');
3261         cn_utils.appindcr(body_code, '            p_quota_id, p_srp_plan_assign_id, ');
3262         cn_utils.appindcr(body_code, '            l_processed_date, l_mul_input_tbl, ');
3263         cn_utils.appindcr(body_code, '            l_endofinterval_flag,l_start_period_id );');
3264 
3265         cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3266         FOR i IN 1..g_number_dim LOOP
3267            cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Input=''||l_mul_input_tbl('||i||').amount);');
3268            cn_utils.appindcr(body_code, '    l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
3269         END LOOP;
3273         IF g_rate_flag THEN
3270         cn_utils.appindcr(body_code, '  end if; ');
3271 
3272         cn_utils.appendcr(body_code);
3274            cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id , ');
3275            cn_utils.appindcr(body_code, '            p_period_id, p_quota_id , g_split_flag,g_itd_flag, ');
3276            cn_utils.appindcr(body_code, '            l_processed_date, g_number_dim,l_mul_input_tbl, ' );
3277            cn_utils.appindcr(body_code, '            g_formula_id, l_rate, l_rate_tier_id, l_tier_split ); ');
3278            cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3279            cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Commission rate='' || l_rate);');
3280            cn_utils.appindcr(body_code, '  end if; ');
3281         END IF;
3282         cn_utils.appendcr(body_code);
3283         cn_utils.appindcr(body_code, '  l_commission := get_commission(null,p_salesrep_id, ');
3284         cn_utils.appindcr(body_code, '            p_period_id, p_quota_id,  ');
3285         cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, l_rate, ' );
3286         cn_utils.appindcr(body_code, '            l_endofinterval_flag,l_start_period_id ); ');
3287         cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3288         cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Output='' || l_commission);');
3289         cn_utils.appindcr(body_code, '  end if; ');
3290 
3291         cn_utils.appendcr(body_code);
3292 
3293         IF g_perf_input_expr_seq >0 THEN
3294                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3295 
3296         ELSIF g_perf_measure_id IS  NULL THEN
3297                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3298 
3299         ELSE
3300         cn_utils.appindcr(body_code, '  l_perf := get_perf(null, p_salesrep_id, p_period_id, ');
3301         cn_utils.appindcr(body_code, '                     p_quota_id, p_srp_plan_assign_id, null,');
3302         cn_utils.appindcr(body_code, '                     l_endofinterval_flag, l_start_period_id );');
3303         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3304         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3305         cn_utils.appindcr(body_code, '     end if; ');
3306         END IF;
3307         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3308         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3309         cn_utils.appindcr(body_code, '     end if; ');
3310         cn_utils.appindcr(body_code, '     l_grp_trx_rec.status := ''CALC''; ');
3311         cn_utils.appindcr(body_code, '     l_grp_trx_rec.credit_type_id := p_credit_type_id; ');
3312         cn_utils.appindcr(body_code, '     l_grp_trx_rec.commission_amount := l_commission ;');
3313         cn_utils.appindcr(body_code, '     l_grp_trx_rec.commission_rate := l_rate ; ');
3314         cn_utils.appindcr(body_code, '     l_grp_trx_rec.rate_tier_id := l_rate_tier_id; ');
3315         cn_utils.appindcr(body_code, '     l_grp_trx_rec.tier_split := l_tier_split ; ');
3316         cn_utils.appindcr(body_code, '     l_grp_trx_rec.input_achieved := l_input(1); ');
3317         cn_utils.appindcr(body_code, '     l_grp_trx_rec.output_achieved:= l_commission ; ');
3318         cn_utils.appindcr(body_code, '     l_grp_trx_rec.perf_achieved := l_perf; ');
3319         cn_utils.appindcr(body_code, ' EXCEPTION WHEN OTHERS THEN ');
3320         cn_utils.appindcr(body_code, '     l_grp_trx_rec.status := ''XCALC''; ');
3321         cn_utils.appindcr(body_code, '     l_grp_trx_rec.error_reason := substr(sqlerrm, 1, 150); ');
3322         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
3323         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3324         cn_utils.appindcr(body_code, ' END ; ');
3325         cn_utils.appendcr(body_code);
3326         cn_utils.appindcr(body_code, '  IF l_endofinterval_flag = ''Y'' THEN      ');
3327         cn_utils.appindcr(body_code, '     l_grp_trx_rec.salesrep_id := p_salesrep_id; ');
3328         cn_utils.appindcr(body_code, '     l_grp_trx_rec.created_during := ''CALC''; ');
3329         cn_utils.appindcr(body_code, '     l_grp_trx_rec.srp_plan_assign_id := p_srp_plan_assign_id; ');
3330         cn_utils.appindcr(body_code, '     l_grp_trx_rec.quota_id := p_quota_id; ');
3331         cn_utils.appindcr(body_code, '     l_grp_trx_rec.processed_date := l_processed_date; ');
3332         cn_utils.appindcr(body_code, '     l_grp_trx_rec.processed_period_id := p_period_id; ');
3333         cn_utils.appindcr(body_code, '     l_grp_trx_rec.pay_period_id :=  p_period_id; ');
3334         cn_utils.appindcr(body_code, '     l_grp_trx_rec.posting_status := ''UNPOSTED''; ');
3335         cn_utils.appindcr(body_code, '     l_grp_trx_rec.pending_status := null; ');
3336         cn_utils.appindcr(body_code, '     l_grp_trx_rec.trx_type := ''GRP'' ; ');
3337         cn_utils.appindcr(body_code, '     cn_formula_common_pkg.create_trx(l_grp_trx_rec); ');
3338         cn_utils.appindcr(body_code, '  END IF;   ');
3339 
3340         -- update package global variables
3341         cn_utils.appendcr(body_code);
3342         cn_utils.appindcr(body_code, '  g_perf_achieved_ptd := l_perf - g_perf_achieved_itd; ');
3343         cn_utils.appindcr(body_code, '  g_perf_achieved_itd := l_perf; ');
3344         FOR i IN 1..g_number_dim LOOP
3345            cn_utils.appindcr(body_code, '    g_input_achieved_ptd('||i||') := l_input('||i||') - g_input_achieved_itd('||i||') ; ');
3346            cn_utils.appindcr(body_code, '    g_input_achieved_itd('||i||') := l_input('||i||'); ');
3347         END LOOP;
3351       ELSIF (g_no_trx_flag) THEN
3348         cn_utils.appindcr(body_code, '  g_commission_payed_ptd := l_commission - g_commission_payed_itd; ');
3349         cn_utils.appindcr(body_code, '  g_commission_payed_itd := l_commission;        ');
3350         cn_utils.appendcr(body_code);
3352            cn_utils.appindcr(body_code, '  BEGIN ');
3353            cn_utils.appindcr(body_code, '    get_input(null, p_salesrep_id, p_period_id, p_quota_id, ');
3354            cn_utils.appindcr(body_code, '              p_srp_plan_assign_id, l_trx_rec_old.processed_date, l_mul_input_tbl  );');
3355            cn_utils.appindcr(body_code, '    if (l_debug_flag = ''Y'') then');
3356            FOR i IN 1..g_number_dim LOOP
3357               cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount);');
3358            END LOOP;
3359            cn_utils.appindcr(body_code, '     end if; ');
3360            cn_utils.appendcr(body_code);
3361 
3362            -- get processed date
3363            cn_utils.appendcr(body_code);
3364            cn_utils.appindcr(body_code, '    SELECT least(p.end_date,nvl(spa.end_date,p.end_date),nvl(q.end_date,p.end_date)) into l_processed_date ');
3365            cn_utils.appindcr(body_code, '      FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3366            cn_utils.appindcr(body_code, '     WHERE p.period_id = p_period_id ');
3367            cn_utils.appindcr(body_code, '           and spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3368            cn_utils.appindcr(body_code, '           and p.org_id = spa.org_id ');
3369            cn_utils.appindcr(body_code, '           and q.quota_id = p_quota_id; ');
3370            -- get rates
3371            IF g_rate_flag THEN
3372               cn_utils.appindcr(body_code, '    cn_formula_common_pkg.get_rates(p_salesrep_id, p_srp_plan_assign_id,');
3373               cn_utils.appindcr(body_code, '                                    p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
3374               cn_utils.appindcr(body_code, '                                    l_processed_date, g_number_dim,l_mul_input_tbl, ');
3375               cn_utils.appindcr(body_code, '                                    g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
3376            END IF;
3377 
3378            -- get output
3379            cn_utils.appendcr(body_code);
3380            cn_utils.appindcr(body_code, '    l_commission := get_commission(null, p_salesrep_id, p_period_id, p_quota_id, p_srp_plan_assign_id, l_rate);');
3381 
3382            FOR i IN 1..g_number_dim LOOP
3383               cn_utils.appindcr(body_code, '       l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
3384            END LOOP;
3385 
3386            IF g_perf_input_expr_seq >0 THEN
3387                   cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3388 
3389            ELSIF g_perf_measure_id IS  NULL THEN
3390                   cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3391 
3392            ELSE
3393                    cn_utils.appindcr(body_code, '     l_perf := get_perf(null, p_salesrep_id,');
3394                    cn_utils.appindcr(body_code, '                          p_period_id, p_quota_id, ');
3395                    cn_utils.appindcr(body_code, '                          p_srp_plan_assign_id, null);');
3396 
3397                    cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3398                    cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3399                    cn_utils.appindcr(body_code, '     end if; ');
3400            END IF;
3401 
3402            -- create itd trx
3403            cn_utils.appendcr(body_code);
3404            cn_utils.appindcr(body_code, '      l_trx_rec_new := l_trx_rec_null; ');
3405            cn_utils.appindcr(body_code, '      l_trx_rec_new.status := ''CALC''; ');
3406            cn_utils.appindcr(body_code, '      l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3407            cn_utils.appindcr(body_code, '      l_trx_rec_new.salesrep_id := p_salesrep_id; ');
3408            cn_utils.appindcr(body_code, '      l_trx_rec_new.created_during := ''CALC''; ');
3409            cn_utils.appindcr(body_code, '      l_trx_rec_new.srp_plan_assign_id := p_srp_plan_assign_id; ');
3410            cn_utils.appindcr(body_code, '      l_trx_rec_new.quota_id := p_quota_id; ');
3411            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_date := l_processed_date; ');
3412            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_period_id := p_period_id; ');
3413            cn_utils.appindcr(body_code, '      l_trx_rec_new.pay_period_id :=  p_period_id; ');
3414            cn_utils.appindcr(body_code, '      l_trx_rec_new.posting_status := ''UNPOSTED''; ');
3415            cn_utils.appindcr(body_code, '      l_trx_rec_new.pending_status := null; ');
3416            cn_utils.appindcr(body_code, '      l_trx_rec_new.trx_type := ''ITD'' ; ');
3417            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_amount := l_commission ;');
3418            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_rate := l_rate ; ');
3419            cn_utils.appindcr(body_code, '      l_trx_rec_new.rate_tier_id := l_rate_tier_id; ');
3420            cn_utils.appindcr(body_code, '      l_trx_rec_new.tier_split := l_tier_split ; ');
3421 /*
3422            cn_utils.appindcr(body_code, '      l_trx_rec_new.input_achieved := 0; ');
3423            cn_utils.appindcr(body_code, '      l_trx_rec_new.output_achieved:= 0; ');
3424 */
3425 
3426            IF g_number_dim > 1 THEN
3427               cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
3428             ELSE
3429               cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
3433             ELSE
3430            END IF;
3431            IF g_itd_flag = 'Y' THEN
3432               cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := g_output_achieved ; ');
3434               --  output_achieved = 0 since no need to accumulate output for individual non itd case
3435               cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := 0 ; ');
3436            END IF;
3437            cn_utils.appindcr(body_code, '     l_trx_rec_new.perf_achieved := l_perf ; ');
3438            cn_utils.appendcr(body_code);
3439 
3440 
3441            cn_utils.appendcr(body_code);
3442            cn_utils.appindcr(body_code, '      cn_formula_common_pkg.create_trx(l_trx_rec_new); ');
3443            cn_utils.appendcr(body_code);
3444 
3445            -- update package variables
3446            cn_utils.appendcr(body_code);
3447            IF g_itd_flag = 'Y' THEN
3448               cn_utils.appindcr(body_code, '   g_output_achieved_ptd := g_output_achieved_ptd + g_output_achieved ;' );
3449               cn_utils.appindcr(body_code, '   g_output_achieved_itd := g_output_achieved_itd + g_output_achieved; ' );
3450            END IF;
3451 
3452            cn_utils.appindcr(body_code, '   g_perf_achieved_ptd := g_perf_achieved_ptd+ l_perf; ');
3453            cn_utils.appindcr(body_code, '   g_perf_achieved_itd := g_perf_achieved_itd+ l_perf; ');
3454 
3455            FOR i IN 1..g_number_dim LOOP
3456               cn_utils.appindcr(body_code, '   g_input_achieved_ptd('||i||') := g_input_achieved_ptd('||i||') + l_input('||i||');        ');
3457               cn_utils.appindcr(body_code, '   g_input_achieved_itd('||i||') := g_input_achieved_itd('||i||') + l_input('||i||');        ');
3458            END LOOP;
3459 
3460            cn_utils.appindcr(body_code, '   g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3461            cn_utils.appindcr(body_code, '   g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3462            cn_utils.appendcr(body_code);
3463 
3464 /*
3465            cn_utils.appindcr(body_code, '      g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3466            cn_utils.appindcr(body_code, '      g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3467 */
3468            cn_utils.appindcr(body_code, '    EXCEPTION WHEN OTHERS THEN ');
3469            cn_utils.appindcr(body_code, '      if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3470            cn_utils.appindcr(body_code, '        FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3471            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3472            cn_utils.appindcr(body_code, '	          sqlerrm); ');
3473            cn_utils.appindcr(body_code, '      end if; ');
3474 
3475            cn_utils.appindcr(body_code, '      cn_message_pkg.debug( ''Failed to create ITD commission line'' ); ');
3476            cn_utils.appindcr(body_code, '    END ; ');
3477      END IF;
3478 
3479      calc_roll(spec_code, body_code);
3480 
3481      cn_utils.appindcr(body_code, ' EXCEPTION ' );
3482      cn_utils.appindcr(body_code, '   when others then ');
3483      IF (NOT(g_no_trx_flag)) THEN
3484      cn_utils.appindcr(body_code, '     IF l_lines_csr%isopen THEN ' );
3485      cn_utils.appindcr(body_code, '       CLOSE l_lines_csr; ');
3486      cn_utils.appindcr(body_code, '     END IF; ');
3487      END IF;
3488      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3489      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3490      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3491      cn_utils.appindcr(body_code, '	          sqlerrm); ');
3492      cn_utils.appindcr(body_code, '     end if; ');
3493      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in formula calculate_quota:''); ');
3494      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3495      cn_utils.appindcr(body_code, '     raise; ');
3496      cn_utils.proc_end( procedure_name, 'N', body_code );
3497 EXCEPTION
3498   when others then
3499     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3500       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3501                      'cn.plsql.cn_formula_gen_pkg.calculate_quota.exception',
3502          	          sqlerrm);
3503     end if;
3504     raise;
3505 END calculate_quota;
3506 
3507 --   construct the get_result procedure which will be invoked if this formula is used as an embeded formula
3508 PROCEDURE get_result (spec_code        IN OUT NOCOPY cn_utils.code_type,
3509                       body_code        IN OUT NOCOPY cn_utils.code_type )
3510 IS
3511     procedure_name        cn_obj_procedures_v.name%TYPE;
3512     procedure_desc        cn_obj_procedures_v.description%TYPE;
3513     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3514     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3515     x_repository_id        cn_repositories.repository_id%TYPE;
3516 
3517     l_counter NUMBER(15);
3518     l_variable_declaration VARCHAR2(400);
3519     l_table_object_id       cn_objects.object_id%type;
3520     l_input_sql_select        varchar2(8000);
3521     l_input_sql_from        varchar2(4000);
3522     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3523     l_input_sql_select_clob clob;
3524     l_input_sql_from_clob   clob;
3525 BEGIN
3526      procedure_name := 'get_result';
3527      procedure_desc := 'This procedure is invoked if this formula is used as an embeded formula';
3528      parameter_list := 'p_commission_line_id NUMBER';
3529 
3533 
3530      proc_init(procedure_name, procedure_desc, parameter_list,
3531                'F', 'NUMBER' , package_spec_id, x_repository_id,
3532                spec_code, body_code);
3534      cn_utils.appindcr(body_code, '  l_mul_input_tbl    cn_formula_common_pkg.mul_input_tbl_type;');
3535      cn_utils.appindcr(body_code, '  l_rate              NUMBER;');
3536      cn_utils.appindcr(body_code, '  l_rate_tier_id     NUMBER;');
3537      cn_utils.appindcr(body_code, '  l_tier_split             NUMBER;');
3538      cn_utils.appindcr(body_code, '  l_commission              NUMBER;');
3539      cn_utils.appindcr(body_code, '  p_salesrep_id      NUMBER(15); ');
3540      cn_utils.appindcr(body_code, '  p_period_id        NUMBER(15); ');
3541      cn_utils.appindcr(body_code, '  p_quota_id         NUMBER(15); ');
3542      cn_utils.appindcr(body_code, '  p_processed_date   DATE ; ');
3543      cn_utils.appindcr(body_code, '  p_srp_plan_assign_id NUMBER(15); ');
3544      cn_utils.appendcr(body_code);
3545      cn_utils.appindcr(body_code, '  CURSOR l_comm_line_csr IS ');
3546     cn_utils.appindcr(body_code, '    SELECT ');
3547 
3548     -- Added for 11.5.10 Performance Enhancments
3549     -- Add column names of CH and CL which are used in the input/output/perf expression
3550     FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
3551       IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
3552           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||',');
3553       ELSE
3554           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name);
3555       END IF;
3556     END LOOP;
3557     IF g_ch_flag THEN
3558         cn_utils.appindcr(body_code, '    FROM cn_commission_lines cl, cn_commission_headers ch ');
3559     ELSE
3560         cn_utils.appindcr(body_code, '    FROM cn_commission_lines cl');
3561     END IF;
3562     cn_utils.appindcr(body_code, '    where cl.commission_line_id = p_commission_line_id ');
3563     IF g_ch_flag THEN
3564       cn_utils.appindcr(body_code, '      AND ch.commission_header_id = cl.commission_header_id');
3565     END IF;
3566     cn_utils.appindcr(body_code, ';');
3567 
3568      -- Added for 11.5.10 Performance Enhancments
3569      -- Declare cursors which will fetch all columns of tables
3570      -- used in input/output/perf expressions.
3571      IF g_trx_group_code = 'INDIVIDUAL' THEN
3572         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
3573         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
3574            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
3575               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
3576                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
3577                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
3578                ELSE
3579                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
3580                END IF;
3581                cn_utils.appendcr(body_code);
3582                cn_utils.appindcr(body_code, '  CURSOR '||l_variable_declaration||'  IS');
3583                l_input_sql_where  := 'WHERE 1=1 ';
3584                l_input_sql_select := lower_str( '  select ' ||g_uniq_tbl_names_tbl(l_table_object_id).column_name_list);
3585                l_input_sql_from := lower( '   from ' ||g_uniq_tbl_names_tbl(l_table_object_id).table_name||' '||
3586                                                     g_uniq_tbl_names_tbl(l_table_object_id).table_alias);
3587                construct_sql_from_where (l_input_sql_select,
3588                                              l_input_sql_from,
3589                                          l_input_sql_where );
3590                --split_long_sql( body_code, l_input_sql_select, 'SELECT');
3591                  cn_utils.appindcr(body_code, 'SELECT * ');
3592 
3593                split_long_sql( body_code, l_input_sql_from, 'FROM');
3594                split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3595            END IF;
3596            l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
3597         END LOOP;
3598      END IF;
3599 
3600 
3601      cn_utils.appendcr(body_code, 'BEGIN');
3602      -- Added for 11.5.10 Performance Enhancments
3603      -- Declare cursors which will fetch all columns of tables
3604      -- used in input/output/perf expressions.
3605      cn_utils.appindcr(body_code, '  OPEN l_comm_line_csr ; ');
3606      cn_utils.appindcr(body_code, '  FETCH l_comm_line_csr into g_commission_rec;');
3607      cn_utils.appindcr(body_code, '  CLOSE l_comm_line_csr; ');
3608      cn_utils.appindcr(body_code ,'  p_salesrep_id   :=   g_commission_rec.CREDITED_SALESREP_ID;         ');
3609      cn_utils.appindcr(body_code ,'  p_period_id     :=   g_commission_rec.PROCESSED_PERIOD_ID;         ');
3610      cn_utils.appindcr(body_code ,'  p_quota_id      :=   g_commission_rec.quota_id;         ');
3611      cn_utils.appindcr(body_code ,'  p_srp_plan_assign_id   :=   g_commission_rec.srp_plan_assign_id;         ');
3612      cn_utils.appindcr(body_code ,'  p_processed_date :=   g_commission_rec.processed_date;         ');
3613 
3614      cn_utils.appendcr(body_code);
3615 
3616      -- Added for 11.5.10 Performance Enhancments
3617      -- Declare fetch statment which will fetch all columns of tables
3618      -- used in input/output/perf expressions.
3619      IF g_trx_group_code = 'INDIVIDUAL' THEN
3620         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
3624 
3621         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
3622            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
3623               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
3625                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
3626                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
3627                ELSE
3628                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
3629                END IF;
3630                cn_utils.appendcr(body_code);
3631                cn_utils.appindcr(body_code, '  OPEN '||l_variable_declaration||' ;' );
3632                cn_utils.appindcr(body_code, '  FETCH '||l_variable_declaration||'  INTO ' ||g_uniq_tbl_names_tbl(l_table_object_id).variable_name||' ;' );
3633                cn_utils.appindcr(body_code, '  CLOSE '||l_variable_declaration||' ;' );
3634             END IF;
3635             l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
3636          END LOOP;
3637       END IF;
3638 
3639      IF g_trx_group_code = 'INDIVIDUAL' AND g_itd_flag = 'N' AND g_cumulative_flag = 'N' THEN
3640         cn_utils.appindcr(body_code, '  get_input(p_commission_line_id, p_salesrep_id, ');
3641         cn_utils.appindcr(body_code, '            p_period_id, p_quota_id, ');
3642         cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, p_processed_date, ');
3643         cn_utils.appindcr(body_code, '            l_mul_input_tbl  );');
3644         cn_utils.appendcr(body_code);
3645         IF g_rate_flag THEN
3646            cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id , ');
3647            cn_utils.appindcr(body_code, '            p_period_id, p_quota_id , g_split_flag,g_itd_flag, ');
3648            cn_utils.appindcr(body_code, '            p_processed_date, g_number_dim,l_mul_input_tbl, ');
3649            cn_utils.appindcr(body_code, '            g_formula_id, l_rate , l_rate_tier_id, l_tier_split ); ');
3650         END IF;
3651         cn_utils.appendcr(body_code);
3652         cn_utils.appindcr(body_code, '  l_commission := get_commission( p_commission_line_id, ');
3653         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
3654         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id, l_rate); ');
3655      END IF;
3656 
3657      cn_utils.appindcr(body_code, '  return l_commission; ');
3658      cn_utils.appendcr(body_code);
3659 
3660      cn_utils.proc_end( procedure_name, 'N', body_code );
3661 
3662 EXCEPTION
3663   when others then
3664     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3665       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3666                      'cn.plsql.cn_formula_gen_pkg.get_result.exception',
3667          	          sqlerrm);
3668     end if;
3669     raise;
3670 END get_result;
3671 
3672  --   construct the update_revclass_perf procedure for the formula package.
3673 PROCEDURE update_revclass_perf (spec_code        IN OUT NOCOPY cn_utils.code_type,
3674                                 body_code        IN OUT NOCOPY cn_utils.code_type )
3675 IS
3676     procedure_name        cn_obj_procedures_v.name%TYPE;
3677     procedure_desc        cn_obj_procedures_v.description%TYPE;
3678     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3679     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3680     x_repository_id        cn_repositories.repository_id%TYPE;
3681 
3682     l_input_sql_select        varchar2(8000);
3683     l_input_sql_from        varchar2(4000);
3684     l_input_sql_where   varchar2(4000) := 'WHERE 1=1';
3685 
3686     l_input_sql_select_clob clob;
3687     l_input_sql_from_clob   clob;
3688 
3689     l_sql_stmt          VARCHAR2(1000);
3690     l_line_alias        VARCHAR2(30);
3691     l_header_alias      VARCHAR2(30);
3692 
3693 BEGIN
3694      procedure_name := 'update_revclass_perf';
3695      procedure_desc := 'To accumulate performance by revenue classes in group by case.'||
3696        'This is a call back when updating plan element subledger ' ;
3697      parameter_list := 'p_salesrep_id NUMBER, p_period_id NUMBER, ';
3698      parameter_list := parameter_list || 'p_quota_id NUMBER, p_srp_plan_assign_id NUMBER';
3699 
3700      proc_init(procedure_name, procedure_desc, parameter_list,
3701                'P', null, package_spec_id, x_repository_id,
3702                spec_code, body_code);
3703 
3704      cn_utils.appindcr(body_code, '  l_perf              NUMBER;');
3705      cn_utils.appindcr(body_code, '  CURSOR l_rev_classes_csr IS ');
3706      cn_utils.appindcr(body_code, '    SELECT revenue_class_id, srp_per_quota_rc_id');
3707      cn_utils.appindcr(body_code, '      FROM cn_srp_per_quota_rc_all rc');
3708      cn_utils.appindcr(body_code, '     WHERE rc.srp_plan_assign_id = p_srp_plan_assign_id');
3709      cn_utils.appindcr(body_code, '       AND rc.salesrep_id = p_salesrep_id');
3710      cn_utils.appindcr(body_code, '          AND rc.period_id = p_period_id');
3711      cn_utils.appindcr(body_code, '          AND rc.quota_id = p_quota_id;');
3712 
3713      cn_utils.appendcr(body_code);
3714      cn_utils.appendcr(body_code, 'BEGIN');
3715 
3716      IF g_perf_measure_id IS NOT NULL THEN
3717         select sql_select, sql_from
3718           into l_input_sql_select_clob, l_input_sql_from_clob
3719           from cn_calc_sql_exps_all
3720           where calc_sql_exp_id = g_perf_measure_id
3721 		    and org_id = g_org_id;
3722 
3726         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3723         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3724         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3725         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3727 
3728       ELSE   /* default to be the input with the lowest input_sequence */
3729         SELECT sql_select input_sql_select, sql_from input_sql_from
3730           INTO l_input_sql_select_clob, l_input_sql_from_clob
3731           FROM cn_calc_sql_exps_all
3732           WHERE org_id = g_org_id
3733 		    AND calc_sql_exp_id = (SELECT calc_sql_exp_id
3734                                    FROM cn_formula_inputs_all
3735                                    WHERE calc_formula_id = g_formula_id
3736                                    AND org_id = g_org_id
3737                                    AND rate_dim_sequence = 1);
3738 
3739         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3740         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3741         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3742         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3743 
3744      END IF;
3745 
3746      construct_sql_from_where(l_input_sql_select,
3747                               l_input_sql_from ,
3748                               l_input_sql_where   );
3749 
3750      -- get header table alias
3751      IF check_sql_stmt_existence(l_input_sql_from, 'cn_commission_headers') THEN
3752         l_header_alias := get_table_alias (l_input_sql_from, 'cn_commission_headers');
3753       ELSE -- comm_header not in sql_from yet, add it and get its alias
3754         l_header_alias := get_table_alias_from_cn('cn_commission_headers');
3755         l_input_sql_from := l_input_sql_from || ', cn_commission_headers_all ' || l_header_alias;
3756      END IF ;
3757      -- get the alias for cn_commisson_lines
3758      IF check_sql_stmt_existence(l_input_sql_from, 'cn_commission_lines') THEN
3759         l_line_alias := get_table_alias (l_input_sql_from, 'cn_commission_lines');
3760       ELSE -- comm_lines not in sql_from yet, add it and get its alias
3761         l_line_alias := get_table_alias_from_cn('cn_commission_lines');
3762         l_input_sql_from := l_input_sql_from || ', cn_commission_lines_all ' || l_line_alias;
3763      END IF ;
3764 
3765      -- Changed by Zack to handle the hierarchy revenue class case
3766      l_input_sql_from := l_input_sql_from || ', cn_quota_rules_all cn_cqr ';
3767 
3768      make_srp_plan_pe_hid_pid_st(l_line_alias, l_header_alias, l_input_sql_where);
3769 
3770      l_sql_stmt := ' and '|| l_line_alias || '.processed_period_id between p_start_period_id and p_period_id';
3771      IF check_sql_stmt_existence(l_input_sql_where, l_sql_stmt) THEN
3772         l_input_sql_where := REPLACE(l_input_sql_where, l_sql_stmt, ' ' );
3773 
3774         l_sql_stmt := ' and '|| l_line_alias || '.processed_period_id = p_period_id';
3775         l_input_sql_where := l_input_sql_where || l_sql_stmt;
3776      END IF;
3777 
3778      make_calc_type(l_line_alias, l_header_alias, l_input_sql_where);
3779 
3780      l_sql_stmt := ' and '|| l_line_alias || '.quota_rule_id = '||' cn_cqr.quota_rule_id ';
3781      l_sql_stmt := l_sql_stmt ||' and cn_cqr.revenue_class_id = l_rev_class.revenue_class_id ';
3782 
3783      IF NOT check_sql_stmt_existence(l_input_sql_where, l_sql_stmt) THEN
3784         l_input_sql_where := l_input_sql_where || l_sql_stmt;
3785      END IF;
3786 
3787      IF g_perf_measure_id IS NOT NULL THEN
3788         l_input_sql_select := REPLACE(l_input_sql_select, 'select', 'select sum(');
3789         l_input_sql_select := l_input_sql_select || ' ) ';
3790      END IF;
3791 
3792      cn_utils.appindcr(body_code, ' FOR l_rev_class IN l_rev_classes_csr LOOP ');
3793      split_long_sql( body_code, l_input_sql_select, 'SELECT');
3794      cn_utils.appindcr(body_code, '   into l_perf ');
3795      split_long_sql( body_code, l_input_sql_from, 'FROM');
3796      split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3797      cn_utils.appendcr(body_code);
3798      cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
3799 
3800 
3801      cn_utils.appindcr(body_code, '   UPDATE cn_srp_per_quota_rc_all');
3802      cn_utils.appindcr(body_code, '         SET period_to_date = l_perf');
3803      cn_utils.appindcr(body_code, '    WHERE srp_per_quota_rc_id = l_rev_class.srp_per_quota_rc_id;');
3804      cn_utils.appindcr(body_code, ' END LOOP; ' );
3805 
3806      cn_utils.proc_end( procedure_name, 'N', body_code );
3807 EXCEPTION
3808   when others then
3809     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3810       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3811                      'cn.plsql.cn_formula_gen_pkg.update_revclass_perf.exception',
3812          	          sqlerrm);
3813     end if;
3814     raise;
3815 END update_revclass_perf;
3816 
3817 --   construct the calculate_quota procdure which will be invoked from the dispatcher in calc engine
3818 PROCEDURE calculate_bonus_quota (spec_code        IN OUT NOCOPY cn_utils.code_type,
3819                                  body_code        IN OUT NOCOPY cn_utils.code_type )
3820 IS
3821     procedure_name        cn_obj_procedures_v.name%TYPE;
3822     procedure_desc        cn_obj_procedures_v.description%TYPE;
3823     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3824     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3825     x_repository_id        cn_repositories.repository_id%TYPE;
3826 
3830     l_input_sql_from_clob   clob;
3827     l_input_sql_select        VARCHAR2(8000);
3828     l_input_sql_from        varchar2(4000);
3829     l_input_sql_select_clob clob;
3831     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3832     l_counter NUMBER;
3833     l_ctr NUMBER;
3834     l_dim_unit_code VARCHAR2(30);
3835 
3836     CURSOR l_mul_inputs_csr IS
3837        SELECT calc_sql_exp_id, rate_dim_sequence, nvl(split_flag, 'N') split_flag
3838          FROM cn_formula_inputs_all
3839          WHERE calc_formula_id = g_formula_id
3840          AND org_id = g_org_id
3841          ORDER BY rate_dim_sequence;
3842 
3843     -- cursor to get the dim_unit_code
3844     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
3845        SELECT dim_unit_code
3846 	 FROM cn_rate_dimensions_all
3847 	 WHERE rate_dimension_id = (SELECT rate_dimension_id
3848 				    FROM cn_rate_sch_dims_all
3849 				    WHERE rate_dim_sequence = p_rate_dim_sequence
3850 				      AND rate_schedule_id = (SELECT rate_schedule_id
3851 							      FROM cn_rt_formula_asgns_all
3852 							      WHERE calc_formula_id = g_formula_id
3853                                     AND org_id = g_org_id
3854 							      AND ROWNUM = 1));
3855 
3856     CURSOR l_input_sql_select_from_csr (l_calc_sql_exp_id NUMBER) IS
3857        SELECT  sql_select input_sql_select, sql_from input_sql_from
3858          FROM  cn_calc_sql_exps_all
3859          WHERE calc_sql_exp_id = l_calc_sql_exp_id
3860 		   AND org_id = g_org_id;
3861 
3862     l_output_sql_select        varchar2(8000);
3863     l_output_sql_from        varchar2(4000);
3864     l_output_sql_select_clob clob;
3865     l_output_sql_from_clob   clob;
3866 
3867     l_output_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3868 
3869     CURSOR l_output_select_from_csr IS
3870        SELECT  sql_select output_sql_select, sql_from output_sql_from
3871          FROM cn_calc_sql_exps_all
3872          WHERE calc_sql_exp_id = (SELECT output_exp_id
3873                                   FROM  cn_calc_formulas_all
3874                                   WHERE  calc_formula_id = g_formula_id
3875                                     AND org_id = g_org_id);
3876 
3877     CURSOR l_perf_select_from_csr IS
3878        select  sql_select, sql_from
3879          from cn_calc_sql_exps_all
3880          where calc_sql_exp_id = g_perf_measure_id;
3881 
3882     CURSOR l_inp_perf_select_from_csr IS
3883        SELECT sql_select input_sql_select, sql_from input_sql_from
3884          FROM cn_calc_sql_exps_all
3885          WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
3886                                   FROM cn_formula_inputs_all
3887                                   WHERE calc_formula_id = g_formula_id
3888                                   AND org_id = g_org_id
3889                                   AND rate_dim_sequence = 1);
3890 
3891     l_perf_sql_select        varchar2(8000);
3892     l_perf_sql_from        varchar2(4000);
3893     l_perf_sql_select_clob clob;
3894     l_perf_sql_from_clob   clob;
3895 
3896     l_perf_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3897 
3898     CURSOR l_all_columns_csr (l_table_id NUMBER ) IS
3899        SELECT lower(name) column_name, data_type
3900          FROM cn_objects_all
3901          WHERE table_id = l_table_id
3902          AND org_id = g_org_id
3903          AND object_type = 'COL'
3904          AND primary_key = 'Y'
3905          AND position IS NOT NULL
3906            ORDER BY position;
3907 BEGIN
3908      procedure_name := 'calculate_quota';
3909      procedure_desc := 'This procedure is the hook to the calculation engine';
3910 
3911      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, p_period_id NUMBER, ';
3912      parameter_list := parameter_list || 'p_start_date DATE, p_quota_id NUMBER, p_process_all_flag VARCHAR2, ';
3913      parameter_list := parameter_list || ' p_intel_calc_flag VARCHAR2, p_calc_type VARCHAR2 ';
3914      parameter_list := parameter_list || ',p_credit_type_id NUMBER, p_role_id NUMBER, x_latest_processed_date OUT NOCOPY DATE           ';
3915 
3916      proc_init(procedure_name, procedure_desc, parameter_list, 'P', null , package_spec_id, x_repository_id, spec_code, body_code);
3917 
3918      cn_utils.appindcr(body_code, '  l_mul_input_tbl           ' || 'cn_formula_common_pkg.mul_input_tbl_type; ');
3919      cn_utils.appindcr(body_code, '  p_rate                     NUMBER;');
3920      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER(15); ');
3921      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER(15); ');
3922      cn_utils.appindcr(body_code, '  l_input                    cn_formula_common_pkg.num_table_type; ');
3923      cn_utils.appindcr(body_code, '  l_input_string             VARCHAR2(30);');
3924      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
3925      cn_utils.appindcr(body_code, '  l_perf                     NUMBER; ');
3926      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
3927      cn_utils.appindcr(body_code, '  l_error_reason             VARCHAR2(150); ');
3928      cn_utils.appindcr(body_code, '  l_name                     VARCHAR2(255); ');
3929      cn_utils.appindcr(body_code, '  l_trx_rec                  cn_formula_common_pkg.trx_rec_type; ');
3930      cn_utils.appindcr(body_code, '  l_trx_rec_null             cn_formula_common_pkg.trx_rec_type; ');
3931      cn_utils.appindcr(body_code, '  l_rollover                 NUMBER := 0; ');
3932      cn_utils.appendcr(body_code);
3933 
3934      -- constructing input cursor here
3935      l_counter := 1;
3939         OPEN l_input_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
3936      FOR l_mul_input IN l_mul_inputs_csr LOOP
3937         l_input_sql_where  := 'WHERE 1=1 ';
3938 
3940         FETCH l_input_sql_select_from_csr
3941           INTO l_input_sql_select_clob, l_input_sql_from_clob;
3942         CLOSE l_input_sql_select_from_csr;
3943 
3944         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3945         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3946         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3947         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3948 
3949         construct_sql_from_where (l_input_sql_select,
3950                                   l_input_sql_from,
3951                                   l_input_sql_where );
3952         -- special logic for first input
3953         IF l_mul_inputs_csr%rowcount = 1 THEN
3954            g_external_table_id := NULL;
3955            handle_bonus_ex_tbl_orderby(l_input_sql_select,
3956                                        l_input_sql_from,
3957                                        l_input_sql_where,
3958                                        'INPUT1' );
3959            -- if there is external_table in input
3960            -- declare the parameters corresponding to the primray key columns of the external tbl
3961            IF g_external_table_id IS NOT NULL THEN
3962               FOR l_column IN l_all_columns_csr(g_external_table_id) LOOP
3963                  l_ctr := l_all_columns_csr%rowcount;
3964                  IF l_column.data_type IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2' ) THEN
3965                     cn_utils.appindcr(body_code, '  l_parameter_'|| l_ctr
3966                                       || '    ' || l_column.data_type || ' (1000); ' );
3967                   ELSE
3968                     cn_utils.appindcr(body_code, '  l_parameter_'|| l_ctr
3969                                       || '    ' || l_column.data_type || ';' );
3970                  END IF;
3971               END LOOP;
3972            END IF;
3973            cn_utils.appendcr(body_code);
3974 
3975            cn_utils.appindcr(body_code, '  CURSOR l_input_csr_'|| l_counter || ' IS ' );
3976            split_long_sql( body_code, l_input_sql_select, 'SELECT');
3977            split_long_sql( body_code, l_input_sql_from, 'FROM');
3978            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3979            cn_utils.appendcr(body_code);
3980 
3981            IF g_external_table_id IS NOT NULL THEN
3982               l_input_sql_where  := 'WHERE 1=1 ';
3983 
3984               OPEN l_input_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
3985               FETCH l_input_sql_select_from_csr
3986                 INTO l_input_sql_select_clob, l_input_sql_from_clob;
3987               CLOSE l_input_sql_select_from_csr;
3988 
3989               convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3990               l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3991               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3992               l_input_sql_from := lower( 'from ' || l_input_sql_from );
3993 
3994               construct_sql_from_where (l_input_sql_select,
3995                                         l_input_sql_from,
3996                                         l_input_sql_where );
3997 
3998               handle_bonus_ex_tbl_orderby(l_input_sql_select,
3999                                           l_input_sql_from,
4000                                           l_input_sql_where,
4001                                           'INPUT0' );
4002 
4003               cn_utils.appindcr(body_code, '  CURSOR l_input_csr_0 IS ' );
4004               split_long_sql( body_code, l_input_sql_select, 'SELECT');
4005               split_long_sql( body_code, l_input_sql_from, 'FROM');
4006               split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
4007               cn_utils.appendcr(body_code);
4008            END IF;
4009 
4010          ELSE
4011            handle_bonus_ex_tbl_orderby(l_input_sql_select,
4012                                        l_input_sql_from,
4013                                        l_input_sql_where,
4014                                        'INPUT' );
4015 
4016            cn_utils.appindcr(body_code, '  CURSOR l_input_csr_'|| l_counter || ' IS ' );
4017            split_long_sql( body_code, l_input_sql_select, 'SELECT');
4018            split_long_sql( body_code, l_input_sql_from, 'FROM');
4019            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
4020            cn_utils.appendcr(body_code);
4021         END IF;
4022 
4023         l_counter := l_counter+1;
4024      END LOOP;
4025 
4026      -- constructing output_cursro here
4027      OPEN l_output_select_from_csr;
4028      FETCH l_output_select_from_csr
4029        INTO l_output_sql_select_clob, l_output_sql_from_clob;
4030      CLOSE l_output_select_from_csr;
4031 
4032      convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
4033      l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
4034      convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
4035      l_output_sql_from := lower( 'from ' || l_output_sql_from );
4036 
4037      g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
4038 
4039      construct_sql_from_where(l_output_sql_select,
4040                               l_output_sql_from,
4041                               l_output_sql_where    );
4042 
4043      handle_output_sql_select(l_output_sql_select,
4047      handle_bonus_ex_tbl_orderby(l_output_sql_select,
4044                               l_output_sql_from,
4045                               l_output_sql_where    );
4046 
4048                                  l_output_sql_from,
4049                                  l_output_sql_where,
4050                                  'OUTPUT' );
4051 
4052      cn_utils.appindcr(body_code, '  CURSOR l_output_csr IS ' );
4053      split_long_sql( body_code, l_output_sql_select, 'SELECT');
4054      split_long_sql( body_code, l_output_sql_from, 'FROM');
4055      split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
4056      cn_utils.appendcr(body_code);
4057 
4058      -- constructing perf_cursor here
4059      IF g_perf_measure_id IS NOT NULL THEN
4060         OPEN l_perf_select_from_csr;
4061         FETCH l_perf_select_from_csr
4062           INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
4063         CLOSE l_perf_select_from_csr;
4064 
4065         convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
4066         l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
4067         convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
4068         l_perf_sql_from := lower('from ' || l_perf_sql_from);
4069       ELSE   /* default to be the input with the lowest input_sequence */
4070         OPEN l_inp_perf_select_from_csr;
4071         FETCH l_inp_perf_select_from_csr
4072           INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
4073         CLOSE l_inp_perf_select_from_csr;
4074 
4075         convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
4076         l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
4077         convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
4078         l_perf_sql_from := lower('from ' || l_perf_sql_from);
4079      END IF;
4080 
4081      construct_sql_from_where(l_perf_sql_select,
4082                               l_perf_sql_from,
4083                               l_perf_sql_where     );
4084 
4085      handle_bonus_ex_tbl_orderby(l_perf_sql_select,
4086                                  l_perf_sql_from,
4087                                  l_perf_sql_where,
4088                                  'PERF'            );
4089 
4090      cn_utils.appindcr(body_code, '  CURSOR l_perf_csr IS ' );
4091      split_long_sql( body_code, l_perf_sql_select, 'SELECT');
4092      split_long_sql( body_code, l_perf_sql_from, 'FROM');
4093      split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
4094 
4095      -- finish contructing input/output/perf cursors
4096      cn_utils.appendcr(body_code, 'BEGIN');
4097      cn_utils.appindcr(body_code, '  g_intel_calc_flag := p_intel_calc_flag;');
4098      cn_utils.appindcr(body_code, '  g_calc_type := p_calc_type;');
4099      calc_init(spec_code, body_code);
4100 
4101      FOR i IN 1..g_number_dim LOOP
4102 	cn_utils.appindcr(body_code, '  l_input('||i||') := 0;        ');
4103      END LOOP;
4104 
4105      IF g_external_table_id IS NOT NULL THEN
4106         cn_utils.appindcr(body_code, ' FOR l_csr_0 IN l_input_csr_0 LOOP ');
4107         cn_utils.appindcr(body_code, '   BEGIN ');
4108         FOR l_column IN l_all_columns_csr(g_external_table_id) LOOP
4109            cn_utils.appindcr(body_code, '     l_parameter_'||
4110                              To_char(l_all_columns_csr%rowcount) || ' := l_csr_0.'
4111                              || l_column.column_name || ' ;');
4112         END LOOP;
4113         cn_utils.appendcr(body_code);
4114       ELSE
4115         cn_utils.appindcr(body_code, '   BEGIN ');
4116      END IF;
4117      cn_utils.appindcr(body_code, '  l_trx_rec  := l_trx_rec_null; ');
4118      FOR l_mul_input IN l_mul_inputs_csr LOOP
4119         l_ctr := l_mul_inputs_csr%rowcount;
4120         cn_utils.appindcr(body_code, '     OPEN l_input_csr_' || l_ctr || ' ;' );
4121 
4122 	OPEN dim_type(l_mul_input.rate_dim_sequence);
4123 	FETCH dim_type INTO l_dim_unit_code;
4124 	CLOSE dim_type;
4125 
4126 	IF (l_dim_unit_code = 'STRING') THEN
4127 	   cn_utils.appindcr(body_code, '     FETCH l_input_csr_' || l_ctr||' INTO l_input_string; ');
4128 	ELSE
4129 	   cn_utils.appindcr(body_code, '     FETCH l_input_csr_' || l_ctr||' INTO l_input('||l_mul_input.rate_dim_sequence||'); ');
4130         END IF;
4131 
4132         cn_utils.appendcr(body_code);
4133         cn_utils.appindcr(body_code, '     IF l_input_csr_'|| l_ctr || '%notfound THEN ');
4134         cn_utils.appindcr(body_code, '        raise no_data_found; ');
4135         cn_utils.appindcr(body_code, '     END IF;  ');
4136         cn_utils.appendcr(body_code);
4137         cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr ||').rate_dim_sequence := '
4138                           || l_mul_input.rate_dim_sequence || ' ; ' );
4139 
4140         IF (l_dim_unit_code = 'STRING') THEN
4141           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').input_string := l_input_string;' );
4142         ELSE
4143           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').input_amount := l_input('||l_mul_input.rate_dim_sequence||');');
4144           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').amount := l_input('||l_mul_input.rate_dim_sequence||');' );
4145         END IF;
4146 
4147         IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4148            cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr || ').base_amount := 0;' );
4149          ELSE
4150            cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr || ').base_amount := l_input('||l_mul_input.rate_dim_sequence||');' );
4154      END LOOP;
4151         END IF;
4152         cn_utils.appindcr(body_code, '     CLOSE l_input_csr_' || l_ctr || ' ;' );
4153         cn_utils.appendcr(body_code);
4155 
4156      --cn_utils.appindcr(body_code, '     l_input := l_mul_input_tbl(1).input_amount; ');
4157      cn_utils.appendcr(body_code);
4158      -- get_rates
4159      IF g_rate_flag THEN
4160         cn_utils.appindcr(body_code, '     cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
4161         cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag, g_itd_flag,');
4162         cn_utils.appindcr(body_code, '                 p_start_date, g_number_dim,l_mul_input_tbl, ');
4163         cn_utils.appindcr(body_code, '                 g_formula_id, p_rate, l_rate_tier_id, l_tier_split ); ');
4164         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Commission rate=''|| p_rate);');
4165      END IF;
4166      cn_utils.appendcr(body_code);
4167      -- get_commission
4168      cn_utils.appindcr(body_code, '     OPEN l_output_csr; ');
4169      cn_utils.appindcr(body_code, '     FETCH l_output_csr INTO l_commission; ');
4170      cn_utils.appindcr(body_code, '     IF l_output_csr%notfound THEN ');
4171      cn_utils.appindcr(body_code, '        raise no_data_found; ');
4172      cn_utils.appindcr(body_code, '     END IF;  ');
4173      cn_utils.appindcr(body_code, '     CLOSE l_output_csr; ');
4174      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Output=''||l_commission);');
4175      cn_utils.appendcr(body_code);
4176      -- get perf need more thought
4177      cn_utils.appindcr(body_code, '     OPEN l_perf_csr; ');
4178      cn_utils.appindcr(body_code, '     FETCH l_perf_csr INTO l_perf; ');
4179      cn_utils.appindcr(body_code, '     IF l_perf_csr%notfound THEN ');
4180      cn_utils.appindcr(body_code, '        raise no_data_found; ');
4181      cn_utils.appindcr(body_code, '     END IF;  ');
4182      cn_utils.appindcr(body_code, '     CLOSE l_perf_csr; ');
4183      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Performance measure=''||l_perf);');
4184      cn_utils.appendcr(body_code);
4185      cn_utils.appindcr(body_code, '     x_latest_processed_date := p_start_date;    ');
4186      cn_utils.appendcr(body_code);
4187      -- update all global variables
4188      update_variables(spec_code, body_code);
4189      cn_utils.appendcr(body_code);
4190      cn_utils.appindcr(body_code, '     l_trx_rec.commission_amount := l_commission ;');
4191      cn_utils.appindcr(body_code, '     l_trx_rec.commission_rate := p_rate ; ');
4192      cn_utils.appindcr(body_code, '     l_trx_rec.rate_tier_id := l_rate_tier_id ;');
4193      cn_utils.appindcr(body_code, '     l_trx_rec.tier_split := l_tier_split ;');
4194      cn_utils.appindcr(body_code, '     l_trx_rec.input_achieved := g_input_achieved_itd(1); ');
4195      cn_utils.appindcr(body_code, '     l_trx_rec.output_achieved := g_output_achieved_itd; ');
4196      cn_utils.appindcr(body_code, '     l_trx_rec.perf_achieved := l_perf; ');
4197      cn_utils.appindcr(body_code, '     l_trx_rec.status := ''CALC''; ');
4198      cn_utils.appindcr(body_code, '     l_trx_rec.credit_type_id := p_credit_type_id; ');
4199      cn_utils.appindcr(body_code, '   EXCEPTION WHEN OTHERS THEN ');
4200 
4201      FOR l_mul_input IN l_mul_inputs_csr LOOP
4202         l_ctr := l_mul_inputs_csr%rowcount;
4203         cn_utils.appindcr(body_code, '     IF l_input_csr_' || l_ctr || '%isopen THEN ' );
4204         cn_utils.appindcr(body_code, '        CLOSE l_input_csr_' || l_ctr || ' ;' );
4205         cn_utils.appindcr(body_code, '     END IF; ');
4206      END LOOP;
4207      cn_utils.appendcr(body_code);
4208      cn_utils.appindcr(body_code, '     IF l_output_csr%isopen THEN ' );
4209      cn_utils.appindcr(body_code, '        CLOSE l_output_csr; ');
4210      cn_utils.appindcr(body_code, '     END IF; ');
4211      cn_utils.appendcr(body_code);
4212      cn_utils.appindcr(body_code, '     IF l_perf_csr%isopen THEN ' );
4213      cn_utils.appindcr(body_code, '        CLOSE l_perf_csr; ');
4214      cn_utils.appindcr(body_code, '     END IF; ');
4215      cn_utils.appendcr(body_code);
4216      -- how to handle exception  -->create a trx with status 'XCALC' that has the error_reason
4217      cn_utils.appindcr(body_code, '     l_trx_rec.error_reason := substr(sqlerrm,1,150);  ');
4218      cn_utils.appindcr(body_code, '     l_trx_rec.status := ''XCALC''; ');
4219      cn_utils.appindcr(body_code, '     l_trx_rec.commission_amount := 0 ;');
4220      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in formula calculate_bonus_quota:''); ' );
4221      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ' );
4222      cn_utils.appindcr(body_code, '   END; ');
4223      cn_utils.appendcr(body_code);
4224      cn_utils.appindcr(body_code, '     l_trx_rec.salesrep_id := p_salesrep_id; ');
4225      cn_utils.appindcr(body_code, '     l_trx_rec.srp_plan_assign_id := p_srp_plan_assign_id; ');
4226      cn_utils.appindcr(body_code, '     l_trx_rec.quota_id := p_quota_id; ');
4227      cn_utils.appindcr(body_code, '     l_trx_rec.processed_date := p_start_date; ');
4228      cn_utils.appindcr(body_code, '     l_trx_rec.processed_period_id := p_period_id; ');
4229      cn_utils.appindcr(body_code, '     l_trx_rec.pay_period_id :=  p_period_id; ');
4230      cn_utils.appindcr(body_code, '     l_trx_rec.posting_status := ''UNPOSTED''; ');
4231      cn_utils.appindcr(body_code, '     l_trx_rec.pending_status := null; ');
4232      cn_utils.appindcr(body_code, '     l_trx_rec.created_during := ''CALC''; ');
4233      cn_utils.appindcr(body_code, '     l_trx_rec.trx_type := ''BONUS'' ; ');
4234      cn_utils.appindcr(body_code, '     cn_formula_common_pkg.create_trx(l_trx_rec); ');
4235      -- create_bonus_trx;
4236      cn_utils.appendcr(body_code);
4240      END IF;
4237      IF g_external_table_id IS NOT NULL THEN
4238         cn_utils.appindcr(body_code, ' END LOOP; ');
4239         -- cn_utils.appindcr(body_code, ' CLOSE l_input_csr_0; ');
4241      -- contructing calc_roll
4242      calc_roll(spec_code, body_code);
4243      cn_utils.appindcr(body_code, ' EXCEPTION ' );
4244      cn_utils.appindcr(body_code, '   when others then ');
4245      FOR l_mul_input IN l_mul_inputs_csr LOOP
4246         l_ctr := l_mul_inputs_csr%rowcount;
4247         cn_utils.appindcr(body_code, '     IF l_input_csr_' || l_ctr || '%isopen THEN ' );
4248         cn_utils.appindcr(body_code, '        CLOSE l_input_csr_' || l_ctr || ' ;' );
4249         cn_utils.appindcr(body_code, '     END IF; ');
4250      END LOOP;
4251      cn_utils.appendcr(body_code);
4252      cn_utils.appindcr(body_code, '     IF l_output_csr%isopen THEN ' );
4253      cn_utils.appindcr(body_code, '        CLOSE l_output_csr; ');
4254      cn_utils.appindcr(body_code, '     END IF; ');
4255      cn_utils.appendcr(body_code);
4256      cn_utils.appindcr(body_code, '     IF l_perf_csr%isopen THEN ' );
4257      cn_utils.appindcr(body_code, '        CLOSE l_perf_csr; ');
4258      cn_utils.appindcr(body_code, '     END IF; ');
4259      cn_utils.appendcr(body_code);
4260      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4261      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4262      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_bonus_quota.exception'', ');
4263      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4264      cn_utils.appindcr(body_code, '     end if; ');
4265      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in calculate_bonsu_quota:''); ');
4266      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ' );
4267      cn_utils.appindcr(body_code, '     raise; ');
4268 
4269      cn_utils.proc_end( procedure_name, 'N', body_code );
4270 EXCEPTION
4271   when others then
4272     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4273       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4274                      'cn.plsql.cn_formula_gen_pkg.calculate_bonus_quota.exception',
4275          	          sqlerrm);
4276     end if;
4277     raise;
4278 END calculate_bonus_quota;
4279 
4280 --   construct the get_forecast_commission procdure which will be invoked by Income Planner
4281 PROCEDURE get_forecast_commission(spec_code        IN OUT NOCOPY cn_utils.code_type,
4282                                   body_code        IN OUT NOCOPY cn_utils.code_type )
4283 IS
4284     procedure_name        cn_obj_procedures_v.name%TYPE;
4285     procedure_desc        cn_obj_procedures_v.description%TYPE;
4286     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
4287 
4288     l_rate_dim_sequence NUMBER;
4289     l_sql_select        VARCHAR2(8000);
4290     l_sql_from          VARCHAR2(4000);
4291     l_sql_where         VARCHAR2(4000);
4292     l_counter           NUMBER := 1;
4293     l_dim_unit_code     VARCHAR2(30);
4294     l_calc_sql_exp_id   NUMBER;
4295     l_output_exp_id     NUMBER;
4296 
4297     l_operator_position NUMBER;
4298     l_operator          VARCHAR2(1);
4299 
4300     CURSOR f_output IS
4301        SELECT f_output_exp_id
4302          FROM cn_calc_formulas_all
4303          WHERE calc_formula_id = g_formula_id
4304            AND org_id = g_org_id;
4305 
4306     CURSOR f_inputs IS
4307        SELECT rate_dim_sequence, f_calc_sql_exp_id, cumulative_flag, split_flag
4308          FROM cn_formula_inputs_all
4309          WHERE calc_formula_id = g_formula_id
4310            AND org_id = g_org_id;
4311 
4312     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
4313        SELECT dim_unit_code
4314          FROM cn_rate_dimensions_all
4315          WHERE rate_dimension_id = (SELECT rate_dimension_id
4316                                     FROM cn_rate_sch_dims_all
4317                                     WHERE rate_dim_sequence = p_rate_dim_sequence
4318                                       AND rate_schedule_id = (SELECT rate_schedule_id
4319                                                               FROM cn_rt_formula_asgns_all
4320                                                               WHERE calc_formula_id = g_formula_id
4321                                                               AND org_id = g_org_id
4322                                                               AND ROWNUM = 1));
4323 
4324     CURSOR sql_statement(p_calc_sql_exp_id NUMBER) IS
4325        SELECT  dbms_lob.substr(sql_select), dbms_lob.substr(sql_from)
4326          FROM  cn_calc_sql_exps_all
4327          WHERE calc_sql_exp_id = p_calc_sql_exp_id;
4328 BEGIN
4329      OPEN f_output;
4330      FETCH f_output INTO l_output_exp_id;
4331      CLOSE f_output;
4332 
4333      -- if there is no forecasting expressions, then return
4334      IF (l_output_exp_id IS NULL) THEN
4335         RETURN;
4336      END IF;
4337 
4338      procedure_name := 'get_forecast_commission';
4339      procedure_desc := '   Called by Income Planner to forecast commissions';
4340 
4341      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, ';
4342      parameter_list := parameter_list || 'p_start_period_id NUMBER, p_forecast_period_id NUMBER, p_quota_id NUMBER,  ';
4343      parameter_list := parameter_list || 'p_forecast_amount NUMBER, x_projected_commission OUT NOCOPY NUMBER ';
4344 
4345      proc_init(procedure_name, procedure_desc, parameter_list,
4349      cn_utils.appindcr(body_code, '  l_mul_input_tbl            ' || 'cn_formula_common_pkg.mul_input_tbl_type; ');
4346                'P', null , null, null,
4347                spec_code, body_code);
4348 
4350      cn_utils.appindcr(body_code, '  p_rate                     NUMBER;');
4351      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
4352      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
4353      cn_utils.appindcr(body_code, '  l_input                    NUMBER; ');
4354      cn_utils.appindcr(body_code, '  l_input_string             VARCHAR2(30); ');
4355      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
4356      cn_utils.appindcr(body_code, '  l_itd_target               NUMBER; ');
4357      cn_utils.appindcr(body_code, '  l_itd_payment              NUMBER; ');
4358      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
4359      cn_utils.appindcr(body_code, '  p_period_id                NUMBER; ');
4360      cn_utils.appindcr(body_code, '  p_start_date               DATE; ');
4361      cn_utils.appindcr(body_code, '  p_process_all_flag         VARCHAR2(1) := ''Y'';');
4362      cn_utils.appendcr(body_code, 'BEGIN');
4363 
4364      cn_utils.appindcr(body_code, '  g_calc_type := ''FORECAST'';');
4365 
4366      cn_utils.appindcr(body_code, '  p_period_id := p_start_period_id; ');
4367 
4368      -- when initialize _itd global variables, set the period_id to be the first period in the forecasting interval
4369 
4370 
4371      /*cn_utils.appindcr(body_code, '  p_period_id := cn_api.get_acc_period_id(trunc(sysdate));');
4372      cn_utils.appindcr(body_code, '  if (p_period_type = ''Q'') then ');
4373      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_quarter_start_period_id(p_quota_id, p_period_id);');
4374      cn_utils.appindcr(body_code, '  elsif (p_period_type = ''Y'') then ');
4375      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_start_period_id(p_quota_id, p_period_id);');
4376      cn_utils.appindcr(body_code, '  end if; ');*/
4377 
4378 
4379      calc_init(spec_code, body_code);
4380 
4381      /*cn_utils.appindcr(body_code, '  if (p_period_type = ''Q'') then ');
4382      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_quarter_end_period_id(p_quota_id, p_period_id);');
4383      cn_utils.appindcr(body_code, '  elsif (p_period_type = ''Y'') then ');
4384      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_end_period_id(p_quota_id, p_period_id);');
4385      cn_utils.appindcr(body_code, '  end if; ');*/
4386 
4387 
4388      cn_utils.appindcr(body_code, '  p_period_id := p_forecast_period_id; ');
4389 
4390      FOR input IN f_inputs LOOP
4391         OPEN dim_type(input.rate_dim_sequence);
4392         FETCH dim_type INTO l_dim_unit_code;
4393         CLOSE dim_type;
4394 
4395         l_sql_where := 'WHERE 1 = 1 ';
4396 
4397         OPEN sql_statement(input.f_calc_sql_exp_id);
4398         FETCH sql_statement INTO l_sql_select, l_sql_from;
4399         CLOSE sql_statement;
4400 
4401         l_sql_select := REPLACE(l_sql_select, 'ForecastAmount', 'p_forecast_amount');
4402         l_sql_select := 'select ' || lower_str(l_sql_select);
4403         l_sql_from := 'from ' || lower(l_sql_from);
4404 
4405         construct_sql_from_where(l_sql_select, l_sql_from, l_sql_where);
4406 
4407         split_long_sql(body_code, l_sql_select, 'SELECT');
4408         IF (l_dim_unit_code = 'STRING') THEN
4409            cn_utils.appindcr(body_code, ' into l_input_string ');
4410          ELSE
4411            cn_utils.appindcr(body_code, ' into l_input ');
4412         END IF;
4413         split_long_sql(body_code, l_sql_from, 'FROM');
4414         split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4415 
4416         cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
4417         cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').rate_dim_sequence := ' || input.rate_dim_sequence || ';');
4418 
4419         IF (l_dim_unit_code = 'STRING') THEN
4420            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').input_string := l_input_string;' );
4421          ELSE
4422            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').input_amount := l_input;' );
4423            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter ||').amount := l_input;' );
4424         END IF;
4425 
4426         IF (input.cumulative_flag = 'N') THEN --IF (g_cumulative_flag = 'N') THEN
4427            IF (input.split_flag <> 'N') THEN --IF (g_split_flag <> 'N') THEN
4428               cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;');
4429             ELSE
4430               cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := l_input;');
4431            END IF;
4432          ELSE
4433            IF g_itd_flag = 'N' THEN
4434               IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4435                  IF (g_trx_group_code = 'GROUP') THEN
4436                     cn_utils.appindcr(body_code, ' l_mul_input_tbl(' || l_counter || ').base_amount := 0;');
4437                   ELSE
4438                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('
4439                                       ||input.rate_dim_sequence||');' );
4440                  END IF;
4441                ELSE
4442                  IF (g_trx_group_code = 'GROUP') THEN
4443                     cn_utils.appindcr(body_code, ' l_mul_input_tbl(' || l_counter || ').base_amount := l_input;');
4447                  END IF;
4444                   ELSE
4445                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('||
4446                                       input.rate_dim_sequence||')+ l_input;' );
4448               END IF;
4449             ELSE
4450               cn_utils.appendcr(body_code);
4451               IF g_pq_target_flag OR g_spq_target_flag  THEN
4452                  IF g_pq_target_flag THEN
4453                     cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
4454                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
4455                  END IF;
4456 
4457                  IF g_spq_target_flag THEN
4458                     cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
4459                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
4460                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
4461 
4462                     IF (g_rollover_flag = 'Y') THEN
4463                        cn_utils.appindcr(body_code, ' SELECT l_itd_target + total_rollover ');
4464                        cn_utils.appindcr(body_code, '   INTO l_itd_target ');
4465                        cn_utils.appindcr(body_code, '   FROM cn_srp_period_quotas_all ');
4466                        cn_utils.appindcr(body_code, '  WHERE srp_plan_assign_id = p_srp_plan_assign_id ');
4467                        cn_utils.appindcr(body_code, '    AND quota_id = p_quota_id ');
4468                        cn_utils.appindcr(body_code, '    AND period_id = p_period_id; ');
4469                     END IF;
4470                  END IF;
4471 
4472                  cn_utils.appendcr(body_code);
4473 
4474                  IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4475                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := (l_input + g_input_achieved_itd('
4476                                       ||input.rate_dim_sequence||')) ');
4477                     cn_utils.appindcr(body_code, '     /l_itd_target;' );
4478                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
4479                   ELSE
4480                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input / l_itd_target; ');
4481                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').base_amount := (l_input + g_input_achieved_itd('
4482                                       ||input.rate_dim_sequence||'))');
4483                     cn_utils.appindcr(body_code, '      /l_itd_target;' );
4484                  END IF;
4485                ELSE
4486                  IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4487                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input + g_input_achieved_itd('
4488                                       ||input.rate_dim_sequence||');' );
4489                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
4490                   ELSE
4491                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input; ');
4492                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').base_amount := l_input + g_input_achieved_itd('
4493                                       ||input.rate_dim_sequence||');' );
4494                  END IF;
4495               END IF;
4496            END IF;
4497         END IF;
4498         cn_utils.appendcr(body_code);
4499         l_counter := l_counter+1;
4500      END LOOP;
4501 
4502      OPEN f_output;
4503      FETCH f_output INTO l_calc_sql_exp_id;
4504      CLOSE f_output;
4505 
4506      OPEN sql_statement(l_calc_sql_exp_id);
4507      FETCH sql_statement INTO l_sql_select, l_sql_from;
4508 
4509      l_sql_select := REPLACE(l_sql_select, 'ForecastAmount', 'p_forecast_amount');
4510      l_sql_select := lower_str( 'select ' || l_sql_select);
4511      l_sql_from := lower('from ' || l_sql_from);
4512      l_sql_where := 'where 1 = 1 ';
4513 
4514      g_rate_flag := check_sql_stmt_existence(l_sql_select, 'rateresult');
4515 
4516      l_operator_position := search_delimiter_select(l_sql_select, 1);
4517      IF l_operator_position > 0 THEN
4518         l_operator := substr(l_sql_select, l_operator_position, 1);
4519      END IF;
4520 
4521      IF g_rate_flag THEN
4522         -- get processed date (end_date of the last period in the forecast date range)
4523         cn_utils.appindcr(body_code, '      SELECT end_date into l_processed_date ');
4524         cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v             ');
4525         cn_utils.appindcr(body_code, '        WHERE period_id = p_period_id       ');
4526         cn_utils.appindcr(body_code, '          AND org_id = g_org_id;       ');
4527 
4528         cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
4529         cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
4530         cn_utils.appindcr(body_code, '                 l_processed_date, g_number_dim,l_mul_input_tbl, ');
4531         cn_utils.appindcr(body_code, '                 g_formula_id, p_rate, l_rate_tier_id, l_tier_split ); ');
4532      END IF;
4533 
4534      construct_sql_from_where(l_sql_select, l_sql_from, l_sql_where);
4535      handle_output_sql_select(l_sql_select, l_sql_from, l_sql_where);
4539      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4536      split_long_sql(body_code, l_sql_select, 'SELECT');
4537      cn_utils.appindcr(body_code, '  into l_commission');
4538      split_long_sql(body_code, l_sql_from, 'FROM');
4540      cn_utils.appendcr(body_code);
4541      cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
4542 
4543      IF g_itd_flag = 'Y' THEN
4544         IF (g_pq_payment_flag OR g_spq_payment_flag) THEN
4545            IF (g_rate_flag) THEN
4546               IF (l_operator_position > 0) THEN
4547                  cn_utils.appindcr(body_code, '  l_commission := p_rate ' || l_operator || ' l_commission - g_commission_payed_itd;');
4548               END IF;
4549             ELSE
4550               cn_utils.appindcr(body_code, '  l_commission := l_commission - g_commission_payed_itd;');
4551            END IF;
4552          ELSE
4553            cn_utils.appindcr(body_code, '  g_output_achieved := l_commission;');
4554            IF (g_rate_flag) THEN
4555               IF (l_operator_position > 0) THEN
4556                  cn_utils.appindcr(body_code, '  l_commission := p_rate ' || l_operator ||
4557                                    ' (g_output_achieved_itd + g_output_achieved) - g_commission_payed_itd;');
4558                ELSE
4559                  cn_utils.appindcr(body_code, '  l_commission := p_rate - g_commission_payed_itd;');
4560               END IF;
4561             ELSE
4562               cn_utils.appindcr(body_code, '  l_commission := g_output_achieved_itd + g_output_achieved - g_commission_payed_itd;');
4563            END IF;
4564         END IF;
4565      END IF;
4566 
4567      cn_utils.appindcr(body_code, '  x_projected_commission := l_commission;' );
4568 
4569      cn_utils.appindcr(body_code, 'EXCEPTION ' );
4570      cn_utils.appindcr(body_code, '  when others then ');
4571      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4572      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4573      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_forecast_commission.exception'', ');
4574      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4575      cn_utils.appindcr(body_code, '     end if; ');
4576      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in get_forecast_commission: ''); ');
4577      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
4578      cn_utils.proc_end(procedure_name, 'N', body_code );
4579 EXCEPTION
4580   WHEN OTHERS THEN
4581     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4582       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4583                      'cn.plsql.cn_formula_gen_pkg.get_forecast_commission.exception',
4584          	          sqlerrm);
4585     end if;
4586     raise;
4587 END get_forecast_commission;
4588 
4589 --- Private Function used only by get_estimated_payout procedure for SFP
4590 FUNCTION get_sql_select(p_piped_sql_select IN VARCHAR2) RETURN VARCHAR2
4591 IS
4592   l_piped_sql_select varchar2(8000);
4593   l_piped_sql_select_copy varchar2(8000);
4594   l_sql_select varchar2(8000);
4595 
4596   l_pipe_found number := 0;
4597   l_dot_found number := 0;
4598   l_index number := 0;
4599   l_begin number:= 1;
4600 
4601   l_segment VARCHAR2(4000);
4602   l_segment_orig VARCHAR2(4000);
4603 
4604   l_revenue VARCHAR2(30);
4605   l_unit VARCHAR2(30);
4606   l_target_replace VARCHAR2(1000);
4607 
4608 BEGIN
4609 
4610 l_piped_sql_select := p_piped_sql_select;
4611 l_piped_sql_select_copy := l_piped_sql_select;
4612 
4616 
4613  LOOP
4614 
4615   l_pipe_found := INSTR(l_piped_sql_select_copy,'|', l_begin);
4617   IF l_pipe_found = 0
4618    THEN
4619        exit;
4620   END IF;
4621 
4622   l_segment_orig := substr(l_piped_sql_select_copy, l_begin, l_pipe_found-l_begin );
4623 
4624 --  dbms_output.put_line(l_segment_orig);
4625 
4626   l_dot_found := INSTR(l_segment_orig,'.');
4627 
4628   IF l_dot_found <> 0 THEN
4629 
4630   l_revenue := 'UPPER(''REVENUE'')';
4631   l_unit := 'UPPER(''UNIT'')';
4632 
4633   l_target_replace :=  'DECODE(qc.quota_unit_code,' || l_revenue ||
4634   ', ( ROUND(NVL(sqc.prorated_amount,0)/NVL(pt.rounding_factor, 1))*NVL(pt.rounding_factor, 1)) ,'
4635   || l_unit ||
4636   ', (NVL(sqc.prorated_amount,0)),( ROUND(NVL(sqc.prorated_amount,0)/NVL(pt.rounding_factor, 1))*NVL(pt.rounding_factor, 1))  ) ' ;
4637 
4638      SELECT DECODE(l_segment_orig,
4639                    'CH.TRANSACTION_AMOUNT', 'p_est_achievement',
4640                    'CH.QUANTITY', 'p_est_achievement',
4641                    'CSQA.TARGET', l_target_replace,
4642                    'CSQA.PAYMENT_AMOUNT', 'payment_amount',
4643                    l_segment_orig
4644                    )
4645      INTO l_segment
4646      FROM dual;
4647 
4648      IF l_segment_orig = l_segment THEN
4649         l_segment := '1';
4650      END IF;
4651 
4652      l_piped_sql_select := REPLACE(l_piped_sql_select,l_segment_orig, l_segment);
4653   END IF;
4654 
4655   l_begin := l_pipe_found + 1;
4656 
4657  END LOOP;
4658 
4659   l_sql_select := REPLACE(l_piped_sql_select,'|', '');
4660 
4661   RETURN l_sql_select;
4662 
4663 EXCEPTION
4664   WHEN OTHERS THEN
4665     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4666       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4667                      'cn.plsql.cn_formula_gen_pkg.get_sql_select.exception',
4668          	          sqlerrm);
4669     end if;
4670     raise;
4671 END;
4672 
4673 --   construct the get_estimated_payout procdure which will be invoked by SFP quota modeling
4674 PROCEDURE get_estimated_payout(spec_code        IN OUT NOCOPY cn_utils.code_type,
4675                                body_code        IN OUT NOCOPY cn_utils.code_type )
4676 IS
4677     procedure_name        cn_obj_procedures_v.name%TYPE;
4678     procedure_desc        cn_obj_procedures_v.description%TYPE;
4679     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
4680 
4681     l_sql_select        VARCHAR2(8000);
4682     l_piped_sql_select  VARCHAR2(8000);
4683     l_sql_from          VARCHAR2(4000);
4684     l_sql_where         VARCHAR2(4000);
4685     l_calc_sql_exp_id   NUMBER;
4686     l_output_exp_id     NUMBER;
4687     l_modeling_flag     VARCHAR2(30);
4688 
4689 
4690     CURSOR output IS
4691        SELECT output_exp_id, modeling_flag
4692          FROM cn_calc_formulas_all
4693          WHERE calc_formula_id = g_formula_id
4694            AND org_id = g_org_id;
4695 
4696     CURSOR input IS
4697        SELECT calc_sql_exp_id
4698          FROM cn_formula_inputs_all
4699          WHERE calc_formula_id = g_formula_id
4700           AND org_id = g_org_id;
4701 
4702     CURSOR sql_statement(p_calc_sql_exp_id NUMBER) IS
4703        SELECT  dbms_lob.substr(piped_sql_select), dbms_lob.substr(sql_select), dbms_lob.substr(sql_from)
4704          FROM  cn_calc_sql_exps_all
4705          WHERE calc_sql_exp_id = p_calc_sql_exp_id;
4706 BEGIN
4707      OPEN output;
4708      FETCH output INTO l_output_exp_id, l_modeling_flag;
4709      CLOSE output;
4710 
4711      -- if it is not a modeling formula, then return
4712      IF (nvl(l_modeling_flag, 'N') <> 'Y') THEN
4713         RETURN;
4714      END IF;
4715 
4716      procedure_name := 'get_estimated_payout';
4717      procedure_desc := '   Called by Quota Modeling to calculate payout';
4718 
4719      parameter_list := 'p_srp_quota_cate_id IN NUMBER, p_est_achievement IN NUMBER, ';
4720      parameter_list := parameter_list || 'x_estimated_payout OUT NOCOPY NUMBER, x_return_status OUT NOCOPY VARCHAR2 ';
4721 
4722      proc_init(procedure_name, procedure_desc, parameter_list,
4723                'P', null , null, null,
4724                spec_code, body_code);
4725 
4726      cn_utils.appindcr(body_code, '  l_rate                     NUMBER;');
4727      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
4728      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
4729      cn_utils.appindcr(body_code, '  l_amount                   NUMBER; ');
4730      cn_utils.appendcr(body_code, 'BEGIN');
4731      cn_utils.appendcr(body_code, '  x_return_status := fnd_api.g_ret_sts_success; ');
4732 
4733      OPEN input;
4734      FETCH input INTO l_calc_sql_exp_id;
4735      CLOSE input;
4736 
4737      l_sql_where := 'where sqc.srp_quota_cate_id = p_srp_quota_cate_id and sqc.role_id = pt.role_id and sqc.quota_category_id = qc.quota_category_id ';
4738 
4739      OPEN sql_statement(l_calc_sql_exp_id);
4740      FETCH sql_statement INTO l_piped_sql_select, l_sql_select, l_sql_from;
4741      CLOSE sql_statement;
4742 
4743 
4744      l_sql_select := get_sql_select(l_piped_sql_select);
4745 
4746      l_sql_select := lower_str('select ' || l_sql_select);
4747      l_sql_from := lower('from cn_srp_quota_cates sqc, cn_role_details_v pt, cn_quota_categories qc');
4748 
4749      split_long_sql(body_code, l_sql_select, 'SELECT');
4750 
4751      cn_utils.appindcr(body_code, ' into l_amount ');
4752 
4753      split_long_sql(body_code, l_sql_from, 'FROM');
4754      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4755 
4756      OPEN sql_statement(l_output_exp_id);
4757      FETCH sql_statement INTO l_piped_sql_select, l_sql_select, l_sql_from;
4758      CLOSE sql_statement;
4759 
4760 
4761      l_sql_select := get_sql_select(l_piped_sql_select);
4762 
4763 
4764      l_sql_select :=  lower_str('select ' || l_sql_select);
4765 
4766      l_sql_from := lower('from cn_srp_quota_cates sqc, cn_role_details_v pt, cn_quota_categories qc');
4767      l_sql_where := 'where sqc.srp_quota_cate_id = p_srp_quota_cate_id and sqc.role_id = pt.role_id and sqc.quota_category_id = qc.quota_category_id ';
4768      g_rate_flag := check_sql_stmt_existence(l_sql_select, 'rateresult');
4769      l_sql_select := REPLACE(l_sql_select, 'rateresult', 'l_rate');
4770 
4771      IF g_rate_flag THEN
4772         cn_utils.appindcr(body_code, '  cn_sfp_formula_cmn_pkg.get_rates( p_srp_quota_cate_id, ');
4773         cn_utils.appindcr(body_code, '                                    g_split_flag, ''N'', ' );
4774         cn_utils.appindcr(body_code, '                                    l_amount, ');
4775         cn_utils.appindcr(body_code, '                                    l_rate, l_rate_tier_id, l_tier_split ); ');
4776      END IF;
4777 
4778      split_long_sql(body_code, l_sql_select, 'SELECT');
4779      cn_utils.appindcr(body_code, '  into x_estimated_payout ');
4780      split_long_sql(body_code, l_sql_from, 'FROM');
4781      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4782      cn_utils.appendcr(body_code);
4783 
4784      cn_utils.appindcr(body_code, 'EXCEPTION ' );
4785      cn_utils.appindcr(body_code, '  when zero_divide then ');
4786      cn_utils.appindcr(body_code, '     x_return_status := ''Z''; ');
4787      cn_utils.appindcr(body_code, '  when others then ');
4788      cn_utils.appindcr(body_code, '     x_return_status := fnd_api.g_ret_sts_error; ');
4789      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4790      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4791      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_estimated_payout.exception'', ');
4792      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4793      cn_utils.appindcr(body_code, '     end if; ');
4794      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in get_estimated_payout: ''); ');
4795      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
4796      cn_utils.proc_end(procedure_name, 'N', body_code );
4797 EXCEPTION
4798   WHEN OTHERS THEN
4799     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4800       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4801                      'cn.plsql.cn_formula_gen_pkg.get_estimated_payout.exception',
4802          	          sqlerrm);
4803     end if;
4804     raise;
4805 END get_estimated_payout;
4806 
4807 --   invoke all formula component constructors to create formula
4808 FUNCTION create_formula (p_formula_id        number) RETURN BOOLEAN IS
4809     package_name        cn_obj_packages_v.name%TYPE;
4810     package_type        cn_obj_packages_v.package_type%TYPE := 'FML';
4811     package_spec_id        cn_obj_packages_v.package_id%TYPE;
4812     package_body_id        cn_obj_packages_v.package_id%TYPE;
4813     package_spec_desc        cn_obj_packages_v.description%TYPE;
4814     package_body_desc        cn_obj_packages_v.description%TYPE;
4815     spec_code                cn_utils.code_type;
4816     body_code                cn_utils.code_type;
4817     dummy               NUMBER(7);
4818     l_module_id                number(15);
4819     l_repository_id        cn_repositories.repository_id%TYPE;
4820 BEGIN
4821    if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4822      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4823                     'cn.plsql.cn_formula_gen_pkg.create_formula.begin',
4824 			    	'Beginning of create_formula procedure ...');
4825    end if;
4826 
4827     cn_utils.set_org_id(g_org_id);
4828 
4829      SELECT repository_id
4830        INTO l_repository_id
4831        FROM cn_repositories_all
4832       WHERE org_id = g_org_id;
4833      package_name := 'cn_formula_' || abs(p_formula_id) || '_' || abs(g_org_id) || '_pkg';
4834 
4835      check_create_object(package_name, 'PKS', package_spec_id, l_repository_id);
4836      check_create_object(package_name, 'PKB', package_body_id, l_repository_id);
4837 
4838    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4839      FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4840                     'cn.plsql.cn_formula_gen_pkg.create_formula.statement',
4841 			    	'The formula package name is '||package_name);
4845 
4842    end if;
4843 
4844      cn_message_pkg.debug('The formula package name is ' ||package_name);
4846      generate_init(p_formula_id);
4847 
4848      -- Added for 11.5.10 formula performance Enhancment
4849      -- populate all necessary plsql tables with details
4850      -- of tables and columns used in all the expressions
4851      -- of this formula
4852      init_tab_column_list(p_formula_id);
4853 
4854    if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4855      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4856                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4857 			    	'After generate_init in create_formula');
4858    end if;
4859 
4860      cn_message_pkg.debug( 'after generate_init ');
4861 
4862      cn_utils.pkg_init(l_module_id, package_name, null, package_type, 'FORMULA',
4863                package_spec_id, package_body_id, package_spec_desc,
4864                package_body_desc, spec_code, body_code);
4865 
4866      pkg_variables(spec_code, body_code);
4867 
4868      IF g_formula_type = 'C' THEN
4869         get_input(spec_code, body_code);
4870         cn_message_pkg.debug( 'after get_input');
4871         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4872           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4873                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4874 			    	'After generating get_input in create_formula');
4875         end if;
4876 
4877 
4878         get_perf(spec_code, body_code);
4879         cn_message_pkg.debug( 'after get_perf ');
4880         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4881           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4882                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4883 			    	'After generating get_perf in create_formula');
4884         end if;
4885 
4886         get_commission(spec_code, body_code);
4887         cn_message_pkg.debug( 'after get_commission');
4888         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4889           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4890                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4891 			    	'After generating get_commission in create_formula');
4892         end if;
4893      END IF;
4894 
4895      IF g_formula_type = 'C' THEN
4896         calculate_quota(spec_code, body_code);
4897         cn_message_pkg.debug( 'after calculate_quota ');
4898         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4899           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4900                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4901 			    	'After generating calculate_quota in create_formula');
4902         end if;
4903       ELSIF g_formula_type = 'B' THEN
4904         calculate_bonus_quota(spec_code, body_code);
4905         cn_message_pkg.debug( 'after calculate_bonus_quota ');
4906         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4907           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4908                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4909 			    	'After generating calculate_bonus_quota in create_formula');
4910         end if;
4911      END IF;
4912 
4913      IF (g_trx_group_code = 'INDIVIDUAL' AND g_itd_flag = 'N' AND g_cumulative_flag = 'N' AND g_formula_type = 'C') THEN
4914         get_result(spec_code, body_code);
4915         cn_message_pkg.debug( 'after get_result ');
4916         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4917           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4918                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4919 			    	'After generating get_result in create_formula');
4920         end if;
4921      END IF;
4922 
4923      IF g_trx_group_code = 'GROUP' THEN
4924         update_revclass_perf(spec_code, body_code);
4925         cn_message_pkg.debug( 'after update_revclass_perf ');
4926         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4927           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4928                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4929 			    	'After generating update_revclass_perf in create_formula');
4930         end if;
4931      END IF;
4932 
4933      IF (g_formula_type = 'C') THEN
4934         get_forecast_commission(spec_code, body_code);
4935         cn_message_pkg.debug( 'after get_forecast_commission');
4936         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4937           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4938                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4939 			    	'After generating get_forecast_commission in create_formula');
4940         end if;
4941      END IF;
4942 
4943      get_estimated_payout(spec_code, body_code);
4944 
4945      cn_utils.pkg_end(package_name, spec_code, body_code);
4946 
4947      cn_utils.unset_org_id;
4948      RETURN TRUE;
4949 
4950      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4951           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4952                     'cn.plsql.cn_formula_gen_pkg.create_formula.end',
4953 			    	'End of create_formula');
4954      end if;
4955 EXCEPTION
4956   when others then
4957     cn_utils.unset_org_id;
4958     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4959       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4963     raise;
4960                      'cn.plsql.cn_formula_gen_pkg.parse.exception',
4961          	          sqlerrm);
4962     end if;
4964 END create_formula;
4965 
4966   -- API name         : generate_formula
4967   -- Type        : Private.
4968   -- Pre-reqs        :
4969   -- Usage        :
4970   --
4971   -- Desc         : create a formula package and store in cn_sources, then submit a concurrent
4972   --              spool the code to a file and get it compiled against the database.
4973   --
4974   -- Parameters        :
4975   --  IN        :  p_api_version       NUMBER      Require
4976   --                    p_init_msg_list     VARCHAR2    Optional (FND_API.G_FALSE)
4977   --                    p_commit               VARCHAR2    Optional (FND_API.G_FALSE)
4978   --                    p_validation_level  NUMBER      Optional (FND_API.G_VALID_LEVEL_FULL)
4979   --  OUT        :  x_return_status     VARCHAR2(1)
4980   --                    x_msg_count               NUMBER
4981   --                    x_msg_data               VARCHAR2(2000)
4982   --  IN        :  p_formula_id        NUMBER(15)  Require
4983   --
4984   --  OUT       :  x_process_audit_id  NUMBER(15)
4985   --
4986   --
4987   -- Version        : Current version        1.0
4988   --                  Initial version         1.0
4989   --
4990   -- Notes        :
4991   --
4992   -- End of comments
4993 PROCEDURE generate_formula
4994     ( p_api_version           IN  NUMBER,
4995       p_init_msg_list         IN  VARCHAR2 := FND_API.G_FALSE,
4996       p_commit                IN  VARCHAR2 := FND_API.G_FALSE,
4997       p_validation_level      IN  VARCHAR2 := FND_API.G_VALID_LEVEL_FULL,
4998       x_return_status         OUT NOCOPY VARCHAR2,
4999       x_msg_count             OUT NOCOPY NUMBER,
5000       x_msg_data              OUT NOCOPY VARCHAR2,
5001       p_formula_id            IN  NUMBER,
5002       p_org_id                IN  NUMBER,
5003       x_process_audit_id      OUT NOCOPY NUMBER
5004       )
5005 IS
5006     l_api_name       CONSTANT VARCHAR2(30) := 'Generate_Formula';
5007     l_api_version    CONSTANT NUMBER :=1.0;
5008 
5009     l_creation_status         BOOLEAN;
5010     l_request_id                NUMBER;
5011     l_file_name                VARCHAR2(200);
5012     l_call_status         BOOLEAN;
5013     l_dummy                          VARCHAR2(500);
5014     l_dev_phase                    VARCHAR2(80);
5015     l_dev_status                   VARCHAR2(80) := 'INCOMPLETE';
5016     l_status            BOOLEAN;
5017 
5018     sqlstring dbms_sql.varchar2s;
5019     empty_sqlstring dbms_sql.varchar2s;
5020     cursor1 INTEGER;
5021     i INTEGER;
5022 
5023     j INTEGER;
5024     new_line_flag BOOLEAN:=TRUE;
5025     retval number;
5026 
5027     l_pkg_object_id  NUMBER(15);
5028     l_error_count    NUMBER;
5029 
5030     l_formula_name   VARCHAR2(100);
5031 BEGIN
5032      -- Standard Start of API savepoint
5033      SAVEPOINT        generate_formula;
5034 
5035      -- Standard call to check for call compatibility.
5036      IF NOT FND_API.Compatible_API_Call ( l_api_version ,
5037                                           p_api_version ,
5038                                           l_api_name    ,
5039                                           G_PKG_NAME )
5040      THEN
5041         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5042      END IF;
5043 
5044      -- Initialize message list if p_init_msg_list is set to TRUE.
5045      IF FND_API.to_Boolean( p_init_msg_list ) THEN
5046         FND_MSG_PUB.initialize;
5047      END IF;
5048 
5049      --  Initialize API return status to success
5050      x_return_status := FND_API.G_RET_STS_SUCCESS;
5051 
5052 
5053      -- Codes start here
5054 
5055      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5056           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5057                     'cn.plsql.cn_formula_gen_pkg.generate_formula.begin',
5058 			    	'Beginning of generate_formula ...');
5059      end if;
5060 
5061      g_org_id := p_org_id;
5062 
5063      l_formula_name := 'cn_formula_'|| abs(p_formula_id) || '_' || abs(g_org_id) || '_pkg';
5064 
5065      l_status := create_formula(p_formula_id);
5066 
5067      IF l_status THEN   /* formula created successfully. Continue to install it. */
5068         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5069           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5070                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5071 			    	'Generate the PL/SQL code successfully in generate_formula');
5072         end if;
5073 
5074         SELECT co.object_id
5075           INTO l_pkg_object_id
5076           FROM cn_objects_all co
5077          WHERE co.name =  l_formula_name
5078            AND co.object_type = 'PKS'
5079            AND co.org_id = g_org_id;
5080 
5081         SELECT cs.text bulk collect INTO sqlstring
5082           FROM cn_source_all cs
5083          WHERE cs.object_id = l_pkg_object_id
5084            AND cs.org_id = g_org_id
5085          ORDER BY cs.line_no ;
5086 
5087         i:=1;
5088         j:= sqlstring.count;
5089 
5090         cursor1:=DBMS_SQL.OPEN_CURSOR;
5091         DBMS_SQL.PARSE(cursor1,sqlstring,i,j,new_line_flag,DBMS_SQL.V7);
5092         retval:=DBMS_SQL.EXECUTE(cursor1);
5093         DBMS_SQL.CLOSE_CURSOR(cursor1);
5094 
5095         sqlstring := empty_sqlstring;
5099           FROM cn_objects_all co
5096 
5097         SELECT co.object_id
5098           INTO l_pkg_object_id
5100           WHERE co.name =  l_formula_name
5101           AND co.object_type = 'PKB'
5102           AND co.org_id = g_org_id;
5103 
5104         SELECT cs.text bulk collect INTO sqlstring
5105           FROM cn_source_all cs
5106           WHERE cs.object_id = l_pkg_object_id
5107             AND cs.org_id = g_org_id
5108           ORDER BY cs.line_no ;
5109 
5110         i:= 1;
5111         j:= sqlstring.count;
5112 
5113         cursor1:=DBMS_SQL.OPEN_CURSOR;
5114         DBMS_SQL.PARSE(cursor1,sqlstring,i,j,new_line_flag,DBMS_SQL.V7);
5115         retval:=DBMS_SQL.EXECUTE(cursor1);
5116         DBMS_SQL.CLOSE_CURSOR(cursor1);
5117 
5118         -- check whether package is installed successfully
5119         SELECT  COUNT(*)
5120           INTO  l_error_count
5121           FROM user_errors
5122           WHERE name = 'CN_FORMULA_'|| abs(p_formula_id) || '_' || abs(g_org_id) || '_PKG'
5123           AND  TYPE IN ('PACKAGE', 'PACKAGE BODY');
5124 
5125         IF l_error_count = 0 THEN
5126            UPDATE cn_calc_formulas_all
5127               SET formula_status = 'COMPLETE'
5128             WHERE calc_formula_id = p_formula_id
5129               AND org_id = g_org_id;
5130 
5131            if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5132              FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5133                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5134 			    	'Compiled formula package successfullly in generate_formula');
5135            end if;
5136          ELSE
5137            UPDATE cn_calc_formulas_all
5138               SET formula_status = 'INCOMPLETE'
5139             WHERE calc_formula_id = p_formula_id
5140               AND org_id = g_org_id;
5141 
5142            x_return_status := FND_API.g_ret_sts_error;
5143            IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5144              THEN
5145               fnd_message.set_name('CN', 'CN_FORMULA_COMPILE_ERR');
5146               FND_MSG_PUB.ADD;
5147               if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5148                 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
5149                     'cn.plsql.cn_formula_gen_pkg.generate_formula.error',
5150 			    	FALSE);
5151               end if;
5152 
5153            END IF;
5154 
5155            if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5156              FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5157                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5158 			    	'Failed to Compile formula package in generate_formula');
5159            end if;
5160 
5161         END IF;
5162       ELSE  -- failed to created formula package
5163         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5164           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5165                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5169         UPDATE cn_calc_formulas_all
5166 			    	'Failed to generate the PL/SQL code in generate_formula');
5167         end if;
5168 
5170            SET formula_status = 'INCOMPLETE'
5171          WHERE calc_formula_id = p_formula_id
5172            AND org_id = g_org_id;
5173 
5174         x_return_status := FND_API.g_ret_sts_error;
5175 
5176         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5177           THEN
5178            fnd_message.set_name('CN', 'CN_FORMULA_COMPILE_ERR');
5179            FND_MSG_PUB.ADD;
5180         END IF;
5181 
5182      END IF;
5183 
5184 
5185      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5186           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5187                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5188 			    	'End of generate_formula');
5189      end if;
5190 
5191      -- Standard check of p_commit.
5192      IF FND_API.To_Boolean( p_commit ) THEN
5193         COMMIT WORK;
5194      END IF;
5195 
5196      -- Standard call to get message count and if count is 1, get message info.
5197      FND_MSG_PUB.Count_And_Get
5198        ( p_count   =>  x_msg_count ,
5199          p_data    =>  x_msg_data  ,
5200          p_encoded => FND_API.G_FALSE
5201        );
5202 EXCEPTION
5203   WHEN FND_API.G_EXC_ERROR THEN
5204         ROLLBACK TO generate_formula;
5205         x_return_status := FND_API.G_RET_STS_ERROR ;
5206         FND_MSG_PUB.Count_And_Get
5207           (p_count   =>  x_msg_count ,
5208            p_data    =>  x_msg_data  ,
5209            p_encoded => FND_API.G_FALSE
5210            );
5211      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5212         ROLLBACK TO generate_formula;
5213         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5214         FND_MSG_PUB.Count_And_Get
5215           (p_count   =>  x_msg_count ,
5216            p_data    =>  x_msg_data  ,
5217            p_encoded => FND_API.G_FALSE
5218            );
5219      WHEN OTHERS THEN
5220         ROLLBACK TO generate_formula;
5221         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5222         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5223           THEN
5224            FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
5225         END IF;
5226         FND_MSG_PUB.Count_And_Get
5227           (p_count   =>  x_msg_count ,
5228            p_data    =>  x_msg_data  ,
5229            p_encoded => FND_API.G_FALSE
5230           );
5231 
5232     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5233       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
5234                      'cn.plsql.cn_formula_gen_pkg.generate_formula.exception',
5235          	          sqlerrm);
5236     end if;
5237 END generate_formula;
5238 
5239 PROCEDURE generate_formula_conc(errbuf       OUT NOCOPY     VARCHAR2,
5240 		                        retcode      OUT NOCOPY     NUMBER,
5241                                 p_org_id                    NUMBER)
5242 IS
5243    l_process_audit_id NUMBER;
5244    l_return_status    VARCHAR2(30);
5245    l_msg_count        NUMBER;
5246    l_msg_data         VARCHAR2(2000);
5247 
5248    CURSOR formulas IS
5249       SELECT calc_formula_id, org_id
5250 	FROM cn_calc_formulas
5251 	WHERE org_id = nvl(p_org_id, org_id);
5252 
5253   CURSOR compile_pkg_cur IS
5254      select object_name || ' ' ||
5255      decode(object_type, 'PACKAGE BODY','compile body','PACKAGE','compile') stmt
5256      from user_objects
5257      where object_name like 'CN_FORMULA%PKG'
5258      and substr(object_name, 12, 1)in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
5259      and object_type like 'PACKAGE%'
5260      and status = 'INVALID';
5261 
5262   CURSOR drop_pkg_cur IS
5263      select object_name stmt
5264      from user_objects
5265      where object_name like 'CN_FORMULA%PKG'
5266      and substr(object_name, 12, 1)in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
5270 BEGIN
5267      and object_type like 'PACKAGE%'
5268      and status = 'INVALID';
5269 
5271    FOR formula IN formulas LOOP
5272       cn_formula_gen_pkg.generate_formula(p_api_version   => 1.0,
5273 					  x_return_status     => l_return_status,
5274 					  x_msg_count         => l_msg_count,
5275 					  x_msg_data          => l_msg_data,
5276 					  p_formula_id        => formula.calc_formula_id,
5277 					  p_org_id            => formula.org_id,
5278 					  x_process_audit_id  => l_process_audit_id
5279 					  );
5280    END LOOP;
5281 
5282    -- Try one round of compiling the invalid formula packages
5283    FOR i in compile_pkg_cur
5284    LOOP
5285      begin
5286       execute immediate 'alter package '|| i.stmt;
5287      exception
5288       when others then
5289 	    null;
5290      end;
5291    END LOOP;
5292 
5293    -- Drop the formula package if still invalid
5294    FOR i in drop_pkg_cur
5295    LOOP
5296      begin
5297       execute immediate 'drop package '|| i.stmt;
5298      exception
5299       when others
5300         then
5301 	  null;
5302      end;
5303    END LOOP;
5304 
5305    retcode := 0;
5306    errbuf := 'Batch runner completes successfully.';
5307 EXCEPTION
5308    WHEN OTHERS THEN
5309      retcode := 2;
5310      errbuf  := sqlerrm;
5311 END generate_formula_conc;
5312 
5313 END cn_formula_gen_pkg;