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