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