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.25.12020000.3 2012/10/04 05:06:03 rnagaraj 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,
21                               variable_name     VARCHAR2(61),
18                               column_object_id  cn_objects.object_id%TYPE,
19                               column_alias      cn_objects.name%TYPE,
20                               column_name       cn_objects.schema%TYPE,
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 -- +======================================================================+
151 -- + populate the table names  columns used into g_exp_tbl_dtls_tbl       +
148 -- +                   Procedure init_tab_column_list                     +
149 -- + Procedure Added for 11.5.10 Peformance Enhancment                    +
150 -- + Process input,output,perf expressions                                +
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);
273         --and g_exp_tbl_dtls_tbl plsql table.
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
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;
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 
325                         IF LENGTH(REPLACE(table_rec.alias,'_',NULL)) > 24 THEN
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
361                            INSTR(g_comm_clmns_names||'|',column_rec.name||'|') = 0)
358 */
359                         IF((INSTR(table_rec.name,'CN_COMMISSION_LINES') >0 OR
360                             INSTR(table_rec.name,'CN_COMMISSION_HEADERS') >0) AND
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
417                     g_non_plsql_func_used_tbl(expression_rec.calc_sql_exp_id) := 'Y';
418                  END IF;
419     ELSE
420           IF NOT g_non_plsql_func_used_tbl.EXISTS(expression_rec.calc_sql_exp_id) THEN
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) ;
486    l_position := instr(p_input_str, '+', p_start);
483    l_position := instr(p_input_str, '-', p_start);
484    get_min(l_position_min, l_position);
485 
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 
554    l_length := Length(p_input_str);
555    l_next := l_start;
556    l_next_prev := l_start;
557 
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
626                     procedure_type                cn_obj_procedures_v.procedure_type%TYPE,
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,
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
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
675    p1      pls_integer;       -- temporary position pointer
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
739      l := length(expr.sql_select);
736         g_rollover_flag := 'Y';
737      END IF;
738 
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;
796         END IF;
797      END LOOP;
798   END IF;
799 EXCEPTION
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);
874          l_comma_position := Length(p_input_from) + 1;
871       l_comma_position := instr(p_input_from, ',', l_table_position);
872 
873       IF l_comma_position = 0 THEN
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;
928 
929 --       Build WHERE clause for cn_commission_lines
930 PROCEDURE make_srp_plan_pe_hid_pid_st(p_line_alias VARCHAR2,
931                                       p_header_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
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;
1073         END IF;
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,
1185                                       x_sql_from IN OUT NOCOPY VARCHAR2 ,
1186                                       x_sql_where IN OUT NOCOPY VARCHAR2 )
1187   IS
1188      l_sq_assign_alias  VARCHAR2(30);
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
1268 END handle_cn_srp_periods_where;
1265            x_sql_where := x_sql_where || l_sql_stmt;
1266         END IF;
1267      END IF;
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;
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 
1304       ELSE
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      l_start_position_old NUMBER;  --Fix for bug 9001039 .
1328 
1329      CURSOR l_all_column_pairs_csr(l_calc_ext_table_id NUMBER)IS
1330         SELECT lower(obj1.name) internal_column_name, lower(obj2.name) external_column_name
1331           FROM cn_calc_ext_tbl_dtls_all detail,
1332           cn_objects_all obj1,
1333           cn_objects_all obj2
1334           WHERE detail.calc_ext_table_id = l_calc_ext_table_id
1335           AND obj1.object_id = detail.internal_column_id
1336           AND obj1.org_id = detail.org_id
1337           AND obj2.object_id = detail.external_column_id
1338           AND obj2.org_id = detail.org_id;
1339 
1340      CURSOR l_ext_table_csr IS
1341         SELECT map.calc_ext_table_id,
1342           lower(obj.name) internal_table_name,
1343           trim( both ' ' FROM lower(obj.alias) )  internal_table_alias,
1344           lower(l_table_name) external_table_name,
1345           lower(l_table_alias) external_table_alias
1346           FROM cn_objects_all obj,
1347           cn_calc_ext_tables_all map
1348           WHERE  lower(map.alias) = l_table_alias
1349           AND map.org_id = g_org_id
1350           AND obj.object_id = map.internal_table_id
1351           AND obj.org_id = map.org_id;
1352 BEGIN
1353      l_end_flag := FALSE;
1354      l_start_position := 1;
1355      l_start_position_old := 1;
1356 
1357      WHILE l_end_flag <> TRUE LOOP
1358         separate_tbl_alias( x_sql_from,
1359                             l_start_position_old,
1360                             l_table_name,
1361                             l_table_alias,
1362                             l_end_flag,
1363                             l_start_position   );
1364 
1365        l_start_position_old :=   l_start_position;
1366 
1367         FOR l_table IN l_ext_table_csr LOOP
1368            -- if external table found in x_sql_from, check if the internal table name not in x_sql_from yet, add it
1369            IF NOT check_sql_stmt_existence(x_sql_from, l_table.internal_table_name) THEN
1370               l_sql_stmt := NULL;
1371               l_sql_stmt := ' , '|| l_table.internal_table_name || ' ' || l_table.internal_table_alias;
1372               x_sql_from := x_sql_from || l_sql_stmt;
1373            END IF;
1374 
1375            -- add join condition for this relationship
1376            FOR l_pair IN l_all_column_pairs_csr(l_table.calc_ext_table_id) LOOP
1377               l_sql_stmt := ' and ' || l_table.internal_table_alias || '.' ||
1378                 l_pair.internal_column_name || ' = ' || l_table.external_table_alias || '.' || l_pair.external_column_name ;
1379               IF NOT check_sql_stmt_existence(x_sql_where, l_sql_stmt) THEN
1380                  x_sql_where := x_sql_where || l_sql_stmt;
1381               END IF;
1382            END LOOP;
1383         END LOOP;
1384      END LOOP;
1385 END handle_external_tables;
1386 
1387 --Build order by clause if any external table is included in bonus type formula
1388 PROCEDURE handle_bonus_ex_tbl_orderby( x_sql_select IN OUT NOCOPY VARCHAR2,
1389                                        x_sql_from IN OUT NOCOPY VARCHAR2 ,
1393      l_table_name VARCHAR2(30);
1390                                        x_sql_where IN OUT NOCOPY VARCHAR2,
1391                                        p_mode  VARCHAR2 )
1392   IS
1394      l_table_alias VARCHAR2(30);
1395      l_end_flag    BOOLEAN;
1396      l_start_position NUMBER;
1397      l_new_position   NUMBER;
1398 
1399      l_sql_stmt VARCHAR2(1000);
1400      l_counter NUMBER := 0;
1401      l_sql_select VARCHAR2(4000);
1402      l_sql_where VARCHAR2(1000);
1403 
1404      CURSOR l_all_columns_csr IS
1405         SELECT  col.table_id, lower(col.name) column_name
1406           FROM cn_calc_ext_tables_all map,
1407           cn_objects_all col
1408           WHERE map.alias = l_table_alias
1409           AND map.org_id = g_org_id
1410           AND col.table_id = map.external_table_id
1411           AND col.org_id = map.org_id
1412           AND col.object_type = 'COL'
1413           AND primary_key = 'Y'
1414           AND position IS NOT NULL
1415             ORDER BY position;
1416 
1417 BEGIN
1418      -- assume only one external table will be used. p_mode can be 'OUTPUT', 'PERF', 'INPUT1', 'INPUT'
1419      l_end_flag := FALSE;
1420      l_start_position := 1;
1421 
1422      WHILE l_end_flag <> TRUE LOOP
1423         separate_tbl_alias( x_sql_from,
1424                             l_start_position,
1425                             l_table_name,
1426                             l_table_alias,
1427                             l_end_flag,
1428                             l_new_position   );
1429 
1430         l_start_position := l_new_position;
1431 
1432         FOR l_col IN l_all_columns_csr LOOP
1433            -- if external table found in x_sql_from
1434            l_counter := 1;
1435 
1436            IF p_mode = 'INPUT1' THEN
1437               g_external_table_id := l_col.table_id;
1438            END IF;
1439 
1440            IF p_mode = 'INPUT0' THEN
1441               IF l_all_columns_csr%rowcount = 1 THEN
1442                  l_sql_select := 'select ' ||  l_table_alias || '.'||  l_col.column_name ;
1443                ELSE
1444                  l_sql_select := l_sql_select || ', ' || l_table_alias || '.'||  l_col.column_name ;
1445               END IF;
1446            END IF;
1447 
1448            IF p_mode = 'INPUT0 ' THEN
1449               IF l_all_columns_csr%rowcount = 1 THEN
1450                  l_sql_stmt :=  ' order by ' || l_table_alias || '.'|| l_col.column_name ;
1451                ELSIF l_all_columns_csr%rowcount > 1 THEN
1452                  l_sql_stmt :=  l_sql_stmt || '  ,' || l_table_alias || '.'|| l_col.column_name;
1453               END IF;
1454             ELSE
1455               l_sql_where := l_sql_where || ' and ' || l_table_alias || '.' || l_col.column_name || ' = ' || 'l_parameter_'||
1456                 To_char(l_all_columns_csr%rowcount);
1457            END IF;
1458         END LOOP;
1459         EXIT WHEN l_counter = 1;
1460      END LOOP;
1461 
1462      x_sql_where := x_sql_where || l_sql_where || l_sql_stmt;
1463      IF p_mode = 'INPUT0' THEN
1464         x_sql_select := l_sql_select;
1465       ELSE
1466         x_sql_select := x_sql_select || l_sql_select;
1467      END IF;
1468 exception
1469   when others then
1470     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1471       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
1472                      'cn.plsql.cn_formula_gen_pkg.handle_bonus_ex_tbl_orderby.exception',
1473          	          sqlerrm);
1474     end if;
1475     raise;
1476 END handle_bonus_ex_tbl_orderby;
1477 
1478 --       take care of RateResult in output_sql_select
1479 PROCEDURE handle_output_sql_select( x_sql_select IN OUT NOCOPY VARCHAR2,
1480                                     x_sql_from IN OUT NOCOPY VARCHAR2 ,
1481                                     x_sql_where IN OUT NOCOPY VARCHAR2 )
1482   IS
1483      l_position   NUMBER;
1484      l_operator_position NUMBER;
1485 BEGIN
1486      -- Find the place of RateResult
1487      l_position := instr(x_sql_select, 'rateresult');
1488 
1489      IF l_position > 0 THEN
1490         -- In ITD case, need to cumulate outputportion without RateResult
1491         IF (g_itd_flag = 'Y') THEN --IF g_itd_flag = 'Y' OR g_trx_group_code = 'GROUP' THEN
1492            l_operator_position := search_delimiter_select(x_sql_select, l_position);
1493 
1494            IF l_operator_position = 0 THEN
1495               -- there is only 'rateresult' found in output, nothing else
1496               x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1497             ELSIF (g_pq_payment_flag OR g_spq_payment_flag) THEN
1498 	      x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1499             ELSE
1500               x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, l_operator_position - l_position +1 ), ' ');
1501            END IF;
1502          ELSE
1503            x_sql_select := replace(x_sql_select, substr(x_sql_select, l_position, length('rateresult')), 'p_rate');
1504         END IF;
1505      END IF;
1506 
1507      x_sql_select := replace(x_sql_select, 'cspq.input_achieved_itd', '(g_input_achieved_itd(1) + g_input_achieved)');
1508 END handle_output_sql_select;
1509 
1510 -- take care of modifying the sql_from and contruction sql_where
1511 PROCEDURE construct_sql_from_where( x_sql_select IN OUT NOCOPY VARCHAR2,
1512                                     x_sql_from IN OUT NOCOPY VARCHAR2 ,
1513                                     x_sql_where IN OUT NOCOPY VARCHAR2 ) IS
1514 BEGIN
1515      handle_external_tables(x_sql_select, x_sql_from, x_sql_where);
1516      handle_comm_lines_where(x_sql_select, x_sql_from, x_sql_where);
1517      handle_comm_headers_where(x_sql_select, x_sql_from, x_sql_where);
1518      handle_cn_quotas_where(x_sql_select, x_sql_from, x_sql_where);
1522      handle_srp_p_assigns_where(x_sql_select, x_sql_from, x_sql_where);
1519      handle_cn_srp_periods_where(x_sql_select, x_sql_from, x_sql_where);
1520      handle_srp_p_quotas_where(x_sql_select, x_sql_from, x_sql_where);
1521      handle_srp_q_assigns_where(x_sql_select, x_sql_from, x_sql_where);
1523      handle_cn_salesreps_where( x_sql_select, x_sql_from, x_sql_where);
1524 END construct_sql_from_where;
1525 
1526 --   create the global variables for the formula package
1527 PROCEDURE  pkg_variables(spec_code        IN OUT NOCOPY cn_utils.code_type,
1528                          body_code        IN OUT NOCOPY cn_utils.code_type )  IS
1529 
1530 -- Added for 11.5.10 Performance Enhancments
1531 l_counter              NUMBER(15);
1532 l_variable_declaration VARCHAR2(1000);
1533 l_table_object_id      cn_objects.object_id%type;
1534 
1535 BEGIN
1536      cn_utils.appendcr(body_code);
1537      cn_utils.appindcr(body_code, '  g_commission_payed_ptd      NUMBER;');
1538      cn_utils.appindcr(body_code, '  g_commission_payed_itd      NUMBER;');
1539      cn_utils.appindcr(body_code, '  g_input_achieved_ptd        cn_formula_common_pkg.num_table_type;');
1540      cn_utils.appindcr(body_code, '  g_input_achieved_itd        cn_formula_common_pkg.num_table_type;');
1541      cn_utils.appindcr(body_code, '  g_output_achieved_ptd       NUMBER;');
1542      cn_utils.appindcr(body_code, '  g_output_achieved_itd       NUMBER;');
1543      cn_utils.appindcr(body_code, '  g_perf_achieved_ptd         NUMBER;');
1544      cn_utils.appindcr(body_code, '  g_perf_achieved_itd         NUMBER;');
1545      cn_utils.appindcr(body_code, '  g_rollover_flag             VARCHAR2(1) := ' || ''''||g_rollover_flag||''''||';');
1546      cn_utils.appindcr(body_code, '  g_intel_calc_flag           VARCHAR2(1);');
1547      cn_utils.appindcr(body_code, '  g_calc_type                 VARCHAR2(30);');
1548      cn_utils.appindcr(body_code, '  g_select_status_flag        VARCHAR2(30);');
1549      cn_utils.appindcr(body_code, '  g_formula_id                NUMBER := ' || g_formula_id || ' ; ');
1550      cn_utils.appindcr(body_code, '  g_number_dim                NUMBER := ' || g_number_dim || ' ; ');
1551      cn_utils.appindcr(body_code, '  g_split_flag                VARCHAR2(1) := ' || ''''|| g_split_flag ||''''||' ; ');
1552      cn_utils.appindcr(body_code, '  g_trx_group_code            VARCHAR2(30) := '|| ''''|| g_trx_group_code ||''''||' ; ');
1553      cn_utils.appindcr(body_code, '  g_itd_flag                  VARCHAR2(1) := ' || ''''|| g_itd_flag ||''''||' ; ');
1554      cn_utils.appindcr(body_code, '  g_input_achieved            NUMBER;');
1555      cn_utils.appindcr(body_code, '  g_output_achieved           NUMBER;');
1556      cn_utils.appindcr(body_code, '  g_org_id                    NUMBER := ' || g_org_id || ';');
1557 
1558 
1559      -- Added for 11.5.10 Performance Enhancments
1560      -- Declare record variable for each table accessed in input/output/perf expressions
1561      l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
1562      FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
1563         IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
1564            INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
1565 
1566                 l_variable_declaration :=  g_uniq_tbl_names_tbl(l_table_object_id).variable_name;
1567                 l_variable_declaration := l_variable_declaration||'                       '
1568                                           ||g_uniq_tbl_names_tbl(l_table_object_id).table_name
1569                                           ||'%ROWTYPE;';
1570                 cn_utils.appindcr(body_code,'  '|| l_variable_declaration);
1571         END IF;
1572         l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
1573      END LOOP;
1574 
1575      -- Added for 11.5.10 Performance Enhancments
1576      -- Declare record type to hold all columns fetched from CH and CL tables
1577      cn_utils.appendcr(body_code);
1578       cn_utils.appindcr(body_code ,'TYPE comm_type IS RECORD ');
1579       cn_utils.appindcr(body_code ,'(');
1580       FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
1581 
1582           IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
1583            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,'  );
1584           ELSE
1585            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'  );
1586           END IF;
1587 
1588       END LOOP;
1589 
1590       cn_utils.appindcr(body_code ,');');
1591       cn_utils.appindcr(body_code ,' g_commission_rec                comm_type ;');
1592 
1593 
1594 
1595      -- create package variables for pe references
1596      IF (g_pe_reference_tbl.COUNT > 0) THEN
1597         FOR i IN g_pe_reference_tbl.first..g_pe_reference_tbl.last LOOP
1598            cn_utils.appendcr(body_code, '  g_'||REPLACE(g_pe_reference_tbl(i), '.', '_')||'      NUMBER;');
1599         END LOOP;
1600      END IF;
1601      cn_utils.appendcr(body_code);
1602 END pkg_variables;
1603 
1604 PROCEDURE convert_clob_to_string ( p_clob_loc clob, x_string OUT NOCOPY VARCHAR2) IS
1605      l_amount NUMBER;
1606 BEGIN
1607      l_amount := dbms_lob.getlength(p_clob_loc);
1608      dbms_lob.read( p_clob_loc, l_amount, 1 , x_string);
1609 
1610      IF (g_pe_id_tbl.COUNT > 0) THEN
1611         FOR i IN g_pe_id_tbl.first..g_pe_id_tbl.last LOOP
1612            x_string := REPLACE(x_string, g_pe_id_tbl(i)||'PE.', 'g_'||g_pe_id_tbl(i)||'PE_');
1613         END LOOP;
1614      END IF;
1615 END convert_clob_to_string;
1616 
1617 --   construct the get_input procedure for the formula package.
1621     procedure_name        cn_obj_procedures_v.name%TYPE;
1618 PROCEDURE get_input (         spec_code        IN OUT NOCOPY cn_utils.code_type,
1619                         body_code        IN OUT NOCOPY cn_utils.code_type )
1620   IS
1622     procedure_desc        cn_obj_procedures_v.description%TYPE;
1623     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
1624     package_spec_id        cn_obj_packages_v.package_id%TYPE;
1625     x_repository_id        cn_repositories.repository_id%TYPE;
1626 
1627     l_input_sql_select        varchar2(8000);
1628     l_input_sql_from        varchar2(4000);
1629     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
1630 
1631     l_input_sql_select_clob clob;
1632     l_input_sql_from_clob   clob;
1633 
1634     l_counter NUMBER;
1635     l_dim_unit_code VARCHAR2(30);
1636 
1637     CURSOR l_mul_inputs_csr IS
1638        SELECT rate_dim_sequence, calc_sql_exp_id, nvl(split_flag, 'N') split_flag, nvl(cumulative_flag, 'N') cumulative_flag
1639          FROM cn_formula_inputs_all
1640         WHERE calc_formula_id = g_formula_id
1641           AND org_id = g_org_id
1642         ORDER BY rate_dim_sequence;
1643 
1644     -- cursor to get the dim_unit_code
1645     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
1646        SELECT dim_unit_code
1647          FROM cn_rate_dimensions_all
1648         WHERE rate_dimension_id = (SELECT rate_dimension_id
1649                                      FROM cn_rate_sch_dims_all
1650                                     WHERE rate_dim_sequence = p_rate_dim_sequence
1651                                       AND rate_schedule_id = (SELECT rate_schedule_id
1652                                                                 FROM cn_rt_formula_asgns_all
1653                                                                WHERE calc_formula_id = g_formula_id
1654                                                                  AND org_id = g_org_id
1655                                                                  AND ROWNUM = 1));
1656 
1657     CURSOR l_sql_select_from_csr (l_calc_sql_exp_id NUMBER) IS
1658        SELECT  sql_select input_sql_select, sql_from input_sql_from
1659          FROM  cn_calc_sql_exps_all
1660          WHERE calc_sql_exp_id = l_calc_sql_exp_id;
1661 
1662 BEGIN
1663      procedure_name := 'get_input';
1664      procedure_desc := 'This procedure is to calculate the input';
1665      parameter_list := 'p_commission_line_id NUMBER, p_salesrep_id NUMBER,' ||
1666        'p_period_id NUMBER, p_quota_id    NUMBER, p_srp_plan_assign_id NUMBER,' ||
1667        'p_processed_date DATE, x_mul_input_tbl IN OUT NOCOPY cn_formula_common_pkg.mul_input_tbl_type';
1668      IF g_trx_group_code = 'GROUP' THEN
1669         parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2, p_start_period_id NUMBER';
1670      END IF;
1671 
1672      proc_init(procedure_name, procedure_desc, parameter_list,
1673                'P', null , package_spec_id, x_repository_id,
1674                spec_code, body_code);
1675 
1676      cn_utils.appindcr(body_code, '  l_input              NUMBER;');
1677      cn_utils.appindcr(body_code, '  l_input_string     VARCHAR2(30);');
1678      cn_utils.appindcr(body_code, '  l_itd_target       NUMBER;');
1679      cn_utils.appendcr(body_code);
1680      cn_utils.appendcr(body_code, 'BEGIN');
1681 
1682      IF g_trx_group_code = 'INDIVIDUAL' THEN
1683         l_counter := 1;
1684         FOR l_mul_input IN l_mul_inputs_csr LOOP
1685            OPEN dim_type(l_mul_input.rate_dim_sequence);
1686            FETCH dim_type INTO l_dim_unit_code;
1687            CLOSE dim_type;
1688 
1689            l_input_sql_where  := 'WHERE 1=1 ';
1690 
1691            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1692            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1693            CLOSE l_sql_select_from_csr;
1694 
1695            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1696            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1697            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1698            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1699 
1700            -- if other tables other than the standard tables are used in
1701            -- the input expression we will retain the select statment in
1702            -- get input othewise we will replace it with a expression using
1703            -- global variable which are prepopulated in calculate_quota
1704            IF g_other_tabused_tbl(l_mul_input.calc_sql_exp_id) = 'Y' THEN
1705 
1706               construct_sql_from_where (l_input_sql_select,
1707                                         l_input_sql_from,
1708                                         l_input_sql_where );
1709               split_long_sql( body_code, l_input_sql_select, 'SELECT');
1710 
1711               IF (l_dim_unit_code = 'STRING') THEN
1712                  cn_utils.appindcr(body_code, ' into l_input_string ');
1713                ELSE
1714                  cn_utils.appindcr(body_code, '   into l_input ');
1715               END IF;
1716               split_long_sql( body_code, l_input_sql_from, 'FROM');
1717               split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1718            ELSE
1719               -- Added for 11.5.10 Performance Enhancments
1720               -- Replace the select with a expression which uses the prefetched column values
1721               -- held in record variables
1722 
1723               -- Added the call to below procedure for bugfix 3574402
1724               construct_sql_from_where (l_input_sql_select,
1725 	                                              l_input_sql_from,
1726 	                                              l_input_sql_where );
1727 
1728 
1732                       ELSE
1729               IF g_non_plsql_func_used_tbl(l_mul_input.calc_sql_exp_id) = 'N' THEN
1730                       IF (l_dim_unit_code = 'STRING') THEN
1731                           cn_utils.appindcr(body_code, ' l_input_string := ');
1733                           cn_utils.appindcr(body_code, 'l_input := ');
1734                       END IF;
1735               ELSE
1736                      cn_utils.appindcr(body_code,'SELECT ');
1737               END IF;
1738               -- add the select clause of the expression with column names replaced with
1739               -- global package variables
1740               FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
1741                  IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = l_mul_input.calc_sql_exp_id THEN
1742                     IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
1743                        g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
1744                        l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1745                                                                    g_exp_tbl_dtls_tbl(i).column_name),
1746                                                                    g_exp_tbl_dtls_tbl(i).variable_name);
1747 
1748                     ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
1749             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
1750             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
1751             			boolena varriable
1752             			*/
1753             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
1754             	                       l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1755                                                                                g_exp_tbl_dtls_tbl(i).column_name),
1756                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
1757             			else
1758             	                       l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1759                                                                                g_exp_tbl_dtls_tbl(i).column_name),
1760                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
1761             			end if;
1762                     ELSE
1763                        l_input_sql_select :=  REPLACE(l_input_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
1764                                                                    g_exp_tbl_dtls_tbl(i).column_name),
1765                                                                    'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
1766                     END IF;
1767                  END IF;
1768               END LOOP;
1769               -- if non plsq function like DECODE is used we cannot use just an expression
1770               -- so select expression from dual;
1771               IF g_non_plsql_func_used_tbl(l_mul_input.calc_sql_exp_id) = 'N' THEN
1772                  -- fix for bug 3187576
1773                  --cn_utils.appindcr(body_code,REPLACE(l_input_sql_select,'select',NULL)||';');
1774                  split_long_sql( body_code, REPLACE(l_input_sql_select,'select',NULL)||';', 'SELECT');
1775 
1776               ELSE
1777                  -- fix for bug 3187576
1778                  --cn_utils.appindcr(body_code,REPLACE(l_input_sql_select,'select',NULL));
1779                  split_long_sql( body_code, REPLACE(l_input_sql_select,'select',NULL), 'SELECT');
1780 
1781                  IF (l_dim_unit_code = 'STRING') THEN
1782                               cn_utils.appindcr(body_code, ' into l_input_string ');
1783                  ELSE
1784                               cn_utils.appindcr(body_code, '   into l_input ');
1785                  END IF;
1786                  cn_utils.appindcr(body_code, '   FROM  DUAL; ');
1787               END IF;
1788             END IF;
1789 
1790            cn_utils.appendcr(body_code);
1791 
1792            IF (l_dim_unit_code = 'STRING') THEN
1793              cn_utils.appindcr(body_code, '  l_input_string := nvl(l_input_string, ''''); ');
1794            ELSE
1795              cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1796            END IF;
1797 
1798            cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter ||').rate_dim_sequence := ' || l_mul_input.rate_dim_sequence || ' ; ' );
1799 
1800            IF (l_dim_unit_code = 'STRING') THEN
1801               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').input_string := l_input_string;' );
1802             ELSE
1803               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').input_amount := l_input;' );
1804               cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter ||').amount := l_input;' );
1805            END IF;
1806 
1807            IF (l_mul_input.cumulative_flag = 'N') THEN --IF g_cumulative_flag = 'N'  THEN
1808               -- 1.single input with non accumulative
1809               -- 2.multiple inputs case is always non accumulative
1810               IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN -- need to split
1811                  cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1812                ELSE -- non cumulative with no split
1813                  cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := l_input;' );
1814               END IF;
1815             ELSE -- single input with cumulative_flag ON. we need to distinguish
1816               IF (g_cumulative_input_no = 1) THEN
1817                  g_cumulative_input_no := l_counter;
1818               END IF;
1822                     cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('||l_mul_input.rate_dim_sequence||');' );
1819 
1820               IF g_itd_flag = 'N' THEN
1821                  IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN -- need to split
1823                   ELSE
1824                     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;' );
1825                  END IF;
1826                ELSE -- g_itd_flag = 'Y'
1827                  cn_utils.appendcr(body_code);
1828                  IF g_pq_target_flag OR g_spq_target_flag  THEN
1829                     IF g_pq_target_flag THEN
1830                        cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
1831                        cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
1832                     END IF;
1833 
1834                     IF g_spq_target_flag THEN
1835                        cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
1836                        cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
1837                        cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
1838                     END IF;
1839 
1840                     cn_utils.appendcr(body_code);
1841 
1842                     IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1843                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := (l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||')) ');
1844                        cn_utils.appindcr(body_code, '     /l_itd_target;' );
1845                        cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1846                      ELSE
1847                        --cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input / l_itd_target; ');
1848                        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||'))');
1849                        cn_utils.appindcr(body_code, '      /l_itd_target;' );
1850                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := x_mul_input_tbl('|| l_counter || ').base_amount; ');
1851                     END IF;
1852                   ELSE
1853                     IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1854                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input+ g_input_achieved_itd('||l_mul_input.rate_dim_sequence||');' );
1855                        cn_utils.appindcr(body_code, '  x_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
1856                      ELSE
1857                        --cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := l_input; ');
1858                        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||');' );
1859                        cn_utils.appindcr(body_code, '  x_mul_input_tbl('|| l_counter || ').amount := x_mul_input_tbl('|| l_counter || ').base_amount; ');
1860                     END IF;
1861                  END IF;
1862               END IF;
1863            END IF;
1864            cn_utils.appendcr(body_code);
1865            l_counter := l_counter+1;
1866         END LOOP;
1867       ELSE -- g_trx_group_code = 'GROUP'
1868         cn_utils.appindcr(body_code, ' IF p_commission_line_id IS NOT NULL THEN ');
1869         cn_utils.appendcr(body_code);
1870 
1871         g_trx_group_code := 'INDIVIDUAL';
1872         l_counter :=1;
1873         FOR l_mul_input IN l_mul_inputs_csr LOOP
1874            l_input_sql_where  := 'WHERE 1=1 ';
1875 
1876            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1877            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1878            CLOSE l_sql_select_from_csr;
1879 
1880            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1881            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1882            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1883            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1884 
1885            construct_sql_from_where (l_input_sql_select,
1886                                      l_input_sql_from,
1887                                      l_input_sql_where );
1888 
1889            split_long_sql( body_code, l_input_sql_select, 'SELECT');
1890            cn_utils.appindcr(body_code, '   into l_input ');
1891            split_long_sql( body_code, l_input_sql_from, 'FROM');
1892            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1893 
1894 
1895            cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1896 
1897         END LOOP;
1898         cn_utils.appindcr(body_code, ' ELSE  ');
1899         cn_utils.appendcr(body_code);
1900 
1901         g_trx_group_code := 'GROUP';
1902         l_counter :=1;
1903         FOR l_mul_input IN l_mul_inputs_csr LOOP
1904 
1905            l_input_sql_where  := 'WHERE 1=1 ';
1906 
1907            OPEN l_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
1908            FETCH l_sql_select_from_csr INTO l_input_sql_select_clob, l_input_sql_from_clob;
1909            CLOSE l_sql_select_from_csr;
1910 
1911            convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
1912            l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
1913            convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
1917                                      l_input_sql_from,
1914            l_input_sql_from := lower( 'from ' || l_input_sql_from );
1915 
1916            construct_sql_from_where (l_input_sql_select,
1918                                      l_input_sql_where );
1919 
1920            cn_utils.appindcr(body_code, ' BEGIN ');
1921            split_long_sql( body_code, l_input_sql_select, 'SELECT');
1922            cn_utils.appindcr(body_code, '   into l_input ');
1923            split_long_sql( body_code, l_input_sql_from, 'FROM');
1924            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
1925            cn_utils.appendcr(body_code);
1926            cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
1927            cn_utils.appendcr(body_code);
1928            cn_utils.appindcr(body_code, ' EXCEPTION WHEN OTHERS THEN ');
1929            cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
1930            cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
1931            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_input.exception'', ');
1932            cn_utils.appindcr(body_code, '	          sqlerrm); ');
1933            cn_utils.appindcr(body_code, '   end if; ');
1934            cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_input: ''); ');
1935            cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
1936            cn_utils.appindcr(body_code, '   raise; ');
1937            cn_utils.appindcr(body_code, ' END; ');
1938            cn_utils.appendcr(body_code);
1939            cn_utils.appindcr(body_code, '  l_input := nvl(l_input,0); ');
1940            cn_utils.appindcr(body_code, '  x_mul_input_tbl('||
1941                              l_counter ||').rate_dim_sequence := '
1942                              || l_mul_input.rate_dim_sequence || ' ; ' );
1943            cn_utils.appendcr(body_code);
1944            cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1945                              ').input_amount := l_input; ');
1946            cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1947                              ').amount := l_input; ');
1948 
1949            IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
1950               cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1951                                 ').base_amount := 0; ');
1952             ELSE
1953               cn_utils.appindcr(body_code, '    x_mul_input_tbl('|| l_counter ||
1954                                 ').base_amount := l_input; ');
1955            END IF;
1956 
1957 
1958            cn_utils.appindcr(body_code, 'g_input_achieved := x_mul_input_tbl(1).input_amount; ');
1959 
1960            l_counter := l_counter+1;
1961         END LOOP;
1962         cn_utils.appindcr(body_code, ' END IF;  ');
1963      END IF;
1964 
1965      if (g_trx_group_code <> 'GROUP') then
1966        cn_utils.appindcr(body_code, 'g_input_achieved := x_mul_input_tbl(1).input_amount; ');
1967      end if;
1968 
1969      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
1970      cn_utils.appindcr(body_code, '  if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
1971      cn_utils.appindcr(body_code, '     FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
1972      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_input.exception'', ');
1973      cn_utils.appindcr(body_code, '	          sqlerrm); ');
1974      cn_utils.appindcr(body_code, '  end if; ');
1975      cn_utils.appindcr(body_code, '  cn_message_pkg.debug(''Exception occurs in get_input: ''); ');
1976      cn_utils.appindcr(body_code, '  cn_message_pkg.debug(sqlerrm); ');
1977      cn_utils.appindcr(body_code, '  raise; ');
1978 
1979      cn_utils.proc_end( procedure_name, 'N', body_code );
1980 EXCEPTION
1981   when others then
1982     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1983       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
1984                      'cn.plsql.cn_formula_gen_pkg.get_input.exception',
1985          	          sqlerrm);
1986     end if;
1987     raise;
1988 END get_input;
1989 
1990 --   construct the get_commission procedure for the formula package.
1991 PROCEDURE get_commission (spec_code        IN OUT NOCOPY cn_utils.code_type,
1992                           body_code        IN OUT NOCOPY cn_utils.code_type )
1993 IS
1994     procedure_name        cn_obj_procedures_v.name%TYPE;
1995     procedure_desc        cn_obj_procedures_v.description%TYPE;
1996     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
1997     package_spec_id        cn_obj_packages_v.package_id%TYPE;
1998     x_repository_id        cn_repositories.repository_id%TYPE;
1999 
2000     l_output_sql_select        varchar2(8000);
2001     l_output_sql_from        varchar2(4000);
2002     l_output_sql_where   varchar2(4000) := 'WHERE 1=1 ';
2003 
2004     l_operator_position NUMBER;
2005     l_operator          VARCHAR2(1);
2006 
2007     l_output_sql_select_clob clob;
2008     l_output_sql_from_clob   clob;
2009     l_out_calc_sql_exp_id   cn_calc_sql_exps.calc_sql_exp_id%TYPE;
2010 
2011     CURSOR l_sql_select_from_csr IS
2012        SELECT calc_sql_exp_id,
2013               sql_select output_sql_select,
2014               sql_from output_sql_from
2015          FROM cn_calc_sql_exps_all
2016         WHERE calc_sql_exp_id = (SELECT output_exp_id
2017                                    FROM cn_calc_formulas_all
2018                                   WHERE calc_formula_id = g_formula_id
2019                                     AND org_id = g_org_id);
2020 
2021 BEGIN
2022      procedure_name := 'get_commission';
2023      procedure_desc := 'This procedure is to calculate the commission';
2024      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';
2028 
2025      IF g_trx_group_code = 'GROUP' THEN
2026        parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2, p_start_period_id NUMBER';
2027      END IF;
2029      proc_init(procedure_name, procedure_desc, parameter_list,'F', 'NUMBER', package_spec_id, x_repository_id,spec_code, body_code);
2030 
2031      cn_utils.appindcr(body_code, '  l_commission              NUMBER;');
2032      cn_utils.appindcr(body_code, '  l_output              NUMBER;');
2033      cn_utils.appendcr(body_code);
2034      cn_utils.appendcr(body_code, 'BEGIN');
2035 
2036      IF g_trx_group_code = 'INDIVIDUAL' THEN
2037         OPEN l_sql_select_from_csr;
2038         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2039         CLOSE l_sql_select_from_csr;
2040 
2041         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2042         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2043         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2044         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2045 
2046         -- found out whether rateresult is used in output sql and what's the operator if any
2047         g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
2048 
2049         l_operator_position := search_delimiter_select(l_output_sql_select, 1);
2050         IF l_operator_position > 0 THEN
2051            l_operator := substr(l_output_sql_select, l_operator_position, 1);
2052         END IF;
2053 
2054         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2055         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2056 
2057         -- Added for 11.5.10 Performance Enhancments
2058         -- if other tables other than the standard tables are used in
2059         -- the output expression we will retain the select statment in
2060         -- otherwise Replace the select with a expression which uses
2061         -- the prefetched column values held in record variables
2062 
2063         IF g_other_tabused_tbl(l_out_calc_sql_exp_id) = 'Y' THEN
2064            split_long_sql( body_code, l_output_sql_select, 'SELECT');
2065            cn_utils.appindcr(body_code, '   into l_commission ');
2066            split_long_sql( body_code, l_output_sql_from, 'FROM');
2067            split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2068         ELSE
2069            IF g_non_plsql_func_used_tbl(l_out_calc_sql_exp_id) = 'N' THEN
2070               cn_utils.appindcr(body_code, 'l_commission := ');
2071            ELSE
2072               cn_utils.appindcr(body_code,'SELECT ');
2073            END IF;
2074            FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
2075               IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = l_out_calc_sql_exp_id THEN
2076                  IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
2077                      g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
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_exp_tbl_dtls_tbl(i).variable_name);
2081                  ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
2082             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
2083             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
2084             			boolena varriable
2085             			*/
2086             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
2087             	                       l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2088                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2089                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
2090             			else
2091             	                       l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2092                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2093                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2094             			end if;
2095                  ELSE
2096                      l_output_sql_select :=  REPLACE(l_output_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2097                                                                    g_exp_tbl_dtls_tbl(i).column_name),
2098                                                                    'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2099                  END IF;
2100               END IF;
2101            END LOOP;
2102            IF g_non_plsql_func_used_tbl(l_out_calc_sql_exp_id) = 'N' THEN
2103               -- fix for bug 3187576
2104               --cn_utils.appindcr(body_code,REPLACE(l_output_sql_select,'select',NULL)||';');
2105               split_long_sql( body_code, REPLACE(l_output_sql_select,'select',NULL)||';', 'SELECT');
2106            ELSE
2107               -- fix for bug 3187576
2108               --cn_utils.appindcr(body_code,REPLACE(l_output_sql_select,'select',NULL));
2109               split_long_sql( body_code, REPLACE(l_output_sql_select,'select',NULL), 'SELECT');
2110               cn_utils.appindcr(body_code, '   into l_commission ');
2111               cn_utils.appindcr(body_code, '   FROM  DUAL; ');
2112            END IF;
2113         END IF;
2114 
2115         cn_utils.appendcr(body_code);
2116         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2117 
2118         IF g_itd_flag = 'Y' THEN
2122               cn_utils.appindcr(body_code, '  g_output_achieved := 0; ');
2119            IF g_pq_payment_flag OR g_spq_payment_flag THEN
2120               -- OR g_no_trx_flag THEN
2121               -- since itd_payment is used, we don't need to accumulate output_achieved
2123               cn_utils.appindcr(body_code, '  l_commission := l_commission - '|| ' g_commission_payed_itd ;' );
2124             ELSE -- we need to accumulate the output
2125               cn_utils.appindcr(body_code, '  g_output_achieved := l_commission; ');
2126               -- if x_rate is used in output
2127               IF g_rate_flag THEN
2128                  IF l_operator_position > 0 THEN
2129                     cn_utils.appindcr(body_code, '  l_commission := p_rate '||l_operator||
2130                                       ' (g_output_achieved_itd + g_output_achieved) - g_commission_payed_itd;');
2131                   ELSE
2132                     cn_utils.appindcr(body_code, '  l_commission := p_rate - '|| 'g_commission_payed_itd ;' );
2133                  END IF;
2134                ELSE
2135                  cn_utils.appindcr(body_code, '  l_commission := g_output_achieved_itd + g_output_achieved - g_commission_payed_itd ;');
2136               END IF;
2137            END IF;
2138         END IF;
2139      ELSE  -- group by case
2140         cn_utils.appindcr(body_code, '  IF p_commission_line_id IS NOT NULL THEN ');
2141         cn_utils.appendcr(body_code);
2142         -- construct the code for testing trx by trx
2143         g_trx_group_code := 'INDIVIDUAL';
2144         l_output_sql_where := 'WHERE 1=1 ';
2145 
2146         OPEN l_sql_select_from_csr;
2147         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2148         CLOSE l_sql_select_from_csr;
2149 
2150         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2151         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2152         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2153         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2154 
2155         -- found out whether rateresult is used in output sql and what's the operator if any
2156         g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
2157 
2158         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2159         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2160 
2161         split_long_sql( body_code, l_output_sql_select, 'SELECT');
2162         cn_utils.appindcr(body_code, '   into l_commission ');
2163         split_long_sql( body_code, l_output_sql_from, 'FROM');
2164         split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2165         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2166         cn_utils.appindcr(body_code, '  ELSE                          ');
2167         cn_utils.appendcr(body_code);
2168         -- construct the code for computing the output and commission
2169         g_trx_group_code := 'GROUP';
2170         l_output_sql_where := 'WHERE 1=1 ';
2171 
2172         OPEN l_sql_select_from_csr;
2173         FETCH l_sql_select_from_csr INTO l_out_calc_sql_exp_id,l_output_sql_select_clob, l_output_sql_from_clob;
2174         CLOSE l_sql_select_from_csr;
2175 
2176         convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
2177         l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
2178         convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
2179         l_output_sql_from := lower( 'from ' || l_output_sql_from );
2180 
2181         construct_sql_from_where(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2182         handle_output_sql_select(l_output_sql_select, l_output_sql_from, l_output_sql_where);
2183 
2184         cn_utils.appindcr(body_code, ' BEGIN ');
2185         split_long_sql( body_code, l_output_sql_select, 'SELECT');
2186         cn_utils.appindcr(body_code, '   into l_commission ');
2187         split_long_sql( body_code, l_output_sql_from, 'FROM');
2188         split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
2189         cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
2190         cn_utils.appendcr(body_code);
2191         cn_utils.appindcr(body_code, 'EXCEPTION WHEN NO_DATA_FOUND THEN ');
2192         cn_utils.appindcr(body_code, '    l_commission := nvl(l_commission,0); ');
2193         cn_utils.appindcr(body_code, ' when others then ');
2194         cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2195         cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2196         cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_commission.exception'', ');
2197         cn_utils.appindcr(body_code, '	          sqlerrm); ');
2198         cn_utils.appindcr(body_code, '   end if; ');
2199         cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_commission: ''); ');
2200         cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2201         cn_utils.appindcr(body_code, '   raise; ');
2202         cn_utils.appindcr(body_code, 'END;');
2203         cn_utils.appendcr(body_code);
2204         cn_utils.appindcr(body_code, '      g_output_achieved_ptd := '||'l_commission - g_output_achieved_itd ;' );
2205         cn_utils.appindcr(body_code, '      g_output_achieved_itd := l_commission; ');
2206         cn_utils.appendcr(body_code);
2207         cn_utils.appindcr(body_code, '  END IF; ' );
2208      END IF;
2209 
2210      cn_utils.appindcr(body_code, '  return l_commission; '        );
2211 
2212      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
2213      cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2214      cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2218      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_commission: ''); ');
2215      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_commission.exception'', ');
2216      cn_utils.appindcr(body_code, '	          sqlerrm); ');
2217      cn_utils.appindcr(body_code, '   end if; ');
2219      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2220      cn_utils.appindcr(body_code, '   raise; ');
2221 
2222      cn_utils.proc_end( procedure_name, 'N', body_code );
2223 EXCEPTION
2224   when others then
2225     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
2226       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
2227                      'cn.plsql.cn_formula_gen_pkg.get_commission.exception',
2228          	          sqlerrm);
2229     end if;
2230     raise;
2231 END get_commission;
2232 
2233 --construct the get_perf procedure for the formula package.
2234 PROCEDURE get_perf (spec_code        IN OUT NOCOPY cn_utils.code_type,
2235                     body_code        IN OUT NOCOPY cn_utils.code_type )
2236 IS
2237     procedure_name        cn_obj_procedures_v.name%TYPE;
2238     procedure_desc        cn_obj_procedures_v.description%TYPE;
2239     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
2240     package_spec_id        cn_obj_packages_v.package_id%TYPE;
2241     x_repository_id        cn_repositories.repository_id%TYPE;
2242 
2243     l_perf_sql_select        varchar2(8000);
2244     l_perf_sql_from        varchar2(4000);
2245     l_perf_sql_where   varchar2(4000) := 'WHERE 1=1 ';
2246 
2247     l_perf_sql_select_clob  clob;
2248     l_perf_sql_from_clob        clob;
2249     l_input_sql_exp_id          cn_calc_sql_exps.calc_sql_exp_id%TYPE;
2250 
2251     CURSOR l_perf_select_from_csr IS
2252         select sql_select, sql_from
2253           from cn_calc_sql_exps_all
2254           where calc_sql_exp_id = g_perf_measure_id;
2255 
2256     CURSOR l_input_select_from_csr IS
2257        SELECT calc_sql_exp_id,
2258               sql_select input_sql_select,
2259               sql_from input_sql_from
2260          FROM cn_calc_sql_exps_all
2261          WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
2262                                   FROM cn_formula_inputs_all
2263                                   WHERE calc_formula_id = g_formula_id
2264                                   AND org_id = g_org_id
2265                                   AND rate_dim_sequence = 1);
2266 
2267 BEGIN
2268      procedure_name := 'get_perf';
2269      procedure_desc := 'This procedure is to accumulate performance measure.';
2270      parameter_list := 'p_commission_line_id NUMBER, p_salesrep_id NUMBER,' ||
2271        'p_period_id NUMBER, p_quota_id NUMBER, p_srp_plan_assign_id NUMBER, p_start_date DATE';
2272      IF g_trx_group_code = 'GROUP' THEN
2273         parameter_list := parameter_list || ', p_endofinterval_flag VARCHAR2 ' ||
2274           ', p_start_period_id NUMBER';
2275      END IF;
2276 
2277      IF g_formula_type = 'B' THEN
2278         parameter_list := parameter_list || ',p_credit_type_id NUMBER, '||
2279           'p_role_id NUMBER';
2280      END IF;
2281 
2282      proc_init(procedure_name, procedure_desc, parameter_list,'F', 'NUMBER' ,
2283                package_spec_id, x_repository_id,spec_code, body_code);
2284 
2285      cn_utils.appindcr(body_code, '  l_perf              NUMBER;');
2286      cn_utils.appendcr(body_code);
2287      cn_utils.appendcr(body_code, 'BEGIN');
2288 
2289      IF g_trx_group_code = 'INDIVIDUAL' THEN
2290         IF g_perf_measure_id IS NOT NULL THEN
2291            OPEN l_perf_select_from_csr;
2292            FETCH l_perf_select_from_csr
2293              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2294            CLOSE l_perf_select_from_csr;
2295 
2296            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2297            l_perf_sql_select := lower_str('select ' || l_perf_sql_select);
2298            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2299            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2300 
2301          ELSE   /* default to be the input with the lowest input_sequence */
2302            OPEN l_input_select_from_csr;
2303            FETCH l_input_select_from_csr
2304            INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2305            CLOSE l_input_select_from_csr;
2306 
2307            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2308            l_perf_sql_select := lower_str('select ' || l_perf_sql_select);
2309            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2310            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2311         END IF;
2312 
2313 
2314         construct_sql_from_where(l_perf_sql_select,
2315                                  l_perf_sql_from,
2316                                  l_perf_sql_where     );
2317         -- Added for 11.5.10 Performance Enhancments
2318         -- Replace the select with a expression which uses
2319         -- the prefetched column values held in record variables
2320         IF g_other_tabused_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'Y' THEN
2321            split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2322            cn_utils.appindcr(body_code, '   into l_perf ');
2323            split_long_sql( body_code, l_perf_sql_from, 'FROM');
2324            split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2325         ELSE
2326            IF g_non_plsql_func_used_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'N' THEN
2327                    cn_utils.appindcr(body_code, 'l_perf := ');
2328            ELSE
2329                    cn_utils.appindcr(body_code,'SELECT ');
2330            END IF;
2331            FOR i in 1..g_exp_tbl_dtls_tbl.COUNT LOOP
2335                        l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2332               IF  g_exp_tbl_dtls_tbl(i).CALC_SQL_EXP_ID = NVL(g_perf_measure_id,l_input_sql_exp_id) THEN
2333                  IF (g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_LINES' AND
2334                    g_exp_tbl_dtls_tbl(i).table_name <> 'CN_COMMISSION_HEADERS' ) THEN
2336                                                                 g_exp_tbl_dtls_tbl(i).column_name),
2337                                                                 g_exp_tbl_dtls_tbl(i).variable_name);
2338                  ELSIF (g_exp_tbl_dtls_tbl(i).table_name = 'CN_COMMISSION_HEADERS')THEN
2339             			/* column name from CN_COMMISSION_HEADERS could have been added with a 'CH_' in front of the column name
2340             			or not. To identify whether CH_ was added in front of the column name, use g_exp_tbl_dtls_tbl.alias_added
2341             			boolena varriable
2342             			*/
2343             			if (g_exp_tbl_dtls_tbl(i).alias_added = true) then
2344             	                       l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2345                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2346                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).table_alias||'_'||g_exp_tbl_dtls_tbl(i).column_name);
2347             			else
2348             	                       l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2349                                                                                g_exp_tbl_dtls_tbl(i).column_name),
2350                                                                                'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2351             			end if;
2352                  ELSE
2353                        l_perf_sql_select :=  REPLACE(l_perf_sql_select,lower(g_exp_tbl_dtls_tbl(i).table_alias||'.'||
2354                                                                 g_exp_tbl_dtls_tbl(i).column_name),
2355                                                                 'g_commission_rec'||'.'||g_exp_tbl_dtls_tbl(i).column_name);
2356                  END IF;
2357               END IF;
2358            END LOOP;
2359            IF g_non_plsql_func_used_tbl(NVL(g_perf_measure_id,l_input_sql_exp_id)) = 'N' THEN
2360               -- fix for bug 3187576
2361               --cn_utils.appindcr(body_code,REPLACE(l_perf_sql_select,'select',NULL)||';');
2362               split_long_sql( body_code, REPLACE(l_perf_sql_select,'select',NULL)||';', 'SELECT');
2363            ELSE
2364               -- fix for bug 3187576
2365               --cn_utils.appindcr(body_code,REPLACE(l_perf_sql_select,'select',NULL));
2366               split_long_sql( body_code, REPLACE(l_perf_sql_select,'select',NULL), 'SELECT');
2367               cn_utils.appindcr(body_code, '   into l_perf ');
2368               cn_utils.appindcr(body_code, '   FROM  DUAL; ');
2369            END IF;
2370         END IF;
2371         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2372      ELSE -- group by case
2373             cn_utils.appindcr(body_code, '  IF p_commission_line_id IS NOT NULL THEN ');
2374         cn_utils.appendcr(body_code);
2375         -- construct the code for testing trx by trx
2376         g_trx_group_code := 'INDIVIDUAL';
2377         l_perf_sql_where := 'WHERE 1=1 ';
2378 
2379         IF g_perf_measure_id IS NOT NULL THEN
2380            OPEN l_perf_select_from_csr;
2381            FETCH l_perf_select_from_csr
2382              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2383            CLOSE l_perf_select_from_csr;
2384 
2385            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2386            l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
2387            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2388            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2389 
2390          ELSE   /* default to be the input with the lowest input_sequence */
2391            OPEN l_input_select_from_csr;
2392            FETCH l_input_select_from_csr
2393              INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2394            CLOSE l_input_select_from_csr;
2395 
2396            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2397            l_perf_sql_select := lower_str('select ' || l_perf_sql_select );
2398            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2399            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2400 
2401         END IF;
2402         construct_sql_from_where(l_perf_sql_select,
2403                                  l_perf_sql_from,
2404                                  l_perf_sql_where     );
2405 
2406         split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2407         cn_utils.appindcr(body_code, '   into l_perf ');
2408         split_long_sql( body_code, l_perf_sql_from, 'FROM');
2409         split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2410 
2411         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2412 
2413         cn_utils.appindcr(body_code, ' ELSE                          ');
2414         cn_utils.appendcr(body_code);
2415         -- construct the code for computing the perf
2416         g_trx_group_code := 'GROUP';
2417         l_perf_sql_where := 'WHERE 1=1 ';
2418 
2419         IF g_perf_measure_id IS NOT NULL THEN
2420            OPEN l_perf_select_from_csr;
2421            FETCH l_perf_select_from_csr
2422              INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
2423            CLOSE l_perf_select_from_csr;
2424 
2425            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2426            l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
2427            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2428            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2429 
2430          ELSE   /* default to be the input with the lowest input_sequence */
2431            OPEN l_input_select_from_csr;
2432            FETCH l_input_select_from_csr
2433              INTO  l_input_sql_exp_id,l_perf_sql_select_clob, l_perf_sql_from_clob;
2434            CLOSE l_input_select_from_csr;
2435 
2436            convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
2437            l_perf_sql_select := lower_str('select ' || l_perf_sql_select );
2438            convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
2439            l_perf_sql_from := lower('from ' || l_perf_sql_from);
2440         END IF;
2441         construct_sql_from_where(l_perf_sql_select,
2442                                  l_perf_sql_from,
2443                                  l_perf_sql_where     );
2444 
2445         cn_utils.appindcr(body_code, '   BEGIN ');
2446         split_long_sql( body_code, l_perf_sql_select, 'SELECT');
2447         cn_utils.appindcr(body_code, '   into l_perf ');
2448         split_long_sql( body_code, l_perf_sql_from, 'FROM');
2449         split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
2450         cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
2451         cn_utils.appindcr(body_code, '   EXCEPTION WHEN NO_DATA_FOUND THEN ');
2452         cn_utils.appindcr(body_code, '      l_perf := nvl(l_perf,0); ');
2453         cn_utils.appindcr(body_code, '      WHEN others then ');
2454         cn_utils.appindcr(body_code, '        if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2455         cn_utils.appindcr(body_code, '          FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2456         cn_utils.appindcr(body_code, '             ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_perf.exception'', ');
2457         cn_utils.appindcr(body_code, '	            sqlerrm); ');
2458         cn_utils.appindcr(body_code, '        end if; ');
2459         cn_utils.appindcr(body_code, '        cn_message_pkg.debug(''Exception occurs in get_perf: ''); ');
2460         cn_utils.appindcr(body_code, '        cn_message_pkg.debug(sqlerrm); ');
2461         cn_utils.appindcr(body_code, '        raise; ');
2462         cn_utils.appindcr(body_code, '   END;');
2463         cn_utils.appendcr(body_code);
2464         cn_utils.appindcr(body_code, '  END IF;  ');
2465      END IF;
2466      cn_utils.appendcr(body_code);
2467      cn_utils.appindcr(body_code, '  return l_perf;        ');
2468 
2469      cn_utils.appindcr(body_code, 'EXCEPTION WHEN OTHERS THEN ');
2470      cn_utils.appindcr(body_code, '   if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
2471      cn_utils.appindcr(body_code, '      FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
2472      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_perf.exception'', ');
2473      cn_utils.appindcr(body_code, '	          sqlerrm); ');
2474      cn_utils.appindcr(body_code, '   end if; ');
2475      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(''Exception occurs in get_perf: ''); ');
2476      cn_utils.appindcr(body_code, '   cn_message_pkg.debug(sqlerrm); ');
2477      cn_utils.appindcr(body_code, '   raise; ');
2478 
2479      cn_utils.proc_end( procedure_name, 'N', body_code );
2480 EXCEPTION
2481   when others then
2482     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
2483       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
2484                      'cn.plsql.cn_formula_gen_pkg.get_perf.exception',
2485          	          sqlerrm);
2486     end if;
2487     raise;
2488 END get_perf;
2489 
2490 --   construct the call to cn_formula_common_pkg.calculate_init;
2491 PROCEDURE calc_init (spec_code        IN OUT NOCOPY cn_utils.code_type,
2492                      body_code        IN OUT NOCOPY cn_utils.code_type )
2493 IS
2494 BEGIN
2495     cn_utils.appendcr(body_code);
2496     cn_utils.appindcr(body_code, '  cn_formula_common_pkg.calculate_init( p_srp_plan_assign_id,' ||' p_salesrep_id, ' );
2497     cn_utils.appindcr(body_code, '              p_period_id, p_quota_id,  p_start_date, ');
2498     cn_utils.appindcr(body_code, '                     p_process_all_flag,  g_intel_calc_flag, g_calc_type,');
2499     cn_utils.appindcr(body_code, '              g_trx_group_code, g_itd_flag, g_rollover_flag,');
2500     cn_utils.appindcr(body_code, '              g_commission_payed_ptd, g_commission_payed_itd,');
2501     cn_utils.appindcr(body_code, '              g_input_achieved_ptd, g_input_achieved_itd,');
2502     cn_utils.appindcr(body_code, '              g_output_achieved_ptd, g_output_achieved_itd,');
2503     cn_utils.appindcr(body_code, '              g_perf_achieved_ptd, g_perf_achieved_itd,');
2504     cn_utils.appindcr(body_code, '              g_select_status_flag);');
2505     cn_utils.appendcr(body_code);
2506 
2507     -- resolve pe references
2508     IF (g_pe_reference_tbl.COUNT > 0) THEN
2509        FOR i IN g_pe_reference_tbl.first..g_pe_reference_tbl.last LOOP
2510           cn_utils.appendcr(body_code, '  select ' || REPLACE(g_pe_reference_tbl(i), g_pe_id_tbl(i)||'PE.', ''));
2511           cn_utils.appendcr(body_code, '    into g_' || REPLACE(g_pe_reference_tbl(i), '.', '_'));
2512           cn_utils.appendcr(body_code, '    from cn_srp_period_quotas');
2513           cn_utils.appendcr(body_code, '   where srp_plan_assign_id = p_srp_plan_assign_id');
2514           cn_utils.appendcr(body_code, '     and period_id = p_period_id');
2515           cn_utils.appendcr(body_code, '     and quota_id = ' || g_pe_id_tbl(i) || ';');
2516           cn_utils.appendcr(body_code);
2517        END LOOP;
2518     END IF;
2519 
2520 END calc_init;
2521 
2522 --   construct the call to cn_formula_common_pkg.calculate_roll;
2523 PROCEDURE calc_roll (spec_code        IN OUT NOCOPY cn_utils.code_type,
2524                      body_code        IN OUT NOCOPY cn_utils.code_type )
2525 IS
2526      l_sql_select VARCHAR2(8000);
2527 
2528      CURSOR exps IS
2529         SELECT dbms_lob.substr(sql_select) sql_select
2530           FROM cn_calc_sql_exps_all
2531           WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
2532                                     FROM cn_formula_inputs_all
2533                                    WHERE calc_formula_id = g_formula_id
2534                                    AND org_id = g_org_id
2535                                    AND rate_dim_sequence = (SELECT MIN(rate_dim_sequence)
2536                                                             FROM cn_formula_inputs_all
2537                                                             WHERE calc_formula_id = g_formula_id
2538                                                             AND org_id = g_org_id
2539                                                             AND cumulative_flag = 'Y'));
2540 BEGIN
2541    OPEN exps;
2542    FETCH exps INTO l_sql_select;
2543    CLOSE exps;
2544 
2545    IF (g_cumulative_flag = 'Y') THEN
2546       IF (instr(l_sql_select, '/CSQA.TARGET', 1, 1) > 0 OR
2547           instr(l_sql_select, '/(CSQA.TARGET+CSPQ.TOTAL_ROLLOVER)', 1, 1) > 0 OR
2548           instr(l_sql_select, '/(CSPQ.TOTAL_ROLLOVER+CSQA.TARGET)', 1, 1) > 0) THEN
2549          cn_utils.appendcr(body_code);
2550          cn_utils.appendcr(body_code, ' SELECT csqa.target + nvl(cspq.total_rollover, 0)');
2551          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2552          cn_utils.appendcr(body_code, '   FROM cn_srp_quota_assigns_all csqa, cn_srp_period_quotas_all cspq ');
2553          cn_utils.appendcr(body_code, '  WHERE csqa.srp_plan_assign_id = p_srp_plan_assign_id ');
2554          cn_utils.appendcr(body_code, '    AND csqa.quota_id = p_quota_id ');
2555          cn_utils.appendcr(body_code, '    AND 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 (instr(l_sql_select, '/CSPQ.ITD_TARGET', 1, 1) > 0 OR
2562               instr(l_sql_select, '/(CSPQ.ITD_TARGET+CSPQ.TOTAL_ROLLOVER)', 1, 1) > 0 OR
2563               instr(l_sql_select, '/(CSPQ.TOTAL_ROLLOVER+CSPQ.ITD_TARGET)', 1, 1) > 0) THEN
2564          cn_utils.appendcr(body_code);
2565          cn_utils.appendcr(body_code, ' SELECT cspq.itd_target + nvl(cspq.total_rollover, 0)');
2566          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2567          cn_utils.appendcr(body_code, '   FROM cn_srp_period_quotas_all cspq ');
2568          cn_utils.appendcr(body_code, '  WHERE cspq.srp_plan_assign_id = p_srp_plan_assign_id ');
2569          cn_utils.appendcr(body_code, '    AND cspq.quota_id = p_quota_id ');
2570          cn_utils.appendcr(body_code, '    AND cspq.period_id = p_period_id; ');
2571          cn_utils.appendcr(body_code);
2572          cn_utils.appendcr(body_code, ' l_rollover := l_rollover * (1 - g_input_achieved_itd(' || g_cumulative_input_no ||') ); ');
2573 
2574        ELSIF (g_itd_flag = 'Y') THEN
2575          cn_utils.appendcr(body_code);
2576          cn_utils.appendcr(body_code, ' SELECT cspq.itd_target - g_input_achieved_itd(' || g_cumulative_input_no || ') ');
2577          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2578          cn_utils.appendcr(body_code, '   FROM cn_srp_period_quotas_all cspq ');
2579          cn_utils.appendcr(body_code, '  WHERE cspq.srp_plan_assign_id = p_srp_plan_assign_id ');
2580          cn_utils.appendcr(body_code, '    AND cspq.quota_id = p_quota_id ');
2581          cn_utils.appendcr(body_code, '    AND cspq.period_id = p_period_id; ');
2582        ELSE
2583          cn_utils.appendcr(body_code);
2584          cn_utils.appendcr(body_code, ' SELECT csqa.target - g_input_achieved_itd(' || g_cumulative_input_no || ') ');
2585          cn_utils.appendcr(body_code, '   INTO l_rollover ');
2586          cn_utils.appendcr(body_code, '   FROM cn_srp_quota_assigns_all csqa ');
2587          cn_utils.appendcr(body_code, '  WHERE csqa.srp_plan_assign_id = p_srp_plan_assign_id ');
2588          cn_utils.appendcr(body_code, '    AND csqa.quota_id = p_quota_id; ');
2589 
2590       END IF;
2591    END IF;
2592 
2593    cn_utils.appindcr(body_code, '  cn_formula_common_pkg.calculate_roll( p_salesrep_id,'||
2594                      'p_period_id, p_quota_id,');
2595    cn_utils.appindcr(body_code, '             p_srp_plan_assign_id,  p_calc_type,');
2596    cn_utils.appindcr(body_code, '             g_input_achieved_ptd, g_input_achieved_itd,');
2597    cn_utils.appindcr(body_code, '             g_output_achieved_ptd, g_output_achieved_itd,');
2598    cn_utils.appindcr(body_code, '             g_perf_achieved_ptd, g_perf_achieved_itd, ');
2599    cn_utils.appindcr(body_code, '             l_rollover );');
2600    cn_utils.appendcr(body_code);
2601 END calc_roll;
2602 
2603 --   construct the cursor for individual case
2604 PROCEDURE individual_cursor (spec_code        IN OUT NOCOPY cn_utils.code_type,
2605                              body_code        IN OUT NOCOPY cn_utils.code_type )         IS
2606 BEGIN
2607     cn_utils.appendcr(body_code);
2608     cn_utils.appindcr(body_code, '  CURSOR l_lines_csr IS  ');
2609     cn_utils.appindcr(body_code, '    SELECT ');
2610 
2611     -- Added for 11.5.10 Performance Enhancments
2612     -- Add column names of CH and CL which are used in the input/output/perf expression
2613     FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
2614       IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
2615           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||',');
2616       ELSE
2617           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name);
2618       END IF;
2619     END LOOP;
2620 
2621     -- Changed for 11.5.10 Performance Enhancments
2622     -- only if CH is used add the table in the from clause
2623     IF g_ch_flag THEN
2624         cn_utils.appindcr(body_code, '    FROM cn_commission_lines_all cl, cn_commission_headers_all ch ');
2625     ELSE
2626         cn_utils.appindcr(body_code, '    FROM cn_commission_lines_all cl');
2627     END IF;
2628 
2629     cn_utils.appindcr(body_code, '    WHERE cl.credited_salesrep_id = p_salesrep_id            ');
2630     cn_utils.appindcr(body_code, '      AND cl.quota_id = p_quota_id                           ');
2631     cn_utils.appindcr(body_code, '      AND cl.srp_plan_assign_id = p_srp_plan_assign_id              ');
2632     cn_utils.appindcr(body_code, '      AND cl.processed_period_id = p_period_id            ');
2633     cn_utils.appindcr(body_code, '      AND cl.processed_date >= p_start_date               ');
2634 
2635 
2636     -- Changed for 11.5.10 Performance Enhancments
2637     -- only if CH is used add the table in the where clause
2638     IF g_ch_flag THEN
2639       cn_utils.appindcr(body_code, '      AND ch.commission_header_id = cl.commission_header_id');
2640     END IF;
2641     cn_utils.appindcr(body_code, '      AND substr(cl.pre_processed_code, 4,1) = ''C''  ');
2642     cn_utils.appindcr(body_code, '      AND ( (g_select_status_flag = ''PCX'' and              ');
2643     cn_utils.appindcr(body_code, '              cl.status in (''POP'', ''CALC'', ''XCALC'') )   ');
2644     cn_utils.appindcr(body_code, '         OR (g_select_status_flag = ''P'' and cl.status = ''POP'') )');
2645     cn_utils.appindcr(body_code, '      AND (( g_calc_type = ''FORECAST'' and                  ');
2646     cn_utils.appindcr(body_code, '              cl.trx_type = ''FORECAST'')                 ');
2647     cn_utils.appindcr(body_code, '           OR (g_calc_type = ''BONUS'' and  cl.trx_type = ''BONUS'' )');
2648     cn_utils.appindcr(body_code, '           OR (g_calc_type = ''COMMISSION'' and              ');
2649     cn_utils.appindcr(body_code, '               cl.trx_type NOT IN (''BONUS'',''FORECAST'',''GRP'') )) ');
2650     cn_utils.appindcr(body_code, '    ORDER by cl.processed_date        asc ');
2651     cn_utils.appindcr(body_code, '              ,cl.commission_line_id      asc ');
2652     cn_utils.appindcr(body_code, '           ;                              ');
2653     cn_utils.appendcr(body_code);
2654 END individual_cursor;
2655 
2656 --   construct the code to update global variables
2657 PROCEDURE update_variables(spec_code        IN OUT NOCOPY cn_utils.code_type,
2658                            body_code        IN OUT NOCOPY cn_utils.code_type )
2659 IS
2660 BEGIN
2661      cn_utils.appendcr(body_code);
2662      IF g_itd_flag = 'Y' THEN
2663         cn_utils.appindcr(body_code, '   g_output_achieved_ptd := g_output_achieved_ptd + g_output_achieved ;' );
2664         cn_utils.appindcr(body_code, '   g_output_achieved_itd := g_output_achieved_itd + g_output_achieved; ' );
2665      END IF;
2666      cn_utils.appindcr(body_code, '   g_perf_achieved_ptd := g_perf_achieved_ptd+ l_perf; ');
2667      cn_utils.appindcr(body_code, '   g_perf_achieved_itd := g_perf_achieved_itd+ l_perf; ');
2668 
2669      FOR i IN 1..g_number_dim LOOP
2670         cn_utils.appindcr(body_code, '   g_input_achieved_ptd('||i||') := g_input_achieved_ptd('||i||') + l_input('||i||');        ');
2671         cn_utils.appindcr(body_code, '   g_input_achieved_itd('||i||') := g_input_achieved_itd('||i||') + l_input('||i||');        ');
2672      END LOOP;
2673 
2674      cn_utils.appindcr(body_code, '   g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
2675      cn_utils.appindcr(body_code, '   g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
2676      cn_utils.appendcr(body_code);
2677 END update_variables;
2678 
2682 IS
2679 --   construct the calculate_quota procdure which will be invoked from the dispatcher in calc engine
2680 PROCEDURE calculate_quota (spec_code        IN OUT NOCOPY cn_utils.code_type,
2681                            body_code        IN OUT NOCOPY cn_utils.code_type )
2683     procedure_name        cn_obj_procedures_v.name%TYPE;
2684     procedure_desc        cn_obj_procedures_v.description%TYPE;
2685     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
2686     package_spec_id        cn_obj_packages_v.package_id%TYPE;
2687     x_repository_id        cn_repositories.repository_id%TYPE;
2688 
2689     l_rate_dim_sequence  NUMBER;
2690     l_output_sql_select        varchar2(8000);
2691     l_output_sql_select_clob clob;
2692 
2693 
2694     l_input_sql_select        varchar2(8000);
2695     l_input_sql_from        varchar2(4000);
2696     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
2697     l_input_sql_select_clob clob;
2698     l_input_sql_from_clob   clob;
2699 
2700     l_operator_position NUMBER;
2701     l_operator          VARCHAR2(1);
2702 
2703     l_counter NUMBER(15);
2704     l_variable_declaration VARCHAR2(400);
2705     l_table_object_id       cn_objects.object_id%type;
2706 
2707     CURSOR itd_inputs IS
2708        SELECT calc_sql_exp_id, rate_dim_sequence, split_flag, cumulative_flag
2709          FROM cn_formula_inputs_all
2710         WHERE calc_formula_id = g_formula_id
2711           AND org_id = g_org_id
2712         ORDER BY rate_dim_sequence;
2713 BEGIN
2714      procedure_name := 'calculate_quota';
2715      procedure_desc := 'This procedure is the hook to the calculation engine';
2716 
2717      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, p_period_id NUMBER, ';
2718      parameter_list := parameter_list || 'p_start_date DATE, p_quota_id NUMBER, ';
2719      parameter_list := parameter_list || 'p_process_all_flag VARCHAR2, p_intel_calc_flag VARCHAR2, ';
2720      parameter_list := parameter_list || ' p_calc_type VARCHAR2, p_credit_type_id NUMBER, x_latest_processed_date OUT NOCOPY DATE  ';
2721 
2722      proc_init(procedure_name, procedure_desc, parameter_list,
2723                'P', null , package_spec_id, x_repository_id,
2724                spec_code, body_code);
2725 
2726      cn_utils.appindcr(body_code, '  l_mul_input_tbl            cn_formula_common_pkg.mul_input_tbl_type; ');
2727      cn_utils.appindcr(body_code, '  l_rate                     NUMBER;');
2728      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
2729      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
2730      cn_utils.appindcr(body_code, '  l_input                    cn_formula_common_pkg.num_table_type; ');
2731      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
2732      cn_utils.appindcr(body_code, '  l_perf                     NUMBER; ');
2733      cn_utils.appindcr(body_code, '  l_itd_target               NUMBER; ');
2734      cn_utils.appindcr(body_code, '  l_itd_payment              NUMBER; ');
2735      cn_utils.appindcr(body_code, '  l_rollover                 NUMBER := 0; ');
2736      cn_utils.appindcr(body_code, '  l_debug_flag               VARCHAR2(1) := fnd_profile.value(''CN_DEBUG''); ');
2737      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
2738      cn_utils.appindcr(body_code, '  l_error_reason             VARCHAR2(150); ');
2739      cn_utils.appindcr(body_code, '  l_name                     VARCHAR2(255); ');
2740      cn_utils.appindcr(body_code, '  l_trx_rec_old              cn_formula_common_pkg.trx_rec_type; ');
2741      cn_utils.appindcr(body_code, '  l_trx_rec_new              cn_formula_common_pkg.trx_rec_type; ');
2742      cn_utils.appindcr(body_code, '  l_trx_rec_null             cn_formula_common_pkg.trx_rec_type; ');
2743 
2744      IF g_trx_group_code = 'GROUP' THEN
2745         cn_utils.appindcr(body_code, '  l_endofinterval_flag       VARCHAR2(1); ');
2746         cn_utils.appindcr(body_code, '  l_start_period_id          NUMBER(15); ');
2747         cn_utils.appindcr(body_code, '  l_grp_trx_rec              cn_formula_common_pkg.trx_rec_type; ');
2748      END IF;
2749      cn_utils.appendcr(body_code);
2750 
2751      --  constrcut the cursor to loop through trxs
2752      IF (NOT(g_no_trx_flag)) THEN
2753         individual_cursor(spec_code, body_code);
2754      END IF;
2755 
2756 
2757      -- Added for 11.5.10 Performance Enhancments
2758      -- Declare cursors which will fetch all columns of tables
2759      -- used in input/output/perf expressions.
2760      IF g_trx_group_code = 'INDIVIDUAL' THEN
2761         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
2762         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
2763            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
2764               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
2765                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
2766                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
2767                ELSE
2768                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
2769                END IF;
2770                cn_utils.appendcr(body_code);
2771                cn_utils.appindcr(body_code, '  CURSOR '||l_variable_declaration||'  IS');
2772                l_input_sql_where  := 'WHERE 1=1 ';
2773                l_input_sql_select := lower_str( '    select ' ||g_uniq_tbl_names_tbl(l_table_object_id).column_name_list);
2774                l_input_sql_from := lower( '   from ' ||g_uniq_tbl_names_tbl(l_table_object_id).table_name||' '||
2775                                                     g_uniq_tbl_names_tbl(l_table_object_id).table_alias);
2776                construct_sql_from_where (l_input_sql_select,
2777                                              l_input_sql_from,
2781 
2778                                          l_input_sql_where );
2779                --split_long_sql( body_code, l_input_sql_select, 'SELECT');
2780                cn_utils.appindcr(body_code, 'SELECT * ');
2782                split_long_sql( body_code, l_input_sql_from, 'FROM');
2783                split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
2784            END IF;
2785            l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
2786         END LOOP;
2787      END IF;
2788 
2789 
2790      cn_utils.appendcr(body_code);
2791      cn_utils.appendcr(body_code, 'BEGIN');
2792      cn_utils.appindcr(body_code, '  g_intel_calc_flag := p_intel_calc_flag;');
2793      cn_utils.appindcr(body_code, '  g_calc_type := p_calc_type;');
2794      calc_init(spec_code, body_code);
2795 
2796      FOR i IN 1..g_number_dim LOOP
2797    	  cn_utils.appindcr(body_code, '  l_input('||i||') := 0;        ');
2798      END LOOP;
2799 
2800      -- Added for 11.5.10 Performance Enhancments
2801      -- Declare open fetch statment which will fetch all columns of tables
2802      -- used in input/output/perf expressions.into global variables
2803      IF g_trx_group_code = 'INDIVIDUAL' THEN
2804         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
2805         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
2806            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
2807               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
2808 
2809                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
2810                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
2811                ELSE
2812                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
2813                END IF;
2814                cn_utils.appendcr(body_code);
2815                cn_utils.appindcr(body_code, '  OPEN '||l_variable_declaration||' ;' );
2816                cn_utils.appindcr(body_code, '  FETCH '||l_variable_declaration||'  INTO ' ||g_uniq_tbl_names_tbl(l_table_object_id).variable_name||' ;' );
2817 
2818                cn_utils.appindcr(body_code, '  CLOSE '||l_variable_declaration||' ;' );
2819 
2820             END IF;
2821             l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
2822          END LOOP;
2823       END IF;
2824 
2825 
2826      IF (g_trx_group_code = 'INDIVIDUAL' AND NOT(g_no_trx_flag)) THEN
2827         -- for individual case we don't need to accumulate output_achieved
2828         cn_utils.appindcr(body_code, '  Open l_lines_csr; ');
2829         cn_utils.appindcr(body_code, '  LOOP ');
2830         cn_utils.appindcr(body_code, '   l_trx_rec_new := l_trx_rec_null; ');
2831         cn_utils.appindcr(body_code, '   FETCH l_lines_csr into g_commission_rec; ');
2832         cn_utils.appindcr(body_code, '     EXIT WHEN l_lines_csr%notfound; ');
2833         cn_utils.appendcr(body_code);
2834         cn_utils.appindcr(body_code, '   BEGIN ');
2835         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_LINE_ID    :=  g_commission_rec.COMMISSION_LINE_ID;        ');
2836         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_HEADER_ID  :=  g_commission_rec.COMMISSION_HEADER_ID;        ');
2837         cn_utils.appindcr(body_code ,'     l_trx_rec_old.SALESREP_ID           :=  g_commission_rec.CREDITED_SALESREP_ID;         ');
2838         cn_utils.appindcr(body_code ,'     l_trx_rec_old.SRP_PLAN_ASSIGN_ID    :=  g_commission_rec.SRP_PLAN_ASSIGN_ID;          ');
2839         cn_utils.appindcr(body_code ,'     l_trx_rec_old.QUOTA_ID              :=  g_commission_rec.QUOTA_ID;                    ');
2840         cn_utils.appindcr(body_code ,'     l_trx_rec_old.CREDIT_TYPE_ID        :=  g_commission_rec.CREDIT_TYPE_ID;              ');
2841         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PROCESSED_DATE        :=  g_commission_rec.PROCESSED_DATE;              ');
2842         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PROCESSED_PERIOD_ID   :=  g_commission_rec.PROCESSED_PERIOD_ID;         ');
2843         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PAY_PERIOD_ID         :=  g_commission_rec.PAY_PERIOD_ID;               ');
2844         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_AMOUNT     :=  g_commission_rec.COMMISSION_AMOUNT;           ');
2845         cn_utils.appindcr(body_code ,'     l_trx_rec_old.COMMISSION_RATE       :=  g_commission_rec.COMMISSION_RATE;             ');
2846         cn_utils.appindcr(body_code ,'     l_trx_rec_old.RATE_TIER_ID          :=  g_commission_rec.RATE_TIER_ID;                ');
2847         cn_utils.appindcr(body_code ,'     l_trx_rec_old.TIER_SPLIT            :=  g_commission_rec.TIER_SPLIT;                  ');
2848         cn_utils.appindcr(body_code ,'     l_trx_rec_old.INPUT_ACHIEVED        :=  g_commission_rec.INPUT_ACHIEVED;              ');
2849         cn_utils.appindcr(body_code ,'     l_trx_rec_old.OUTPUT_ACHIEVED       :=  g_commission_rec.OUTPUT_ACHIEVED;             ');
2850         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PERF_ACHIEVED         :=  g_commission_rec.PERF_ACHIEVED;               ');
2851         cn_utils.appindcr(body_code ,'     l_trx_rec_old.POSTING_STATUS        :=  g_commission_rec.POSTING_STATUS;              ');
2852         cn_utils.appindcr(body_code ,'     l_trx_rec_old.PENDING_STATUS        :=  g_commission_rec.PENDING_STATUS;              ');
2853         cn_utils.appindcr(body_code ,'     l_trx_rec_old.CREATED_DURING        :=  g_commission_rec.CREATED_DURING;              ');
2854         cn_utils.appindcr(body_code ,'     l_trx_rec_old.TRX_TYPE              :=  g_commission_rec.TRX_TYPE;                    ');
2855         cn_utils.appindcr(body_code ,'     l_trx_rec_old.ERROR_REASON          :=  g_commission_rec.ERROR_REASON;               ');
2856         cn_utils.appindcr(body_code ,'     l_trx_rec_old.STATUS                   :=  g_commission_rec.STATUS;                         ');
2857 
2861         cn_utils.appindcr(body_code, '                l_mul_input_tbl  );');
2858         cn_utils.appindcr(body_code, '     get_input(l_trx_rec_old.commission_line_id, p_salesrep_id, ');
2859         cn_utils.appindcr(body_code, '                p_period_id, p_quota_id, ');
2860         cn_utils.appindcr(body_code, '                p_srp_plan_assign_id, l_trx_rec_old.processed_date, ');
2862 
2863         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2864         cn_utils.appindcr(body_code, '       cn_message_pkg.debug('' ''); ');
2865         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Transaction (line ID='' || l_trx_rec_old.commission_line_id||'')'' );');
2866         FOR i IN 1..g_number_dim LOOP
2867            cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount || l_mul_input_tbl('||i||').input_string );');
2868         END LOOP;
2869         cn_utils.appindcr(body_code, '     end if; ');
2870         cn_utils.appendcr(body_code);
2871 
2872         IF g_rate_flag THEN
2873            cn_utils.appindcr(body_code, '     cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
2874            cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
2875            cn_utils.appindcr(body_code, '                 l_trx_rec_old.processed_date, g_number_dim,l_mul_input_tbl, ');
2876            cn_utils.appindcr(body_code, '                 g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
2877 
2878            cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2879            cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Commission rate='' || l_rate);');
2880            cn_utils.appindcr(body_code, '     end if; ');
2881         END IF;
2882 
2883         cn_utils.appendcr(body_code);
2884         cn_utils.appindcr(body_code, '     l_commission := get_commission( l_trx_rec_old.commission_line_id,');
2885         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
2886         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id,        l_rate); ');
2887         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2888         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Output='' || l_commission);');
2889         cn_utils.appindcr(body_code, '     end if; ');
2890 
2891         IF g_perf_input_expr_seq >0 THEN
2892                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
2893 
2894         ELSIF g_perf_measure_id IS  NULL THEN
2895                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
2896 
2897         ELSE
2898                 cn_utils.appindcr(body_code, '     l_perf := get_perf(l_trx_rec_old.commission_line_id, p_salesrep_id,');
2899                 cn_utils.appindcr(body_code, '                          p_period_id, p_quota_id, ');
2900                 cn_utils.appindcr(body_code, '                          p_srp_plan_assign_id, l_trx_rec_old.processed_date);');
2901 
2902                 cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
2903                 cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
2904                 cn_utils.appindcr(body_code, '     end if; ');
2905         END IF;
2906 
2907         FOR i IN 1..g_number_dim LOOP
2908            cn_utils.appindcr(body_code, '       l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
2909         END LOOP;
2910 
2911         cn_utils.appindcr(body_code, '     x_latest_processed_date := l_trx_rec_old.processed_date;    ');
2912         cn_utils.appendcr(body_code);
2913         cn_utils.appindcr(body_code, '     l_trx_rec_new.status := ''CALC''; ');
2914         cn_utils.appindcr(body_code, '     l_trx_rec_new.credit_type_id := p_credit_type_id; ');
2915         cn_utils.appindcr(body_code, '     l_trx_rec_new.commission_amount := l_commission; ');
2916         cn_utils.appindcr(body_code, '     l_trx_rec_new.commission_rate := l_rate; ');
2917         cn_utils.appindcr(body_code, '     l_trx_rec_new.rate_tier_id := l_rate_tier_id ; ');
2918         cn_utils.appindcr(body_code, '     l_trx_rec_new.tier_split := l_tier_split ; ');
2919         IF g_number_dim > 1 THEN
2920            cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
2921          ELSE
2922            cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
2923         END IF;
2924         IF g_itd_flag = 'Y' THEN
2925            cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := g_output_achieved ; ');
2926          ELSE
2927            --  output_achieved = 0 since no need to accumulate output for individual non itd case
2928            cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := 0 ; ');
2929         END IF;
2930         cn_utils.appindcr(body_code, '     l_trx_rec_new.perf_achieved := l_perf ; ');
2931         cn_utils.appendcr(body_code);
2932         -- update package variables
2933         update_variables(spec_code, body_code);
2934         cn_utils.appindcr(body_code, '   EXCEPTION when others then        ');
2935         cn_utils.appindcr(body_code, '     l_trx_rec_new.error_reason := substr(sqlerrm,1,150); ');
2936         cn_utils.appindcr(body_code, '     l_trx_rec_new.status := ''XCALC'' ; ');
2937         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
2938         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
2939         cn_utils.appindcr(body_code, '   END;   ');
2940         cn_utils.appendcr(body_code);
2941         cn_utils.appindcr(body_code, '   cn_formula_common_pkg.update_trx(l_trx_rec_old, l_trx_rec_new) ; ');
2942         cn_utils.appindcr(body_code, '  END LOOP;');
2943         cn_utils.appindcr(body_code, '  CLOSE l_lines_csr; ');
2944         cn_utils.appendcr(body_code);
2945 
2946         -- need to create 'ITD' trx if there is no calc trx in this period
2950            cn_utils.appindcr(body_code, '    BEGIN ');
2947         IF g_itd_flag = 'Y' THEN
2948            cn_utils.appindcr(body_code, '  IF cn_formula_common_pkg.check_itd_calc_trx( p_salesrep_id, ');
2949            cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, p_period_id, p_quota_id ) = FALSE THEN ');
2951            -- get input
2952            cn_utils.appendcr(body_code);
2953 
2954            -- if there is more than one input, take care of the non-cumulative inputs
2955            IF g_number_dim > 1 THEN
2956              cn_utils.appindcr(body_code, '       g_commission_rec := null; ');
2957              cn_utils.appindcr(body_code, '       get_input(null, p_salesrep_id, ');
2958              cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id, ');
2959              cn_utils.appindcr(body_code, '                 p_srp_plan_assign_id, l_trx_rec_old.processed_date, ');
2960              cn_utils.appindcr(body_code, '                 l_mul_input_tbl  );');
2961 
2962 			 FOR i IN 1..g_number_dim LOOP
2963                cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount || l_mul_input_tbl('||i||').input_string );');
2964              END LOOP;
2965              cn_utils.appendcr(body_code);
2966            END IF;
2967 
2968            FOR itd_input IN itd_inputs LOOP
2969               cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').rate_dim_sequence := '
2970                                 || itd_input.rate_dim_sequence || ';' );
2971 
2972               SELECT  sql_select input_sql_select, sql_from input_sql_from
2973                 INTO l_input_sql_select_clob, l_input_sql_from_clob
2974                 FROM cn_calc_sql_exps_all
2975                 WHERE calc_sql_exp_id = itd_input.calc_sql_exp_id
2976 				  AND org_id = g_org_id;
2977 
2978               convert_clob_to_string( l_input_sql_select_clob, l_input_sql_select );
2979               l_input_sql_select := lower_str( 'select ' || l_input_sql_select);
2980               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
2981               l_input_sql_from := lower( 'from ' || l_input_sql_from );
2982 
2983               construct_sql_from_where (l_input_sql_select,
2984                                         l_input_sql_from,
2985                                         l_input_sql_where );
2986 
2987 
2988               IF g_pq_target_flag OR g_spq_target_flag  THEN
2989                  -- get itd_target
2990                  IF g_pq_target_flag THEN
2991                     cn_utils.appindcr(body_code, '      l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
2992                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
2993                  END IF;
2994 
2995                  IF g_spq_target_flag THEN
2996                     cn_utils.appindcr(body_code, '      l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
2997                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
2998                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
2999                  END IF;
3000 
3001                  cn_utils.appendcr(body_code);
3002 
3003                  IF itd_input.split_flag <> 'N' THEN
3004                     cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := 0;' );
3005                   ELSE
3006                     IF itd_input.cumulative_flag = 'Y' THEN
3007                       cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := g_input_achieved_itd('
3008                                       ||itd_input.rate_dim_sequence||') / l_itd_target;' );
3009                     ELSE
3010                       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;' );
3011 					END IF;
3012                  END IF;
3013 
3014                  IF itd_input.cumulative_flag = 'Y' THEN
3015                    cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount := g_input_achieved_itd('
3016                                    ||itd_input.rate_dim_sequence||')/l_itd_target;' );
3017                  ELSE
3018                    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;' );
3019 				 END IF;
3020                ELSE
3021                  IF itd_input.split_flag <> 'N' THEN
3022                     cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := 0;' );
3023                   ELSE
3024                     IF itd_input.cumulative_flag = 'Y' THEN
3025                       cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').base_amount := g_input_achieved_itd('
3026                                       ||itd_input.rate_dim_sequence||');' );
3027 					END IF;
3028                  END IF;
3029 
3030                  IF itd_input.cumulative_flag = 'Y' THEN
3031                    cn_utils.appindcr(body_code, '      l_mul_input_tbl('||itd_input.rate_dim_sequence||').amount := g_input_achieved_itd('
3032                                    ||itd_input.rate_dim_sequence||');' );
3033                  END IF;
3034               END IF;
3035            END LOOP;
3036 
3037            -- get processed date
3038            cn_utils.appendcr(body_code);
3039            cn_utils.appindcr(body_code, '      SELECT least(p.end_date,nvl(spa.end_date,p.end_date),nvl(q.end_date,p.end_date)) ');
3040            cn_utils.appindcr(body_code, '        INTO l_processed_date ');
3044            cn_utils.appindcr(body_code, '         AND spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3041            cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3042            cn_utils.appindcr(body_code, '       WHERE p.period_id = p_period_id ');
3043            cn_utils.appindcr(body_code, '         AND p.org_id = spa.org_id ');
3045            cn_utils.appindcr(body_code, '         AND q.quota_id = p_quota_id; ');
3046            -- get rates
3047            IF g_rate_flag THEN
3048               cn_utils.appindcr(body_code, '      cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
3049               cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
3050               cn_utils.appindcr(body_code, '                 l_processed_date, g_number_dim,l_mul_input_tbl, ');
3051               cn_utils.appindcr(body_code, '                 g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
3052            END IF;
3053 
3054            -- get output
3055            cn_utils.appendcr(body_code);
3056            IF g_itd_flag = 'Y' THEN
3057               SELECT  sql_select output_sql_select
3058                 INTO l_output_sql_select_clob
3059                 FROM cn_calc_sql_exps_all
3060                 WHERE org_id = g_org_id
3061 				  AND calc_sql_exp_id = (SELECT output_exp_id
3062                                          FROM  cn_calc_formulas_all
3063                                          WHERE  calc_formula_id = g_formula_id
3064 										   AND org_id = g_org_id);
3065 
3066               convert_clob_to_string( l_output_sql_select_clob, l_output_sql_select );
3067               l_output_sql_select := lower_str( 'select ' || l_output_sql_select);
3068 
3069               g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
3070 
3071               l_operator_position := search_delimiter_select(l_output_sql_select, 1);
3072               IF l_operator_position > 0 THEN
3073                  l_operator := substr(l_output_sql_select, l_operator_position, 1);
3074               END IF;
3075 
3076               SELECT  sql_select input_sql_select, sql_from input_sql_from
3077                 INTO l_input_sql_select_clob, l_input_sql_from_clob
3078                 FROM cn_calc_sql_exps_all
3079                 WHERE org_id = g_org_id
3080 				  AND calc_sql_exp_id = (SELECT output_exp_id
3081                                          FROM  cn_calc_formulas_all
3082                                          WHERE  calc_formula_id = g_formula_id
3083 										   AND org_id = g_org_id);
3084 
3085               convert_clob_to_string( l_input_sql_select_clob, l_input_sql_select );
3086               l_input_sql_select := lower_str( 'select ' || l_input_sql_select);
3087               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3088               l_input_sql_from := lower( 'from ' || l_input_sql_from );
3089 
3090               construct_sql_from_where (l_input_sql_select,
3091                                         l_input_sql_from,
3092                                         l_input_sql_where );
3093 
3094               IF g_pq_payment_flag OR g_spq_payment_flag THEN
3095                  -- get itd_payment
3096                  IF g_pq_payment_flag THEN
3097                     cn_utils.appindcr(body_code, '      l_itd_payment := cn_formula_common_pkg.get_pq_itd_payment ');
3098                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
3099                  END IF;
3100 
3101                  IF g_spq_payment_flag THEN
3102                     cn_utils.appindcr(body_code, '      l_itd_payment := cn_formula_common_pkg.get_spq_itd_payment ');
3103                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
3104                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
3105                  END IF;
3106 
3107            IF g_rate_flag THEN
3108                     IF l_operator_position > 0 THEN
3109             -- clku bug 2877815, call get-commission to calculate ITD results correctly
3110                cn_utils.appindcr(body_code, ' l_commission := get_commission( l_trx_rec_old.commission_line_id, ');
3111                cn_utils.appindcr(body_code, '                                 p_salesrep_id, p_period_id, p_quota_id, ');
3112                cn_utils.appindcr(body_code, '                                 p_srp_plan_assign_id,        l_rate);');
3113 
3114                     END IF;
3115                   ELSE
3116             -- clku bug 2877815, call get-commission to calculate ITD results correctly
3117                     cn_utils.appindcr(body_code, '       l_commission := get_commission( l_trx_rec_old.commission_line_id, ');
3118             cn_utils.appindcr(body_code, '                                 p_salesrep_id, p_period_id, p_quota_id, ');
3119             cn_utils.appindcr(body_code, '                                 p_srp_plan_assign_id,        l_rate); ');
3120 
3121 
3122                  END IF;
3123                ELSE
3124                  -- if x_rate is used in output
3125                  IF g_rate_flag THEN
3126                     IF l_operator_position > 0 THEN
3127                        cn_utils.appindcr(body_code, '      l_commission := l_rate '||
3128                                          l_operator ||' g_output_achieved_itd ');
3129                        cn_utils.appindcr(body_code, '                   - g_commission_payed_itd ;' );
3130                      ELSE
3131                        cn_utils.appindcr(body_code, '      l_commission := l_rate - '||
3132                                          ' g_commission_payed_itd ;' );
3133                     END IF;
3134                   ELSE
3135                     cn_utils.appindcr(body_code, '      l_commission := g_output_achieved_itd '||
3136                                       '- g_commission_payed_itd ;' );
3137                  END IF;
3138               END IF;
3139            END IF;
3140 
3141            -- create itd trx
3142            cn_utils.appendcr(body_code);
3143            cn_utils.appindcr(body_code, '      l_trx_rec_new := l_trx_rec_null; ');
3144            cn_utils.appindcr(body_code, '      l_trx_rec_new.status := ''CALC''; ');
3145              cn_utils.appindcr(body_code, '      l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3146            cn_utils.appindcr(body_code, '      l_trx_rec_new.salesrep_id := p_salesrep_id; ');
3147            cn_utils.appindcr(body_code, '      l_trx_rec_new.created_during := ''CALC''; ');
3148            cn_utils.appindcr(body_code, '      l_trx_rec_new.srp_plan_assign_id := p_srp_plan_assign_id; ');
3149            cn_utils.appindcr(body_code, '      l_trx_rec_new.quota_id := p_quota_id; ');
3150            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_date := l_processed_date; ');
3151            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_period_id := p_period_id; ');
3152            cn_utils.appindcr(body_code, '      l_trx_rec_new.pay_period_id :=  p_period_id; ');
3153            cn_utils.appindcr(body_code, '      l_trx_rec_new.posting_status := ''UNPOSTED''; ');
3154            cn_utils.appindcr(body_code, '      l_trx_rec_new.pending_status := null; ');
3155            cn_utils.appindcr(body_code, '      l_trx_rec_new.trx_type := ''ITD'' ; ');
3156            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_amount := l_commission ;');
3157            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_rate := l_rate ; ');
3158            cn_utils.appindcr(body_code, '      l_trx_rec_new.rate_tier_id := l_rate_tier_id; ');
3159            cn_utils.appindcr(body_code, '      l_trx_rec_new.tier_split := l_tier_split ; ');
3160            cn_utils.appindcr(body_code, '      l_trx_rec_new.input_achieved := 0; ');
3161            cn_utils.appindcr(body_code, '      l_trx_rec_new.output_achieved:= 0; ');
3162            cn_utils.appindcr(body_code, '      l_trx_rec_new.perf_achieved := 0; ');
3166            cn_utils.appindcr(body_code, '      g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3163            cn_utils.appendcr(body_code);
3164            cn_utils.appindcr(body_code, '      cn_formula_common_pkg.create_trx(l_trx_rec_new); ');
3165            cn_utils.appendcr(body_code);
3167            cn_utils.appindcr(body_code, '      g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3168            cn_utils.appindcr(body_code, '    EXCEPTION WHEN OTHERS THEN ');
3169            cn_utils.appindcr(body_code, '      if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3170            cn_utils.appindcr(body_code, '        FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3171            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3172            cn_utils.appindcr(body_code, '	          sqlerrm); ');
3173            cn_utils.appindcr(body_code, '      end if; ');
3174            cn_utils.appindcr(body_code, '      cn_message_pkg.debug( ''Failed to create ITD commission line'' ); ');
3175            cn_utils.appindcr(body_code, '    END ; ');
3176            cn_utils.appindcr(body_code, '  END IF; ');
3177            cn_utils.appendcr(body_code);
3178         END IF;
3179       ELSIF (g_trx_group_code = 'GROUP' AND NOT(g_no_trx_flag)) THEN
3180         cn_utils.appindcr(body_code, '  l_endofinterval_flag := ''N'';                          ');
3181         cn_utils.appindcr(body_code, '  Open l_lines_csr; ');
3182         cn_utils.appindcr(body_code, '  LOOP ');
3183         cn_utils.appindcr(body_code, '   l_trx_rec_new := l_trx_rec_null; ');
3184         cn_utils.appindcr(body_code, '   FETCH l_lines_csr into g_commission_rec; ');
3185         cn_utils.appindcr(body_code, '     EXIT WHEN l_lines_csr%notfound; ');
3186         cn_utils.appindcr(body_code, '   BEGIN ');
3187         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_LINE_ID    :=  g_commission_rec.COMMISSION_LINE_ID;        ');
3188         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_HEADER_ID  :=  g_commission_rec.COMMISSION_HEADER_ID;        ');
3189         cn_utils.appindcr(body_code ,'l_trx_rec_old.SALESREP_ID  :=  g_commission_rec.CREDITED_SALESREP_ID;         ');
3190         cn_utils.appindcr(body_code ,'l_trx_rec_old.SRP_PLAN_ASSIGN_ID    :=  g_commission_rec.SRP_PLAN_ASSIGN_ID;          ');
3191         cn_utils.appindcr(body_code ,'l_trx_rec_old.QUOTA_ID              :=  g_commission_rec.QUOTA_ID;                    ');
3192         cn_utils.appindcr(body_code ,'l_trx_rec_old.CREDIT_TYPE_ID        :=  g_commission_rec.CREDIT_TYPE_ID;              ');
3193         cn_utils.appindcr(body_code ,'l_trx_rec_old.PROCESSED_DATE        :=  g_commission_rec.PROCESSED_DATE;              ');
3194         cn_utils.appindcr(body_code ,'l_trx_rec_old.PROCESSED_PERIOD_ID   :=  g_commission_rec.PROCESSED_PERIOD_ID;         ');
3195         cn_utils.appindcr(body_code ,'l_trx_rec_old.PAY_PERIOD_ID         :=  g_commission_rec.PAY_PERIOD_ID;               ');
3196         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_AMOUNT     :=  g_commission_rec.COMMISSION_AMOUNT;           ');
3197         cn_utils.appindcr(body_code ,'l_trx_rec_old.COMMISSION_RATE       :=  g_commission_rec.COMMISSION_RATE;             ');
3198         cn_utils.appindcr(body_code ,'l_trx_rec_old.RATE_TIER_ID          :=  g_commission_rec.RATE_TIER_ID;                ');
3199         cn_utils.appindcr(body_code ,'l_trx_rec_old.TIER_SPLIT            :=  g_commission_rec.TIER_SPLIT;                  ');
3200         cn_utils.appindcr(body_code ,'l_trx_rec_old.INPUT_ACHIEVED        :=  g_commission_rec.INPUT_ACHIEVED;              ');
3201         cn_utils.appindcr(body_code ,'l_trx_rec_old.OUTPUT_ACHIEVED       :=  g_commission_rec.OUTPUT_ACHIEVED;             ');
3202         cn_utils.appindcr(body_code ,'l_trx_rec_old.PERF_ACHIEVED         :=  g_commission_rec.PERF_ACHIEVED;               ');
3203         cn_utils.appindcr(body_code ,'l_trx_rec_old.POSTING_STATUS        :=  g_commission_rec.POSTING_STATUS;              ');
3204         cn_utils.appindcr(body_code ,'l_trx_rec_old.PENDING_STATUS        :=  g_commission_rec.PENDING_STATUS;              ');
3205         cn_utils.appindcr(body_code ,'l_trx_rec_old.CREATED_DURING        :=  g_commission_rec.CREATED_DURING;              ');
3206         cn_utils.appindcr(body_code ,'l_trx_rec_old.TRX_TYPE              :=  g_commission_rec.TRX_TYPE;                    ');
3207         cn_utils.appindcr(body_code ,'l_trx_rec_old.ERROR_REASON          :=  g_commission_rec.ERROR_REASON;               ');
3208         cn_utils.appindcr(body_code ,'l_trx_rec_old.STATUS                   :=  g_commission_rec.STATUS;                         ');
3209 
3210         cn_utils.appindcr(body_code, '    get_input(l_trx_rec_old.commission_line_id, p_salesrep_id, ');
3211         cn_utils.appindcr(body_code, '              p_period_id, p_quota_id, ');
3212         cn_utils.appindcr(body_code, '              p_srp_plan_assign_id, p_start_date, ');
3213         cn_utils.appindcr(body_code, '              l_mul_input_tbl, l_endofinterval_flag, null);');
3214         cn_utils.appendcr(body_code);
3215         cn_utils.appindcr(body_code, '    l_commission := get_commission(l_trx_rec_old.commission_line_id,');
3216         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
3217         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id, l_rate, ');
3218         cn_utils.appindcr(body_code, '                  l_endofinterval_flag, null);');
3219         cn_utils.appendcr(body_code);
3220         IF g_perf_input_expr_seq >0 THEN
3221                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3222 
3223         ELSIF g_perf_measure_id IS  NULL THEN
3224                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3225 
3226         ELSE
3227                    cn_utils.appindcr(body_code, '    l_perf := get_perf(l_trx_rec_old.commission_line_id, p_salesrep_id,');
3228                 cn_utils.appindcr(body_code, '                 p_period_id,p_quota_id, p_srp_plan_assign_id, ');
3229                 cn_utils.appindcr(body_code, '                 p_start_date, l_endofinterval_flag, null);');
3233                 cn_utils.appindcr(body_code, '     end if; ');
3230 
3231                 cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3232                 cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3234         END IF;
3235 
3236         cn_utils.appindcr(body_code, '    x_latest_processed_date := l_trx_rec_old.processed_date;    ');
3237         cn_utils.appendcr(body_code);
3238         cn_utils.appindcr(body_code, '    l_trx_rec_new.status := ''CALC''; ');
3239         cn_utils.appindcr(body_code, '    l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3240         cn_utils.appendcr(body_code);
3241         cn_utils.appindcr(body_code, '   EXCEPTION when others then        ');
3242         cn_utils.appindcr(body_code, '    l_trx_rec_new.error_reason := substr(sqlerrm,1,150); ');
3243         cn_utils.appindcr(body_code, '    l_trx_rec_new.status := ''XCALC'' ; ');
3244 		cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
3245         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3246         cn_utils.appindcr(body_code, '   END;   ');
3247         cn_utils.appendcr(body_code);
3248         cn_utils.appindcr(body_code, '   cn_formula_common_pkg.update_trx(l_trx_rec_old, l_trx_rec_new) ; ');
3249         cn_utils.appindcr(body_code, '  END LOOP;  ');
3250         cn_utils.appindcr(body_code, '  CLOSE l_lines_csr; ');
3251         cn_utils.appendcr(body_code);
3252         cn_utils.appindcr(body_code, '    l_start_period_id := ' );
3253         cn_utils.appindcr(body_code, '        cn_formula_common_pkg.get_start_period_id( '||
3254                           'p_quota_id, p_period_id);');
3255         cn_utils.appendcr(body_code);
3256         cn_utils.appindcr(body_code, '  IF cn_formula_common_pkg.EndOfGroupByInterval(p_quota_id, '||
3257                           'p_period_id, p_srp_plan_assign_id) THEN ');
3258         cn_utils.appindcr(body_code, '    l_endofinterval_flag := ''Y''; ');
3259         cn_utils.appindcr(body_code, '  END IF;  ');
3260 
3261         -- get processed date
3262         cn_utils.appendcr(body_code);
3263         cn_utils.appindcr(body_code, '      SELECT least(p.end_date,nvl(spa.end_date,p.end_date),nvl(q.end_date,p.end_date)) ');
3264         cn_utils.appindcr(body_code, '        INTO l_processed_date ');
3265         cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3266         cn_utils.appindcr(body_code, '       WHERE p.period_id = p_period_id ');
3267         cn_utils.appindcr(body_code, '         AND spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3268         cn_utils.appindcr(body_code, '         AND p.org_id = spa.org_id ');
3269         cn_utils.appindcr(body_code, '         AND q.quota_id = p_quota_id; ');
3270 
3271         cn_utils.appendcr(body_code);
3272         cn_utils.appindcr(body_code, ' BEGIN ');
3273         cn_utils.appindcr(body_code, '  get_input(null, p_salesrep_id, p_period_id,');
3274         cn_utils.appindcr(body_code, '            p_quota_id, p_srp_plan_assign_id, ');
3275         cn_utils.appindcr(body_code, '            l_processed_date, l_mul_input_tbl, ');
3276         cn_utils.appindcr(body_code, '            l_endofinterval_flag,l_start_period_id );');
3277 	--  commented for the Bug 12383021
3278       --  cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3279         FOR i IN 1..g_number_dim LOOP
3280           -- cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Input=''||l_mul_input_tbl('||i||').amount);');
3281            cn_utils.appindcr(body_code, '    l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
3282         END LOOP;
3283       --  cn_utils.appindcr(body_code, '  end if; ');
3284 
3285         cn_utils.appendcr(body_code);
3286         IF g_rate_flag THEN
3287            cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id , ');
3288            cn_utils.appindcr(body_code, '            p_period_id, p_quota_id , g_split_flag,g_itd_flag, ');
3289            cn_utils.appindcr(body_code, '            l_processed_date, g_number_dim,l_mul_input_tbl, ' );
3290            cn_utils.appindcr(body_code, '            g_formula_id, l_rate, l_rate_tier_id, l_tier_split ); ');
3291            cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3292            cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Commission rate='' || l_rate);');
3293            cn_utils.appindcr(body_code, '  end if; ');
3294         END IF;
3295         cn_utils.appendcr(body_code);
3296         cn_utils.appindcr(body_code, '  l_commission := get_commission(null,p_salesrep_id, ');
3297         cn_utils.appindcr(body_code, '            p_period_id, p_quota_id,  ');
3298         cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, l_rate, ' );
3299         cn_utils.appindcr(body_code, '            l_endofinterval_flag,l_start_period_id ); ');
3300         cn_utils.appindcr(body_code, '  if (l_debug_flag = ''Y'') then');
3301         cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Output='' || l_commission);');
3302         cn_utils.appindcr(body_code, '  end if; ');
3303 
3304         cn_utils.appendcr(body_code);
3305 
3306         IF g_perf_input_expr_seq >0 THEN
3307                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3308 
3309         ELSIF g_perf_measure_id IS  NULL THEN
3310                cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3311 
3312         ELSE
3313         cn_utils.appindcr(body_code, '  l_perf := get_perf(null, p_salesrep_id, p_period_id, ');
3314         cn_utils.appindcr(body_code, '                     p_quota_id, p_srp_plan_assign_id, null,');
3315         cn_utils.appindcr(body_code, '                     l_endofinterval_flag, l_start_period_id );');
3316         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3317         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3321         cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3318         cn_utils.appindcr(body_code, '     end if; ');
3319         END IF;
3320         cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3322         cn_utils.appindcr(body_code, '     end if; ');
3323         cn_utils.appindcr(body_code, '     l_grp_trx_rec.status := ''CALC''; ');
3324         cn_utils.appindcr(body_code, '     l_grp_trx_rec.credit_type_id := p_credit_type_id; ');
3325         cn_utils.appindcr(body_code, '     l_grp_trx_rec.commission_amount := l_commission ;');
3326         cn_utils.appindcr(body_code, '     l_grp_trx_rec.commission_rate := l_rate ; ');
3327         cn_utils.appindcr(body_code, '     l_grp_trx_rec.rate_tier_id := l_rate_tier_id; ');
3328         cn_utils.appindcr(body_code, '     l_grp_trx_rec.tier_split := l_tier_split ; ');
3329         cn_utils.appindcr(body_code, '     l_grp_trx_rec.input_achieved := l_input(1); ');
3330         cn_utils.appindcr(body_code, '     l_grp_trx_rec.output_achieved:= l_commission ; ');
3331         cn_utils.appindcr(body_code, '     l_grp_trx_rec.perf_achieved := l_perf; ');
3332         cn_utils.appindcr(body_code, ' EXCEPTION WHEN OTHERS THEN ');
3333         cn_utils.appindcr(body_code, '     l_grp_trx_rec.status := ''XCALC''; ');
3334         cn_utils.appindcr(body_code, '     l_grp_trx_rec.error_reason := substr(sqlerrm, 1, 150); ');
3335         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs while calculating commission line: ''); ');
3336         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3337         cn_utils.appindcr(body_code, ' END ; ');
3338         cn_utils.appendcr(body_code);
3339         cn_utils.appindcr(body_code, '  IF l_endofinterval_flag = ''Y'' THEN      ');
3340         cn_utils.appindcr(body_code, '     l_grp_trx_rec.salesrep_id := p_salesrep_id; ');
3341         cn_utils.appindcr(body_code, '     l_grp_trx_rec.created_during := ''CALC''; ');
3342         cn_utils.appindcr(body_code, '     l_grp_trx_rec.srp_plan_assign_id := p_srp_plan_assign_id; ');
3343         cn_utils.appindcr(body_code, '     l_grp_trx_rec.quota_id := p_quota_id; ');
3344         cn_utils.appindcr(body_code, '     l_grp_trx_rec.processed_date := l_processed_date; ');
3345         cn_utils.appindcr(body_code, '     l_grp_trx_rec.processed_period_id := p_period_id; ');
3346         cn_utils.appindcr(body_code, '     l_grp_trx_rec.pay_period_id :=  p_period_id; ');
3347         cn_utils.appindcr(body_code, '     l_grp_trx_rec.posting_status := ''UNPOSTED''; ');
3348         cn_utils.appindcr(body_code, '     l_grp_trx_rec.pending_status := null; ');
3349         cn_utils.appindcr(body_code, '     l_grp_trx_rec.trx_type := ''GRP'' ; ');
3350         cn_utils.appindcr(body_code, '     cn_formula_common_pkg.create_trx(l_grp_trx_rec); ');
3351         cn_utils.appindcr(body_code, '  END IF;   ');
3352 
3353         -- update package global variables
3354         cn_utils.appendcr(body_code);
3355         cn_utils.appindcr(body_code, '  g_perf_achieved_ptd := l_perf - g_perf_achieved_itd; ');
3356         cn_utils.appindcr(body_code, '  g_perf_achieved_itd := l_perf; ');
3357         FOR i IN 1..g_number_dim LOOP
3358            cn_utils.appindcr(body_code, '    g_input_achieved_ptd('||i||') := l_input('||i||') - g_input_achieved_itd('||i||') ; ');
3359            cn_utils.appindcr(body_code, '    g_input_achieved_itd('||i||') := l_input('||i||'); ');
3360         END LOOP;
3361         cn_utils.appindcr(body_code, '  g_commission_payed_ptd := l_commission - g_commission_payed_itd; ');
3362         cn_utils.appindcr(body_code, '  g_commission_payed_itd := l_commission;        ');
3363         cn_utils.appendcr(body_code);
3364       ELSIF (g_no_trx_flag) THEN
3365            cn_utils.appindcr(body_code, '  BEGIN ');
3366            cn_utils.appindcr(body_code, '    get_input(null, p_salesrep_id, p_period_id, p_quota_id, ');
3367            cn_utils.appindcr(body_code, '              p_srp_plan_assign_id, l_trx_rec_old.processed_date, l_mul_input_tbl  );');
3368            cn_utils.appindcr(body_code, '    if (l_debug_flag = ''Y'') then');
3369            FOR i IN 1..g_number_dim LOOP
3370               cn_utils.appindcr(body_code, '    cn_message_pkg.debug(''Input='' || l_mul_input_tbl('||i||').amount);');
3371            END LOOP;
3372            cn_utils.appindcr(body_code, '     end if; ');
3373            cn_utils.appendcr(body_code);
3374 
3375            -- get processed date
3376            cn_utils.appendcr(body_code);
3377            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 ');
3378            cn_utils.appindcr(body_code, '      FROM cn_acc_period_statuses_v p,cn_srp_plan_assigns_all spa,cn_quotas_all q  ');
3379            cn_utils.appindcr(body_code, '     WHERE p.period_id = p_period_id ');
3380            cn_utils.appindcr(body_code, '           and spa.srp_plan_assign_id = p_srp_plan_assign_id ');
3381            cn_utils.appindcr(body_code, '           and p.org_id = spa.org_id ');
3382            cn_utils.appindcr(body_code, '           and q.quota_id = p_quota_id; ');
3383            -- get rates
3384            IF g_rate_flag THEN
3385               cn_utils.appindcr(body_code, '    cn_formula_common_pkg.get_rates(p_salesrep_id, p_srp_plan_assign_id,');
3386               cn_utils.appindcr(body_code, '                                    p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
3387               cn_utils.appindcr(body_code, '                                    l_processed_date, g_number_dim,l_mul_input_tbl, ');
3388               cn_utils.appindcr(body_code, '                                    g_formula_id,l_rate, l_rate_tier_id, l_tier_split ); ');
3389            END IF;
3390 
3391            -- get output
3392            cn_utils.appendcr(body_code);
3393            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);');
3394 
3395            FOR i IN 1..g_number_dim LOOP
3399            IF g_perf_input_expr_seq >0 THEN
3396               cn_utils.appindcr(body_code, '       l_input('||i||') := l_mul_input_tbl('||i||').input_amount;        ');
3397            END LOOP;
3398 
3400                   cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||g_perf_input_expr_seq||').input_amount;  ');
3401 
3402            ELSIF g_perf_measure_id IS  NULL THEN
3403                   cn_utils.appindcr(body_code,'       l_perf :=l_mul_input_tbl('||1||').input_amount;  ');
3404 
3405            ELSE
3406                    cn_utils.appindcr(body_code, '     l_perf := get_perf(null, p_salesrep_id,');
3407                    cn_utils.appindcr(body_code, '                          p_period_id, p_quota_id, ');
3408                    cn_utils.appindcr(body_code, '                          p_srp_plan_assign_id, null);');
3409 
3410                    cn_utils.appindcr(body_code, '     if (l_debug_flag = ''Y'') then');
3411                    cn_utils.appindcr(body_code, '       cn_message_pkg.debug(''Performance measure='' || l_perf);');
3412                    cn_utils.appindcr(body_code, '     end if; ');
3413            END IF;
3414 
3415            -- create itd trx
3416            cn_utils.appendcr(body_code);
3417            cn_utils.appindcr(body_code, '      l_trx_rec_new := l_trx_rec_null; ');
3418            cn_utils.appindcr(body_code, '      l_trx_rec_new.status := ''CALC''; ');
3419            cn_utils.appindcr(body_code, '      l_trx_rec_new.credit_type_id := p_credit_type_id; ');
3420            cn_utils.appindcr(body_code, '      l_trx_rec_new.salesrep_id := p_salesrep_id; ');
3421            cn_utils.appindcr(body_code, '      l_trx_rec_new.created_during := ''CALC''; ');
3422            cn_utils.appindcr(body_code, '      l_trx_rec_new.srp_plan_assign_id := p_srp_plan_assign_id; ');
3423            cn_utils.appindcr(body_code, '      l_trx_rec_new.quota_id := p_quota_id; ');
3424            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_date := l_processed_date; ');
3425            cn_utils.appindcr(body_code, '      l_trx_rec_new.processed_period_id := p_period_id; ');
3426            cn_utils.appindcr(body_code, '      l_trx_rec_new.pay_period_id :=  p_period_id; ');
3427            cn_utils.appindcr(body_code, '      l_trx_rec_new.posting_status := ''UNPOSTED''; ');
3428            cn_utils.appindcr(body_code, '      l_trx_rec_new.pending_status := null; ');
3429            cn_utils.appindcr(body_code, '      l_trx_rec_new.trx_type := ''ITD'' ; ');
3430            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_amount := l_commission ;');
3431            cn_utils.appindcr(body_code, '      l_trx_rec_new.commission_rate := l_rate ; ');
3432            cn_utils.appindcr(body_code, '      l_trx_rec_new.rate_tier_id := l_rate_tier_id; ');
3433            cn_utils.appindcr(body_code, '      l_trx_rec_new.tier_split := l_tier_split ; ');
3434 /*
3435            cn_utils.appindcr(body_code, '      l_trx_rec_new.input_achieved := 0; ');
3436            cn_utils.appindcr(body_code, '      l_trx_rec_new.output_achieved:= 0; ');
3437 */
3438 
3439            IF g_number_dim > 1 THEN
3440               cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
3441             ELSE
3442               cn_utils.appindcr(body_code, '     l_trx_rec_new.input_achieved := l_input(1) ; ');
3443            END IF;
3444            IF g_itd_flag = 'Y' THEN
3445               cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := g_output_achieved ; ');
3446             ELSE
3447               --  output_achieved = 0 since no need to accumulate output for individual non itd case
3448               cn_utils.appindcr(body_code, '     l_trx_rec_new.output_achieved := 0 ; ');
3449            END IF;
3450            cn_utils.appindcr(body_code, '     l_trx_rec_new.perf_achieved := l_perf ; ');
3451            cn_utils.appendcr(body_code);
3452 
3453 
3454            cn_utils.appendcr(body_code);
3455            cn_utils.appindcr(body_code, '      cn_formula_common_pkg.create_trx(l_trx_rec_new); ');
3456            cn_utils.appendcr(body_code);
3457 
3458            -- update package variables
3459            cn_utils.appendcr(body_code);
3460            IF g_itd_flag = 'Y' THEN
3461               cn_utils.appindcr(body_code, '   g_output_achieved_ptd := g_output_achieved_ptd + g_output_achieved ;' );
3462               cn_utils.appindcr(body_code, '   g_output_achieved_itd := g_output_achieved_itd + g_output_achieved; ' );
3463            END IF;
3464 
3465            cn_utils.appindcr(body_code, '   g_perf_achieved_ptd := g_perf_achieved_ptd+ l_perf; ');
3466            cn_utils.appindcr(body_code, '   g_perf_achieved_itd := g_perf_achieved_itd+ l_perf; ');
3467 
3468            FOR i IN 1..g_number_dim LOOP
3469               cn_utils.appindcr(body_code, '   g_input_achieved_ptd('||i||') := g_input_achieved_ptd('||i||') + l_input('||i||');        ');
3470               cn_utils.appindcr(body_code, '   g_input_achieved_itd('||i||') := g_input_achieved_itd('||i||') + l_input('||i||');        ');
3471            END LOOP;
3472 
3473            cn_utils.appindcr(body_code, '   g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3474            cn_utils.appindcr(body_code, '   g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3475            cn_utils.appendcr(body_code);
3476 
3477 /*
3478            cn_utils.appindcr(body_code, '      g_commission_payed_ptd := g_commission_payed_ptd + l_commission;        ');
3479            cn_utils.appindcr(body_code, '      g_commission_payed_itd := g_commission_payed_itd + l_commission;        ');
3480 */
3481            cn_utils.appindcr(body_code, '    EXCEPTION WHEN OTHERS THEN ');
3482            cn_utils.appindcr(body_code, '      if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3483            cn_utils.appindcr(body_code, '        FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3484            cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3485            cn_utils.appindcr(body_code, '	          sqlerrm); ');
3489            cn_utils.appindcr(body_code, '    END ; ');
3486            cn_utils.appindcr(body_code, '      end if; ');
3487 
3488            cn_utils.appindcr(body_code, '      cn_message_pkg.debug( ''Failed to create ITD commission line'' ); ');
3490      END IF;
3491 
3492      calc_roll(spec_code, body_code);
3493 
3494      cn_utils.appindcr(body_code, ' EXCEPTION ' );
3495      cn_utils.appindcr(body_code, '   when others then ');
3496      IF (NOT(g_no_trx_flag)) THEN
3497      cn_utils.appindcr(body_code, '     IF l_lines_csr%isopen THEN ' );
3498      cn_utils.appindcr(body_code, '       CLOSE l_lines_csr; ');
3499      cn_utils.appindcr(body_code, '     END IF; ');
3500      END IF;
3501      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
3502      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
3503      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_quota.exception'', ');
3504      cn_utils.appindcr(body_code, '	          sqlerrm); ');
3505      cn_utils.appindcr(body_code, '     end if; ');
3506      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in formula calculate_quota:''); ');
3507      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
3508      cn_utils.appindcr(body_code, '     raise; ');
3509      cn_utils.proc_end( procedure_name, 'N', body_code );
3510 EXCEPTION
3511   when others then
3512     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3513       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3514                      'cn.plsql.cn_formula_gen_pkg.calculate_quota.exception',
3515          	          sqlerrm);
3516     end if;
3517     raise;
3518 END calculate_quota;
3519 
3520 --   construct the get_result procedure which will be invoked if this formula is used as an embeded formula
3521 PROCEDURE get_result (spec_code        IN OUT NOCOPY cn_utils.code_type,
3522                       body_code        IN OUT NOCOPY cn_utils.code_type )
3523 IS
3524     procedure_name        cn_obj_procedures_v.name%TYPE;
3525     procedure_desc        cn_obj_procedures_v.description%TYPE;
3526     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3527     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3528     x_repository_id        cn_repositories.repository_id%TYPE;
3529 
3530     l_counter NUMBER(15);
3531     l_variable_declaration VARCHAR2(400);
3532     l_table_object_id       cn_objects.object_id%type;
3533     l_input_sql_select        varchar2(8000);
3534     l_input_sql_from        varchar2(4000);
3535     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3536     l_input_sql_select_clob clob;
3537     l_input_sql_from_clob   clob;
3538 BEGIN
3539      procedure_name := 'get_result';
3540      procedure_desc := 'This procedure is invoked if this formula is used as an embeded formula';
3541      parameter_list := 'p_commission_line_id NUMBER';
3542 
3543      proc_init(procedure_name, procedure_desc, parameter_list,
3544                'F', 'NUMBER' , package_spec_id, x_repository_id,
3545                spec_code, body_code);
3546 
3547      cn_utils.appindcr(body_code, '  l_mul_input_tbl    cn_formula_common_pkg.mul_input_tbl_type;');
3548      cn_utils.appindcr(body_code, '  l_rate              NUMBER;');
3549      cn_utils.appindcr(body_code, '  l_rate_tier_id     NUMBER;');
3550      cn_utils.appindcr(body_code, '  l_tier_split             NUMBER;');
3551      cn_utils.appindcr(body_code, '  l_commission              NUMBER;');
3552      cn_utils.appindcr(body_code, '  p_salesrep_id      NUMBER(15); ');
3553      cn_utils.appindcr(body_code, '  p_period_id        NUMBER(15); ');
3554      cn_utils.appindcr(body_code, '  p_quota_id         NUMBER(15); ');
3555      cn_utils.appindcr(body_code, '  p_processed_date   DATE ; ');
3556      cn_utils.appindcr(body_code, '  p_srp_plan_assign_id NUMBER(15); ');
3557      cn_utils.appendcr(body_code);
3558      cn_utils.appindcr(body_code, '  CURSOR l_comm_line_csr IS ');
3559     cn_utils.appindcr(body_code, '    SELECT ');
3560 
3561     -- Added for 11.5.10 Performance Enhancments
3562     -- Add column names of CH and CL which are used in the input/output/perf expression
3563     FOR i IN g_comm_tbl_clmn_nms_tbl.FIRST..g_comm_tbl_clmn_nms_tbl.LAST LOOP
3564       IF i <> g_comm_tbl_clmn_nms_tbl.LAST THEN
3565           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name||',');
3566       ELSE
3567           cn_utils.appindcr(body_code ,'         '||g_comm_tbl_clmn_nms_tbl(i).table_alias||'.'||g_comm_tbl_clmn_nms_tbl(i).column_name);
3568       END IF;
3569     END LOOP;
3570     IF g_ch_flag THEN
3571         cn_utils.appindcr(body_code, '    FROM cn_commission_lines cl, cn_commission_headers ch ');
3572     ELSE
3573         cn_utils.appindcr(body_code, '    FROM cn_commission_lines cl');
3574     END IF;
3575     cn_utils.appindcr(body_code, '    where cl.commission_line_id = p_commission_line_id ');
3576     IF g_ch_flag THEN
3577       cn_utils.appindcr(body_code, '      AND ch.commission_header_id = cl.commission_header_id');
3578     END IF;
3579     cn_utils.appindcr(body_code, ';');
3580 
3581      -- Added for 11.5.10 Performance Enhancments
3582      -- Declare cursors which will fetch all columns of tables
3583      -- used in input/output/perf expressions.
3584      IF g_trx_group_code = 'INDIVIDUAL' THEN
3585         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
3586         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
3587            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
3588               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
3589                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
3593                END IF;
3590                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
3591                ELSE
3592                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
3594                cn_utils.appendcr(body_code);
3595                cn_utils.appindcr(body_code, '  CURSOR '||l_variable_declaration||'  IS');
3596                l_input_sql_where  := 'WHERE 1=1 ';
3597                l_input_sql_select := lower_str( '  select ' ||g_uniq_tbl_names_tbl(l_table_object_id).column_name_list);
3598                l_input_sql_from := lower( '   from ' ||g_uniq_tbl_names_tbl(l_table_object_id).table_name||' '||
3599                                                     g_uniq_tbl_names_tbl(l_table_object_id).table_alias);
3600                construct_sql_from_where (l_input_sql_select,
3601                                              l_input_sql_from,
3602                                          l_input_sql_where );
3603                --split_long_sql( body_code, l_input_sql_select, 'SELECT');
3604                  cn_utils.appindcr(body_code, 'SELECT * ');
3605 
3606                split_long_sql( body_code, l_input_sql_from, 'FROM');
3607                split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3608            END IF;
3609            l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
3610         END LOOP;
3611      END IF;
3612 
3613 
3614      cn_utils.appendcr(body_code, 'BEGIN');
3615      -- Added for 11.5.10 Performance Enhancments
3616      -- Declare cursors which will fetch all columns of tables
3617      -- used in input/output/perf expressions.
3618      cn_utils.appindcr(body_code, '  OPEN l_comm_line_csr ; ');
3619      cn_utils.appindcr(body_code, '  FETCH l_comm_line_csr into g_commission_rec;');
3620      cn_utils.appindcr(body_code, '  CLOSE l_comm_line_csr; ');
3621      cn_utils.appindcr(body_code ,'  p_salesrep_id   :=   g_commission_rec.CREDITED_SALESREP_ID;         ');
3622      cn_utils.appindcr(body_code ,'  p_period_id     :=   g_commission_rec.PROCESSED_PERIOD_ID;         ');
3623      cn_utils.appindcr(body_code ,'  p_quota_id      :=   g_commission_rec.quota_id;         ');
3624      cn_utils.appindcr(body_code ,'  p_srp_plan_assign_id   :=   g_commission_rec.srp_plan_assign_id;         ');
3625      cn_utils.appindcr(body_code ,'  p_processed_date :=   g_commission_rec.processed_date;         ');
3626 
3627      cn_utils.appendcr(body_code);
3628 
3629      -- Added for 11.5.10 Performance Enhancments
3630      -- Declare fetch statment which will fetch all columns of tables
3631      -- used in input/output/perf expressions.
3632      IF g_trx_group_code = 'INDIVIDUAL' THEN
3633         l_table_object_id := g_uniq_tbl_names_tbl.FIRST;
3634         FOR l_counter IN 1..g_uniq_tbl_names_tbl.COUNT LOOP
3635            IF INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_LINES') =  0  AND
3636               INSTR(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'CN_COMMISSION_HEADERS') = 0 THEN
3637 
3638                IF LENGTH(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) > 24 THEN
3639                    l_variable_declaration := 'l_'||lower(substr(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL),1,24))||'_cur';
3640                ELSE
3641                    l_variable_declaration := 'l_'||lower(REPLACE(g_uniq_tbl_names_tbl(l_table_object_id).table_name,'_',NULL)) ||'_cur';
3642                END IF;
3643                cn_utils.appendcr(body_code);
3644                cn_utils.appindcr(body_code, '  OPEN '||l_variable_declaration||' ;' );
3645                cn_utils.appindcr(body_code, '  FETCH '||l_variable_declaration||'  INTO ' ||g_uniq_tbl_names_tbl(l_table_object_id).variable_name||' ;' );
3646                cn_utils.appindcr(body_code, '  CLOSE '||l_variable_declaration||' ;' );
3647             END IF;
3648             l_table_object_id :=  g_uniq_tbl_names_tbl.NEXT(l_table_object_id);
3649          END LOOP;
3650       END IF;
3651 
3652      IF g_trx_group_code = 'INDIVIDUAL' AND g_itd_flag = 'N' AND g_cumulative_flag = 'N' THEN
3653         cn_utils.appindcr(body_code, '  get_input(p_commission_line_id, p_salesrep_id, ');
3654         cn_utils.appindcr(body_code, '            p_period_id, p_quota_id, ');
3655         cn_utils.appindcr(body_code, '            p_srp_plan_assign_id, p_processed_date, ');
3656         cn_utils.appindcr(body_code, '            l_mul_input_tbl  );');
3657         cn_utils.appendcr(body_code);
3658         IF g_rate_flag THEN
3659            cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id , ');
3660            cn_utils.appindcr(body_code, '            p_period_id, p_quota_id , g_split_flag,g_itd_flag, ');
3661            cn_utils.appindcr(body_code, '            p_processed_date, g_number_dim,l_mul_input_tbl, ');
3662            cn_utils.appindcr(body_code, '            g_formula_id, l_rate , l_rate_tier_id, l_tier_split ); ');
3663         END IF;
3664         cn_utils.appendcr(body_code);
3665         cn_utils.appindcr(body_code, '  l_commission := get_commission( p_commission_line_id, ');
3666         cn_utils.appindcr(body_code, '                  p_salesrep_id, p_period_id, p_quota_id, ');
3667         cn_utils.appindcr(body_code, '                  p_srp_plan_assign_id, l_rate); ');
3668      END IF;
3669 
3670      cn_utils.appindcr(body_code, '  return l_commission; ');
3671      cn_utils.appendcr(body_code);
3672 
3673      cn_utils.proc_end( procedure_name, 'N', body_code );
3674 
3675 EXCEPTION
3676   when others then
3677     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3678       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3679                      'cn.plsql.cn_formula_gen_pkg.get_result.exception',
3680          	          sqlerrm);
3681     end if;
3682     raise;
3683 END get_result;
3684 
3688 IS
3685  --   construct the update_revclass_perf procedure for the formula package.
3686 PROCEDURE update_revclass_perf (spec_code        IN OUT NOCOPY cn_utils.code_type,
3687                                 body_code        IN OUT NOCOPY cn_utils.code_type )
3689     procedure_name        cn_obj_procedures_v.name%TYPE;
3690     procedure_desc        cn_obj_procedures_v.description%TYPE;
3691     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3692     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3693     x_repository_id        cn_repositories.repository_id%TYPE;
3694 
3695     l_input_sql_select        varchar2(8000);
3696     l_input_sql_from        varchar2(4000);
3697     l_input_sql_where   varchar2(4000) := 'WHERE 1=1';
3698 
3699     l_input_sql_select_clob clob;
3700     l_input_sql_from_clob   clob;
3701 
3702     l_sql_stmt          VARCHAR2(1000);
3703     l_line_alias        VARCHAR2(30);
3704     l_header_alias      VARCHAR2(30);
3705 
3706 BEGIN
3707      procedure_name := 'update_revclass_perf';
3708      procedure_desc := 'To accumulate performance by revenue classes in group by case.'||
3709        'This is a call back when updating plan element subledger ' ;
3710      parameter_list := 'p_salesrep_id NUMBER, p_period_id NUMBER, ';
3711      parameter_list := parameter_list || 'p_quota_id NUMBER, p_srp_plan_assign_id NUMBER';
3712 
3713      proc_init(procedure_name, procedure_desc, parameter_list,
3714                'P', null, package_spec_id, x_repository_id,
3715                spec_code, body_code);
3716 
3717      cn_utils.appindcr(body_code, '  l_perf              NUMBER;');
3718      cn_utils.appindcr(body_code, '  CURSOR l_rev_classes_csr IS ');
3719      cn_utils.appindcr(body_code, '    SELECT revenue_class_id, srp_per_quota_rc_id');
3720      cn_utils.appindcr(body_code, '      FROM cn_srp_per_quota_rc_all rc');
3721      cn_utils.appindcr(body_code, '     WHERE rc.srp_plan_assign_id = p_srp_plan_assign_id');
3722      cn_utils.appindcr(body_code, '       AND rc.salesrep_id = p_salesrep_id');
3723      cn_utils.appindcr(body_code, '          AND rc.period_id = p_period_id');
3724      cn_utils.appindcr(body_code, '          AND rc.quota_id = p_quota_id;');
3725 
3726      cn_utils.appendcr(body_code);
3727      cn_utils.appendcr(body_code, 'BEGIN');
3728 
3729      IF g_perf_measure_id IS NOT NULL THEN
3730         select sql_select, sql_from
3731           into l_input_sql_select_clob, l_input_sql_from_clob
3732           from cn_calc_sql_exps_all
3733           where calc_sql_exp_id = g_perf_measure_id
3734 		    and org_id = g_org_id;
3735 
3736         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3737         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3738         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3739         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3740 
3741       ELSE   /* default to be the input with the lowest input_sequence */
3742         SELECT sql_select input_sql_select, sql_from input_sql_from
3743           INTO l_input_sql_select_clob, l_input_sql_from_clob
3744           FROM cn_calc_sql_exps_all
3745           WHERE org_id = g_org_id
3746 		    AND calc_sql_exp_id = (SELECT calc_sql_exp_id
3747                                    FROM cn_formula_inputs_all
3748                                    WHERE calc_formula_id = g_formula_id
3749                                    AND org_id = g_org_id
3750                                    AND rate_dim_sequence = 1);
3751 
3752         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3753         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3754         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3755         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3756 
3757      END IF;
3758 
3759      construct_sql_from_where(l_input_sql_select,
3760                               l_input_sql_from ,
3761                               l_input_sql_where   );
3762 
3763      -- get header table alias
3764      IF check_sql_stmt_existence(l_input_sql_from, 'cn_commission_headers') THEN
3765         l_header_alias := get_table_alias (l_input_sql_from, 'cn_commission_headers');
3766       ELSE -- comm_header not in sql_from yet, add it and get its alias
3767         l_header_alias := get_table_alias_from_cn('cn_commission_headers');
3768         l_input_sql_from := l_input_sql_from || ', cn_commission_headers_all ' || l_header_alias;
3769      END IF ;
3770      -- get the alias for cn_commisson_lines
3771      IF check_sql_stmt_existence(l_input_sql_from, 'cn_commission_lines') THEN
3772         l_line_alias := get_table_alias (l_input_sql_from, 'cn_commission_lines');
3773       ELSE -- comm_lines not in sql_from yet, add it and get its alias
3774         l_line_alias := get_table_alias_from_cn('cn_commission_lines');
3775         l_input_sql_from := l_input_sql_from || ', cn_commission_lines_all ' || l_line_alias;
3776      END IF ;
3777 
3778      -- Changed by Zack to handle the hierarchy revenue class case
3779      l_input_sql_from := l_input_sql_from || ', cn_quota_rules_all cn_cqr ';
3780 
3781      make_srp_plan_pe_hid_pid_st(l_line_alias, l_header_alias, l_input_sql_where);
3782 
3783      l_sql_stmt := ' and '|| l_line_alias || '.processed_period_id between p_start_period_id and p_period_id';
3784      IF check_sql_stmt_existence(l_input_sql_where, l_sql_stmt) THEN
3785         l_input_sql_where := REPLACE(l_input_sql_where, l_sql_stmt, ' ' );
3786 
3787         l_sql_stmt := ' and '|| l_line_alias || '.processed_period_id = p_period_id';
3788         l_input_sql_where := l_input_sql_where || l_sql_stmt;
3789      END IF;
3790 
3791      make_calc_type(l_line_alias, l_header_alias, l_input_sql_where);
3792 
3793      l_sql_stmt := ' and '|| l_line_alias || '.quota_rule_id = '||' cn_cqr.quota_rule_id ';
3794      l_sql_stmt := l_sql_stmt ||' and cn_cqr.revenue_class_id = l_rev_class.revenue_class_id ';
3795 
3799 
3796      IF NOT check_sql_stmt_existence(l_input_sql_where, l_sql_stmt) THEN
3797         l_input_sql_where := l_input_sql_where || l_sql_stmt;
3798      END IF;
3800      IF g_perf_measure_id IS NOT NULL THEN
3801         l_input_sql_select := REPLACE(l_input_sql_select, 'select', 'select sum(');
3802         l_input_sql_select := l_input_sql_select || ' ) ';
3803      END IF;
3804 
3805      cn_utils.appindcr(body_code, ' FOR l_rev_class IN l_rev_classes_csr LOOP ');
3806      split_long_sql( body_code, l_input_sql_select, 'SELECT');
3807      cn_utils.appindcr(body_code, '   into l_perf ');
3808      split_long_sql( body_code, l_input_sql_from, 'FROM');
3809      split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3810      cn_utils.appendcr(body_code);
3811      cn_utils.appindcr(body_code, '   l_perf := nvl(l_perf, 0); ');
3812 
3813 
3814      cn_utils.appindcr(body_code, '   UPDATE cn_srp_per_quota_rc_all');
3815      cn_utils.appindcr(body_code, '         SET period_to_date = l_perf');
3816      cn_utils.appindcr(body_code, '    WHERE srp_per_quota_rc_id = l_rev_class.srp_per_quota_rc_id;');
3817      cn_utils.appindcr(body_code, ' END LOOP; ' );
3818 
3819      cn_utils.proc_end( procedure_name, 'N', body_code );
3820 EXCEPTION
3821   when others then
3822     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
3823       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
3824                      'cn.plsql.cn_formula_gen_pkg.update_revclass_perf.exception',
3825          	          sqlerrm);
3826     end if;
3827     raise;
3828 END update_revclass_perf;
3829 
3830 --   construct the calculate_quota procdure which will be invoked from the dispatcher in calc engine
3831 PROCEDURE calculate_bonus_quota (spec_code        IN OUT NOCOPY cn_utils.code_type,
3832                                  body_code        IN OUT NOCOPY cn_utils.code_type )
3833 IS
3834     procedure_name        cn_obj_procedures_v.name%TYPE;
3835     procedure_desc        cn_obj_procedures_v.description%TYPE;
3836     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
3837     package_spec_id        cn_obj_packages_v.package_id%TYPE;
3838     x_repository_id        cn_repositories.repository_id%TYPE;
3839 
3840     l_input_sql_select        VARCHAR2(8000);
3841     l_input_sql_from        varchar2(4000);
3842     l_input_sql_select_clob clob;
3843     l_input_sql_from_clob   clob;
3844     l_input_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3845     l_counter NUMBER;
3846     l_ctr NUMBER;
3847     l_dim_unit_code VARCHAR2(30);
3848 
3849     CURSOR l_mul_inputs_csr IS
3850        SELECT calc_sql_exp_id, rate_dim_sequence, nvl(split_flag, 'N') split_flag
3851          FROM cn_formula_inputs_all
3852          WHERE calc_formula_id = g_formula_id
3853          AND org_id = g_org_id
3854          ORDER BY rate_dim_sequence;
3855 
3856     -- cursor to get the dim_unit_code
3857     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
3858        SELECT dim_unit_code
3859 	 FROM cn_rate_dimensions_all
3860 	 WHERE rate_dimension_id = (SELECT rate_dimension_id
3861 				    FROM cn_rate_sch_dims_all
3862 				    WHERE rate_dim_sequence = p_rate_dim_sequence
3863 				      AND rate_schedule_id = (SELECT rate_schedule_id
3864 							      FROM cn_rt_formula_asgns_all
3865 							      WHERE calc_formula_id = g_formula_id
3866                                     AND org_id = g_org_id
3867 							      AND ROWNUM = 1));
3868 
3869     CURSOR l_input_sql_select_from_csr (l_calc_sql_exp_id NUMBER) IS
3870        SELECT  sql_select input_sql_select, sql_from input_sql_from
3871          FROM  cn_calc_sql_exps_all
3872          WHERE calc_sql_exp_id = l_calc_sql_exp_id
3873 		   AND org_id = g_org_id;
3874 
3875     l_output_sql_select        varchar2(8000);
3876     l_output_sql_from        varchar2(4000);
3877     l_output_sql_select_clob clob;
3878     l_output_sql_from_clob   clob;
3879 
3880     l_output_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3881 
3882     CURSOR l_output_select_from_csr IS
3883        SELECT  sql_select output_sql_select, sql_from output_sql_from
3884          FROM cn_calc_sql_exps_all
3885          WHERE calc_sql_exp_id = (SELECT output_exp_id
3886                                   FROM  cn_calc_formulas_all
3887                                   WHERE  calc_formula_id = g_formula_id
3888                                     AND org_id = g_org_id);
3889 
3890     CURSOR l_perf_select_from_csr IS
3891        select  sql_select, sql_from
3892          from cn_calc_sql_exps_all
3893          where calc_sql_exp_id = g_perf_measure_id;
3894 
3895     CURSOR l_inp_perf_select_from_csr IS
3896        SELECT sql_select input_sql_select, sql_from input_sql_from
3897          FROM cn_calc_sql_exps_all
3898          WHERE calc_sql_exp_id = (SELECT calc_sql_exp_id
3899                                   FROM cn_formula_inputs_all
3900                                   WHERE calc_formula_id = g_formula_id
3901                                   AND org_id = g_org_id
3902                                   AND rate_dim_sequence = 1);
3903 
3904     l_perf_sql_select        varchar2(8000);
3905     l_perf_sql_from        varchar2(4000);
3906     l_perf_sql_select_clob clob;
3907     l_perf_sql_from_clob   clob;
3908 
3909     l_perf_sql_where   varchar2(4000) := 'WHERE 1=1 ';
3910 
3911     CURSOR l_all_columns_csr (l_table_id NUMBER ) IS
3912        SELECT lower(name) column_name, data_type
3913          FROM cn_objects_all
3914          WHERE table_id = l_table_id
3915          AND org_id = g_org_id
3916          AND object_type = 'COL'
3917          AND primary_key = 'Y'
3918          AND position IS NOT NULL
3919            ORDER BY position;
3920 BEGIN
3921      procedure_name := 'calculate_quota';
3922      procedure_desc := 'This procedure is the hook to the calculation engine';
3923 
3927      parameter_list := parameter_list || ',p_credit_type_id NUMBER, p_role_id NUMBER, x_latest_processed_date OUT NOCOPY DATE           ';
3924      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, p_period_id NUMBER, ';
3925      parameter_list := parameter_list || 'p_start_date DATE, p_quota_id NUMBER, p_process_all_flag VARCHAR2, ';
3926      parameter_list := parameter_list || ' p_intel_calc_flag VARCHAR2, p_calc_type VARCHAR2 ';
3928 
3929      proc_init(procedure_name, procedure_desc, parameter_list, 'P', null , package_spec_id, x_repository_id, spec_code, body_code);
3930 
3931      cn_utils.appindcr(body_code, '  l_mul_input_tbl           ' || 'cn_formula_common_pkg.mul_input_tbl_type; ');
3932      cn_utils.appindcr(body_code, '  p_rate                     NUMBER;');
3933      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER(15); ');
3934      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER(15); ');
3935      cn_utils.appindcr(body_code, '  l_input                    cn_formula_common_pkg.num_table_type; ');
3936      cn_utils.appindcr(body_code, '  l_input_string             VARCHAR2(30);');
3937      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
3938      cn_utils.appindcr(body_code, '  l_perf                     NUMBER; ');
3939      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
3940      cn_utils.appindcr(body_code, '  l_error_reason             VARCHAR2(150); ');
3941      cn_utils.appindcr(body_code, '  l_name                     VARCHAR2(255); ');
3942      cn_utils.appindcr(body_code, '  l_trx_rec                  cn_formula_common_pkg.trx_rec_type; ');
3943      cn_utils.appindcr(body_code, '  l_trx_rec_null             cn_formula_common_pkg.trx_rec_type; ');
3944      cn_utils.appindcr(body_code, '  l_rollover                 NUMBER := 0; ');
3945      cn_utils.appendcr(body_code);
3946 
3947      -- constructing input cursor here
3948      l_counter := 1;
3949      FOR l_mul_input IN l_mul_inputs_csr LOOP
3950         l_input_sql_where  := 'WHERE 1=1 ';
3951 
3952         OPEN l_input_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
3953         FETCH l_input_sql_select_from_csr
3954           INTO l_input_sql_select_clob, l_input_sql_from_clob;
3955         CLOSE l_input_sql_select_from_csr;
3956 
3957         convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
3958         l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
3959         convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
3960         l_input_sql_from := lower( 'from ' || l_input_sql_from );
3961 
3962         construct_sql_from_where (l_input_sql_select,
3963                                   l_input_sql_from,
3964                                   l_input_sql_where );
3965         -- special logic for first input
3966         IF l_mul_inputs_csr%rowcount = 1 THEN
3967            g_external_table_id := NULL;
3968            handle_bonus_ex_tbl_orderby(l_input_sql_select,
3969                                        l_input_sql_from,
3970                                        l_input_sql_where,
3971                                        'INPUT1' );
3972            -- if there is external_table in input
3973            -- declare the parameters corresponding to the primray key columns of the external tbl
3974            IF g_external_table_id IS NOT NULL THEN
3975               FOR l_column IN l_all_columns_csr(g_external_table_id) LOOP
3976                  l_ctr := l_all_columns_csr%rowcount;
3977                  IF l_column.data_type IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2' ) THEN
3978                     cn_utils.appindcr(body_code, '  l_parameter_'|| l_ctr
3979                                       || '    ' || l_column.data_type || ' (1000); ' );
3980                   ELSE
3981                     cn_utils.appindcr(body_code, '  l_parameter_'|| l_ctr
3982                                       || '    ' || l_column.data_type || ';' );
3983                  END IF;
3984               END LOOP;
3985            END IF;
3986            cn_utils.appendcr(body_code);
3987 
3988            cn_utils.appindcr(body_code, '  CURSOR l_input_csr_'|| l_counter || ' IS ' );
3989            split_long_sql( body_code, l_input_sql_select, 'SELECT');
3990            split_long_sql( body_code, l_input_sql_from, 'FROM');
3991            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
3992            cn_utils.appendcr(body_code);
3993 
3994            IF g_external_table_id IS NOT NULL THEN
3995               l_input_sql_where  := 'WHERE 1=1 ';
3996 
3997               OPEN l_input_sql_select_from_csr(l_mul_input.calc_sql_exp_id);
3998               FETCH l_input_sql_select_from_csr
3999                 INTO l_input_sql_select_clob, l_input_sql_from_clob;
4000               CLOSE l_input_sql_select_from_csr;
4001 
4002               convert_clob_to_string(l_input_sql_select_clob, l_input_sql_select);
4003               l_input_sql_select := lower_str( 'select ' || l_input_sql_select );
4004               convert_clob_to_string(l_input_sql_from_clob, l_input_sql_from);
4005               l_input_sql_from := lower( 'from ' || l_input_sql_from );
4006 
4007               construct_sql_from_where (l_input_sql_select,
4008                                         l_input_sql_from,
4009                                         l_input_sql_where );
4010 
4011               handle_bonus_ex_tbl_orderby(l_input_sql_select,
4012                                           l_input_sql_from,
4013                                           l_input_sql_where,
4014                                           'INPUT0' );
4015 
4016               cn_utils.appindcr(body_code, '  CURSOR l_input_csr_0 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          ELSE
4024            handle_bonus_ex_tbl_orderby(l_input_sql_select,
4025                                        l_input_sql_from,
4026                                        l_input_sql_where,
4027                                        'INPUT' );
4028 
4029            cn_utils.appindcr(body_code, '  CURSOR l_input_csr_'|| l_counter || ' IS ' );
4030            split_long_sql( body_code, l_input_sql_select, 'SELECT');
4031            split_long_sql( body_code, l_input_sql_from, 'FROM');
4032            split_long_sql( body_code, l_input_sql_where||';', 'WHERE');
4033            cn_utils.appendcr(body_code);
4034         END IF;
4035 
4036         l_counter := l_counter+1;
4037      END LOOP;
4038 
4039      -- constructing output_cursro here
4040      OPEN l_output_select_from_csr;
4041      FETCH l_output_select_from_csr
4042        INTO l_output_sql_select_clob, l_output_sql_from_clob;
4043      CLOSE l_output_select_from_csr;
4044 
4045      convert_clob_to_string(l_output_sql_select_clob, l_output_sql_select);
4046      l_output_sql_select := lower_str( 'select ' || l_output_sql_select );
4047      convert_clob_to_string(l_output_sql_from_clob, l_output_sql_from);
4048      l_output_sql_from := lower( 'from ' || l_output_sql_from );
4049 
4050      g_rate_flag := check_sql_stmt_existence(l_output_sql_select, 'rateresult');
4051 
4052      construct_sql_from_where(l_output_sql_select,
4053                               l_output_sql_from,
4054                               l_output_sql_where    );
4055 
4056      handle_output_sql_select(l_output_sql_select,
4057                               l_output_sql_from,
4058                               l_output_sql_where    );
4059 
4060      handle_bonus_ex_tbl_orderby(l_output_sql_select,
4061                                  l_output_sql_from,
4062                                  l_output_sql_where,
4063                                  'OUTPUT' );
4064 
4065      cn_utils.appindcr(body_code, '  CURSOR l_output_csr IS ' );
4066      split_long_sql( body_code, l_output_sql_select, 'SELECT');
4067      split_long_sql( body_code, l_output_sql_from, 'FROM');
4068      split_long_sql( body_code, l_output_sql_where||';', 'WHERE');
4069      cn_utils.appendcr(body_code);
4070 
4071      -- constructing perf_cursor here
4072      IF g_perf_measure_id IS NOT NULL THEN
4073         OPEN l_perf_select_from_csr;
4074         FETCH l_perf_select_from_csr
4075           INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
4076         CLOSE l_perf_select_from_csr;
4077 
4078         convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
4079         l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
4080         convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
4081         l_perf_sql_from := lower('from ' || l_perf_sql_from);
4082       ELSE   /* default to be the input with the lowest input_sequence */
4083         OPEN l_inp_perf_select_from_csr;
4084         FETCH l_inp_perf_select_from_csr
4085           INTO l_perf_sql_select_clob, l_perf_sql_from_clob;
4086         CLOSE l_inp_perf_select_from_csr;
4087 
4088         convert_clob_to_string( l_perf_sql_select_clob, l_perf_sql_select);
4089         l_perf_sql_select := lower_str('select sum( ' || l_perf_sql_select || ' ) ' );
4090         convert_clob_to_string( l_perf_sql_from_clob, l_perf_sql_from);
4091         l_perf_sql_from := lower('from ' || l_perf_sql_from);
4092      END IF;
4093 
4094      construct_sql_from_where(l_perf_sql_select,
4095                               l_perf_sql_from,
4096                               l_perf_sql_where     );
4097 
4098      handle_bonus_ex_tbl_orderby(l_perf_sql_select,
4099                                  l_perf_sql_from,
4100                                  l_perf_sql_where,
4101                                  'PERF'            );
4102 
4103      cn_utils.appindcr(body_code, '  CURSOR l_perf_csr IS ' );
4104      split_long_sql( body_code, l_perf_sql_select, 'SELECT');
4105      split_long_sql( body_code, l_perf_sql_from, 'FROM');
4106      split_long_sql( body_code, l_perf_sql_where||';', 'WHERE');
4107 
4108      -- finish contructing input/output/perf cursors
4109      cn_utils.appendcr(body_code, 'BEGIN');
4110      cn_utils.appindcr(body_code, '  g_intel_calc_flag := p_intel_calc_flag;');
4111      cn_utils.appindcr(body_code, '  g_calc_type := p_calc_type;');
4112      calc_init(spec_code, body_code);
4113 
4114      FOR i IN 1..g_number_dim LOOP
4115 	cn_utils.appindcr(body_code, '  l_input('||i||') := 0;        ');
4116      END LOOP;
4117 
4118      IF g_external_table_id IS NOT NULL THEN
4119         cn_utils.appindcr(body_code, ' FOR l_csr_0 IN l_input_csr_0 LOOP ');
4120         cn_utils.appindcr(body_code, '   BEGIN ');
4121         FOR l_column IN l_all_columns_csr(g_external_table_id) LOOP
4122            cn_utils.appindcr(body_code, '     l_parameter_'||
4123                              To_char(l_all_columns_csr%rowcount) || ' := l_csr_0.'
4124                              || l_column.column_name || ' ;');
4128         cn_utils.appindcr(body_code, '   BEGIN ');
4125         END LOOP;
4126         cn_utils.appendcr(body_code);
4127       ELSE
4129      END IF;
4130      cn_utils.appindcr(body_code, '  l_trx_rec  := l_trx_rec_null; ');
4131      FOR l_mul_input IN l_mul_inputs_csr LOOP
4132         l_ctr := l_mul_inputs_csr%rowcount;
4133         cn_utils.appindcr(body_code, '     OPEN l_input_csr_' || l_ctr || ' ;' );
4134 
4135 	OPEN dim_type(l_mul_input.rate_dim_sequence);
4136 	FETCH dim_type INTO l_dim_unit_code;
4137 	CLOSE dim_type;
4138 
4139 	IF (l_dim_unit_code = 'STRING') THEN
4140 	   cn_utils.appindcr(body_code, '     FETCH l_input_csr_' || l_ctr||' INTO l_input_string; ');
4141 	ELSE
4142 	   cn_utils.appindcr(body_code, '     FETCH l_input_csr_' || l_ctr||' INTO l_input('||l_mul_input.rate_dim_sequence||'); ');
4143         END IF;
4144 
4145         cn_utils.appendcr(body_code);
4146         cn_utils.appindcr(body_code, '     IF l_input_csr_'|| l_ctr || '%notfound THEN ');
4147         cn_utils.appindcr(body_code, '        raise no_data_found; ');
4148         cn_utils.appindcr(body_code, '     END IF;  ');
4149         cn_utils.appendcr(body_code);
4150         cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr ||').rate_dim_sequence := '
4151                           || l_mul_input.rate_dim_sequence || ' ; ' );
4152 
4153         IF (l_dim_unit_code = 'STRING') THEN
4154           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').input_string := l_input_string;' );
4155         ELSE
4156           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').input_amount := l_input('||l_mul_input.rate_dim_sequence||');');
4157           cn_utils.appindcr(body_code, '     l_mul_input_tbl('|| l_ctr ||').amount := l_input('||l_mul_input.rate_dim_sequence||');' );
4158         END IF;
4159 
4160         IF (l_mul_input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4161            cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr || ').base_amount := 0;' );
4162          ELSE
4163            cn_utils.appindcr(body_code, '     l_mul_input_tbl(' || l_ctr || ').base_amount := l_input('||l_mul_input.rate_dim_sequence||');' );
4164         END IF;
4165         cn_utils.appindcr(body_code, '     CLOSE l_input_csr_' || l_ctr || ' ;' );
4166         cn_utils.appendcr(body_code);
4167      END LOOP;
4168 
4169      --cn_utils.appindcr(body_code, '     l_input := l_mul_input_tbl(1).input_amount; ');
4170      cn_utils.appendcr(body_code);
4171      -- get_rates
4172      IF g_rate_flag THEN
4173         cn_utils.appindcr(body_code, '     cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
4174         cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag, g_itd_flag,');
4175         cn_utils.appindcr(body_code, '                 p_start_date, g_number_dim,l_mul_input_tbl, ');
4176         cn_utils.appindcr(body_code, '                 g_formula_id, p_rate, l_rate_tier_id, l_tier_split ); ');
4177         cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Commission rate=''|| p_rate);');
4178      END IF;
4179      cn_utils.appendcr(body_code);
4180      -- get_commission
4181      cn_utils.appindcr(body_code, '     OPEN l_output_csr; ');
4182      cn_utils.appindcr(body_code, '     FETCH l_output_csr INTO l_commission; ');
4183      cn_utils.appindcr(body_code, '     IF l_output_csr%notfound THEN ');
4184      cn_utils.appindcr(body_code, '        raise no_data_found; ');
4185      cn_utils.appindcr(body_code, '     END IF;  ');
4186      cn_utils.appindcr(body_code, '     CLOSE l_output_csr; ');
4187      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Output=''||l_commission);');
4188      cn_utils.appendcr(body_code);
4189      -- get perf need more thought
4190      cn_utils.appindcr(body_code, '     OPEN l_perf_csr; ');
4191      cn_utils.appindcr(body_code, '     FETCH l_perf_csr INTO l_perf; ');
4192      cn_utils.appindcr(body_code, '     IF l_perf_csr%notfound THEN ');
4193      cn_utils.appindcr(body_code, '        raise no_data_found; ');
4194      cn_utils.appindcr(body_code, '     END IF;  ');
4195      cn_utils.appindcr(body_code, '     CLOSE l_perf_csr; ');
4196      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Performance measure=''||l_perf);');
4197      cn_utils.appendcr(body_code);
4198      cn_utils.appindcr(body_code, '     x_latest_processed_date := p_start_date;    ');
4199      cn_utils.appendcr(body_code);
4200      -- update all global variables
4201      update_variables(spec_code, body_code);
4202      cn_utils.appendcr(body_code);
4203      cn_utils.appindcr(body_code, '     l_trx_rec.commission_amount := l_commission ;');
4204      cn_utils.appindcr(body_code, '     l_trx_rec.commission_rate := p_rate ; ');
4205      cn_utils.appindcr(body_code, '     l_trx_rec.rate_tier_id := l_rate_tier_id ;');
4206      cn_utils.appindcr(body_code, '     l_trx_rec.tier_split := l_tier_split ;');
4207      cn_utils.appindcr(body_code, '     l_trx_rec.input_achieved := g_input_achieved_itd(1); ');
4208      cn_utils.appindcr(body_code, '     l_trx_rec.output_achieved := g_output_achieved_itd; ');
4209      cn_utils.appindcr(body_code, '     l_trx_rec.perf_achieved := l_perf; ');
4210      cn_utils.appindcr(body_code, '     l_trx_rec.status := ''CALC''; ');
4211      cn_utils.appindcr(body_code, '     l_trx_rec.credit_type_id := p_credit_type_id; ');
4212      cn_utils.appindcr(body_code, '   EXCEPTION WHEN OTHERS THEN ');
4213 
4214      FOR l_mul_input IN l_mul_inputs_csr LOOP
4215         l_ctr := l_mul_inputs_csr%rowcount;
4216         cn_utils.appindcr(body_code, '     IF l_input_csr_' || l_ctr || '%isopen THEN ' );
4217         cn_utils.appindcr(body_code, '        CLOSE l_input_csr_' || l_ctr || ' ;' );
4218         cn_utils.appindcr(body_code, '     END IF; ');
4219      END LOOP;
4220      cn_utils.appendcr(body_code);
4221      cn_utils.appindcr(body_code, '     IF l_output_csr%isopen THEN ' );
4222      cn_utils.appindcr(body_code, '        CLOSE l_output_csr; ');
4223      cn_utils.appindcr(body_code, '     END IF; ');
4224      cn_utils.appendcr(body_code);
4228      cn_utils.appendcr(body_code);
4225      cn_utils.appindcr(body_code, '     IF l_perf_csr%isopen THEN ' );
4226      cn_utils.appindcr(body_code, '        CLOSE l_perf_csr; ');
4227      cn_utils.appindcr(body_code, '     END IF; ');
4229      -- how to handle exception  -->create a trx with status 'XCALC' that has the error_reason
4230      cn_utils.appindcr(body_code, '     l_trx_rec.error_reason := substr(sqlerrm,1,150);  ');
4231      cn_utils.appindcr(body_code, '     l_trx_rec.status := ''XCALC''; ');
4232      cn_utils.appindcr(body_code, '     l_trx_rec.commission_amount := 0 ;');
4233      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in formula calculate_bonus_quota:''); ' );
4234      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ' );
4235      cn_utils.appindcr(body_code, '   END; ');
4236      cn_utils.appendcr(body_code);
4237      cn_utils.appindcr(body_code, '     l_trx_rec.salesrep_id := p_salesrep_id; ');
4238      cn_utils.appindcr(body_code, '     l_trx_rec.srp_plan_assign_id := p_srp_plan_assign_id; ');
4239      cn_utils.appindcr(body_code, '     l_trx_rec.quota_id := p_quota_id; ');
4240      cn_utils.appindcr(body_code, '     l_trx_rec.processed_date := p_start_date; ');
4241      cn_utils.appindcr(body_code, '     l_trx_rec.processed_period_id := p_period_id; ');
4242      cn_utils.appindcr(body_code, '     l_trx_rec.pay_period_id :=  p_period_id; ');
4243      cn_utils.appindcr(body_code, '     l_trx_rec.posting_status := ''UNPOSTED''; ');
4244      cn_utils.appindcr(body_code, '     l_trx_rec.pending_status := null; ');
4245      cn_utils.appindcr(body_code, '     l_trx_rec.created_during := ''CALC''; ');
4246      cn_utils.appindcr(body_code, '     l_trx_rec.trx_type := ''BONUS'' ; ');
4247      cn_utils.appindcr(body_code, '     cn_formula_common_pkg.create_trx(l_trx_rec); ');
4248      -- create_bonus_trx;
4249      cn_utils.appendcr(body_code);
4250      IF g_external_table_id IS NOT NULL THEN
4251         cn_utils.appindcr(body_code, ' END LOOP; ');
4252         -- cn_utils.appindcr(body_code, ' CLOSE l_input_csr_0; ');
4253      END IF;
4254      -- contructing calc_roll
4255      calc_roll(spec_code, body_code);
4256      cn_utils.appindcr(body_code, ' EXCEPTION ' );
4257      cn_utils.appindcr(body_code, '   when others then ');
4258      FOR l_mul_input IN l_mul_inputs_csr LOOP
4259         l_ctr := l_mul_inputs_csr%rowcount;
4260         cn_utils.appindcr(body_code, '     IF l_input_csr_' || l_ctr || '%isopen THEN ' );
4261         cn_utils.appindcr(body_code, '        CLOSE l_input_csr_' || l_ctr || ' ;' );
4262         cn_utils.appindcr(body_code, '     END IF; ');
4263      END LOOP;
4264      cn_utils.appendcr(body_code);
4265      cn_utils.appindcr(body_code, '     IF l_output_csr%isopen THEN ' );
4266      cn_utils.appindcr(body_code, '        CLOSE l_output_csr; ');
4267      cn_utils.appindcr(body_code, '     END IF; ');
4268      cn_utils.appendcr(body_code);
4269      cn_utils.appindcr(body_code, '     IF l_perf_csr%isopen THEN ' );
4270      cn_utils.appindcr(body_code, '        CLOSE l_perf_csr; ');
4271      cn_utils.appindcr(body_code, '     END IF; ');
4272      cn_utils.appendcr(body_code);
4273      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4274      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4275      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.calculate_bonus_quota.exception'', ');
4276      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4277      cn_utils.appindcr(body_code, '     end if; ');
4278      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in calculate_bonsu_quota:''); ');
4279      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ' );
4280      cn_utils.appindcr(body_code, '     raise; ');
4281 
4282      cn_utils.proc_end( procedure_name, 'N', body_code );
4283 EXCEPTION
4284   when others then
4285     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4286       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4287                      'cn.plsql.cn_formula_gen_pkg.calculate_bonus_quota.exception',
4288          	          sqlerrm);
4289     end if;
4290     raise;
4291 END calculate_bonus_quota;
4292 
4293 --   construct the get_forecast_commission procdure which will be invoked by Income Planner
4294 PROCEDURE get_forecast_commission(spec_code        IN OUT NOCOPY cn_utils.code_type,
4295                                   body_code        IN OUT NOCOPY cn_utils.code_type )
4296 IS
4297     procedure_name        cn_obj_procedures_v.name%TYPE;
4298     procedure_desc        cn_obj_procedures_v.description%TYPE;
4299     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
4300 
4301     l_rate_dim_sequence NUMBER;
4302     l_sql_select        VARCHAR2(8000);
4303     l_sql_from          VARCHAR2(4000);
4304     l_sql_where         VARCHAR2(4000);
4305     l_counter           NUMBER := 1;
4306     l_dim_unit_code     VARCHAR2(30);
4307     l_calc_sql_exp_id   NUMBER;
4308     l_output_exp_id     NUMBER;
4309 
4310     l_operator_position NUMBER;
4311     l_operator          VARCHAR2(1);
4312 
4313     CURSOR f_output IS
4314        SELECT f_output_exp_id
4315          FROM cn_calc_formulas_all
4316          WHERE calc_formula_id = g_formula_id
4317            AND org_id = g_org_id;
4318 
4319     CURSOR f_inputs IS
4320        SELECT rate_dim_sequence, f_calc_sql_exp_id, cumulative_flag, split_flag
4321          FROM cn_formula_inputs_all
4322          WHERE calc_formula_id = g_formula_id
4323            AND org_id = g_org_id;
4324 
4325     CURSOR dim_type(p_rate_dim_sequence NUMBER) IS
4326        SELECT dim_unit_code
4327          FROM cn_rate_dimensions_all
4328          WHERE rate_dimension_id = (SELECT rate_dimension_id
4329                                     FROM cn_rate_sch_dims_all
4330                                     WHERE rate_dim_sequence = p_rate_dim_sequence
4334                                                               AND org_id = g_org_id
4331                                       AND rate_schedule_id = (SELECT rate_schedule_id
4332                                                               FROM cn_rt_formula_asgns_all
4333                                                               WHERE calc_formula_id = g_formula_id
4335                                                               AND ROWNUM = 1));
4336 
4337     CURSOR sql_statement(p_calc_sql_exp_id NUMBER) IS
4338        SELECT  dbms_lob.substr(sql_select), dbms_lob.substr(sql_from)
4339          FROM  cn_calc_sql_exps_all
4340          WHERE calc_sql_exp_id = p_calc_sql_exp_id;
4341 BEGIN
4342      OPEN f_output;
4343      FETCH f_output INTO l_output_exp_id;
4344      CLOSE f_output;
4345 
4346      -- if there is no forecasting expressions, then return
4347      IF (l_output_exp_id IS NULL) THEN
4348         RETURN;
4349      END IF;
4350 
4351      procedure_name := 'get_forecast_commission';
4352      procedure_desc := '   Called by Income Planner to forecast commissions';
4353 
4354      parameter_list := 'p_srp_plan_assign_id NUMBER, p_salesrep_id NUMBER, ';
4355      parameter_list := parameter_list || 'p_start_period_id NUMBER, p_forecast_period_id NUMBER, p_quota_id NUMBER,  ';
4356      parameter_list := parameter_list || 'p_forecast_amount NUMBER, x_projected_commission OUT NOCOPY NUMBER ';
4357 
4358      proc_init(procedure_name, procedure_desc, parameter_list,
4359                'P', null , null, null,
4360                spec_code, body_code);
4361 
4362      cn_utils.appindcr(body_code, '  l_mul_input_tbl            ' || 'cn_formula_common_pkg.mul_input_tbl_type; ');
4363      cn_utils.appindcr(body_code, '  p_rate                     NUMBER;');
4364      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
4365      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
4366      cn_utils.appindcr(body_code, '  l_input                    NUMBER; ');
4367      cn_utils.appindcr(body_code, '  l_input_string             VARCHAR2(30); ');
4368      cn_utils.appindcr(body_code, '  l_commission               NUMBER; ');
4369      cn_utils.appindcr(body_code, '  l_itd_target               NUMBER; ');
4370      cn_utils.appindcr(body_code, '  l_itd_payment              NUMBER; ');
4371      cn_utils.appindcr(body_code, '  l_processed_date           DATE; ');
4372      cn_utils.appindcr(body_code, '  p_period_id                NUMBER; ');
4373      cn_utils.appindcr(body_code, '  p_start_date               DATE; ');
4374      cn_utils.appindcr(body_code, '  p_process_all_flag         VARCHAR2(1) := ''Y'';');
4375      cn_utils.appendcr(body_code, 'BEGIN');
4376 
4377      cn_utils.appindcr(body_code, '  g_calc_type := ''FORECAST'';');
4378 
4379      cn_utils.appindcr(body_code, '  p_period_id := p_start_period_id; ');
4380 
4381      -- when initialize _itd global variables, set the period_id to be the first period in the forecasting interval
4382 
4383 
4384      /*cn_utils.appindcr(body_code, '  p_period_id := cn_api.get_acc_period_id(trunc(sysdate));');
4385      cn_utils.appindcr(body_code, '  if (p_period_type = ''Q'') then ');
4386      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_quarter_start_period_id(p_quota_id, p_period_id);');
4387      cn_utils.appindcr(body_code, '  elsif (p_period_type = ''Y'') then ');
4388      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_start_period_id(p_quota_id, p_period_id);');
4389      cn_utils.appindcr(body_code, '  end if; ');*/
4390 
4391 
4392      calc_init(spec_code, body_code);
4393 
4394      /*cn_utils.appindcr(body_code, '  if (p_period_type = ''Q'') then ');
4395      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_quarter_end_period_id(p_quota_id, p_period_id);');
4396      cn_utils.appindcr(body_code, '  elsif (p_period_type = ''Y'') then ');
4397      cn_utils.appindcr(body_code, '    p_period_id := cn_formula_common_pkg.get_end_period_id(p_quota_id, p_period_id);');
4398      cn_utils.appindcr(body_code, '  end if; ');*/
4399 
4400 
4401      cn_utils.appindcr(body_code, '  p_period_id := p_forecast_period_id; ');
4402 
4403      FOR input IN f_inputs LOOP
4404         OPEN dim_type(input.rate_dim_sequence);
4405         FETCH dim_type INTO l_dim_unit_code;
4406         CLOSE dim_type;
4407 
4408         l_sql_where := 'WHERE 1 = 1 ';
4409 
4410         OPEN sql_statement(input.f_calc_sql_exp_id);
4411         FETCH sql_statement INTO l_sql_select, l_sql_from;
4412         CLOSE sql_statement;
4413 
4414         l_sql_select := REPLACE(l_sql_select, 'ForecastAmount', 'p_forecast_amount');
4415         l_sql_select := 'select ' || lower_str(l_sql_select);
4416         l_sql_from := 'from ' || lower(l_sql_from);
4417 
4418         construct_sql_from_where(l_sql_select, l_sql_from, l_sql_where);
4419 
4420         split_long_sql(body_code, l_sql_select, 'SELECT');
4421         IF (l_dim_unit_code = 'STRING') THEN
4422            cn_utils.appindcr(body_code, ' into l_input_string ');
4423          ELSE
4424            cn_utils.appindcr(body_code, ' into l_input ');
4425         END IF;
4426         split_long_sql(body_code, l_sql_from, 'FROM');
4427         split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4428 
4429         cn_utils.appindcr(body_code, '  l_input := nvl(l_input, 0); ');
4430         cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').rate_dim_sequence := ' || input.rate_dim_sequence || ';');
4431 
4432         IF (l_dim_unit_code = 'STRING') THEN
4433            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').input_string := l_input_string;' );
4434          ELSE
4435            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').input_amount := l_input;' );
4436            cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter ||').amount := l_input;' );
4437         END IF;
4438 
4439         IF (input.cumulative_flag = 'N') THEN --IF (g_cumulative_flag = 'N') THEN
4443               cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := l_input;');
4440            IF (input.split_flag <> 'N') THEN --IF (g_split_flag <> 'N') THEN
4441               cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;');
4442             ELSE
4444            END IF;
4445          ELSE
4446            IF g_itd_flag = 'N' THEN
4447               IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4448                  IF (g_trx_group_code = 'GROUP') THEN
4449                     cn_utils.appindcr(body_code, ' l_mul_input_tbl(' || l_counter || ').base_amount := 0;');
4450                   ELSE
4451                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('
4452                                       ||input.rate_dim_sequence||');' );
4453                  END IF;
4454                ELSE
4455                  IF (g_trx_group_code = 'GROUP') THEN
4456                     cn_utils.appindcr(body_code, ' l_mul_input_tbl(' || l_counter || ').base_amount := l_input;');
4457                   ELSE
4458                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := g_input_achieved_itd('||
4459                                       input.rate_dim_sequence||')+ l_input;' );
4460                  END IF;
4461               END IF;
4462             ELSE
4463               cn_utils.appendcr(body_code);
4464               IF g_pq_target_flag OR g_spq_target_flag  THEN
4465                  IF g_pq_target_flag THEN
4466                     cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_pq_itd_target ');
4467                     cn_utils.appindcr(body_code, '                              ( p_period_id, p_quota_id  );' );
4468                  END IF;
4469 
4470                  IF g_spq_target_flag THEN
4471                     cn_utils.appindcr(body_code, '  l_itd_target := cn_formula_common_pkg.get_spq_itd_target ');
4472                     cn_utils.appindcr(body_code, '                         ( p_salesrep_id, p_srp_plan_assign_id, ' );
4473                     cn_utils.appindcr(body_code, '                           p_period_id, p_quota_id             ); ');
4474 
4475                     IF (g_rollover_flag = 'Y') THEN
4476                        cn_utils.appindcr(body_code, ' SELECT l_itd_target + total_rollover ');
4477                        cn_utils.appindcr(body_code, '   INTO l_itd_target ');
4478                        cn_utils.appindcr(body_code, '   FROM cn_srp_period_quotas_all ');
4479                        cn_utils.appindcr(body_code, '  WHERE srp_plan_assign_id = p_srp_plan_assign_id ');
4480                        cn_utils.appindcr(body_code, '    AND quota_id = p_quota_id ');
4481                        cn_utils.appindcr(body_code, '    AND period_id = p_period_id; ');
4482                     END IF;
4483                  END IF;
4484 
4485                  cn_utils.appendcr(body_code);
4486 
4487                  IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4488                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := (l_input + g_input_achieved_itd('
4489                                       ||input.rate_dim_sequence||')) ');
4490                     cn_utils.appindcr(body_code, '     /l_itd_target;' );
4491                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
4492                   ELSE
4493                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input / l_itd_target; ');
4494                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').base_amount := (l_input + g_input_achieved_itd('
4495                                       ||input.rate_dim_sequence||'))');
4496                     cn_utils.appindcr(body_code, '      /l_itd_target;' );
4497                  END IF;
4498                ELSE
4499                  IF (input.split_flag <> 'N') THEN --IF g_split_flag <> 'N' THEN
4500                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input + g_input_achieved_itd('
4501                                       ||input.rate_dim_sequence||');' );
4502                     cn_utils.appindcr(body_code, '  l_mul_input_tbl(' || l_counter || ').base_amount := 0;' );
4503                   ELSE
4504                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').amount := l_input; ');
4505                     cn_utils.appindcr(body_code, '  l_mul_input_tbl('|| l_counter || ').base_amount := l_input + g_input_achieved_itd('
4506                                       ||input.rate_dim_sequence||');' );
4507                  END IF;
4508               END IF;
4509            END IF;
4510         END IF;
4511         cn_utils.appendcr(body_code);
4512         l_counter := l_counter+1;
4513      END LOOP;
4514 
4515      OPEN f_output;
4516      FETCH f_output INTO l_calc_sql_exp_id;
4517      CLOSE f_output;
4518 
4519      OPEN sql_statement(l_calc_sql_exp_id);
4520      FETCH sql_statement INTO l_sql_select, l_sql_from;
4521 
4522      l_sql_select := REPLACE(l_sql_select, 'ForecastAmount', 'p_forecast_amount');
4523      l_sql_select := lower_str( 'select ' || l_sql_select);
4524      l_sql_from := lower('from ' || l_sql_from);
4525      l_sql_where := 'where 1 = 1 ';
4526 
4527      g_rate_flag := check_sql_stmt_existence(l_sql_select, 'rateresult');
4528 
4529      l_operator_position := search_delimiter_select(l_sql_select, 1);
4530      IF l_operator_position > 0 THEN
4531         l_operator := substr(l_sql_select, l_operator_position, 1);
4532      END IF;
4533 
4534      IF g_rate_flag THEN
4535         -- get processed date (end_date of the last period in the forecast date range)
4536         cn_utils.appindcr(body_code, '      SELECT end_date into l_processed_date ');
4537         cn_utils.appindcr(body_code, '        FROM cn_acc_period_statuses_v             ');
4538         cn_utils.appindcr(body_code, '        WHERE period_id = p_period_id       ');
4542         cn_utils.appindcr(body_code, '                 p_period_id, p_quota_id , g_split_flag,g_itd_flag, ' );
4539         cn_utils.appindcr(body_code, '          AND org_id = g_org_id;       ');
4540 
4541         cn_utils.appindcr(body_code, '  cn_formula_common_pkg.get_rates( p_salesrep_id, p_srp_plan_assign_id,');
4543         cn_utils.appindcr(body_code, '                 l_processed_date, g_number_dim,l_mul_input_tbl, ');
4544         cn_utils.appindcr(body_code, '                 g_formula_id, p_rate, l_rate_tier_id, l_tier_split ); ');
4545      END IF;
4546 
4547      construct_sql_from_where(l_sql_select, l_sql_from, l_sql_where);
4548      handle_output_sql_select(l_sql_select, l_sql_from, l_sql_where);
4549      split_long_sql(body_code, l_sql_select, 'SELECT');
4550      cn_utils.appindcr(body_code, '  into l_commission');
4551      split_long_sql(body_code, l_sql_from, 'FROM');
4552      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4553      cn_utils.appendcr(body_code);
4554      cn_utils.appindcr(body_code, '   l_commission := nvl(l_commission, 0); ');
4555 
4556      IF g_itd_flag = 'Y' THEN
4557         IF (g_pq_payment_flag OR g_spq_payment_flag) THEN
4558            IF (g_rate_flag) THEN
4559               IF (l_operator_position > 0) THEN
4560                  cn_utils.appindcr(body_code, '  l_commission := p_rate ' || l_operator || ' l_commission - g_commission_payed_itd;');
4561               END IF;
4562             ELSE
4563               cn_utils.appindcr(body_code, '  l_commission := l_commission - g_commission_payed_itd;');
4564            END IF;
4565          ELSE
4566            cn_utils.appindcr(body_code, '  g_output_achieved := l_commission;');
4567            IF (g_rate_flag) THEN
4568               IF (l_operator_position > 0) THEN
4569                  cn_utils.appindcr(body_code, '  l_commission := p_rate ' || l_operator ||
4570                                    ' (g_output_achieved_itd + g_output_achieved) - g_commission_payed_itd;');
4571                ELSE
4572                  cn_utils.appindcr(body_code, '  l_commission := p_rate - g_commission_payed_itd;');
4573               END IF;
4574             ELSE
4575               cn_utils.appindcr(body_code, '  l_commission := g_output_achieved_itd + g_output_achieved - g_commission_payed_itd;');
4576            END IF;
4577         END IF;
4578      END IF;
4579 
4580      cn_utils.appindcr(body_code, '  x_projected_commission := l_commission;' );
4581 
4582      cn_utils.appindcr(body_code, 'EXCEPTION ' );
4583      cn_utils.appindcr(body_code, '  when others then ');
4584      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4585      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4586      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_forecast_commission.exception'', ');
4587      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4588      cn_utils.appindcr(body_code, '     end if; ');
4589      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in get_forecast_commission: ''); ');
4590      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
4591      cn_utils.proc_end(procedure_name, 'N', body_code );
4592 EXCEPTION
4593   WHEN OTHERS THEN
4594     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4595       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4596                      'cn.plsql.cn_formula_gen_pkg.get_forecast_commission.exception',
4597          	          sqlerrm);
4598     end if;
4599     raise;
4600 END get_forecast_commission;
4601 
4602 --- Private Function used only by get_estimated_payout procedure for SFP
4603 FUNCTION get_sql_select(p_piped_sql_select IN VARCHAR2) RETURN VARCHAR2
4604 IS
4605   l_piped_sql_select varchar2(8000);
4606   l_piped_sql_select_copy varchar2(8000);
4607   l_sql_select varchar2(8000);
4608 
4609   l_pipe_found number := 0;
4610   l_dot_found number := 0;
4611   l_index number := 0;
4612   l_begin number:= 1;
4613 
4614   l_segment VARCHAR2(4000);
4615   l_segment_orig VARCHAR2(4000);
4616 
4617   l_revenue VARCHAR2(30);
4618   l_unit VARCHAR2(30);
4619   l_target_replace VARCHAR2(1000);
4620 
4621 BEGIN
4622 
4623 l_piped_sql_select := p_piped_sql_select;
4624 l_piped_sql_select_copy := l_piped_sql_select;
4625 
4626  LOOP
4627 
4628   l_pipe_found := INSTR(l_piped_sql_select_copy,'|', l_begin);
4629 
4630   IF l_pipe_found = 0
4631    THEN
4632        exit;
4633   END IF;
4634 
4635   l_segment_orig := substr(l_piped_sql_select_copy, l_begin, l_pipe_found-l_begin );
4636 
4637 --  dbms_output.put_line(l_segment_orig);
4638 
4639   l_dot_found := INSTR(l_segment_orig,'.');
4640 
4641   IF l_dot_found <> 0 THEN
4642 
4643   l_revenue := 'UPPER(''REVENUE'')';
4644   l_unit := 'UPPER(''UNIT'')';
4645 
4646   l_target_replace :=  'DECODE(qc.quota_unit_code,' || l_revenue ||
4647   ', ( ROUND(NVL(sqc.prorated_amount,0)/NVL(pt.rounding_factor, 1))*NVL(pt.rounding_factor, 1)) ,'
4648   || l_unit ||
4649   ', (NVL(sqc.prorated_amount,0)),( ROUND(NVL(sqc.prorated_amount,0)/NVL(pt.rounding_factor, 1))*NVL(pt.rounding_factor, 1))  ) ' ;
4650 
4651      SELECT DECODE(l_segment_orig,
4652                    'CH.TRANSACTION_AMOUNT', 'p_est_achievement',
4653                    'CH.QUANTITY', 'p_est_achievement',
4654                    'CSQA.TARGET', l_target_replace,
4655                    'CSQA.PAYMENT_AMOUNT', 'payment_amount',
4656                    l_segment_orig
4657                    )
4658      INTO l_segment
4659      FROM dual;
4660 
4661      IF l_segment_orig = l_segment THEN
4662         l_segment := '1';
4663      END IF;
4664 
4665      l_piped_sql_select := REPLACE(l_piped_sql_select,l_segment_orig, l_segment);
4666   END IF;
4667 
4668   l_begin := l_pipe_found + 1;
4669 
4670  END LOOP;
4674   RETURN l_sql_select;
4671 
4672   l_sql_select := REPLACE(l_piped_sql_select,'|', '');
4673 
4675 
4676 EXCEPTION
4677   WHEN OTHERS THEN
4678     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4679       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4680                      'cn.plsql.cn_formula_gen_pkg.get_sql_select.exception',
4681          	          sqlerrm);
4682     end if;
4683     raise;
4684 END;
4685 
4686 --   construct the get_estimated_payout procdure which will be invoked by SFP quota modeling
4687 PROCEDURE get_estimated_payout(spec_code        IN OUT NOCOPY cn_utils.code_type,
4688                                body_code        IN OUT NOCOPY cn_utils.code_type )
4689 IS
4690     procedure_name        cn_obj_procedures_v.name%TYPE;
4691     procedure_desc        cn_obj_procedures_v.description%TYPE;
4692     parameter_list        cn_obj_procedures_v.parameter_list%TYPE;
4693 
4694     l_sql_select        VARCHAR2(8000);
4695     l_piped_sql_select  VARCHAR2(8000);
4696     l_sql_from          VARCHAR2(4000);
4697     l_sql_where         VARCHAR2(4000);
4698     l_calc_sql_exp_id   NUMBER;
4699     l_output_exp_id     NUMBER;
4700     l_modeling_flag     VARCHAR2(30);
4701 
4702 
4703     CURSOR output IS
4704        SELECT output_exp_id, modeling_flag
4705          FROM cn_calc_formulas_all
4706          WHERE calc_formula_id = g_formula_id
4707            AND org_id = g_org_id;
4708 
4709     CURSOR input IS
4710        SELECT calc_sql_exp_id
4711          FROM cn_formula_inputs_all
4712          WHERE calc_formula_id = g_formula_id
4713           AND org_id = g_org_id;
4714 
4715     CURSOR sql_statement(p_calc_sql_exp_id NUMBER) IS
4716        SELECT  dbms_lob.substr(piped_sql_select), dbms_lob.substr(sql_select), dbms_lob.substr(sql_from)
4717          FROM  cn_calc_sql_exps_all
4718          WHERE calc_sql_exp_id = p_calc_sql_exp_id;
4719 BEGIN
4720      OPEN output;
4721      FETCH output INTO l_output_exp_id, l_modeling_flag;
4722      CLOSE output;
4723 
4724      -- if it is not a modeling formula, then return
4725      IF (nvl(l_modeling_flag, 'N') <> 'Y') THEN
4726         RETURN;
4727      END IF;
4728 
4729      procedure_name := 'get_estimated_payout';
4730      procedure_desc := '   Called by Quota Modeling to calculate payout';
4731 
4732      parameter_list := 'p_srp_quota_cate_id IN NUMBER, p_est_achievement IN NUMBER, ';
4733      parameter_list := parameter_list || 'x_estimated_payout OUT NOCOPY NUMBER, x_return_status OUT NOCOPY VARCHAR2 ';
4734 
4735      proc_init(procedure_name, procedure_desc, parameter_list,
4736                'P', null , null, null,
4737                spec_code, body_code);
4738 
4739      cn_utils.appindcr(body_code, '  l_rate                     NUMBER;');
4740      cn_utils.appindcr(body_code, '  l_rate_tier_id             NUMBER;');
4741      cn_utils.appindcr(body_code, '  l_tier_split               NUMBER;');
4742      cn_utils.appindcr(body_code, '  l_amount                   NUMBER; ');
4743      cn_utils.appendcr(body_code, 'BEGIN');
4744      cn_utils.appendcr(body_code, '  x_return_status := fnd_api.g_ret_sts_success; ');
4745 
4746      OPEN input;
4747      FETCH input INTO l_calc_sql_exp_id;
4748      CLOSE input;
4749 
4750      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 ';
4751 
4752      OPEN sql_statement(l_calc_sql_exp_id);
4753      FETCH sql_statement INTO l_piped_sql_select, l_sql_select, l_sql_from;
4754      CLOSE sql_statement;
4755 
4756 
4757      l_sql_select := get_sql_select(l_piped_sql_select);
4758 
4759      l_sql_select := lower_str('select ' || l_sql_select);
4760      l_sql_from := lower('from cn_srp_quota_cates sqc, cn_role_details_v pt, cn_quota_categories qc');
4761 
4762      split_long_sql(body_code, l_sql_select, 'SELECT');
4763 
4764      cn_utils.appindcr(body_code, ' into l_amount ');
4765 
4766      split_long_sql(body_code, l_sql_from, 'FROM');
4767      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4768 
4769      OPEN sql_statement(l_output_exp_id);
4770      FETCH sql_statement INTO l_piped_sql_select, l_sql_select, l_sql_from;
4771      CLOSE sql_statement;
4772 
4773 
4774      l_sql_select := get_sql_select(l_piped_sql_select);
4775 
4776 
4777      l_sql_select :=  lower_str('select ' || l_sql_select);
4778 
4779      l_sql_from := lower('from cn_srp_quota_cates sqc, cn_role_details_v pt, cn_quota_categories qc');
4780      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 ';
4781      g_rate_flag := check_sql_stmt_existence(l_sql_select, 'rateresult');
4782      l_sql_select := REPLACE(l_sql_select, 'rateresult', 'l_rate');
4783 
4784      IF g_rate_flag THEN
4785         cn_utils.appindcr(body_code, '  cn_sfp_formula_cmn_pkg.get_rates( p_srp_quota_cate_id, ');
4786         cn_utils.appindcr(body_code, '                                    g_split_flag, ''N'', ' );
4787         cn_utils.appindcr(body_code, '                                    l_amount, ');
4788         cn_utils.appindcr(body_code, '                                    l_rate, l_rate_tier_id, l_tier_split ); ');
4789      END IF;
4790 
4791      split_long_sql(body_code, l_sql_select, 'SELECT');
4792      cn_utils.appindcr(body_code, '  into x_estimated_payout ');
4793      split_long_sql(body_code, l_sql_from, 'FROM');
4794      split_long_sql(body_code, l_sql_where || ';', 'WHERE');
4795      cn_utils.appendcr(body_code);
4796 
4797      cn_utils.appindcr(body_code, 'EXCEPTION ' );
4798      cn_utils.appindcr(body_code, '  when zero_divide then ');
4799      cn_utils.appindcr(body_code, '     x_return_status := ''Z''; ');
4800      cn_utils.appindcr(body_code, '  when others then ');
4801      cn_utils.appindcr(body_code, '     x_return_status := fnd_api.g_ret_sts_error; ');
4802      cn_utils.appindcr(body_code, '     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then ');
4803      cn_utils.appindcr(body_code, '       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, ');
4804      cn_utils.appindcr(body_code, '          ''cn.plsql.cn_formula_'||g_formula_id||'_pkg.get_estimated_payout.exception'', ');
4805      cn_utils.appindcr(body_code, '	          sqlerrm); ');
4806      cn_utils.appindcr(body_code, '     end if; ');
4807      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(''Exception occurs in get_estimated_payout: ''); ');
4808      cn_utils.appindcr(body_code, '     cn_message_pkg.debug(sqlerrm); ');
4809      cn_utils.proc_end(procedure_name, 'N', body_code );
4810 EXCEPTION
4811   WHEN OTHERS THEN
4812     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4813       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4814                      'cn.plsql.cn_formula_gen_pkg.get_estimated_payout.exception',
4815          	          sqlerrm);
4816     end if;
4817     raise;
4818 END get_estimated_payout;
4819 
4820 --   invoke all formula component constructors to create formula
4821 FUNCTION create_formula (p_formula_id        number) RETURN BOOLEAN IS
4822     package_name        cn_obj_packages_v.name%TYPE;
4823     package_type        cn_obj_packages_v.package_type%TYPE := 'FML';
4824     package_spec_id        cn_obj_packages_v.package_id%TYPE;
4825     package_body_id        cn_obj_packages_v.package_id%TYPE;
4826     package_spec_desc        cn_obj_packages_v.description%TYPE;
4827     package_body_desc        cn_obj_packages_v.description%TYPE;
4828     spec_code                cn_utils.code_type;
4829     body_code                cn_utils.code_type;
4830     dummy               NUMBER(7);
4831     l_module_id                number(15);
4832     l_repository_id        cn_repositories.repository_id%TYPE;
4833 BEGIN
4834 
4835    -- ADDED for bug 14230033
4836   IF ( ad_zd.get_edition('PATCH') IS NOT NULL ) THEN
4837      IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4838         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4839                     'cn.plsql.cn_formula_gen_pkg.create_formula',
4840 			    	'AD_ZD_DISABLED_FEATURE');
4841      END IF;
4842      RETURN FALSE;
4843   END IF;
4844 
4845    if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4846      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4847                     'cn.plsql.cn_formula_gen_pkg.create_formula.begin',
4848 			    	'Beginning of create_formula procedure ...');
4849    end if;
4850 
4851     cn_utils.set_org_id(g_org_id);
4852 
4853      SELECT repository_id
4854        INTO l_repository_id
4855        FROM cn_repositories_all
4856       WHERE org_id = g_org_id;
4857      package_name := 'cn_formula_' || abs(p_formula_id) || '_' || abs(g_org_id) || '_pkg';
4858 
4859      check_create_object(package_name, 'PKS', package_spec_id, l_repository_id);
4860      check_create_object(package_name, 'PKB', package_body_id, l_repository_id);
4861 
4862    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4863      FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4864                     'cn.plsql.cn_formula_gen_pkg.create_formula.statement',
4865 			    	'The formula package name is '||package_name);
4866    end if;
4867 
4868      cn_message_pkg.debug('The formula package name is ' ||package_name);
4869 
4870      generate_init(p_formula_id);
4871 
4872      -- Added for 11.5.10 formula performance Enhancment
4873      -- populate all necessary plsql tables with details
4874      -- of tables and columns used in all the expressions
4875      -- of this formula
4876      init_tab_column_list(p_formula_id);
4877 
4878    if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4879      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4880                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4881 			    	'After generate_init in create_formula');
4882    end if;
4883 
4884      cn_message_pkg.debug( 'after generate_init ');
4885 
4886      cn_utils.pkg_init(l_module_id, package_name, null, package_type, 'FORMULA',
4887                package_spec_id, package_body_id, package_spec_desc,
4888                package_body_desc, spec_code, body_code);
4889 
4890      pkg_variables(spec_code, body_code);
4891 
4892      IF g_formula_type = 'C' THEN
4893         get_input(spec_code, body_code);
4894         cn_message_pkg.debug( 'after get_input');
4895         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4896           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4897                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4898 			    	'After generating get_input in create_formula');
4899         end if;
4900 
4901 
4902         get_perf(spec_code, body_code);
4903         cn_message_pkg.debug( 'after get_perf ');
4904         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4905           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4906                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4907 			    	'After generating get_perf in create_formula');
4908         end if;
4909 
4910         get_commission(spec_code, body_code);
4911         cn_message_pkg.debug( 'after get_commission');
4912         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4913           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4914                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4915 			    	'After generating get_commission in create_formula');
4916         end if;
4917      END IF;
4918 
4919      IF g_formula_type = 'C' THEN
4920         calculate_quota(spec_code, body_code);
4921         cn_message_pkg.debug( 'after calculate_quota ');
4922         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4923           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4924                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4925 			    	'After generating calculate_quota in create_formula');
4926         end if;
4927       ELSIF g_formula_type = 'B' THEN
4928         calculate_bonus_quota(spec_code, body_code);
4929         cn_message_pkg.debug( 'after calculate_bonus_quota ');
4930         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4931           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4932                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4933 			    	'After generating calculate_bonus_quota in create_formula');
4934         end if;
4935      END IF;
4936 
4937      IF (g_trx_group_code = 'INDIVIDUAL' AND g_itd_flag = 'N' AND g_cumulative_flag = 'N' AND g_formula_type = 'C') THEN
4938         get_result(spec_code, body_code);
4939         cn_message_pkg.debug( 'after get_result ');
4940         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4941           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4942                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4943 			    	'After generating get_result in create_formula');
4944         end if;
4945      END IF;
4946 
4947      IF g_trx_group_code = 'GROUP' THEN
4948         update_revclass_perf(spec_code, body_code);
4949         cn_message_pkg.debug( 'after update_revclass_perf ');
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.progress',
4953 			    	'After generating update_revclass_perf in create_formula');
4954         end if;
4955      END IF;
4956 
4957      IF (g_formula_type = 'C') THEN
4958         get_forecast_commission(spec_code, body_code);
4959         cn_message_pkg.debug( 'after get_forecast_commission');
4960         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4961           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4962                     'cn.plsql.cn_formula_gen_pkg.create_formula.progress',
4963 			    	'After generating get_forecast_commission in create_formula');
4964         end if;
4965      END IF;
4966 
4967      get_estimated_payout(spec_code, body_code);
4968 
4969      cn_utils.pkg_end(package_name, spec_code, body_code);
4970 
4971      cn_utils.unset_org_id;
4972      RETURN TRUE;
4973 
4974      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4975           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
4976                     'cn.plsql.cn_formula_gen_pkg.create_formula.end',
4977 			    	'End of create_formula');
4978      end if;
4979 EXCEPTION
4980   when others then
4981     cn_utils.unset_org_id;
4982     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
4983       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
4984                      'cn.plsql.cn_formula_gen_pkg.parse.exception',
4985          	          sqlerrm);
4986     end if;
4987     raise;
4988 END create_formula;
4989 
4990   -- API name         : generate_formula
4991   -- Type        : Private.
4992   -- Pre-reqs        :
4993   -- Usage        :
4994   --
4995   -- Desc         : create a formula package and store in cn_sources, then submit a concurrent
4996   --              spool the code to a file and get it compiled against the database.
4997   --
4998   -- Parameters        :
4999   --  IN        :  p_api_version       NUMBER      Require
5000   --                    p_init_msg_list     VARCHAR2    Optional (FND_API.G_FALSE)
5001   --                    p_commit               VARCHAR2    Optional (FND_API.G_FALSE)
5002   --                    p_validation_level  NUMBER      Optional (FND_API.G_VALID_LEVEL_FULL)
5003   --  OUT        :  x_return_status     VARCHAR2(1)
5004   --                    x_msg_count               NUMBER
5005   --                    x_msg_data               VARCHAR2(2000)
5009   --
5006   --  IN        :  p_formula_id        NUMBER(15)  Require
5007   --
5008   --  OUT       :  x_process_audit_id  NUMBER(15)
5010   --
5011   -- Version        : Current version        1.0
5012   --                  Initial version         1.0
5013   --
5014   -- Notes        :
5015   --
5016   -- End of comments
5017 PROCEDURE generate_formula
5018     ( p_api_version           IN  NUMBER,
5019       p_init_msg_list         IN  VARCHAR2 := FND_API.G_FALSE,
5020       p_commit                IN  VARCHAR2 := FND_API.G_FALSE,
5021       p_validation_level      IN  VARCHAR2 := FND_API.G_VALID_LEVEL_FULL,
5022       x_return_status         OUT NOCOPY VARCHAR2,
5023       x_msg_count             OUT NOCOPY NUMBER,
5024       x_msg_data              OUT NOCOPY VARCHAR2,
5025       p_formula_id            IN  NUMBER,
5026       p_org_id                IN  NUMBER,
5027       x_process_audit_id      OUT NOCOPY NUMBER
5028       )
5029 IS
5030     l_api_name       CONSTANT VARCHAR2(30) := 'Generate_Formula';
5031     l_api_version    CONSTANT NUMBER :=1.0;
5032 
5033     l_creation_status         BOOLEAN;
5034     l_request_id                NUMBER;
5035     l_file_name                VARCHAR2(200);
5036     l_call_status         BOOLEAN;
5037     l_dummy                          VARCHAR2(500);
5038     l_dev_phase                    VARCHAR2(80);
5039     l_dev_status                   VARCHAR2(80) := 'INCOMPLETE';
5040     l_status            BOOLEAN;
5041 
5042     sqlstring dbms_sql.varchar2s;
5043     empty_sqlstring dbms_sql.varchar2s;
5044     cursor1 INTEGER;
5045 
5046     i INTEGER;
5047     j INTEGER;
5048     new_line_flag BOOLEAN:=TRUE;
5049     retval number;
5050 
5051     l_pkg_object_id  NUMBER(15);
5052     l_error_count    NUMBER;
5053 
5054     l_formula_name   VARCHAR2(100);
5055 
5056     -- START Declaration for bug 12330815
5057 
5058     l_applsys_schema  VARCHAR2(30);
5059 
5060     CURSOR pkg_object_id (c_formula_name VARCHAR2, c_obj_type VARCHAR2, c_org_id NUMBER) IS
5061     SELECT co.object_id, UPPER(co.name) name
5062            FROM cn_objects_all co
5063            WHERE co.name = c_formula_name
5064            AND co.object_type = c_obj_type
5065            AND co.org_id = c_org_id;
5066 
5067 
5068     CURSOR pkg_start (c_object_id NUMBER, c_org_id NUMBER) IS
5069     SELECT cs.line_no, cs.text
5070            FROM cn_source_all cs
5071            WHERE cs.object_id = c_object_id
5072            AND cs.org_id = c_org_id
5073            AND SUBSTR(cs.text,1,25) = 'CREATE OR REPLACE PACKAGE'
5074            ORDER BY cs.line_no;
5075 
5076     l_pkg_start_rec  pkg_start%ROWTYPE;
5077 
5078     CURSOR pkg_end (c_object_id NUMBER, c_org_id NUMBER) IS
5079     SELECT cs.line_no, cs.text
5080            FROM cn_source_all cs
5081            WHERE cs.object_id = c_object_id
5082            AND cs.org_id = c_org_id
5083            AND cs.text like 'END%'
5084            ORDER BY cs.line_no DESC;
5085 
5086     l_pkg_end_rec pkg_end%ROWTYPE;
5087 
5088     CURSOR fetch_code (c_object_id NUMBER, c_pkg_str NUMBER, c_pkg_end NUMBER) IS
5089     SELECT cs.text
5090            FROM cn_source_all cs
5091            WHERE cs.object_id = c_object_id
5092            AND cs.line_no BETWEEN c_pkg_str and c_pkg_end
5093            ORDER BY cs.line_no;
5094 
5095     -- END Declaration for bug 12330815
5096 
5097 
5098 BEGIN
5099      -- Standard Start of API savepoint
5100      SAVEPOINT        generate_formula;
5101 
5102    -- ADDED for bug 14230033
5103      IF ( ad_zd.get_edition('PATCH') IS NOT NULL ) THEN
5104         IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5105           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5106                     'cn.plsql.cn_formula_gen_pkg.generate_formula',
5107                                 'AD_ZD_DISABLED_FEATURE ...');
5108         END IF;
5109         x_return_status := 'E';
5110         x_msg_data      := 'AD_ZD_DISABLED_FEATURE';
5111         RETURN;
5112      END IF;
5113 
5114      -- Standard call to check for call compatibility.
5115      IF NOT FND_API.Compatible_API_Call ( l_api_version ,
5116                                           p_api_version ,
5117                                           l_api_name    ,
5118                                           G_PKG_NAME )
5119      THEN
5120         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5121      END IF;
5122 
5123      -- Initialize message list if p_init_msg_list is set to TRUE.
5124      IF FND_API.to_Boolean( p_init_msg_list ) THEN
5125         FND_MSG_PUB.initialize;
5126      END IF;
5127 
5128      --  Initialize API return status to success
5129      x_return_status := FND_API.G_RET_STS_SUCCESS;
5130 
5131 
5132      -- Codes start here
5133 
5134      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5135           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5136                     'cn.plsql.cn_formula_gen_pkg.generate_formula.begin',
5137 			    	'Beginning of generate_formula ...');
5138      end if;
5139 
5140      g_org_id := p_org_id;
5141 
5142      l_formula_name := 'cn_formula_'|| abs(p_formula_id) || '_' || abs(g_org_id) || '_pkg';
5143 
5144      l_status := create_formula(p_formula_id);
5145 
5146      IF l_status THEN   /* formula created successfully. Continue to install it. */
5147         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5148           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5149                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5150 			    	'Generate the PL/SQL code successfully in generate_formula');
5151         end if;
5152 
5153        -- start usage of ad_ddl from bug 12330815 ( repalce dbms_sql with ad_ddl)
5154 
5155          SELECT user
5156                 INTO l_applsys_schema
5157                 FROM dual;
5158 
5159          FOR c_pkg_spec IN pkg_object_id(l_formula_name, 'PKS', g_org_id) LOOP
5160 
5161              OPEN pkg_start(c_pkg_spec.object_id, g_org_id);
5162              FETCH pkg_start INTO l_pkg_start_rec;
5163              CLOSE pkg_start;
5164 
5165              OPEN pkg_end(c_pkg_spec.object_id, g_org_id);
5166              FETCH pkg_end INTO l_pkg_end_rec;
5167              CLOSE pkg_end;
5168 
5169              i := 0;
5170              FOR pkg_line IN fetch_code(c_pkg_spec.object_id, l_pkg_start_rec.line_no, l_pkg_end_rec.line_no) LOOP
5171                 i:= i + 1;
5172                 ad_ddl.build_package(pkg_line.text, i);
5173              END LOOP;
5174              ad_ddl.create_package(l_applsys_schema, 'CN', c_pkg_spec.name, 'FALSE', 1, i);
5175 
5176          END LOOP;
5177 
5178 
5179          FOR c_pkg_body IN pkg_object_id(l_formula_name, 'PKB', g_org_id) LOOP
5180 
5181              OPEN pkg_start(c_pkg_body.object_id, g_org_id);
5182              FETCH pkg_start INTO l_pkg_start_rec;
5183              CLOSE pkg_start;
5184 
5185              OPEN pkg_end(c_pkg_body.object_id, g_org_id);
5186              FETCH pkg_end INTO l_pkg_end_rec;
5187              CLOSE pkg_end;
5188 
5189              i := 0;
5190              FOR pkg_line IN fetch_code(c_pkg_body.object_id, l_pkg_start_rec.line_no, l_pkg_end_rec.line_no) LOOP
5191                  i := i + 1;
5192                  ad_ddl.build_package(pkg_line.text, i);
5193              END LOOP;
5194              ad_ddl.create_package(l_applsys_schema, 'CN', c_pkg_body.name, 'TRUE', 1, i);
5195 
5196          END LOOP;
5197 
5198 
5199        -- end usage of ad_ddl from bug 12330815
5200 
5201         -- check whether package is installed successfully
5202         SELECT  COUNT(*)
5203           INTO  l_error_count
5204           FROM user_errors
5205           WHERE name = 'CN_FORMULA_'|| abs(p_formula_id) || '_' || abs(g_org_id) || '_PKG'
5206           AND  TYPE IN ('PACKAGE', 'PACKAGE BODY');
5207 
5208         IF l_error_count = 0 THEN
5209            UPDATE cn_calc_formulas_all
5210               SET formula_status = 'COMPLETE'
5211             WHERE calc_formula_id = p_formula_id
5212               AND org_id = g_org_id;
5213 
5214            if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5215              FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5216                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5217 			    	'Compiled formula package successfullly in generate_formula');
5218            end if;
5219          ELSE
5220            UPDATE cn_calc_formulas_all
5221               SET formula_status = 'INCOMPLETE'
5222             WHERE calc_formula_id = p_formula_id
5223               AND org_id = g_org_id;
5224 
5225            x_return_status := FND_API.g_ret_sts_error;
5226            IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5227              THEN
5228               fnd_message.set_name('CN', 'CN_FORMULA_COMPILE_ERR');
5229               FND_MSG_PUB.ADD;
5230               if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5231                 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
5232                     'cn.plsql.cn_formula_gen_pkg.generate_formula.error',
5233 			    	FALSE);
5234               end if;
5235 
5236            END IF;
5237 
5238            if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5239              FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5240                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5241 			    	'Failed to Compile formula package in generate_formula');
5242            end if;
5243 
5244         END IF;
5245       ELSE  -- failed to created formula package
5246         if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5247           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5248                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5249 			    	'Failed to generate the PL/SQL code in generate_formula');
5250         end if;
5251 
5252         UPDATE cn_calc_formulas_all
5253            SET formula_status = 'INCOMPLETE'
5254          WHERE calc_formula_id = p_formula_id
5255            AND org_id = g_org_id;
5256 
5257         x_return_status := FND_API.g_ret_sts_error;
5258 
5259         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5260           THEN
5261            fnd_message.set_name('CN', 'CN_FORMULA_COMPILE_ERR');
5262            FND_MSG_PUB.ADD;
5263         END IF;
5264 
5265      END IF;
5266 
5267 
5268      if (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5269           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
5270                     'cn.plsql.cn_formula_gen_pkg.generate_formula.progress',
5271 			    	'End of generate_formula');
5272      end if;
5273 
5274      -- Standard check of p_commit.
5275      IF FND_API.To_Boolean( p_commit ) THEN
5276         COMMIT WORK;
5277      END IF;
5278 
5279      -- Standard call to get message count and if count is 1, get message info.
5280      FND_MSG_PUB.Count_And_Get
5281        ( p_count   =>  x_msg_count ,
5282          p_data    =>  x_msg_data  ,
5283          p_encoded => FND_API.G_FALSE
5284        );
5285 EXCEPTION
5286   WHEN FND_API.G_EXC_ERROR THEN
5287         ROLLBACK TO generate_formula;
5288         x_return_status := FND_API.G_RET_STS_ERROR ;
5289         FND_MSG_PUB.Count_And_Get
5290           (p_count   =>  x_msg_count ,
5291            p_data    =>  x_msg_data  ,
5292            p_encoded => FND_API.G_FALSE
5293            );
5294      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5295         ROLLBACK TO generate_formula;
5296         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5297         FND_MSG_PUB.Count_And_Get
5298           (p_count   =>  x_msg_count ,
5299            p_data    =>  x_msg_data  ,
5300            p_encoded => FND_API.G_FALSE
5301            );
5302      WHEN OTHERS THEN
5303         ROLLBACK TO generate_formula;
5304         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5305         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5306           THEN
5307            FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
5308         END IF;
5309         FND_MSG_PUB.Count_And_Get
5310           (p_count   =>  x_msg_count ,
5311            p_data    =>  x_msg_data  ,
5312            p_encoded => FND_API.G_FALSE
5313           );
5314 
5315     if (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
5316       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
5317                      'cn.plsql.cn_formula_gen_pkg.generate_formula.exception',
5318          	          sqlerrm);
5319     end if;
5320 END generate_formula;
5321 
5322 PROCEDURE generate_formula_conc(errbuf       OUT NOCOPY     VARCHAR2,
5323 		                retcode      OUT NOCOPY     NUMBER,
5324                                 p_org_id                    NUMBER)
5325 IS
5326    l_process_audit_id NUMBER;
5327    l_return_status    VARCHAR2(30);
5328    l_msg_count        NUMBER;
5329    l_msg_data         VARCHAR2(2000);
5330 
5331   TYPE cn_form_tab IS TABLE OF VARCHAR2(500);
5332   l_form_list cn_form_tab;
5333 
5334   CURSOR pkg_cur IS
5335      SELECT object_name stmt
5336      FROM user_objects
5337      WHERE object_name LIKE 'CN_FORMULA%PKG'
5338      AND SUBSTR(object_name, 12, 1)in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
5339      AND object_type = 'PACKAGE';
5340 
5341   CURSOR formulas IS
5342       SELECT calc_formula_id, org_id
5343 	FROM cn_calc_formulas
5344 	WHERE org_id = nvl(p_org_id, org_id);
5345 
5346   CURSOR compile_pkg_cur IS
5347      select object_name || ' ' ||
5348      decode(object_type, 'PACKAGE BODY','compile body','PACKAGE','compile') stmt
5349      from user_objects
5350      where object_name like 'CN_FORMULA%PKG'
5351      and substr(object_name, 12, 1)in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
5352      and object_type like 'PACKAGE%'
5353      and status = 'INVALID';
5354 
5355   CURSOR drop_pkg_cur IS
5356      select object_name stmt
5357      from user_objects
5358      where object_name like 'CN_FORMULA%PKG'
5359      and substr(object_name, 12, 1)in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
5360      and object_type like 'PACKAGE%'
5361      and status = 'INVALID';
5362 
5363 BEGIN
5364 
5365    -- ADDED for bug 14230033
5366   IF ( ad_zd.get_edition('PATCH') IS NOT NULL ) THEN
5367      retcode := 2;
5368      errbuf  := 'AD_ZD_DISABLED_FEATURE';
5369      RETURN;
5370   END IF;
5371 
5372   -- Code for bug 13835607
5373   -- Drop all the formula packages which existed in the prior release
5374   OPEN pkg_cur;
5375       FETCH pkg_cur BULK COLLECT INTO l_form_list;
5376   CLOSE pkg_cur;
5377 
5378   FOR i in 1..l_form_list.count LOOP
5379     BEGIN
5380       EXECUTE IMMEDIATE 'DROP PACKAGE '|| l_form_list(i);
5381     EXCEPTION
5382       WHEN OTHERS THEN
5383           NULL;
5384     END;
5385   END LOOP;
5386 
5387   -- Re-create the formula packages for the upgrade
5388    FOR formula IN formulas LOOP
5389       cn_formula_gen_pkg.generate_formula(p_api_version   => 1.0,
5390 					  x_return_status     => l_return_status,
5391 					  x_msg_count         => l_msg_count,
5392 					  x_msg_data          => l_msg_data,
5393 					  p_formula_id        => formula.calc_formula_id,
5394 					  p_org_id            => formula.org_id,
5395 					  x_process_audit_id  => l_process_audit_id
5396 					  );
5397    END LOOP;
5398 
5399    -- Try one round of compiling the invalid formula packages
5400    FOR i in compile_pkg_cur
5401    LOOP
5402      begin
5403       execute immediate 'alter package '|| i.stmt;
5404      exception
5405       when others then
5406 	    null;
5407      end;
5408    END LOOP;
5409 
5410    -- Drop the formula package if still invalid
5411    FOR i in drop_pkg_cur
5412    LOOP
5413      begin
5414       execute immediate 'drop package '|| i.stmt;
5415      exception
5416       when others
5417         then
5418 	  null;
5419      end;
5420    END LOOP;
5421 
5422    retcode := 0;
5423    errbuf := 'Batch runner completes successfully.';
5424 EXCEPTION
5425    WHEN OTHERS THEN
5426      retcode := 2;
5427      errbuf  := sqlerrm;
5428 END generate_formula_conc;
5429 
5430 END cn_formula_gen_pkg;