[Home] [Help]
PACKAGE BODY: APPS.OZF_FORECAST_UTIL_PVT
Source
1 PACKAGE BODY OZF_FORECAST_UTIL_PVT AS
2 /* $Header: ozfvfoub.pls 120.7 2006/10/04 20:56:27 mkothari noship $*/
3 /**
4 Fri Sep 29 2006:11/16 AM RSSHARMA Fixed bug # 5572679.Part MOAC fixes. Replaced retrieval of org_if FROM environment variable CLIENT_INFO by calling MO_GLOBAL package function.
5 Comprehensive fix remaing.
6 */
7 g_pkg_name CONSTANT VARCHAR2(30):='OZF_FORECAST_UTIL_PVT';
8
9 -----------------------------------------------------------
10 -- CF
11 -----------------------------------------------------------
12
13 OZF_DEBUG_HIGH_ON constant boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
14 OZF_DEBUG_LOW_ON constant boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
15 OZF_DEBUG_MEDIUM_ON constant boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
16
17 PROCEDURE get_dates ( p_period_type_id IN NUMBER,
18 p_time_id IN NUMBER,
19 x_record_type_id OUT NOCOPY NUMBER,
20 x_start_date OUT NOCOPY DATE,
21 x_end_date OUT NOCOPY DATE) IS
22
23
24 BEGIN
25 IF p_period_type_id = 128
26 THEN
27 --
28 x_record_type_id := 119;
29
30 SELECT start_date, end_date INTO x_start_date, x_end_date
31 FROM ozf_time_ent_year
32 WHERE ent_year_id = p_time_id;
33 --
34 ELSIF p_period_type_id = 64
35 THEN
36 --
37 x_record_type_id := 55;
38
39 SELECT start_date, end_date INTO x_start_date, x_end_date
40 FROM ozf_time_ent_qtr
41 WHERE ent_qtr_id = p_time_id;
42 --
43 ELSIF p_period_type_id = 32
44 THEN
45 --
46 x_record_type_id := 23;
47
48 SELECT start_date, end_date INTO x_start_date, x_end_date
49 FROM ozf_time_ent_period
50 WHERE ent_period_id = p_time_id;
51 --
52 ELSIF p_period_type_id = 16
53 THEN
54 --
55 x_record_type_id := 11;
56
57 SELECT start_date, end_date INTO x_start_date, x_end_date
58 FROM ozf_time_week
59 WHERE week_id = p_time_id;
60 --
61 ELSIF p_period_type_id = 1
62 THEN
63 --
64 x_record_type_id := 1;
65
66 SELECT start_date, end_date INTO x_start_date, x_end_date
67 FROM ozf_time_day
68 WHERE report_date_julian = p_time_id;
69 --
70 END IF;
71 END get_dates;
72
73
74 PROCEDURE get_sales ( p_obj_type IN VARCHAR2,
75 p_obj_id IN NUMBER,
76 p_product_attribute_context IN VARCHAR2,
77 p_product_attribute IN VARCHAR2,
78 p_product_attr_value IN VARCHAR2,
79 p_qualifier_grouping_no IN NUMBER,
80 p_period_number IN NUMBER,
81 p_forecast_id IN NUMBER,
82 x_sales OUT NOCOPY NUMBER ) AS
83
84
85 CURSOR periods_csr (p_object_id IN NUMBER)
86 IS
87 SELECT period_number,
88 start_date,
89 end_date,
90 period_type_id
91 FROM ozf_forecast_periods
92 WHERE obj_type = p_obj_type
93 AND obj_id = p_object_id
94 AND period_number = NVL(p_period_number, period_number)
95 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
96 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version ;
97
98 CURSOR sales_csr (p_as_of_date IN DATE,
99 p_record_type_id IN NUMBER )
100 IS
101 select SUM(sales.sales_qty)
102 from ozf_order_sales_sumry_mv sales,
103 ozf_time_rpt_struct rpt,
104 ( select cust.qualifier_grouping_no,
105 cust.cust_account_id,
106 decode ( count(cust.qualifier_grouping_no),
107 1, max(cust.site_use_code), null
108 ) site_use_code,
109 decode ( count(cust.qualifier_grouping_no),
110 1, max(cust.site_use_id), null
111 ) site_use_id,
112 prod.product_attribute_context,
113 prod.product_attribute,
114 prod.product_attr_value,
115 prod.product_id inventory_item_id
116 from ozf_forecast_customers cust,
117 ozf_forecast_products prod
118 where prod.obj_type = p_obj_type
119 and prod.obj_id = p_obj_id
120 and prod.obj_type = cust.obj_type
121 and prod.obj_id = cust.obj_id
122 group by cust.qualifier_grouping_no,
123 cust.cust_account_id,
124 prod.product_attribute_context,
125 prod.product_attribute,
126 prod.product_attr_value,
127 prod.product_id
128 ) cust_prod,
129 ozf_forecast_dimentions dim
130 where dim.obj_type = p_obj_type
131 and dim.obj_id = p_obj_id
132 AND dim.forecast_id = p_forecast_id
133 and dim.product_attribute_context = cust_prod.product_attribute_context
134 and dim.product_attribute = cust_prod.product_attribute
135 and dim.product_attr_value = cust_prod.product_attr_value
136 and dim.qualifier_grouping_no = cust_prod.qualifier_grouping_no
137 and sales.sold_to_cust_account_id = cust_prod.cust_account_id
138 and decode(cust_prod.site_use_code,
139 NULL,-99,
140 'BILL_TO',sales.bill_to_site_use_id,
141 sales.ship_to_site_use_id) = NVL(cust_prod.site_use_id, -99)
142 and sales.inventory_item_id = cust_prod.inventory_item_id
143 and rpt.report_date = p_as_of_date
144 and BITAND(rpt.record_type_id, p_record_type_id ) = rpt.record_type_id
145 and rpt.time_id = sales.time_id
146 and dim.product_attribute_context = NVL(p_product_attribute_context, dim.product_attribute_context)
147 and dim.product_attribute = NVL(p_product_attribute, dim.product_attribute)
148 and dim.product_attr_value = NVL(p_product_attr_value, dim.product_attr_value)
149 and dim.qualifier_grouping_no = NVL(p_qualifier_grouping_no, dim.qualifier_grouping_no) ;
150
151 -- inanaiah: R12 - for offer_code
152 /* CURSOR base_quantity_type_csr IS
153 SELECT base_quantity_type, offer_code
154 FROM ozf_act_forecasts_all
155 WHERE forecast_id = p_forecast_id;
156
157 CURSOR offerid_csr(p_offer_code IN VARCHAR2) IS
158 SELECT qp_list_header_id --offer_id
159 FROM ozf_offers off
160 WHERE off.offer_code = p_offer_code;
161 */
162
163 l_sales NUMBER := 0;
164 l_period_sales NUMBER := 0;
165
166 l_xtd_sales NUMBER := 0;
167 l_start_xtd NUMBER := 0;
168 l_end_xtd NUMBER := 0;
169
170 l_record_type_id NUMBER;
171 l_start_date DATE;
172 l_end_date DATE;
173
174 -- R12
175 -- l_base_quantity_type VARCHAR2(30);
176 -- l_offer_code VARCHAR2(30);
177 l_obj_id NUMBER := p_obj_id;
178
179 BEGIN
180
181 ----dbms_output.put_line('Obj_Type '|| p_obj_type);
182 ----dbms_output.put_line('Obj_Id '|| p_obj_id);
183
184 -- inanaiah: R12 - for offer code
185 -- appropriate offer_id will be passed as p_obj_id whenever basis is OFFER_CODE
186 /*
187 OPEN base_quantity_type_csr;
188 FETCH base_quantity_type_csr INTO l_base_quantity_type, l_offer_code;
189 CLOSE base_quantity_type_csr;
190
191 IF (l_base_quantity_type = 'OFFER_CODE')
192 THEN
193 OPEN offerid_csr(l_offer_code);
194 FETCH offerid_csr INTO l_obj_id;
195 CLOSE offerid_csr;
196 END IF;
197 */
198 FOR i IN periods_csr(l_obj_id)
199 LOOP
200 get_dates(i.period_type_id,
201 i.period_number,
202 l_record_type_id,
203 l_start_date,
204 l_end_date );
205
206 ----dbms_output.put_line('period_type_id '|| i.period_type_id );
207 ----dbms_output.put_line('period_number '|| i.period_number);
208 ----dbms_output.put_line('l_record_type_id '|| l_record_type_id );
209 ----dbms_output.put_line('l_start_date '|| l_start_date);
210 ----dbms_output.put_line('l_end_date '|| l_end_date);
211
212 IF i.start_date > l_start_date
213 THEN
214 -- Start Date is in the middle of the period
215 -- Sales for the period = XTD for End_Date - XTD for Start_Date
216 OPEN sales_csr(i.end_date, l_record_type_id);
217 FETCH sales_csr INTO l_end_xtd;
218 CLOSE sales_csr;
219
220 OPEN sales_csr(i.start_date, l_record_type_id);
221 FETCH sales_csr INTO l_start_xtd;
222 CLOSE sales_csr;
223
224 l_xtd_sales := l_end_xtd - l_start_xtd;
225 ELSE
226 -- Sales for the period is XTD as of End Date
227
228 OPEN sales_csr(i.end_date, l_record_type_id);
229 FETCH sales_csr INTO l_xtd_sales;
230 CLOSE sales_csr;
231
232 END IF;
233
234 ----dbms_output.put_line('l_end_xtd '||l_end_xtd );
235 ----dbms_output.put_line('l_start_xtd '|| l_start_xtd);
236 ----dbms_output.put_line('l_xtd_sales '|| l_xtd_sales);
237
238 l_sales := l_sales + l_xtd_sales;
239
240 END LOOP;
241
242 x_sales := l_sales;
243 ----dbms_output.put_line('x_Sales '|| x_sales);
244 END;
245
246 -- R12 modified
247 PROCEDURE create_forecast(p_api_version IN NUMBER,
248 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
249 p_commit IN VARCHAR2 := FND_API.g_false,
250 p_obj_type IN VARCHAR2,
251 p_obj_id IN NUMBER,
252 p_fcst_uom IN VARCHAR2,
253
254 p_start_date IN DATE,
255 p_end_date IN DATE,
256 p_base_quantity_type IN VARCHAR2,
257 p_base_quantity_ref IN VARCHAR2,
258 p_last_scenario_id IN NUMBER,
259 p_offer_code IN VARCHAR2,
260
261 x_forecast_id IN OUT NOCOPY NUMBER,
262 x_activity_metric_id OUT NOCOPY NUMBER, -- 11510
263 x_return_status OUT NOCOPY VARCHAR2,
264 x_msg_count OUT NOCOPY NUMBER,
265 x_msg_data OUT NOCOPY VARCHAR2
266 ) AS
267
268 l_api_version CONSTANT NUMBER := 1.0;
269 l_api_name CONSTANT VARCHAR2(30) := 'Create_Forecast';
270 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
271 l_return_status VARCHAR2(1);
272
273 l_forecast_id NUMBER;
274 l_act_forecast_count NUMBER;
275 l_act_forecast_rec OZF_ActForecast_PVT.act_forecast_rec_type;
276
277 -- 11510
278 l_activity_metric_id NUMBER;
279
280 CURSOR c_act_met_id IS
281 SELECT ozf_act_metrics_all_s.NEXTVAL
282 FROM dual;
283
284 BEGIN
285
286 --
287 -- Initialize savepoint.
288 --
289
290 SAVEPOINT Create_Forecast;
291
292 IF FND_API.to_boolean(p_init_msg_list) THEN
293 FND_MSG_PUB.initialize;
294 END IF;
295
296 IF NOT FND_API.compatible_api_call(l_api_version,
297 p_api_version,
298 l_api_name,
299 g_pkg_name)
300 THEN
301 RAISE FND_API.g_exc_unexpected_error;
302 END IF;
303 x_return_status := FND_API.g_ret_sts_success;
304
305 IF x_forecast_id IS NULL
306 THEN
307 l_act_forecast_rec.arc_act_fcast_used_by := p_obj_type;
308 l_act_forecast_rec.act_fcast_used_by_id := p_obj_id;
309 l_act_forecast_rec.forecast_uom_code := p_fcst_uom;
310 l_act_forecast_rec.base_quantity := 0;
311
312 --R12 modified
313 ----dbms_output.put_line( ' -- Create_Forecast -- ');
314 ----dbms_output.put_line( ' -- ***** -- '||p_last_scenario_id);
315 IF p_last_scenario_id = 0
316 THEN
317 ----dbms_output.put_line( ' -- ***** -- ');
318 l_act_forecast_rec.last_scenario_id := 1;
319 ELSIF p_last_scenario_id IS NULL
320 THEN
321 ----dbms_output.put_line( ' -- ***** -- ');
322 l_act_forecast_rec.last_scenario_id := 1;
323 ELSE
324 ----dbms_output.put_line( ' -- 1 ***** -- ');
325 l_act_forecast_rec.last_scenario_id := p_last_scenario_id + 1;
326 END IF;
327
328 l_act_forecast_rec.base_quantity_type := p_base_quantity_type;
329 l_act_forecast_rec.base_quantity_ref := p_base_quantity_ref;
330 l_act_forecast_rec.base_quantity_start_date := p_start_date;
331 l_act_forecast_rec.base_quantity_end_date := p_end_date;
332 l_act_forecast_rec.offer_code := p_offer_code;
333
334 ----dbms_output.put_line( '-- 1.1 create_forecast --');
335 OZF_ActForecast_PVT.Create_ActForecast (
336 p_api_version => p_api_version,
337 x_return_status => l_return_status ,
338 x_msg_count => x_msg_count ,
339 x_msg_data => x_msg_data ,
340
341 p_act_forecast_rec => l_act_forecast_rec,
342 x_forecast_id => x_forecast_id );
343
344 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
345 RAISE FND_API.G_EXC_ERROR;
346 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
347 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
348 END IF;
349
350 ----dbms_output.put_line( '-- 1.2 --' || x_forecast_id );
351 -- 11510
352 l_forecast_id := x_forecast_id;
353 ELSE
354 l_forecast_id := x_forecast_id;
355 END IF;
356
357 OPEN c_act_met_id;
358 FETCH c_act_met_id INTO l_activity_metric_id;
359 CLOSE c_act_met_id;
360 ----dbms_output.put_line( '-- 1.3 --' || l_activity_metric_id );
361
362 INSERT INTO ozf_act_metrics_all (
363 ACTIVITY_METRIC_ID , LAST_UPDATE_DATE,
364 LAST_UPDATED_BY , CREATION_DATE,
365 CREATED_BY , LAST_UPDATE_LOGIN,
366 OBJECT_VERSION_NUMBER , ACT_METRIC_USED_BY_ID,
367 ARC_ACT_METRIC_USED_BY , APPLICATION_ID,
368 SENSITIVE_DATA_FLAG , METRIC_ID,
369 ORG_ID,
370 DIRTY_FLAG )
371 VALUES ( l_activity_metric_id , sysdate,
372 fnd_global.user_id , sysdate,
373 fnd_global.user_id , fnd_global.login_id,
374 1 , l_forecast_id,
375 'FCST' , 530 ,
376 'N' , 1,
377 MO_GLOBAL.GET_CURRENT_ORG_ID() ,
378 'Y');
379
380 x_activity_metric_id := l_activity_metric_id;
381
382 EXCEPTION
383
384 WHEN FND_API.G_EXC_ERROR THEN
385
386 ROLLBACK TO Create_Forecast;
387 x_return_status := FND_API.G_RET_STS_ERROR;
388 FND_MSG_PUB.Count_And_Get (
389 p_count => x_msg_count,
390 p_data => x_msg_data
391 );
392
393 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
394
395 ROLLBACK TO Create_Forecast;
396 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
397 FND_MSG_PUB.Count_And_Get (
398 p_count => x_msg_count,
399 p_data => x_msg_data
400 );
401
402 WHEN OTHERS THEN
403
404 ROLLBACK TO Create_Forecast;
405 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
406
407 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
408 FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
409 END IF;
410 FND_MSG_PUB.Count_And_Get (
411 p_count => x_msg_count,
412 p_data => x_msg_data
413 );
414
415
416 END create_forecast;
417
418
419 -----------------------------------------------------------
420 -- CD
421 -----------------------------------------------------------
422
423 PROCEDURE create_dimentions (
424 p_api_version IN NUMBER,
425 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
426 p_commit IN VARCHAR2 := FND_API.g_false,
427 p_obj_type IN VARCHAR2,
428 p_obj_id IN NUMBER,
429 p_forecast_id IN NUMBER,
430 x_return_status OUT NOCOPY VARCHAR2,
431 x_msg_count OUT NOCOPY NUMBER,
432 x_msg_data OUT NOCOPY VARCHAR2 )
433 AS
434
435 l_api_version CONSTANT NUMBER := 1.0;
436 l_api_name CONSTANT VARCHAR2(30) := 'create_dimentions';
437 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
438 l_return_status VARCHAR2(1);
439
440
441 TYPE DimCurType IS REF CURSOR;
442 dim_cv DimCurType;
443 excp_cv DimCurType;
444
445 -- RUP1: Modified qualifier_grouping_no for Camp Level
446 l_obj_dimentions VARCHAR2(30000) :=
447 'select distinct '||
448 ' prd.PRODUCT_ATTRIBUTE_CONTEXT, '||
449 ' prd.PRODUCT_ATTRIBUTE, '||
450 ' prd.PRODUCT_ATTR_VALUE, '||
451 ' (off.qp_list_header_id + mkt.QUALIFIER_GROUPING_NO) qualifier_grouping_no, '||
452 ' mkt.QUALIFIER_CONTEXT, '||
453 ' mkt.QUALIFIER_ATTRIBUTE, '||
454 ' mkt.QUALIFIER_ATTR_VALUE, '||
455 ' mkt.QUALIFIER_ATTR_VALUE_TO, '||
456 ' mkt.COMPARISON_OPERATOR_CODE '||
457 'from qp_pricing_attributes prd, '||
458 ' qp_qualifiers mkt, '||
459 ' ozf_act_offers off, '||
460 ' qp_list_lines ln '||
461 'where off.arc_act_offer_used_by = :l_object_type '||
462 'and off.act_offer_used_by_id = :l_object_id '||
463 'and off.qp_list_header_id = prd.list_header_id '||
464 'and prd.excluder_flag = ''N'' '||
465 'and prd.list_line_id = ln.list_line_id '||
466 'and (ln.start_date_active < SYSDATE '||
467 ' OR ln.start_date_active IS NULL) '||
468 'and (ln.end_date_active > SYSDATE '||
469 ' OR ln.end_date_active IS NULL) '||
470 'and prd.list_header_id = mkt.list_header_id ' ||
471 'and (mkt.start_date_active < SYSDATE '||
472 ' OR mkt.start_date_active IS NULL) '||
473 'and (mkt.end_date_active > SYSDATE '||
474 ' OR mkt.end_date_active IS NULL) '||
475 'and mkt.list_line_id = -1';
476
477
478
479 l_obj_exclusions VARCHAR2(30000) :=
480 'select exp.PRODUCT_ATTRIBUTE_CONTEXT, '||
481 ' exp.PRODUCT_ATTRIBUTE, '||
482 ' exp.PRODUCT_ATTR_VALUE, '||
483 ' prd.PRODUCT_ATTRIBUTE_CONTEXT, '||
484 ' prd.PRODUCT_ATTRIBUTE, '||
485 ' prd.PRODUCT_ATTR_VALUE ' ||
486 'from qp_pricing_attributes prd, '||
487 ' qp_pricing_attributes exp,'||
488 ' ozf_act_offers off '||
489 'where off.arc_act_offer_used_by = :l_object_type '||
490 'and off.act_offer_used_by_id = :l_object_id '||
491 'and off.qp_list_header_id = prd.list_header_id '||
492 'and prd.excluder_flag = ''Y'' '||
493 'and prd.list_line_id = exp.list_line_id '||
494 'and exp.excluder_flag = ''N'' ' ;
495
496 l_offer_dimentions VARCHAR2(30000) :=
497 'select distinct '||
498 ' prd.PRODUCT_ATTRIBUTE_CONTEXT, '||
499 ' prd.PRODUCT_ATTRIBUTE, '||
500 ' prd.PRODUCT_ATTR_VALUE, '||
501 ' mkt.QUALIFIER_GROUPING_NO, '||
502 ' mkt.QUALIFIER_CONTEXT, '||
503 ' mkt.QUALIFIER_ATTRIBUTE, '||
504 ' mkt.QUALIFIER_ATTR_VALUE, '||
505 ' mkt.QUALIFIER_ATTR_VALUE_TO, '||
506 ' mkt.COMPARISON_OPERATOR_CODE '||
507 'from qp_pricing_attributes prd, '||
508 ' qp_qualifiers mkt, '||
509 ' qp_list_lines ln '||
510 'where ''OFFR'' = :l_object_type '||
511 'and prd.list_header_id = :l_object_id '||
512 'and prd.excluder_flag = ''N'' '||
513 'and prd.list_line_id = ln.list_line_id '||
514 'and (ln.start_date_active < SYSDATE '||
515 ' OR ln.start_date_active IS NULL) '||
516 'and (ln.end_date_active > SYSDATE '||
517 ' OR ln.end_date_active IS NULL) '||
518 'and prd.list_header_id = mkt.list_header_id ' ||
519 'and (mkt.start_date_active < SYSDATE '||
520 ' OR mkt.start_date_active IS NULL) '||
521 'and (mkt.end_date_active > SYSDATE '||
522 ' OR mkt.end_date_active IS NULL) '||
523 'and mkt.list_line_id = -1';
524
525 l_offer_exclusions VARCHAR2(30000) :=
526 'select exp.PRODUCT_ATTRIBUTE_CONTEXT, '||
527 ' exp.PRODUCT_ATTRIBUTE, '||
528 ' exp.PRODUCT_ATTR_VALUE, '||
529 ' prd.PRODUCT_ATTRIBUTE_CONTEXT, '||
530 ' prd.PRODUCT_ATTRIBUTE, '||
531 ' prd.PRODUCT_ATTR_VALUE ' ||
532 'from qp_pricing_attributes prd, '||
533 ' qp_pricing_attributes exp '||
534 'where ''OFFR'' = :l_object_type '||
535 'and prd.list_header_id = :l_object_id '||
536 'and prd.excluder_flag = ''Y'' '||
537 'and prd.list_line_id = exp.list_line_id '||
538 'and exp.excluder_flag = ''N'' ' ;
539
540 l_lumpsum_offr_dim VARCHAR2(30000) :=
541 'select ''ITEM'' PRODUCT_ATTRIBUTE_CONTEXT ,'||
542 ' DECODE(a.level_type_code,''PRODUCT'', '||
543 ' ''PRICING_ATTRIBUTE1'', '||
544 ' ''PRICING_ATTRIBUTE2'') PRODUCT_ATTRIBUTE , '||
545 ' DECODE(a.level_type_code,''PRODUCT'', '||
546 ' a.inventory_item_id, '||
547 ' a.category_id) PRODUCT_ATTR_VALUE, '||
548 ' 10 QUALIFIER_GROUPING_NO , '||
549 ' ''CUSTOMER'' QUALIFIER_CONTEXT, '||
550 ' ''QUALIFIER_ATTRIBUTE2'' QUALIFIER_ATTRIBUTE, '||
551 ' b.qualifier_id QUALIFIER_ATTR_VALUE, '||
552 ' null QUALIFIER_ATTR_VALUE_TO, '||
553 ' ''='' COMPARISON_OPERATOR_CODE '||
554 'from ams_act_products a, '||
555 'ozf_offers b '||
556 'where a.arc_act_product_used_by = :l_object_type '||
557 'and a.act_product_used_by_id = :l_object_id '||
558 'and a.act_product_used_by_id = b.qp_list_header_id '||
559 'and a.excluded_flag = ''N'' ' ;
560
561 l_lumpsum_offr_exc VARCHAR2(30000) :=
562 'select ''ITEM'' product_attribute_context, '||
563 ' DECODE(a.level_type_code,''PRODUCT'', '||
564 ' ''PRICING_ATTRIBUTE1'', '||
565 ' ''PRICING_ATTRIBUTE2'') product_attribute , '||
566 ' DECODE(a.level_type_code,''PRODUCT'', '||
567 ' a.inventory_item_id, '||
568 ' a.category_id) product_attr_value, '||
569 ' ''ITEM'' product_attribute_context_e , '||
570 ' DECODE(b.level_type_code,''PRODUCT'', '||
571 ' ''PRICING_ATTRIBUTE1'', '||
572 ' ''PRICING_ATTRIBUTE2'') product_attribute_e , '||
573 ' DECODE(b.level_type_code,''PRODUCT'', '||
574 ' b.inventory_item_id, '||
575 ' b.category_id) product_attr_value_e '||
576 'from ams_act_products a, '||
577 ' ams_act_products b '||
578 'where a.arc_act_product_used_by = :l_object_type '||
579 'and a.act_product_used_by_id = :l_object_id '||
580 'and a.excluded_flag = ''N'' '||
581 'and b.arc_act_product_used_by = ''PROD'' '||
582 'and b.act_product_used_by_id = a.activity_product_id '||
583 'and b.excluded_flag = ''Y'' ';
584
585 -- 11510
586 l_wkst_dimentions VARCHAR2(30000) :=
587 'select prd.product_attribute_context, '||
588 ' prd.product_attribute, '||
589 ' prd.product_attr_value, '||
590 ' -1 qualifier_grouping_no, '||
591 ' mkt.qualifier_context, '||
592 ' mkt.qualifier_attribute, '||
593 ' mkt.qualifier_attr_value, '||
594 ' NULL qualifier_attr_value_to, '||
595 ' mkt.comparison_operator_code '||
596 'from ozf_worksheet_lines prd, '||
597 ' ozf_worksheet_qualifiers mkt '||
598 'where ''WKST'' = :l_object_type '||
599 'and mkt.worksheet_header_id = :l_object_id '||
600 'and mkt.worksheet_header_id = prd.worksheet_header_id '||
601 'and prd.exclude_flag = ''N'' ';
602
603 -- R12
604 l_vol_offer_dimensions VARCHAR2(30000) :=
605 'SELECT '||
606 ' ODP.PRODUCT_CONTEXT, '||
607 ' ODP.PRODUCT_ATTRIBUTE, '||
608 ' ODP.PRODUCT_ATTR_VALUE, '||
609 ' MKT.QUALIFIER_GROUPING_NO, '||
610 ' MKT.QUALIFIER_CONTEXT, '||
611 ' MKT.QUALIFIER_ATTRIBUTE, '||
612 ' MKT.QUALIFIER_ATTR_VALUE, '||
613 ' MKT.QUALIFIER_ATTR_VALUE_TO, '||
614 ' MKT.COMPARISON_OPERATOR_CODE '||
615 'FROM '||
616 ' OZF_OFFERS OFFR, '||
617 ' OZF_OFFER_DISCOUNT_LINES ODL, '||
618 ' OZF_OFFER_DISCOUNT_PRODUCTS ODP, '||
619 ' QP_QUALIFIERS MKT '||
620 'WHERE ''OFFR'' = :l_object_type '||
621 ' AND OFFR.QP_LIST_HEADER_ID = :l_object_id '||
622 ' AND OFFR.OFFER_ID = ODL.OFFER_ID '||
623 ' AND ODL.TIER_TYPE = ''PBH'' '||
624 ' AND ODP.OFFER_ID = OFFR.OFFER_ID '||
625 ' AND ODP.OFFER_DISCOUNT_LINE_ID = ODL.OFFER_DISCOUNT_LINE_ID '||
626 ' AND ODP.APPLY_DISCOUNT_FLAG = ''Y'' '||
627 ' AND OFFR.QP_LIST_HEADER_ID = MKT.LIST_HEADER_ID '||
628 ' AND (MKT.START_DATE_ACTIVE < SYSDATE OR MKT.START_DATE_ACTIVE IS NULL) '||
629 ' AND (MKT.END_DATE_ACTIVE > SYSDATE OR MKT.END_DATE_ACTIVE IS NULL) '||
630 ' AND MKT.LIST_LINE_ID = -1';
631
632 -- R12
633 l_vol_offer_exc VARCHAR2(30000) :=
634 ' SELECT '||
635 ' EXCODP.PRODUCT_CONTEXT, '||
636 ' EXCODP.PRODUCT_ATTRIBUTE, '||
637 ' EXCODP.PRODUCT_ATTR_VALUE, '||
638 ' PRDODP.PRODUCT_CONTEXT, '||
639 ' PRDODP.PRODUCT_ATTRIBUTE, '||
640 ' PRDODP.PRODUCT_ATTR_VALUE '||
641 'FROM '||
642 ' OZF_OFFERS OFFR, '||
643 ' OZF_OFFER_DISCOUNT_LINES ODL, '||
644 ' OZF_OFFER_DISCOUNT_PRODUCTS PRDODP, '||
645 ' OZF_OFFER_DISCOUNT_PRODUCTS EXCODP '||
646 'WHERE ''OFFR'' = :l_object_type '||
647 ' AND OFFR.QP_LIST_HEADER_ID = :l_object_id '||
648 ' AND OFFR.OFFER_ID = ODL.OFFER_ID '||
649 ' AND ODL.TIER_TYPE = ''PBH'' '||
650 ' AND EXCODP.OFFER_ID = OFFR.OFFER_ID '||
651 ' AND ODL.OFFER_DISCOUNT_LINE_ID = EXCODP.OFFER_DISCOUNT_LINE_ID '||
652 ' AND EXCODP.APPLY_DISCOUNT_FLAG = ''N'' '||
653 ' AND PRDODP.OFFER_ID = OFFR.OFFER_ID '||
654 ' AND ODL.OFFER_DISCOUNT_LINE_ID = PRDODP.OFFER_DISCOUNT_LINE_ID '||
655 ' AND PRDODP.APPLY_DISCOUNT_FLAG = ''Y'' ';
656
657
658
659
660 CURSOR get_offer_type(l_qp_list_header_id NUMBER) IS
661 SELECT offer_type
662 FROM ozf_offers
663 WHERE qp_list_header_id = l_qp_list_header_id;
664
665 l_offer_type VARCHAR2(30);
666
667 l_fcst_dimentions VARCHAR2(30000);
668 l_fcst_exclusions VARCHAR2(30000);
669
670 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
671 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
672 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
673
674 l_product_attribute_context_e ozf_forecast_prod_exclusions.product_attribute_context_e%TYPE;
675 l_product_attribute_e ozf_forecast_prod_exclusions.product_attribute_e%TYPE;
676 l_product_attr_value_e ozf_forecast_prod_exclusions.product_attr_value_e%TYPE;
677
678 l_qualifier_grouping_no ozf_forecast_dimentions.qualifier_grouping_no%TYPE;
679 l_qualifier_context ozf_forecast_dimentions.qualifier_context%TYPE;
680 l_qualifier_context_attribute ozf_forecast_dimentions.qualifier_attribute%TYPE;
681 l_qualifier_attr_value ozf_forecast_dimentions.qualifier_attr_value%TYPE;
682 l_qualifier_attr_value_to ozf_forecast_dimentions.qualifier_attr_value_to%TYPE;
683 l_comparison_operator_code ozf_forecast_dimentions.comparison_operator_code%TYPE;
684
685 l_count NUMBER :=0;
686 l_obj_type VARCHAR2(30);
687
688 BEGIN
689
690 IF (OZF_DEBUG_HIGH_ON) THEN
691
692 OZF_Utility_PVT.debug_message(l_full_name || ': Start Creating Dimentions');
693
694 END IF;
695
696 SAVEPOINT Create_Dimentions;
697
698 IF FND_API.to_boolean(p_init_msg_list) THEN
699 FND_MSG_PUB.initialize;
700 END IF;
701
702 IF NOT FND_API.compatible_api_call(l_api_version,
703 p_api_version,
704 l_api_name,
705 g_pkg_name)
706 THEN
707 RAISE FND_API.g_exc_unexpected_error;
708 END IF;
709
710 x_return_status := FND_API.g_ret_sts_success;
711 ----dbms_output.put_line( ' -- IN create_dimentions -- ');
712 IF p_obj_type IN ('CAMP', 'CSCH')
713 THEN
714
715 l_fcst_dimentions := l_obj_dimentions ;
716 l_fcst_exclusions := l_obj_exclusions ;
717
718 ELSIF (( p_obj_type = 'OFFR' ) OR (p_obj_type = 'DISP' ) )
719 THEN
720 ----dbms_output.put_line( ' -- IN create_dimentions, p_obj_type **** -- '||p_obj_type);
721 OPEN get_offer_type(p_obj_id);
722 FETCH get_offer_type INTO l_offer_type;
723 CLOSE get_offer_type ;
724 ----dbms_output.put_line( ' -- IN create_dimentions, l_offer_type **** -- '||l_offer_type);
725 IF l_offer_type = 'LUMPSUM'
726 THEN
727 l_fcst_dimentions := l_lumpsum_offr_dim ;
728 l_fcst_exclusions := l_lumpsum_offr_exc ;
729 ELSIF l_offer_type = 'VOLUME_OFFER'
730 THEN
731 l_fcst_dimentions := l_vol_offer_dimensions ;
732 l_fcst_exclusions := l_vol_offer_exc ;
733 ELSE
734 l_fcst_dimentions := l_offer_dimentions ;
735 l_fcst_exclusions := l_offer_exclusions ;
736 END IF;
737 ELSIF ( p_obj_type = 'WKST' )
738 THEN
739 -- 11510
740 l_fcst_dimentions := l_wkst_dimentions;
741
742 END IF;
743 ----dbms_output.put_line( ' -- IN create_dimentions, before deleting **** -- ');
744 -- inanaiah: R12 - delete records only of the forecast being refered otherwise the reference needed is lost when creating new version
745 DELETE FROM ozf_forecast_dimentions
746 WHERE obj_type = p_obj_type
747 AND obj_id = p_obj_id
748 AND forecast_id = p_forecast_id;
749
750 --R12 change
751 IF (p_obj_type = 'DISP')
752 THEN
753 l_obj_type := 'OFFR';
754 ELSE
755 l_obj_type := p_obj_type;
756 END IF;
757 ----dbms_output.put_line( ' -- IN create_dimentions, after deleting **** -- '||l_obj_type);
758 --OPEN dim_cv FOR l_fcst_dimentions USING p_obj_type, p_obj_id;
759
760 OPEN dim_cv FOR l_fcst_dimentions USING l_obj_type, p_obj_id;
761 LOOP
762
763 ----dbms_output.put_line( ' -- IN create_dimentions, B4 fetch dim_cv **** -- ');
764 FETCH dim_cv INTO
765 l_product_attribute_context,
766 l_product_attribute,
767 l_product_attr_value,
768 l_qualifier_grouping_no,
769 l_qualifier_context,
770 l_qualifier_context_attribute,
771 l_qualifier_attr_value,
772 l_qualifier_attr_value_to,
773 l_comparison_operator_code ;
774 ----dbms_output.put_line( ' -- IN create_dimentions, AFTER fetch dim_cv **** -- ');
775 EXIT WHEN dim_cv%NOTFOUND;
776
777 l_count := l_count + 1 ;
778 ----dbms_output.put_line( ' -- IN create_dimentions, B4 INSERT INTO ozf_forecast_dimentions **** -- ');
779 INSERT INTO ozf_forecast_dimentions(FORECAST_DIMENTION_ID,
780 OBJ_TYPE,
781 OBJ_ID,
782 PRODUCT_ATTRIBUTE_CONTEXT,
783 PRODUCT_ATTRIBUTE,
784 PRODUCT_ATTR_VALUE,
785 QUALIFIER_GROUPING_NO,
786 QUALIFIER_CONTEXT,
787 QUALIFIER_ATTRIBUTE,
788 QUALIFIER_ATTR_VALUE,
789 QUALIFIER_ATTR_VALUE_TO,
790 COMPARISON_OPERATOR_CODE,
791 SECURITY_GROUP_ID,
792 CREATION_DATE,
793 CREATED_BY,
794 LAST_UPDATE_DATE,
795 LAST_UPDATED_BY,
796 LAST_UPDATE_LOGIN,
797 FORECAST_ID)
798 VALUES ( ozf_forecast_dimentions_s.nextval,
799 p_obj_type,
800 p_obj_id,
801 l_product_attribute_context,
802 l_product_attribute,
803 l_product_attr_value,
804 l_qualifier_grouping_no,
805 l_qualifier_context,
806 l_qualifier_context_attribute,
807 l_qualifier_attr_value,
808 l_qualifier_attr_value_to,
809 l_comparison_operator_code,
810 NULL,
811 sysdate,
812 fnd_global.user_id,
813 sysdate,
814 fnd_global.user_id,
815 fnd_global.login_id,
816 p_forecast_id );
817
818 END LOOP;
819
820 CLOSE dim_cv;
821
822 IF l_count = 0
823 THEN
824 if p_obj_type <> 'WKST'
825 then
826 FND_MESSAGE.set_name('OZF', 'OZF_FCST_PROD_MKT_REQD');
827 FND_MSG_PUB.add;
828 RAISE FND_API.G_EXC_ERROR;
829 end if;
830 END IF;
831
832 -- 11510 : Worksheets will not have exclusions
833 IF ( p_obj_type <> 'WKST' ) THEN
834 ----dbms_output.put_line( ' -- IN create_dimentions, p_obj_type <> WKST **** -- ');
835 /* inanaiah: R12 - not deleted as the reference is needed when creating new version
836 DELETE FROM ozf_forecast_prod_exclusions
837 WHERE obj_type = p_obj_type
838 AND obj_id = p_obj_id ;
839 */
840
841 --OPEN excp_cv FOR l_fcst_exclusions USING p_obj_type, p_obj_id;
842 OPEN excp_cv FOR l_fcst_exclusions USING l_obj_type, p_obj_id;
843
844 LOOP
845 ----dbms_output.put_line( ' -- IN create_dimentions, B4 fetching excp_cv **** -- ');
846 FETCH excp_cv INTO
847 l_product_attribute_context,
848 l_product_attribute,
849 l_product_attr_value,
850 l_product_attribute_context_e,
851 l_product_attribute_e,
852 l_product_attr_value_e ;
853 ----dbms_output.put_line( ' -- IN create_dimentions, AFTER fetching excp_cv **** -- ');
854 EXIT WHEN excp_cv%NOTFOUND;
855 ----dbms_output.put_line( ' -- IN create_dimentions, B4 INSERT INTO ozf_forecast_prod_exclusions **** -- ');
856 INSERT INTO ozf_forecast_prod_exclusions(
857 FORECAST_PROD_EXCLUSION_ID,
858 OBJ_TYPE,
859 OBJ_ID,
860 PRODUCT_ATTRIBUTE_CONTEXT,
861 PRODUCT_ATTRIBUTE,
862 PRODUCT_ATTR_VALUE,
863 PRODUCT_ATTRIBUTE_CONTEXT_E,
864 PRODUCT_ATTRIBUTE_E,
865 PRODUCT_ATTR_VALUE_E,
866 SECURITY_GROUP_ID,
867 CREATION_DATE,
868 CREATED_BY,
869 LAST_UPDATE_DATE,
870 LAST_UPDATED_BY,
871 LAST_UPDATE_LOGIN)
872 VALUES ( ozf_forecast_prod_exclusions_s.nextval,
873 p_obj_type,
874 p_obj_id,
875 l_product_attribute_context,
876 l_product_attribute,
877 l_product_attr_value,
878 l_product_attribute_context_e,
879 l_product_attribute_e,
880 l_product_attr_value_e,
881 NULL,
882 sysdate,
883 fnd_global.user_id,
884 sysdate,
885 fnd_global.user_id,
886 fnd_global.login_id );
887
888
889 END LOOP;
890
891 CLOSE excp_cv;
892
893 END IF;
894
895 IF (OZF_DEBUG_HIGH_ON) THEN
896 OZF_Utility_PVT.debug_message(l_full_name || ': End Creating Dimentions');
897 END IF;
898
899 EXCEPTION
900
901 WHEN FND_API.G_EXC_ERROR THEN
902
903 ROLLBACK TO Create_Dimentions;
904 x_return_status := FND_API.G_RET_STS_ERROR;
905 FND_MSG_PUB.Count_And_Get (
906 p_count => x_msg_count,
907 p_data => x_msg_data
908 );
909
910 WHEN OTHERS THEN
911 x_return_status := FND_API.g_ret_sts_unexp_error;
912 ROLLBACK TO Create_Dimentions;
913
914 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
915 THEN
916 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
917 END IF;
918
919 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
920 p_count => x_msg_count,
921 p_data => x_msg_data);
922
923
924 END create_dimentions;
925
926
927 -----------------------------------------------------------
928 -- CP
929 -----------------------------------------------------------
930
931 PROCEDURE populate_fcst_products(
932 p_api_version IN NUMBER,
933 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
934 p_commit IN VARCHAR2 := FND_API.g_false,
935
936 p_obj_type IN VARCHAR2,
937 p_obj_id IN NUMBER,
938 p_forecast_id IN NUMBER,
939
940 x_return_status OUT NOCOPY VARCHAR2,
941 x_msg_count OUT NOCOPY NUMBER,
942 x_msg_data OUT NOCOPY VARCHAR2
943
944 )
945 IS
946
947 CURSOR c_products IS
948 SELECT DISTINCT
949 product_attribute_context,
950 product_attribute,
951 product_attr_value
952 FROM ozf_forecast_dimentions
953 WHERE obj_type = p_obj_type
954 AND obj_id = p_obj_id
955 AND forecast_id = p_forecast_id;
956
957 CURSOR c_excluded_products( p_product_attribute_context IN VARCHAR2,
958 p_product_attribute IN VARCHAR2,
959 p_product_attr_value IN VARCHAR2 ) IS
960 SELECT product_attribute_context_e,
961 product_attribute_e,
962 product_attr_value_e
963 FROM ozf_forecast_prod_exclusions
964 WHERE product_attribute_context = p_product_attribute_context
965 AND product_attribute = p_product_attribute
966 AND product_attr_value = p_product_attr_value
967 AND obj_type = p_obj_type
968 AND obj_id = p_obj_id ;
969 /*
970 CURSOR c_no_products IS
971 SELECT COUNT(*)
972 FROM ozf_forecast_dimentions
973 WHERE obj_type = p_obj_type
974 AND obj_id = p_obj_id;
975 */
976 CURSOR c_no_excl_products( p_product_attribute_context IN VARCHAR2,
977 p_product_attribute IN VARCHAR2,
978 p_product_attr_value IN VARCHAR2 ) IS
979 SELECT COUNT(*)
980 FROM ozf_forecast_prod_exclusions
981 WHERE product_attribute_context = p_product_attribute_context
982 AND product_attribute = p_product_attribute
983 AND product_attr_value = p_product_attr_value
984 AND obj_type = p_obj_type
985 AND obj_id = p_obj_id ;
986
987 l_api_version CONSTANT NUMBER := 1.0;
988 l_api_name CONSTANT VARCHAR2(30) := 'populate_fcst_products';
989 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
990 l_return_status VARCHAR2(1);
991
992 l_stmt_temp VARCHAR2(32000) := NULL;
993 l_stmt_product1 VARCHAR2(32000) := NULL;
994 l_stmt_product2 VARCHAR2(32000) := NULL;
995 l_stmt_product VARCHAR2(32000) := NULL;
996 l_stmt_denorm VARCHAR2(32000) := NULL;
997
998 l_pricing_attribute_id NUMBER;
999 l_list_line_id NUMBER;
1000
1001 -- l_no_products NUMBER;
1002 l_no_excl_products NUMBER;
1003 -- l_prod_index NUMBER;
1004 l_excl_index NUMBER;
1005 l_denorm_csr NUMBER;
1006 l_ignore NUMBER;
1007
1008
1009 BEGIN
1010
1011 IF (OZF_DEBUG_HIGH_ON) THEN
1012
1013 OZF_Utility_PVT.debug_message(l_full_name || ': Start populate products');
1014
1015 END IF;
1016
1017 SAVEPOINT Populate_Products;
1018
1019 IF FND_API.to_boolean(p_init_msg_list) THEN
1020 FND_MSG_PUB.initialize;
1021 END IF;
1022
1023 IF NOT FND_API.compatible_api_call(l_api_version,
1024 p_api_version,
1025 l_api_name,
1026 g_pkg_name)
1027 THEN
1028 RAISE FND_API.g_exc_unexpected_error;
1029 END IF;
1030
1031 x_return_status := FND_API.g_ret_sts_success;
1032
1033 delete from ozf_forecast_products
1034 where obj_type = p_obj_type
1035 and obj_id = p_obj_id ;
1036
1037 /*
1038 OPEN c_no_products;
1039 FETCH c_no_products INTO l_no_products;
1040 CLOSE c_no_products;
1041
1042 l_prod_index := 1;
1043 */
1044 FOR i IN c_products LOOP
1045 FND_DSQL.init;
1046 FND_DSQL.add_text('INSERT INTO ozf_forecast_products( ');
1047 FND_DSQL.add_text('forecast_product_id, ');
1048 FND_DSQL.add_text('obj_type, ');
1049 FND_DSQL.add_text('obj_id, ');
1050 FND_DSQL.add_text('product_attribute_context, ');
1051 FND_DSQL.add_text('product_attribute, ');
1052 FND_DSQL.add_text('product_attr_value, ');
1053 FND_DSQL.add_text('product_id, ');
1054 FND_DSQL.add_text('creation_date, ');
1055 FND_DSQL.add_text('created_by, ');
1056 FND_DSQL.add_text('last_update_date, ');
1057 FND_DSQL.add_text('last_updated_by , ');
1058 FND_DSQL.add_text('last_update_login )');
1059
1060 FND_DSQL.add_text(' SELECT ');
1061 FND_DSQL.add_text('ozf_forecast_products_s.nextval,');
1062 FND_DSQL.add_bind(p_obj_type);
1063 FND_DSQL.add_text(',');
1064 FND_DSQL.add_bind(p_obj_id);
1065 FND_DSQL.add_text(',');
1066 FND_DSQL.add_bind(i.product_attribute_context);
1067 FND_DSQL.add_text(',' );
1068 FND_DSQL.add_bind(i.product_attribute);
1069 FND_DSQL.add_text(',' );
1070 FND_DSQL.add_bind(i.product_attr_value);
1071 FND_DSQL.add_text(',' );
1072 FND_DSQL.add_text('a.product_id , ');
1073 FND_DSQL.add_text('sysdate , ');
1074 FND_DSQL.add_text('fnd_global.user_id ,');
1075 FND_DSQL.add_text('sysdate , ');
1076 FND_DSQL.add_text('fnd_global.user_id, ');
1077 FND_DSQL.add_text('fnd_global.login_id ');
1078
1079 FND_DSQL.add_text(' FROM (');
1080
1081 l_stmt_temp := null;
1082 l_stmt_product := NULL;
1083 l_stmt_product1 := NULL;
1084 l_stmt_denorm := NULL;
1085
1086 OPEN c_no_excl_products(i.product_attribute_context,
1087 i.product_attribute,
1088 i.product_attr_value);
1089 FETCH c_no_excl_products INTO l_no_excl_products;
1090 CLOSE c_no_excl_products;
1091
1092 -- FND_DSQL.add_text('(');
1093
1094 l_stmt_temp := OZF_OFFR_ELIG_PROD_DENORM_PVT.get_sql(
1095 p_context => i.product_attribute_context,
1096 p_attribute => i.product_attribute,
1097 p_attr_value_from => i.product_attr_value,
1098 p_attr_value_to => NULL,
1099 p_comparison => NULL,
1100 p_type => 'PROD'
1101 );
1102
1103 IF l_stmt_temp IS NULL THEN
1104 GOTO NEXT_PRODUCT;
1105 ELSE
1106 IF l_no_excl_products > 0 THEN
1107 FND_DSQL.add_text(' MINUS (');
1108 END IF;
1109 END IF;
1110
1111 IF l_stmt_product1 IS NULL THEN
1112 l_stmt_product1 := l_stmt_temp;
1113 END IF;
1114
1115 l_stmt_product2 := NULL;
1116 l_excl_index := 1;
1117
1118 FOR j IN c_excluded_products(i.product_attribute_context,
1119 i.product_attribute,
1120 i.product_attr_value )
1121 LOOP
1122
1123 l_stmt_temp := OZF_OFFR_ELIG_PROD_DENORM_PVT.get_sql(
1124 p_context => j.product_attribute_context_e,
1125 p_attribute => j.product_attribute_e,
1126 p_attr_value_from => j.product_attr_value_e,
1127 p_attr_value_to => NULL,
1128 p_comparison => NULL,
1129 p_type => 'PROD'
1130 );
1131
1132 IF l_stmt_temp IS NULL THEN
1133 EXIT;
1134 ELSE
1135 IF l_excl_index < l_no_excl_products THEN
1136 FND_DSQL.add_text(' UNION ');
1137 l_excl_index := l_excl_index + 1;
1138 ELSE
1139 FND_DSQL.add_text(')');
1140 END IF;
1141 END IF;
1142 END LOOP;
1143
1144 -- FND_DSQL.add_text(')');
1145 /*
1146 IF l_prod_index < l_no_products THEN
1147 FND_DSQL.add_text(' UNION ');
1148 l_prod_index := l_prod_index + 1;
1149 END IF;
1150 */
1151 FND_DSQL.add_text(') a');
1152
1153 l_denorm_csr := DBMS_SQL.open_cursor;
1154 FND_DSQL.set_cursor(l_denorm_csr);
1155 l_stmt_denorm := FND_DSQL.get_text(FALSE);
1156 DBMS_SQL.parse(l_denorm_csr, l_stmt_denorm, DBMS_SQL.native);
1157 FND_DSQL.do_binds;
1158 l_ignore := DBMS_SQL.execute(l_denorm_csr);
1159 dbms_sql.close_cursor(l_denorm_csr);
1160
1161 <<NEXT_PRODUCT>>
1162 NULL;
1163 END LOOP;
1164
1165 IF (OZF_DEBUG_HIGH_ON) THEN
1166
1167 OZF_Utility_PVT.debug_message(l_full_name || ': End populate products');
1168
1169 END IF;
1170
1171 EXCEPTION
1172
1173 WHEN OTHERS THEN
1174 x_return_status := FND_API.g_ret_sts_unexp_error;
1175 ROLLBACK TO Populate_Products;
1176
1177 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
1178 THEN
1179 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
1180 END IF;
1181
1182 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
1183 p_count => x_msg_count,
1184 p_data => x_msg_data);
1185
1186 END populate_fcst_products;
1187
1188
1189
1190 PROCEDURE get_site_type( p_context IN VARCHAR2,
1191 p_attribute IN VARCHAR2,
1192 p_type OUT NOCOPY VARCHAR2)
1193 IS
1194
1195 -- ?? What if the condition_id_column has a site_use_id/party_site_id with a
1196 -- different alias ??
1197 -- Ans: Implementation doc specifies to use these column names only
1198
1199 CURSOR check_for_site(l_context VARCHAR2, l_attribute VARCHAR2) IS
1200 SELECT DECODE(instr(upper(condition_id_column),'SITE_USE_ID'),
1201 0,DECODE(instr(upper(condition_id_column),'PARTY_SITE_ID'),0,'N','P'),
1202 'C')
1203 FROM ozf_denorm_queries
1204 WHERE query_for='ELIG'
1205 AND condition_id_column IS NOT NULL
1206 AND context = l_context
1207 AND attribute = l_attribute;
1208
1209 BEGIN
1210
1211 /* ************
1212 N = Not a site
1213 P = Party Site
1214 C = Customer Account Site
1215 ************ */
1216
1217 OPEN check_for_site(p_context,p_attribute);
1218 FETCH check_for_site INTO p_type ;
1219 CLOSE check_for_site;
1220
1221 END get_site_type;
1222
1223
1224 PROCEDURE populate_fcst_customers(
1225 p_api_version IN NUMBER,
1226 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
1227 p_commit IN VARCHAR2 := FND_API.g_false,
1228
1229 p_obj_type IN VARCHAR2,
1230 p_obj_id IN NUMBER,
1231 p_forecast_id IN NUMBER,
1232
1233 x_return_status OUT NOCOPY VARCHAR2,
1234 x_msg_count OUT NOCOPY NUMBER,
1235 x_msg_data OUT NOCOPY VARCHAR2
1236
1237 )
1238 IS
1239
1240 CURSOR c_groups IS
1241 SELECT distinct qualifier_grouping_no
1242 FROM ozf_forecast_dimentions
1243 WHERE obj_type = p_obj_type
1244 AND obj_id = p_obj_id
1245 AND forecast_id = p_forecast_id;
1246
1247 CURSOR c_get_site_use(p_site_use_id NUMBER) IS
1248 SELECT site_use_code
1249 FROM hz_cust_site_uses
1250 WHERE site_use_id = p_site_use_id;
1251
1252 CURSOR c_qualifiers(l_grouping_no NUMBER) IS
1253 SELECT DISTINCT
1254 qualifier_context,
1255 qualifier_attribute,
1256 qualifier_attr_value,
1257 qualifier_attr_value_to,
1258 comparison_operator_code
1259 FROM ozf_forecast_dimentions
1260 WHERE obj_type = p_obj_type
1261 AND obj_id = p_obj_id
1262 AND forecast_id = p_forecast_id
1263 AND qualifier_grouping_no = l_grouping_no ;
1264
1265 CURSOR c_no_qualifiers(l_grouping_no NUMBER) IS
1266 SELECT COUNT(*)
1267 FROM (SELECT DISTINCT
1268 qualifier_context,
1269 qualifier_attribute,
1270 qualifier_attr_value,
1271 qualifier_attr_value_to,
1272 comparison_operator_code
1273 FROM ozf_forecast_dimentions
1274 WHERE obj_type = p_obj_type
1275 AND obj_id = p_obj_id
1276 AND forecast_id = p_forecast_id
1277 AND qualifier_grouping_no = l_grouping_no) ;
1278
1279 l_api_version CONSTANT NUMBER := 1.0;
1280 l_api_name CONSTANT VARCHAR2(30) := 'populate_fcst_parties';
1281 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1282 l_return_status VARCHAR2(1);
1283
1284 l_stmt_temp VARCHAR2(32000) := NULL;
1285 l_stmt_group VARCHAR2(32000) := NULL;
1286 l_stmt_denorm VARCHAR2(32000) := NULL;
1287
1288 l_qualifier_grouping_no NUMBER := NULL;
1289 l_site_use_id VARCHAR2(40);
1290 l_site_type VARCHAR2(1);
1291 l_site_use_code VARCHAR2(30) := 'NULL';
1292
1293 l_no_qualifiers NUMBER;
1294 l_qualifier_index NUMBER;
1295 l_denorm_csr NUMBER;
1296 l_ignore NUMBER;
1297
1298 BEGIN
1299
1300 IF (OZF_DEBUG_HIGH_ON) THEN
1301
1302 OZF_Utility_PVT.debug_message(l_full_name || ': Start populate customers');
1303
1304 END IF;
1305 SAVEPOINT Populate_Customers;
1306
1307 IF FND_API.to_boolean(p_init_msg_list) THEN
1308 FND_MSG_PUB.initialize;
1309 END IF;
1310
1311 IF NOT FND_API.compatible_api_call(l_api_version,
1312 p_api_version,
1313 l_api_name,
1314 g_pkg_name)
1315 THEN
1316 RAISE FND_API.g_exc_unexpected_error;
1317 END IF;
1318
1319 x_return_status := FND_API.g_ret_sts_success;
1320
1321 DELETE FROM ozf_forecast_customers
1322 WHERE obj_type = p_obj_type
1323 AND obj_id = p_obj_id ;
1324
1325 FOR i IN c_groups LOOP
1326
1327 FND_DSQL.init;
1328 FND_DSQL.add_text('INSERT INTO ozf_forecast_customers( ');
1329 FND_DSQL.add_text('forecast_customer_id, ');
1330 FND_DSQL.add_text('obj_type, ');
1331 FND_DSQL.add_text('obj_id, ');
1332 FND_DSQL.add_text('qualifier_grouping_no, ');
1333 FND_DSQL.add_text('cust_account_id, ');
1334 FND_DSQL.add_text('site_use_id, ');
1335 FND_DSQL.add_text('site_use_code, ');
1336 FND_DSQL.add_text('creation_date, ');
1337 FND_DSQL.add_text('created_by, ');
1338 FND_DSQL.add_text('last_update_date, ');
1339 FND_DSQL.add_text('last_updated_by, ');
1340 FND_DSQL.add_text('last_update_login )');
1341
1342 /*
1343 FOR j IN c_qualifiers(i.qualifier_grouping_no) LOOP
1344 get_site_type(j.qualifier_context, j.qualifier_attribute, l_site_type);
1345
1346 IF ( l_site_type = 'P' ) THEN
1347 l_site_use_id := -1;
1348 ELSIF ( l_site_type = 'N') THEN
1349 l_site_use_id := NULL;
1350 ELSIF ( l_site_type = 'C') THEN
1351 l_site_use_id := j.qualifier_attr_value ;
1352
1353 OPEN c_get_site_use(j.qualifier_attr_value);
1354 FETCH c_get_site_use INTO l_site_use_code;
1355 CLOSE c_get_site_use;
1356 ELSE
1357 l_site_use_id := NULL;
1358 END IF ;
1359 END LOOP;
1360 */
1361 FND_DSQL.add_text(' SELECT ');
1362 FND_DSQL.add_text('ozf_forecast_customers_s.nextval ,');
1363 FND_DSQL.add_bind(p_obj_type);
1364 FND_DSQL.add_text(',');
1365 FND_DSQL.add_bind(p_obj_id);
1366 FND_DSQL.add_text(',');
1367 FND_DSQL.add_bind(i.qualifier_grouping_no);
1368 FND_DSQL.add_text(',');
1369 FND_DSQL.add_text('b.cust_account_id ,');
1370 FND_DSQL.add_text('b.site_use_id ,');
1371 FND_DSQL.add_text('b.site_use_code ,');
1372 -- FND_DSQL.add_bind(l_site_use_id);
1373 -- FND_DSQL.add_text(',');
1374 -- FND_DSQL.add_bind(l_site_use_code);
1375 -- FND_DSQL.add_text(',');
1376 FND_DSQL.add_text('sysdate , ');
1377 FND_DSQL.add_text('fnd_global.user_id ,');
1378 FND_DSQL.add_text('sysdate , ');
1379 FND_DSQL.add_text('fnd_global.user_id, ');
1380 FND_DSQL.add_text('fnd_global.login_id ');
1381
1382 FND_DSQL.add_text(' FROM (');
1383
1384 OPEN c_no_qualifiers(i.qualifier_grouping_no);
1385 FETCH c_no_qualifiers INTO l_no_qualifiers;
1386 CLOSE c_no_qualifiers;
1387
1388 l_stmt_group := NULL;
1389 l_site_type := NULL;
1390 l_qualifier_grouping_no := i.qualifier_grouping_no;
1391 l_qualifier_index := 1;
1392
1393 FOR j IN c_qualifiers(i.qualifier_grouping_no) LOOP
1394
1395
1396 l_stmt_temp := NULL;
1397
1398 l_stmt_temp := OZF_OFFR_ELIG_PROD_DENORM_PVT.get_sql(
1399 p_context => j.qualifier_context,
1400 p_attribute => j.qualifier_attribute,
1401 p_attr_value_from => j.qualifier_attr_value,
1402 p_attr_value_to => j.qualifier_attr_value_to,
1403 p_comparison => j.comparison_operator_code,
1404 p_type => 'ELIG'
1405 );
1406
1407 IF l_stmt_temp IS NULL
1408 THEN
1409 -- context-attribute pair does not return a party
1410 GOTO NEXT_CUSTOMER ;
1411 ELSE
1412
1413 IF l_qualifier_index < l_no_qualifiers THEN
1414 FND_DSQL.add_text(' INTERSECT ');
1415 l_qualifier_index := l_qualifier_index + 1;
1416 END IF;
1417 END IF;
1418
1419 <<NEXT_CUSTOMER>>
1420 null;
1421 END LOOP;
1422 FND_DSQL.add_text(') b');
1423
1424 -- FND_DSQL.add_text(' a,hz_cust_accounts b');
1425 -- FND_DSQL.add_text(' WHERE a.party_id = b.party_id ');
1426
1427 IF l_stmt_temp IS NULL
1428 THEN
1429 GOTO NEXT_GROUP ;
1430 END IF;
1431
1432 l_denorm_csr := DBMS_SQL.open_cursor;
1433 FND_DSQL.set_cursor(l_denorm_csr);
1434 l_stmt_denorm := FND_DSQL.get_text(FALSE);
1435 ams_utility_pvt.debug_message('stmt ' || l_stmt_denorm);
1436 DBMS_SQL.parse(l_denorm_csr, l_stmt_denorm, DBMS_SQL.native);
1437 FND_DSQL.do_binds;
1438 l_ignore := DBMS_SQL.execute(l_denorm_csr);
1439 dbms_sql.close_cursor(l_denorm_csr);
1440
1441 <<NEXT_GROUP>>
1442 NULL;
1443
1444 END LOOP;
1445
1446 EXCEPTION
1447 WHEN OTHERS THEN
1448 x_return_status := FND_API.g_ret_sts_unexp_error;
1449 ROLLBACK TO Populate_Customers;
1450
1451 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
1452 THEN
1453 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
1454 END IF;
1455
1456 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
1457 p_count => x_msg_count,
1458 p_data => x_msg_data);
1459 x_msg_data := SQLERRM;
1460 END populate_fcst_customers;
1461
1462 PROCEDURE populate_fcst_periods(
1463 p_api_version IN NUMBER,
1464 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
1465 p_commit IN VARCHAR2 := FND_API.g_false,
1466
1467 p_obj_type IN VARCHAR2,
1468 p_obj_id IN NUMBER,
1469 p_start_date IN DATE,
1470 p_end_date IN DATE,
1471 p_period_level IN VARCHAR2,
1472 p_forecast_id IN NUMBER,
1473
1474 x_return_status OUT NOCOPY VARCHAR2,
1475 x_msg_count OUT NOCOPY NUMBER,
1476 x_msg_data OUT NOCOPY VARCHAR2 )
1477 IS
1478
1479 l_api_version CONSTANT NUMBER := 1.0;
1480 l_api_name CONSTANT VARCHAR2(30) := 'populate_fcst_periods';
1481 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1482 l_return_status VARCHAR2(1);
1483
1484 CURSOR periods_csr (p_period_type_id IN NUMBER)
1485 IS
1486 SELECT DISTINCT
1487 decode(p_period_type_id ,
1488 1, report_date_julian,
1489 16, week_id,
1490 32, month_id,
1491 64, ent_qtr_id
1492 , ent_year_id ) time_id
1493 FROM ozf_time_day
1494 WHERE report_date BETWEEN p_start_date AND p_end_date;
1495
1496 CURSOR day_csr(l_time_id IN NUMBER) IS
1497 SELECT to_char(report_date) name, start_date, end_date
1498 FROM ozf_time_day
1499 WHERE report_date_julian = l_time_id;
1500
1501 CURSOR week_csr(l_time_id IN NUMBER) IS
1502 SELECT name, start_date, end_date
1503 FROM ozf_time_week
1504 WHERE week_id = l_time_id;
1505
1506 CURSOR month_csr(l_time_id IN NUMBER) IS
1507 SELECT name, start_date, end_date
1508 FROM ozf_time_ent_period
1509 WHERE ent_period_id = l_time_id;
1510
1511 CURSOR qtr_csr(l_time_id IN NUMBER) IS
1512 SELECT name, start_date, end_date
1513 FROM ozf_time_ent_qtr
1514 WHERE ent_qtr_id = l_time_id;
1515
1516 CURSOR year_csr(l_time_id IN NUMBER) IS
1517 SELECT name, start_date, end_date
1518 FROM ozf_time_ent_year
1519 WHERE ent_year_id = l_time_id;
1520
1521
1522 l_temp_start_date DATE;
1523 l_temp_end_date DATE;
1524 l_days NUMBER;
1525 l_period_number NUMBER ;
1526 l_period_type_id NUMBER;
1527 l_name VARCHAR2(100);
1528
1529 BEGIN
1530 IF (OZF_DEBUG_HIGH_ON)
1531 THEN
1532 OZF_Utility_PVT.debug_message(l_full_name || ': Start Populate Periods');
1533 END IF;
1534 SAVEPOINT Populate_Periods;
1535
1536 IF FND_API.to_boolean(p_init_msg_list) THEN
1537 FND_MSG_PUB.initialize;
1538 END IF;
1539
1540 IF NOT FND_API.compatible_api_call(l_api_version,
1541 p_api_version,
1542 l_api_name,
1543 g_pkg_name)
1544 THEN
1545 RAISE FND_API.g_exc_unexpected_error;
1546 END IF;
1547
1548
1549 x_return_status := FND_API.g_ret_sts_success;
1550
1551 IF ( ( p_start_date IS NULL) OR (p_end_date IS NULL) )
1552 THEN
1553 return;
1554 END IF;
1555
1556 -- inanaiah: R12 - delete records only of the forecast being refered otherwise the reference needed is lost when creating new version
1557 DELETE FROM ozf_forecast_periods
1558 WHERE obj_id = p_obj_id
1559 AND obj_type = p_obj_type
1560 AND forecast_id = p_forecast_id;
1561
1562 -- Period Type (day - 1, week 16, month - 32, quarter - 64, year - 128)
1563
1564 ----dbms_output.put_line( ' -- period -- '|| p_period_level );
1565 ----dbms_output.put_line( ' -- period: start date -- '|| p_start_date );
1566 ----dbms_output.put_line( ' -- period: end date -- '|| p_end_date );
1567 ----dbms_output.put_line( ' -- period: obj type -- '|| p_obj_type );
1568
1569 l_period_type_id := p_period_level;
1570
1571 -- FOR i IN periods_csr(l_period_type_id)
1572 FOR i IN periods_csr(p_period_level)
1573 LOOP
1574
1575 ----dbms_output.put_line( ' -- period -- '|| p_period_level );
1576
1577 l_period_number := i.time_id ;
1578 IF p_period_level = '1'
1579 THEN
1580 OPEN day_csr(i.time_id);
1581 FETCH day_csr INTO l_name, l_temp_start_date, l_temp_end_date;
1582 CLOSE day_csr;
1583 ELSIF p_period_level = '16'
1584 THEN
1585 OPEN week_csr(i.time_id);
1586 FETCH week_csr INTO l_name, l_temp_start_date, l_temp_end_date;
1587 CLOSE week_csr;
1588 ELSIF p_period_level = '32'
1589 THEN
1590 OPEN month_csr(i.time_id);
1591 FETCH month_csr INTO l_name, l_temp_start_date, l_temp_end_date;
1592 CLOSE month_csr;
1593 ELSIF p_period_level = '64'
1594 THEN
1595 OPEN qtr_csr(i.time_id);
1596 FETCH qtr_csr INTO l_name, l_temp_start_date, l_temp_end_date;
1597 CLOSE qtr_csr;
1598 ELSE
1599 OPEN year_csr(i.time_id);
1600 FETCH year_csr INTO l_name, l_temp_start_date, l_temp_end_date;
1601 CLOSE year_csr;
1602 END IF;
1603
1604 IF l_temp_start_date < p_start_date
1605 THEN
1606 l_temp_start_date := p_start_date;
1607 END IF;
1608
1609 IF l_temp_end_date > p_end_date
1610 THEN
1611 l_temp_end_date := p_end_date;
1612 END IF;
1613
1614 INSERT INTO ozf_forecast_periods (
1615 forecast_period_id,
1616 obj_type,
1617 obj_id,
1618 period_number,
1619 start_date,
1620 end_date,
1621 creation_date,
1622 created_by,
1623 last_update_date,
1624 last_updated_by,
1625 last_update_login,
1626 period_type_id,
1627 period_name,
1628 forecast_id)
1629 VALUES ( ozf_forecast_periods_s.nextval,
1630 p_obj_type,
1631 p_obj_id,
1632 l_period_number,
1633 l_temp_start_date,
1634 l_temp_end_date,
1635 sysdate,
1636 fnd_global.user_id,
1637 sysdate,
1638 fnd_global.user_id,
1639 fnd_global.login_id,
1640 l_period_type_id,
1641 l_name,
1642 p_forecast_id );
1643 END LOOP;
1644
1645 IF (OZF_DEBUG_HIGH_ON)
1646 THEN
1647 OZF_Utility_PVT.debug_message(l_full_name || ': End Populate Periods');
1648 END IF;
1649
1650 EXCEPTION
1651 WHEN OTHERS THEN
1652 x_return_status := FND_API.g_ret_sts_unexp_error;
1653 ROLLBACK TO Populate_Periods;
1654
1655 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
1656 THEN
1657 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
1658 END IF;
1659
1660 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
1661 p_count => x_msg_count,
1662 p_data => x_msg_data);
1663
1664
1665 END populate_fcst_periods;
1666
1667 -----------------------------------------------
1668 PROCEDURE create_fact(p_fact_type IN VARCHAR2,
1669 p_base_quantity IN NUMBER,
1670 p_fact_reference IN VARCHAR2,
1671 p_start_date IN DATE,
1672 p_end_date IN DATE,
1673 p_forecast_id IN NUMBER,
1674 p_activity_metric_id IN NUMBER,
1675 p_previous_fact_id IN NUMBER,
1676 p_root_fact_id IN NUMBER,
1677 p_node_id IN NUMBER ) IS
1678 BEGIN
1679 ----dbms_output.put_line( ' -- $$$$$$ create_fact-- ');
1680 INSERT INTO ozf_act_metric_facts_all (
1681 ACTIVITY_METRIC_FACT_ID , LAST_UPDATE_DATE ,
1682 LAST_UPDATED_BY , CREATION_DATE ,
1683 CREATED_BY , OBJECT_VERSION_NUMBER ,
1684 ACT_METRIC_USED_BY_ID , ARC_ACT_METRIC_USED_BY ,
1685 VALUE_TYPE , ACTIVITY_METRIC_ID ,
1686 TRANS_FORECASTED_VALUE , FUNCTIONAL_CURRENCY_CODE ,
1687 FUNC_FORECASTED_VALUE , ORG_ID ,
1688 DE_METRIC_ID , TIME_ID1 ,
1689 FROM_DATE , TO_DATE ,
1690 FACT_VALUE , FACT_PERCENT ,
1691 BASE_QUANTITY , ROOT_FACT_ID ,
1692 PREVIOUS_FACT_ID , FACT_TYPE ,
1693 FACT_REFERENCE , LAST_UPDATE_LOGIN,
1694 FORECAST_REMAINING_QUANTITY , NODE_ID)
1695 VALUES ( ozf_act_metric_facts_all_s.nextval , sysdate ,
1696 fnd_global.user_id , sysdate ,
1697 fnd_global.user_id , 1 ,
1698 p_forecast_id , 'FCST' ,
1699 'NUMERIC' , p_activity_metric_id,
1700 0 , 'NONE',
1701 0, MO_GLOBAL.GET_CURRENT_ORG_ID(),
1702 0 , 0 ,
1703 p_start_date , p_end_date ,
1704 NULL , NULL ,
1705 ROUND(NVL(p_base_quantity,0)) , p_root_fact_id ,
1706 p_previous_fact_id , p_fact_type ,
1707 p_fact_reference , fnd_global.login_id,
1708 0 , p_node_id);
1709
1710 -- ROUND(NVL(p_base_quantity,0)) , p_root_fact_id ,
1711
1712 END create_fact;
1713
1714 --------------------------------------------------
1715
1716 PROCEDURE create_dimention_facts (
1717 p_api_version IN NUMBER,
1718 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
1719 p_commit IN VARCHAR2 := FND_API.g_false,
1720 --R12 Baseline
1721 p_base_quantity_type IN VARCHAR2,
1722 p_obj_type IN VARCHAR2,
1723 p_obj_id IN NUMBER,
1724 p_forecast_id IN NUMBER,
1725 p_activity_metric_id IN NUMBER,
1726 p_dimention IN VARCHAR2,
1727 p_fcst_uom IN VARCHAR2,
1728 p_product_attribute_context IN VARCHAR2,
1729 p_product_attribute IN VARCHAR2,
1730 p_product_attr_value IN VARCHAR2,
1731 p_qualifier_grouping_no IN NUMBER,
1732 p_period_number IN NUMBER,
1733 p_previous_fact_id IN NUMBER,
1734 p_root_fact_id IN NUMBER,
1735 x_return_status OUT NOCOPY VARCHAR2,
1736 x_msg_count OUT NOCOPY NUMBER,
1737 x_msg_data OUT NOCOPY VARCHAR2)
1738 IS
1739
1740 l_api_version CONSTANT NUMBER := 1.0;
1741 l_api_name CONSTANT VARCHAR2(30) := 'create_dimention_facts';
1742 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1743 l_return_status VARCHAR2(1);
1744 /*
1745 CURSOR get_base_sales (l_product_attribute_context IN VARCHAR2,
1746 l_product_attribute IN VARCHAR2,
1747 l_product_attr_value IN VARCHAR2,
1748 l_qualifier_grouping_no IN NUMBER,
1749 l_period_number IN NUMBER )
1750 IS
1751 select SUM(inv_convert.inv_um_convert( bs.product_id,
1752 null,
1753 bs.qty,
1754 bs.order_uom,
1755 p_fcst_uom,
1756 null, null)
1757 )
1758 from ozf_forecast_dimentions dim,
1759 ozf_forecast_products prod,
1760 ozf_forecast_customers mkt,
1761 ozf_forecast_periods time,
1762 ams_base_sales_mv bs
1763 where dim.obj_type = p_obj_type
1764 and dim.obj_id = p_obj_id
1765 and dim.obj_type = prod.obj_type
1766 and dim.obj_id = prod.obj_id
1767 and dim.product_attribute_context = prod.product_attribute_context
1768 and dim.product_attribute = prod.product_attribute
1769 and dim.product_attr_value = prod.product_attr_value
1770 and dim.obj_type = mkt.obj_type
1771 and dim.obj_id = mkt.obj_id
1772 and dim.qualifier_grouping_no = mkt.qualifier_grouping_no
1773 and dim.obj_type = time.obj_type
1774 and dim.obj_id = time.obj_id
1775 and bs.product_id = prod.product_id
1776 and bs.cust_account_id = mkt.cust_account_id
1777 and bs.ordered_date between time.start_date and time.end_date
1778 and dim.product_attribute_context = NVL(l_product_attribute_context, dim.product_attribute_context)
1779 and dim.product_attribute = NVL(l_product_attribute, dim.product_attribute)
1780 and dim.product_attr_value = NVL(l_product_attr_value, dim.product_attr_value)
1781 and dim.qualifier_grouping_no = NVL(l_qualifier_grouping_no, dim.qualifier_grouping_no)
1782 and time.period_number = NVL(l_period_number,time.period_number)
1783 and DECODE(mkt.site_use_code,
1784 'BILL_TO', bs.bill_to_site_id,
1785 'SHIP_TO', bs.ship_to_site_id, 99) = NVL(mkt.SITE_USE_ID,99) ;
1786 */
1787
1788 CURSOR get_products(l_qualifier_grouping_no IN NUMBER) IS
1789 SELECT min(forecast_dimention_id) forecast_dimention_id,
1790 product_attribute_context,
1791 product_attribute,
1792 product_attr_value
1793 FROM ozf_forecast_dimentions
1794 WHERE obj_type = p_obj_type
1795 AND obj_id = p_obj_id
1796 AND forecast_id = p_forecast_id
1797 AND qualifier_grouping_no = NVL(l_qualifier_grouping_no, qualifier_grouping_no)
1798 GROUP BY
1799 product_attribute_context,
1800 product_attribute,
1801 product_attr_value ;
1802
1803 -- RUP1: Modified group by clause
1804
1805 CURSOR get_markets (l_product_attribute_context IN VARCHAR2,
1806 l_product_attribute IN VARCHAR2,
1807 l_product_attr_value IN VARCHAR2 )
1808 IS
1809 SELECT min(forecast_dimention_id) forecast_dimention_id,
1810 min(qualifier_grouping_no) qualifier_grouping_no
1811 FROM ozf_forecast_dimentions
1812 WHERE obj_type = p_obj_type
1813 AND obj_id = p_obj_id
1814 AND forecast_id = p_forecast_id
1815 AND product_attribute_context = NVL(l_product_attribute_context, product_attribute_context)
1816 AND product_attribute = NVL(l_product_attribute, product_attribute)
1817 AND product_attr_value = NVL(l_product_attr_value, product_attr_value)
1818 GROUP BY
1819 qualifier_context,
1820 qualifier_attribute,
1821 qualifier_attr_value,
1822 qualifier_grouping_no ;
1823
1824 -- R12 modified
1825 CURSOR get_periods IS
1826 SELECT forecast_period_id,
1827 period_number,
1828 --ADD_MONTHS(start_date,12) start_date,
1829 --ADD_MONTHS(end_date,12) end_date
1830 start_date,
1831 end_date
1832 FROM ozf_forecast_periods
1833 --WHERE obj_type = p_obj_type
1834 WHERE obj_type = 'DISP'
1835 AND obj_id = p_obj_id
1836 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
1837 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version
1838
1839 -- inanaiah: used to divide the time spread base sales
1840 CURSOR get_count_periods(p_id IN NUMBER) IS
1841 SELECT count(forecast_period_id)
1842 FROM ozf_forecast_periods
1843 WHERE obj_type = p_obj_type
1844 AND obj_id = p_id
1845 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
1846 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version
1847
1848 -- inanaiah: used to get the time spread base sales
1849 CURSOR get_sales_period(p_id IN NUMBER) IS
1850 SELECT period_number
1851 FROM ozf_forecast_periods
1852 WHERE obj_type = p_obj_type -- 'OFFR'
1853 AND obj_id = p_id
1854 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
1855 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version
1856
1857 --inanaiah: base_quantity_ref used for Offer_code basis
1858 CURSOR get_offerCPcomb IS
1859 SELECT base_quantity_ref, offer_code
1860 FROM ozf_act_forecasts_all
1861 WHERE forecast_id = p_forecast_id;
1862
1863 CURSOR offerid_csr(p_offer_code IN VARCHAR2) IS
1864 SELECT qp_list_header_id --offer_id
1865 FROM ozf_offers off
1866 WHERE off.offer_code = p_offer_code;
1867
1868
1869 l_base_sales NUMBER := 0;
1870 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
1871 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
1872 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
1873 l_qualifier_grouping_no NUMBER;
1874 l_period_number NUMBER;
1875
1876 -- R12
1877 l_count_periods NUMBER;
1878 l_total_base_sales NUMBER;
1879
1880 --- l_base_quantity_ref NUMBER; --- its varchar2 (08/25/2005)
1881 -- l_base_quantity_type NUMBER; --- its varchar2 (08/25/2005)
1882
1883 l_base_quantity_ref ozf_act_forecasts_all.BASE_QUANTITY_REF%TYPE;
1884
1885 l_offer_code VARCHAR2(30);
1886 l_obj_id NUMBER := p_obj_id;
1887
1888 /* Added for promotional goods offer */
1889
1890 l_node_id NUMBER;
1891 l_offer_type VARCHAR2(30) := 'OFFR';
1892
1893 CURSOR get_offer_type
1894 IS
1895 SELECT offer_type
1896 FROM ozf_offers
1897 WHERE qp_list_header_id = p_obj_id;
1898
1899 CURSOR get_promotion_type(l_product_attribute_context IN VARCHAR2,
1900 l_product_attribute IN VARCHAR2,
1901 l_product_attr_value IN VARCHAR2 )
1902 IS
1903 SELECT DECODE(qpl.list_line_type_code
1904 ,'DIS', DECODE(qpl.operand
1905 ,100 , DECODE(qpl.arithmetic_operator
1906 ,'%', 3
1907 , 2 )
1908 , 2)
1909 , 1) promotion_type
1910 FROM qp_list_lines qpl,
1911 qp_pricing_attributes qp
1912 WHERE qpl.list_header_id = p_obj_id
1913 AND qpl.list_line_id = qp.list_line_id
1914 AND qp.excluder_flag = 'N'
1915 AND qp.product_attribute_context = l_product_attribute_context
1916 AND qp.product_attribute = l_product_attribute
1917 AND qp.product_attr_value = l_product_attr_value
1918 ORDER BY promotion_type;
1919
1920 BEGIN
1921
1922 IF (OZF_DEBUG_HIGH_ON) THEN
1923 OZF_Utility_PVT.debug_message(l_full_name || ': Start Create Dimention Facts');
1924 END IF;
1925
1926 SAVEPOINT Create_Dimention_Facts;
1927
1928 IF FND_API.to_boolean(p_init_msg_list) THEN
1929 FND_MSG_PUB.initialize;
1930 END IF;
1931
1932 IF NOT FND_API.compatible_api_call(l_api_version,
1933 p_api_version,
1934 l_api_name,
1935 g_pkg_name)
1936 THEN
1937 RAISE FND_API.g_exc_unexpected_error;
1938 END IF;
1939
1940 x_return_status := FND_API.g_ret_sts_success;
1941
1942 --dbms_output.put_line( ' ##### 1. create_dimention_facts -- ');
1943 l_product_attribute_context := p_product_attribute_context;
1944 l_product_attribute := p_product_attribute;
1945 l_product_attr_value := p_product_attr_value;
1946 l_qualifier_grouping_no := p_qualifier_grouping_no ;
1947 l_period_number := p_period_number;
1948
1949 OPEN get_offerCPcomb;
1950 FETCH get_offerCPcomb INTO l_base_quantity_ref, l_offer_code;
1951 CLOSE get_offerCPcomb;
1952
1953 --offerid_csr
1954 IF (p_base_quantity_type = 'OFFER_CODE')
1955 THEN
1956 OPEN offerid_csr(l_offer_code);
1957 FETCH offerid_csr INTO l_obj_id;
1958 CLOSE offerid_csr;
1959 END IF;
1960
1961 IF (p_dimention = 'PRODUCT')
1962 THEN
1963 FOR i IN get_products(p_qualifier_grouping_no)
1964 LOOP
1965
1966 l_product_attribute_context := i.product_attribute_context;
1967 l_product_attribute := i.product_attribute;
1968 l_product_attr_value := i.product_attr_value;
1969 /*
1970 OPEN get_base_sales(l_product_attribute_context,
1971 l_product_attribute,
1972 l_product_attr_value,
1973 l_qualifier_grouping_no,
1974 l_period_number) ;
1975 FETCH get_base_sales INTO l_base_sales;
1976 CLOSE get_base_sales;
1977 */
1978
1979 --R12 Baseline
1980 IF (p_base_quantity_type = 'BASELINE')
1981 THEN
1982 l_base_sales := 0;
1983 ELSIF ((p_base_quantity_type = 'OFFER_CODE') AND (l_base_quantity_ref = to_char(1) ) )
1984 THEN
1985 l_base_sales := 0;
1986 ELSE
1987 get_sales(p_obj_type,
1988 l_obj_id,
1989 l_product_attribute_context,
1990 l_product_attribute,
1991 l_product_attr_value,
1992 l_qualifier_grouping_no,
1993 l_period_number,
1994 p_forecast_id,
1995 l_base_sales) ;
1996 END IF;
1997
1998 IF p_obj_type = 'OFFR'
1999 THEN
2000 OPEN get_offer_type;
2001 FETCH get_offer_type INTO l_offer_type;
2002 CLOSE get_offer_type;
2003 END IF;
2004
2005 IF l_offer_type = 'OID'
2006 THEN
2007
2008 FOR j IN get_promotion_type(l_product_attribute_context,
2009 l_product_attribute,
2010 l_product_attr_value)
2011 LOOP
2012 create_fact( p_dimention,
2013 l_base_sales,
2014 i.forecast_dimention_id,
2015 NULL, NULL,
2016 p_forecast_id,p_activity_metric_id,
2017 p_previous_fact_id, p_root_fact_id,
2018 j.promotion_type );
2019 l_base_sales := 0;
2020 END LOOP;
2021
2022 ELSE
2023 ----dbms_output.put_line('period_level ' || i.forecast_dimention_id);
2024 create_fact( p_dimention,
2025 l_base_sales,
2026 i.forecast_dimention_id,
2027 NULL, NULL,
2028 p_forecast_id,p_activity_metric_id,
2029 p_previous_fact_id, p_root_fact_id,
2030 l_node_id );
2031
2032 END IF;
2033
2034 END LOOP;
2035
2036 ELSIF (p_dimention = 'MARKET')
2037 THEN
2038
2039 FOR i IN get_markets(l_product_attribute_context,
2040 l_product_attribute,
2041 l_product_attr_value)
2042 LOOP
2043
2044 l_qualifier_grouping_no := i.qualifier_grouping_no;
2045 /*
2046 OPEN get_base_sales(l_product_attribute_context,
2047 l_product_attribute,
2048 l_product_attr_value,
2049 l_qualifier_grouping_no,
2050 l_period_number) ;
2051 FETCH get_base_sales INTO l_base_sales;
2052 CLOSE get_base_sales;
2053 */
2054 --R12 Baseline
2055 IF (p_base_quantity_type = 'BASELINE')
2056 THEN
2057 l_base_sales := 0;
2058 ELSIF ((p_base_quantity_type = 'OFFER_CODE') AND (l_base_quantity_ref = to_char(1) ) )
2059 THEN
2060 l_base_sales := 0;
2061 ELSE
2062 get_sales(p_obj_type,
2063 l_obj_id,
2064 l_product_attribute_context,
2065 l_product_attribute,
2066 l_product_attr_value,
2067 l_qualifier_grouping_no,
2068 l_period_number,
2069 p_forecast_id,
2070 l_base_sales) ;
2071 END IF;
2072
2073 create_fact( p_dimention,
2074 l_base_sales,
2075 i.forecast_dimention_id,
2076 NULL,NULL,
2077 p_forecast_id,p_activity_metric_id,
2078 p_previous_fact_id, p_root_fact_id,
2079 l_node_id );
2080 END LOOP;
2081
2082 ELSIF (p_dimention = 'TIME')
2083 THEN
2084 --R12 Baseline
2085 IF (p_base_quantity_type = 'BASELINE')
2086 THEN
2087 l_base_sales := 0;
2088 ELSIF ((p_base_quantity_type = 'OFFER_CODE') AND (l_base_quantity_ref = to_char(1) ) )
2089 THEN
2090 l_base_sales := 0;
2091 ELSE
2092 OPEN get_count_periods(l_obj_id);
2093 FETCH get_count_periods INTO l_count_periods;
2094 CLOSE get_count_periods;
2095
2096 FOR i IN get_sales_period(l_obj_id)
2097 LOOP
2098 get_sales(p_obj_type,
2099 l_obj_id,
2100 l_product_attribute_context,
2101 l_product_attribute,
2102 l_product_attr_value,
2103 l_qualifier_grouping_no,
2104 i.period_number,
2105 p_forecast_id,
2106 l_base_sales) ;
2107
2108 l_total_base_sales := l_total_base_sales + l_base_sales;
2109 END LOOP;
2110
2111 -- inanaiah: divide the total base sales evenly among the periods
2112 l_base_sales := ROUND(l_total_base_sales / l_count_periods);
2113
2114 END IF; -- IF (p_base_quantity_type
2115
2116
2117 FOR i IN get_periods
2118 LOOP
2119 create_fact( p_dimention,
2120 l_base_sales,
2121 i.forecast_period_id, -- i.period_number,
2122 i.start_date,i.end_date,
2123 p_forecast_id,p_activity_metric_id,
2124 p_previous_fact_id, p_root_fact_id,
2125 l_node_id );
2126 END LOOP;
2127
2128 END IF;
2129
2130 IF (OZF_DEBUG_HIGH_ON) THEN
2131 OZF_Utility_PVT.debug_message(l_full_name || ': End Create Dimention Facts');
2132 END IF;
2133
2134 EXCEPTION
2135
2136 WHEN OTHERS THEN
2137 x_return_status := FND_API.g_ret_sts_unexp_error;
2138 ROLLBACK TO Create_Dimention_Facts;
2139
2140 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
2141 THEN
2142 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2143 END IF;
2144
2145 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
2146 p_count => x_msg_count,
2147 p_data => x_msg_data);
2148
2149 END create_dimention_facts;
2150
2151
2152 PROCEDURE create_fcst_facts(
2153 p_api_version IN NUMBER,
2154 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
2155 p_commit IN VARCHAR2 := FND_API.g_false,
2156
2157 --R12 Baseline
2158 p_base_quantity_type IN VARCHAR2,
2159
2160 p_obj_type IN VARCHAR2,
2161 p_obj_id IN NUMBER,
2162 p_forecast_id IN NUMBER,
2163 p_activity_metric_id IN NUMBER,
2164
2165 p_level IN VARCHAR2,
2166 p_dimention IN VARCHAR2,
2167 p_fcst_uom IN VARCHAR2,
2168
2169 p_start_date IN DATE,
2170 p_end_date IN DATE,
2171
2172 x_return_status OUT NOCOPY VARCHAR2,
2173 x_msg_count OUT NOCOPY NUMBER,
2174 x_msg_data OUT NOCOPY VARCHAR2 )
2175 IS
2176
2177 l_api_version CONSTANT NUMBER := 1.0;
2178 l_api_name CONSTANT VARCHAR2(30) := 'create_fcst_facts';
2179 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2180
2181 l_return_status VARCHAR2(1);
2182 l_msg_count number(10);
2183 l_msg_data varchar2(2000);
2184
2185 CURSOR level_one_facts IS
2186 SELECT activity_metric_fact_id,
2187 fact_reference,
2188 fact_type
2189 FROM ozf_act_metric_facts_all
2190 WHERE arc_act_metric_used_by = 'FCST'
2191 AND act_metric_used_by_id = p_forecast_id
2192 AND previous_fact_id IS NULL
2193 AND root_fact_id IS NULL;
2194
2195 CURSOR level_two_facts(p_previous_fact_id IN NUMBER) IS
2196 SELECT activity_metric_fact_id,
2197 fact_reference,
2198 fact_type
2199 FROM ozf_act_metric_facts_all
2200 WHERE arc_act_metric_used_by = 'FCST'
2201 AND act_metric_used_by_id = p_forecast_id
2202 AND previous_fact_id = p_previous_fact_id
2203 AND root_fact_id IS NULL;
2204
2205 CURSOR get_product_qualfiers(p_forecast_dimention_id IN NUMBER) IS
2206 SELECT product_attribute_context,
2207 product_attribute,
2208 product_attr_value
2209 FROM ozf_forecast_dimentions
2210 WHERE forecast_dimention_id = p_forecast_dimention_id
2211 AND forecast_id = p_forecast_id;
2212
2213 CURSOR get_market_qualifiers(p_forecast_dimention_id IN NUMBER) IS
2214 SELECT qualifier_grouping_no
2215 FROM ozf_forecast_dimentions
2216 WHERE forecast_dimention_id = p_forecast_dimention_id
2217 AND forecast_id = p_forecast_id;
2218
2219 l_base_sales NUMBER := 0;
2220
2221 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
2222 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
2223 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
2224 l_qualifier_grouping_no NUMBER;
2225 l_period_number NUMBER;
2226
2227 l_previous_fact_id NUMBER ;
2228 l_root_fact_id NUMBER;
2229
2230 BEGIN
2231
2232 IF (OZF_DEBUG_HIGH_ON) THEN
2233 OZF_Utility_PVT.debug_message(l_full_name || ': Start Create Fcst Facts');
2234 END IF;
2235
2236 SAVEPOINT Create_Fcst_Facts;
2237
2238 IF FND_API.to_boolean(p_init_msg_list) THEN
2239 FND_MSG_PUB.initialize;
2240 END IF;
2241
2242 IF NOT FND_API.compatible_api_call(l_api_version,
2243 p_api_version,
2244 l_api_name,
2245 g_pkg_name)
2246 THEN
2247 RAISE FND_API.g_exc_unexpected_error;
2248 END IF;
2249
2250 x_return_status := FND_API.g_ret_sts_success;
2251
2252 --dbms_output.put_line( ' -- 1. create_fcst_facts -- ');
2253
2254 IF ( p_level = 'ONE' )
2255 THEN
2256
2257 DELETE FROM ozf_act_metric_facts_all
2258 WHERE activity_metric_id = p_activity_metric_id ;
2259 --
2260
2261 --R12 Baseline
2262 IF (p_base_quantity_type <> 'BASELINE')
2263 THEN
2264 UPDATE ozf_act_forecasts_all
2265 SET dimention2 = NULL,
2266 dimention3 = NULL
2267 WHERE forecast_id = p_forecast_id ;
2268 END IF;
2269
2270 --
2271 --dbms_output.put_line( ' -- 1.1 create_fcst_facts -- ');
2272 create_dimention_facts ( p_api_version,
2273 p_init_msg_list,
2274 p_commit,
2275 p_base_quantity_type,
2276 p_obj_type,
2277 p_obj_id,
2278 p_forecast_id,
2279 p_activity_metric_id,
2280 p_dimention,
2281 p_fcst_uom,
2282 l_product_attribute_context,
2283 l_product_attribute,
2284 l_product_attr_value,
2285 l_qualifier_grouping_no,
2286 l_period_number,
2287 l_previous_fact_id,
2288 l_root_fact_id,
2289 x_return_status,
2290 x_msg_count,
2291 x_msg_data);
2292
2293 END IF ;
2294
2295 IF ( p_level = 'TWO' )
2296 THEN
2297
2298 --
2299 -- Delete level two and three facts.
2300
2301 DELETE FROM ozf_act_metric_facts_all
2302 WHERE activity_metric_id = p_activity_metric_id
2303 AND previous_fact_id IS NOT NULL;
2304
2305 FOR i IN level_one_facts
2306 LOOP
2307
2308 l_previous_fact_id := i.activity_metric_fact_id ;
2309
2310 IF (i.fact_type = 'PRODUCT')
2311 THEN
2312
2313 OPEN get_product_qualfiers(i.fact_reference);
2314 FETCH get_product_qualfiers INTO l_product_attribute_context,
2315 l_product_attribute,
2316 l_product_attr_value ;
2317 CLOSE get_product_qualfiers;
2318
2319 ELSIF (i.fact_type = 'MARKET')
2320 THEN
2321
2322 OPEN get_market_qualifiers(i.fact_reference);
2323 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
2324 CLOSE get_market_qualifiers;
2325
2326 ELSIF (i.fact_type = 'TIME')
2327 THEN
2328 l_period_number := i.fact_reference;
2329
2330 END IF;
2331 --dbms_output.put_line( ' -- 1.2 create_fcst_facts -- ');
2332 create_dimention_facts ( p_api_version,
2333 p_init_msg_list,
2334 p_commit,
2335 p_base_quantity_type,
2336 p_obj_type,
2337 p_obj_id,
2338 p_forecast_id,
2339 p_activity_metric_id,
2340 p_dimention,
2341 p_fcst_uom,
2342 l_product_attribute_context,
2343 l_product_attribute,
2344 l_product_attr_value,
2345 l_qualifier_grouping_no,
2346 l_period_number,
2347 l_previous_fact_id,
2348 l_root_fact_id,
2349 x_return_status,
2350 x_msg_count,
2351 x_msg_data);
2352
2353 END LOOP; -- End Level One Records
2354
2355 END IF; -- End Level Two
2356
2357 IF ( p_level = 'THREE' )
2358 THEN
2359
2360 FOR i IN level_one_facts
2361 LOOP
2362 l_root_fact_id := i.activity_metric_fact_id ;
2363
2364 IF (i.fact_type = 'PRODUCT')
2365 THEN
2366
2367 OPEN get_product_qualfiers(i.fact_reference) ;
2368 FETCH get_product_qualfiers INTO l_product_attribute_context,
2369 l_product_attribute,
2370 l_product_attr_value ;
2371 CLOSE get_product_qualfiers;
2372
2373 ELSIF (i.fact_type = 'MARKET')
2374 THEN
2375
2376 OPEN get_market_qualifiers(i.fact_reference);
2377 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
2378 CLOSE get_market_qualifiers;
2379
2380 ELSIF (i.fact_type = 'TIME')
2381 THEN
2382 l_period_number := i.fact_reference;
2383
2384 END IF;
2385
2386 FOR j IN level_two_facts(i.activity_metric_fact_id)
2387 LOOP
2388
2389 l_previous_fact_id := j.activity_metric_fact_id ;
2390
2391 IF (j.fact_type = 'PRODUCT')
2392 THEN
2393
2394 OPEN get_product_qualfiers(j.fact_reference);
2395 FETCH get_product_qualfiers INTO l_product_attribute_context,
2396 l_product_attribute,
2397 l_product_attr_value ;
2398 CLOSE get_product_qualfiers;
2399
2400 ELSIF (j.fact_type = 'MARKET')
2401 THEN
2402
2403 OPEN get_market_qualifiers(j.fact_reference);
2404 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
2405 CLOSE get_market_qualifiers;
2406
2407 ELSIF (j.fact_type = 'TIME')
2408 THEN
2409 l_period_number := j.fact_reference ;
2410
2411 END IF;
2412 --dbms_output.put_line( ' -- 1.3 create_fcst_facts -- ');
2413 create_dimention_facts ( p_api_version,
2414 p_init_msg_list,
2415 p_commit,
2416 p_base_quantity_type,
2417 p_obj_type,
2418 p_obj_id,
2419 p_forecast_id,
2420 p_activity_metric_id,
2421 p_dimention,
2422 p_fcst_uom,
2423 l_product_attribute_context,
2424 l_product_attribute,
2425 l_product_attr_value,
2426 l_qualifier_grouping_no,
2427 l_period_number,
2428 l_previous_fact_id,
2429 l_root_fact_id,
2430 x_return_status,
2431 x_msg_count,
2432 x_msg_data);
2433 --dbms_output.put_line( ' -- soon after 1.3 -- x_return_status ==> '||x_return_status);
2434
2435 END LOOP; -- End of Level Two Records(j)
2436
2437 END LOOP; -- End Level One Records(i)
2438
2439 END IF; -- End Level Three
2440
2441 IF (OZF_DEBUG_HIGH_ON) THEN
2442
2443 OZF_Utility_PVT.debug_message(l_full_name || ': End Create Fcst Facts');
2444
2445 END IF;
2446
2447 EXCEPTION
2448
2449 WHEN OTHERS THEN
2450 x_return_status := FND_API.g_ret_sts_unexp_error;
2451
2452 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
2453 THEN
2454 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2455 END IF;
2456
2457 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
2458 p_count => x_msg_count,
2459 p_data => x_msg_data);
2460
2461
2462 END create_fcst_facts;
2463
2464 --***********************************************
2465 --R12 Baseline - Dummy Method for testing
2466 --***********************************************
2467 FUNCTION get_best_fit_lift2 RETURN NUMBER IS BEGIN RETURN .01; END;
2468
2469 --***********************************************
2470 --R12 Baseline
2471 --***********************************************
2472 FUNCTION get_best_fit_lift (
2473 p_obj_type IN VARCHAR2,
2474 p_obj_id IN NUMBER,
2475 p_forecast_id IN NUMBER,
2476 p_base_quantity_ref IN VARCHAR2,
2477 p_market_type IN VARCHAR2,
2478 p_market_id IN NUMBER,
2479 p_product_attribute_context IN VARCHAR2,
2480 p_product_attribute IN VARCHAR2,
2481 p_product_attr_value IN VARCHAR2,
2482 p_product_id IN NUMBER,
2483 p_tpr_percent IN NUMBER,
2484 p_report_date IN DATE
2485 )
2486 RETURN NUMBER
2487 IS
2488 l_api_version CONSTANT NUMBER := 1.0;
2489 l_api_name CONSTANT VARCHAR2(30) := 'get_best_fit_lift';
2490 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2491 l_msg_count number;
2492 l_msg_data varchar2(2000);
2493
2494 CURSOR c_fcst_rec (l_fcst_id IN NUMBER) IS
2495 SELECT
2496 PERIOD_LEVEL,
2497 BASE_QUANTITY_TYPE,
2498 BASE_QUANTITY_REF,
2499 FORECAST_SPREAD_TYPE,
2500 BASE_QUANTITY_START_DATE,
2501 BASE_QUANTITY_END_DATE,
2502 INCREMENT_QUOTA,
2503 FORECAST_UOM_CODE,
2504 LAST_SCENARIO_ID
2505 FROM OZF_ACT_FORECASTS_ALL
2506 WHERE FORECAST_ID = l_fcst_id;
2507
2508 CURSOR c_wkst_fcst_rec IS
2509 SELECT
2510 a.PERIOD_LEVEL,
2511 a.BASE_QUANTITY_TYPE,
2512 a.BASE_QUANTITY_REF,
2513 a.FORECAST_SPREAD_TYPE,
2514 trunc(b.start_date_active) wkst_start_date_active,
2515 trunc(b.end_date_active) wkst_end_date_active,
2516 a.INCREMENT_QUOTA,
2517 a.forecast_uom_code,
2518 a.LAST_SCENARIO_ID
2519 FROM ozf_act_forecasts_all a,
2520 ozf_worksheet_headers_b b
2521 WHERE a.FORECAST_ID = p_forecast_id
2522 AND b.worksheet_header_id = NVL(p_obj_id, b.worksheet_header_id)
2523 AND a.arc_act_fcast_used_by = NVL(p_obj_type, 'WKST')
2524 AND a.act_fcast_used_by_id = b.worksheet_header_id
2525 AND b.forecast_generated = DECODE(p_obj_id, NULL, 'N',b.forecast_generated);
2526
2527
2528 CURSOR c_offr_trade_medium_csr IS
2529 SELECT
2530 offperf.channel_id
2531 FROM
2532 ozf_offer_performances offperf
2533 WHERE
2534 offperf.list_header_id = p_obj_id
2535 AND offperf.product_attribute_context = p_product_attribute_context
2536 AND DECODE(offperf.product_attr_value,'ALL','MATCH', offperf.product_attr_value) =
2537 DECODE(offperf.product_attr_value,'ALL','MATCH', p_product_attr_value)
2538 AND DECODE(offperf.product_attribute,'PRICING_ATTRIBUTE3','MATCH', offperf.product_attribute) =
2539 DECODE(offperf.product_attribute,'PRICING_ATTRIBUTE3','MATCH', p_product_attribute)
2540 AND p_report_date between NVL(offperf.start_date, p_report_date) and NVL (offperf.end_date, p_report_date);
2541
2542 CURSOR c_wkst_trade_medium_csr IS
2543 SELECT
2544 offperf.channel_id
2545 FROM
2546 ozf_offer_performances offperf
2547 WHERE
2548 offperf.used_by = p_obj_type
2549 AND offperf.used_by = p_obj_id
2550 AND offperf.product_attribute_context = p_product_attribute_context
2551 AND DECODE(offperf.product_attr_value,'ALL','MATCH', offperf.product_attr_value) =
2552 DECODE(offperf.product_attr_value,'ALL','MATCH', p_product_attr_value)
2553 AND DECODE(offperf.product_attribute,'PRICING_ATTRIBUTE3','MATCH', offperf.product_attribute) =
2554 DECODE(offperf.product_attribute,'PRICING_ATTRIBUTE3','MATCH', p_product_attribute)
2555 AND p_report_date between NVL(offperf.start_date, p_report_date) and NVL (offperf.end_date, p_report_date);
2556
2557
2558 CURSOR c_trade_medium_col_name_csr(l_trade_tactic_id NUMBER) IS
2559 SELECT
2560 TRADE_TACTIC_COLUMN_NAME
2561 FROM
2562 OZF_TRADE_TACTICS_MAPPING
2563 WHERE DATA_SOURCE = p_base_quantity_ref
2564 AND TRADE_TACTIC_ID = l_trade_tactic_id
2565 AND rownum = 1
2566 ORDER BY CREATION_DATE DESC;
2567
2568 i NUMBER := 0;
2569 j NUMBER := 0;
2570 l_base_sales NUMBER := 0;
2571 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
2572 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
2573 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
2574 l_qualifier_grouping_no NUMBER;
2575 l_period_number NUMBER;
2576 l_previous_fact_id NUMBER ;
2577 l_root_fact_id NUMBER;
2578 l_period_level OZF_ACT_FORECASTS_ALL.period_level%TYPE;
2579 l_base_quantity_type OZF_ACT_FORECASTS_ALL.base_quantity_type%TYPE;
2580 l_base_quantity_ref OZF_ACT_FORECASTS_ALL.base_quantity_ref%TYPE;
2581 l_forecast_spread_type OZF_ACT_FORECASTS_ALL.forecast_spread_type%TYPE;
2582 l_base_quantity_start_date OZF_ACT_FORECASTS_ALL.base_quantity_start_date%TYPE;
2583 l_base_quantity_end_date OZF_ACT_FORECASTS_ALL.base_quantity_end_date%TYPE;
2584 l_increment_quota OZF_ACT_FORECASTS_ALL.increment_quota%TYPE;
2585 l_forecast_uom_code OZF_ACT_FORECASTS_ALL.forecast_uom_code%TYPE;
2586 l_last_scenario_id OZF_ACT_FORECASTS_ALL.last_scenario_id%TYPE;
2587 l_trade_tactic_id1 NUMBER;
2588 l_trade_tactic_id2 NUMBER;
2589 l_trade_tactic_id3 NUMBER;
2590 l_trade_tactic_id4 NUMBER;
2591 l_trade_tactic_id5 NUMBER;
2592 l_trade_tactic_id6 NUMBER;
2593 l_trade_tactic_id7 NUMBER;
2594 l_trade_tactic_id8 NUMBER;
2595 l_trade_tactic_id9 NUMBER;
2596 l_trade_tactic_id10 NUMBER;
2597 l_trade_tactic_name1 VARCHAR2(30);
2598 l_trade_tactic_name2 VARCHAR2(30);
2599 l_trade_tactic_name3 VARCHAR2(30);
2600 l_trade_tactic_name4 VARCHAR2(30);
2601 l_trade_tactic_name5 VARCHAR2(30);
2602 l_trade_tactic_name6 VARCHAR2(30);
2603 l_trade_tactic_name7 VARCHAR2(30);
2604 l_trade_tactic_name8 VARCHAR2(30);
2605 l_trade_tactic_name9 VARCHAR2(30);
2606 l_trade_tactic_name10 VARCHAR2(30);
2607 l_lift_factor NUMBER;
2608 l_final_lift_sql VARCHAR2(30000);
2609 l_lift_factor_sql VARCHAR2(30000) :=
2610 ' SELECT MIN(LIFT.LIFT_FACTOR) ' ||
2611 ' FROM OZF_LIFT_FACTORS_FACTS LIFT, AMS_PARTY_MARKET_SEGMENTS DENORM ' ||
2612 ' WHERE LIFT.DATA_SOURCE = :L_BASE_QUANTITY_REF '||
2613 ' AND LIFT.MARKET_TYPE = DENORM.MARKET_QUALIFIER_TYPE '||
2614 ' AND LIFT.MARKET_ID = DENORM.MARKET_QUALIFIER_REFERENCE '||
2615 ' AND DENORM.SITE_USE_CODE = :L_MARKET_TYPE '||
2616 ' AND DENORM.SITE_USE_ID = :L_MARKET_ID '||
2617 ' AND LIFT.ITEM_LEVEL = ''PRICING_ATTRIBUTE1'' ' ||
2618 ' AND LIFT.ITEM_ID = :L_PRODUCT_ID '||
2619 ' AND LIFT.TPR_PERCENT <= :L_TPR_PERCENT '||
2620 ' AND :L_REPORT_DATE BETWEEN LIFT.TRANSACTION_FROM_DATE AND LIFT.TRANSACTION_TO_DATE ';
2621
2622 l_where_str VARCHAR2(10000) := NULL;
2623 TYPE G_GenericCurType IS REF CURSOR;
2624 get_lift_factor_csr G_GenericCurType; --cursor variable (processed like a PL/SQL variable)
2625
2626
2627 CURSOR get_offer_type
2628 IS
2629 SELECT offer_type
2630 FROM ozf_offers
2631 WHERE qp_list_header_id = p_obj_id;
2632
2633 CURSOR get_promotion_type(l_product_attribute_context IN VARCHAR2,
2634 l_product_attribute IN VARCHAR2,
2635 l_product_attr_value IN VARCHAR2 )
2636 IS
2637 SELECT DECODE(qpl.list_line_type_code
2638 ,'DIS', DECODE(qpl.operand
2639 ,100 , DECODE(qpl.arithmetic_operator
2640 ,'%', 3
2641 , 2 )
2642 , 2)
2643 , 1) promotion_type
2644 FROM qp_list_lines qpl,
2645 qp_pricing_attributes qp
2646 WHERE qpl.list_header_id = p_obj_id
2647 AND qpl.list_line_id = qp.list_line_id
2648 AND qp.excluder_flag = 'N'
2649 AND qp.product_attribute_context = l_product_attribute_context
2650 AND qp.product_attribute = l_product_attribute
2651 AND qp.product_attr_value = l_product_attr_value
2652 ORDER BY promotion_type;
2653
2654
2655 BEGIN
2656
2657 --IF (OZF_DEBUG_HIGH_ON) THEN
2658 -- OZF_Utility_PVT.debug_message(l_full_name || ': Start get_best_fit_lift ');
2659 --END IF;
2660
2661 -- First: Get Offer or Wkst Forecast Header Level Details from the forecast id
2662 IF p_obj_type = 'OFFR'
2663 THEN
2664 -- for OFFR
2665 OPEN c_fcst_rec(p_forecast_id);
2666 FETCH c_fcst_rec INTO
2667 l_period_level,
2668 l_base_quantity_type,
2669 l_base_quantity_ref,
2670 l_forecast_spread_type,
2671 l_base_quantity_start_date,
2672 l_base_quantity_end_date,
2673 l_increment_quota,
2674 l_forecast_uom_code,
2675 l_last_scenario_id;
2676 CLOSE c_fcst_rec;
2677
2678 ELSIF p_obj_type = 'WKST'
2679 THEN
2680 -- for WKST
2681 OPEN c_fcst_rec(p_forecast_id);
2682 FETCH c_fcst_rec INTO
2683 l_period_level,
2684 l_base_quantity_type,
2685 l_base_quantity_ref,
2686 l_forecast_spread_type,
2687 l_base_quantity_start_date,
2688 l_base_quantity_end_date,
2689 l_increment_quota,
2690 l_forecast_uom_code,
2691 l_last_scenario_id;
2692 CLOSE c_fcst_rec;
2693
2694 END IF;
2695
2696 -- for the given offer and prod_attr , find all offer performances in 10 variables
2697 -- find column_names from the mapping table
2698 -- form the query to find lift factor
2699 -- return lift factor
2700
2701 IF p_obj_type = 'OFFR' THEN
2702
2703 i := 1;
2704 FOR channel_rec IN c_offr_trade_medium_csr
2705 LOOP
2706 CASE i
2707 WHEN 1 THEN l_trade_tactic_id1 := channel_rec.channel_id;
2708 WHEN 2 THEN l_trade_tactic_id2 := channel_rec.channel_id;
2709 WHEN 3 THEN l_trade_tactic_id3 := channel_rec.channel_id;
2710 WHEN 4 THEN l_trade_tactic_id4 := channel_rec.channel_id;
2711 WHEN 5 THEN l_trade_tactic_id5 := channel_rec.channel_id;
2712 WHEN 6 THEN l_trade_tactic_id6 := channel_rec.channel_id;
2713 WHEN 7 THEN l_trade_tactic_id7 := channel_rec.channel_id;
2714 WHEN 8 THEN l_trade_tactic_id8 := channel_rec.channel_id;
2715 WHEN 9 THEN l_trade_tactic_id9 := channel_rec.channel_id;
2716 WHEN 10 THEN l_trade_tactic_id10 := channel_rec.channel_id;
2717 END CASE;
2718 i := i + 1;
2719 EXIT WHEN i = 11;
2720 END LOOP;
2721
2722 ELSIF p_obj_type = 'WKST' THEN
2723
2724 i := 1;
2725 FOR channel_rec IN c_wkst_trade_medium_csr
2726 LOOP
2727 CASE i
2728 WHEN 1 THEN l_trade_tactic_id1 := channel_rec.channel_id;
2729 WHEN 2 THEN l_trade_tactic_id2 := channel_rec.channel_id;
2730 WHEN 3 THEN l_trade_tactic_id3 := channel_rec.channel_id;
2731 WHEN 4 THEN l_trade_tactic_id4 := channel_rec.channel_id;
2732 WHEN 5 THEN l_trade_tactic_id5 := channel_rec.channel_id;
2733 WHEN 6 THEN l_trade_tactic_id6 := channel_rec.channel_id;
2734 WHEN 7 THEN l_trade_tactic_id7 := channel_rec.channel_id;
2735 WHEN 8 THEN l_trade_tactic_id8 := channel_rec.channel_id;
2736 WHEN 9 THEN l_trade_tactic_id9 := channel_rec.channel_id;
2737 WHEN 10 THEN l_trade_tactic_id10 := channel_rec.channel_id;
2738 END CASE;
2739 i := i + 1;
2740 EXIT WHEN i = 11;
2741 END LOOP;
2742 END IF;
2743
2744 FOR j IN 1..(i-1)
2745 LOOP
2746 CASE j
2747 WHEN 1 THEN
2748 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id1);
2749 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name1;
2750 CLOSE c_trade_medium_col_name_csr;
2751 WHEN 2 THEN
2752 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id2);
2753 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name2;
2754 CLOSE c_trade_medium_col_name_csr;
2755 WHEN 3 THEN
2756 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id3);
2757 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name3;
2758 CLOSE c_trade_medium_col_name_csr;
2759 WHEN 4 THEN
2760 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id4);
2761 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name4;
2762 CLOSE c_trade_medium_col_name_csr;
2763 WHEN 5 THEN
2764 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id5);
2765 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name5;
2766 CLOSE c_trade_medium_col_name_csr;
2767 WHEN 6 THEN
2768 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id6);
2769 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name6;
2770 CLOSE c_trade_medium_col_name_csr;
2771 WHEN 7 THEN
2772 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id7);
2773 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name7;
2774 CLOSE c_trade_medium_col_name_csr;
2775 WHEN 8 THEN
2776 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id8);
2777 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name8;
2778 CLOSE c_trade_medium_col_name_csr;
2779 WHEN 9 THEN
2780 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id9);
2781 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name9;
2782 CLOSE c_trade_medium_col_name_csr;
2783 WHEN 10 THEN
2784 OPEN c_trade_medium_col_name_csr(l_trade_tactic_id10);
2785 FETCH c_trade_medium_col_name_csr into l_trade_tactic_name10;
2786 CLOSE c_trade_medium_col_name_csr;
2787 END CASE;
2788 END LOOP;
2789
2790 /*
2791 Find Best-Fit Tactics:
2792 ~~~~~~~~~~~~~~~~~~~~~~
2793 Reduce the data set to those where a Trade Medium matches a tactic in Tactic Category #1.
2794 (If Lifts have "Display", "End-Aisle", & "Secondary Location" tactics in Category #1.
2795 Offer has "Display" as Trade Medium so return these lift records in data set).
2796 Repeat process of matching Trade mediums to Tactic Category #2-10 until a match is not found.
2797 This is the Best-Fit lift.
2798 */
2799
2800 IF l_trade_tactic_name1 IS NOT NULL THEN
2801 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name1 || ' = ' || l_trade_tactic_id1;
2802 END IF;
2803
2804 IF l_trade_tactic_name2 IS NOT NULL THEN
2805 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name2 || ' = ' || l_trade_tactic_id2;
2806 END IF;
2807
2808 IF l_trade_tactic_name3 IS NOT NULL THEN
2809 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name3 || ' = ' || l_trade_tactic_id3;
2810 END IF;
2811
2812 IF l_trade_tactic_name4 IS NOT NULL THEN
2813 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name4 || ' = ' || l_trade_tactic_id4;
2814 END IF;
2815
2816 IF l_trade_tactic_name5 IS NOT NULL THEN
2817 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name5 || ' = ' || l_trade_tactic_id5;
2818 END IF;
2819
2820 IF l_trade_tactic_name6 IS NOT NULL THEN
2821 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name6 || ' = ' || l_trade_tactic_id6;
2822 END IF;
2823
2824 IF l_trade_tactic_name7 IS NOT NULL THEN
2825 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name7 || ' = ' || l_trade_tactic_id7;
2826 END IF;
2827
2828 IF l_trade_tactic_name8 IS NOT NULL THEN
2829 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name8 || ' = ' || l_trade_tactic_id8;
2830 END IF;
2831
2832 IF l_trade_tactic_name9 IS NOT NULL THEN
2833 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name9 || ' = ' || l_trade_tactic_id9;
2834 END IF;
2835
2836 IF l_trade_tactic_name10 IS NOT NULL THEN
2837 l_where_str := l_where_str || ' AND '|| l_trade_tactic_name10 || ' = ' || l_trade_tactic_id10;
2838 END IF;
2839
2840
2841 -- Also consider Offer Type and Activity Id When needed ---------
2842 -- Check for WKST
2843 -- CHECK query by printing it and execute from TOAD
2844 -- See how to get discount percent in process_baseline ....
2845
2846 IF l_where_str IS NOT NULL THEN
2847 l_final_lift_sql := l_lift_factor_sql || l_where_str;
2848 --OZF_Utility_PVT.debug_message( ' ~~l_where_str~~=> '|| l_where_str );
2849 ELSE
2850 l_final_lift_sql := l_lift_factor_sql;
2851 END IF;
2852 --OZF_Utility_PVT.debug_message( ' ~~~l_final_lift_sql~~~~ => '||l_final_lift_sql );
2853
2854 OPEN get_lift_factor_csr FOR l_final_lift_sql USING
2855 p_base_quantity_ref,
2856 p_market_type,
2857 p_market_id,
2858 p_product_id,
2859 p_tpr_percent,
2860 p_report_date
2861 ;
2862 FETCH get_lift_factor_csr INTO l_lift_factor;
2863 CLOSE get_lift_factor_csr ;
2864 --OZF_Utility_PVT.debug_message( ' ~~~ l_lift_factor ~~~~ =====> '|| to_char(l_lift_factor) );
2865
2866
2867 IF l_lift_factor IS NULL THEN
2868
2869 --OZF_Utility_PVT.debug_message( ' ~~~ l_lift_factor IS NULL ~~~~ ');
2870
2871 l_where_str := NULL;
2872 l_final_lift_sql := NULL;
2873
2874 IF l_trade_tactic_name1 IS NOT NULL THEN
2875 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name1 || ' = ' || l_trade_tactic_id1;
2876 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name1 || ' IS NULL ) ';
2877 END IF;
2878
2879 IF l_trade_tactic_name2 IS NOT NULL THEN
2880 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name2 || ' = ' || l_trade_tactic_id2;
2881 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name2 || ' IS NULL ) ';
2882 END IF;
2883
2884 IF l_trade_tactic_name3 IS NOT NULL THEN
2885 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name3 || ' = ' || l_trade_tactic_id3;
2886 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name3 || ' IS NULL ) ';
2887 END IF;
2888
2889 IF l_trade_tactic_name4 IS NOT NULL THEN
2890 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name4 || ' = ' || l_trade_tactic_id4;
2891 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name4 || ' IS NULL ) ';
2892 END IF;
2893
2894 IF l_trade_tactic_name5 IS NOT NULL THEN
2895 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name5 || ' = ' || l_trade_tactic_id5;
2896 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name5 || ' IS NULL ) ';
2897 END IF;
2898
2899 IF l_trade_tactic_name6 IS NOT NULL THEN
2900 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name6 || ' = ' || l_trade_tactic_id6;
2901 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name6 || ' IS NULL ) ';
2902 END IF;
2903
2904 IF l_trade_tactic_name7 IS NOT NULL THEN
2905 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name7 || ' = ' || l_trade_tactic_id7;
2906 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name7 || ' IS NULL ) ';
2907 END IF;
2908
2909 IF l_trade_tactic_name8 IS NOT NULL THEN
2910 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name8 || ' = ' || l_trade_tactic_id8;
2911 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name8 || ' IS NULL ) ';
2912 END IF;
2913
2914 IF l_trade_tactic_name9 IS NOT NULL THEN
2915 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name9 || ' = ' || l_trade_tactic_id9;
2916 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name9 || ' IS NULL ) ';
2917 END IF;
2918
2919 IF l_trade_tactic_name10 IS NOT NULL THEN
2920 l_where_str := l_where_str || ' AND ('|| l_trade_tactic_name10 || ' = ' || l_trade_tactic_id10;
2921 l_where_str := l_where_str || ' OR ' || l_trade_tactic_name10 || ' IS NULL ) ';
2922 END IF;
2923
2924 IF l_where_str IS NOT NULL THEN
2925 l_final_lift_sql := l_lift_factor_sql || l_where_str;
2926 --OZF_Utility_PVT.debug_message( ' ~222~l_where_str~~=> '|| l_where_str );
2927 ELSE
2928 l_final_lift_sql := l_lift_factor_sql;
2929 END IF;
2930
2931 OPEN get_lift_factor_csr FOR l_final_lift_sql USING
2932 p_base_quantity_ref,
2933 p_market_type,
2934 p_market_id,
2935 p_product_id,
2936 p_tpr_percent,
2937 p_report_date
2938 ;
2939 FETCH get_lift_factor_csr INTO l_lift_factor;
2940 CLOSE get_lift_factor_csr ;
2941
2942 --OZF_Utility_PVT.debug_message( ' 2222~~~ l_lift_factor ~~~~ =====> '||l_lift_factor );
2943
2944 END IF; -- IF l_lift_factor IS NULL THEN
2945
2946 /*
2947 IF l_lift_factor IS NULL THEN
2948 -- CONSTANT LIFT FACTORS
2949 IF (p_tpr_percent > 20) THEN l_lift_factor := 20/100;
2950 ELSIF (p_tpr_percent > 10) THEN l_lift_factor := 10/100;
2951 ELSE l_lift_factor := 5/100;
2952 END IF;
2953 END IF;
2954 */
2955
2956 -- IF (OZF_DEBUG_HIGH_ON) THEN
2957 -- OZF_Utility_PVT.debug_message(l_full_name || ': End get_best_fit_lift ');
2958 -- END IF;
2959
2960 RETURN NVL(l_lift_factor, 0);
2961
2962 EXCEPTION
2963 WHEN OTHERS THEN
2964 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
2965 THEN
2966 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2967 END IF;
2968 --OZF_Utility_PVT.debug_message(' get_best_fit_lift : OTHER ERROR ' || sqlerrm );
2969 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
2970 p_count => l_msg_count,
2971 p_data => l_msg_data);
2972 Return 0; -- i.e. lift is ZERO
2973 END get_best_fit_lift; --end of function
2974
2975
2976 --***********************************************
2977 --R12 Baseline
2978 -- When TPR percent is changed on the UI, then
2979 -- this method will calculate new incremental sales for
2980 -- each of the levels -> PRODUCT, MARKET AND TIME
2981 /*IF there is a change in TPRpercent for a given Product,P1
2982 THEN
2983 Call this private method -->
2984 adjust_baseline_spreads(level, fact_id, oldTPRdiscount, newTPRdiscount)
2985 This method will do these (handled by my code):
2986 Generate new 3rd Level Spread
2987 Generate new 2nd Level spread
2988 Generate new numbers for P1's row (Incremental and RTF only.
2989 (Note that P1TotalForecast is always sum of P1BaseSales and P1Incremental)
2990
2991 Then your code should handle
2992 Updation of HeaderTotalForecast.
2993 Updation of the HeaderRTF.
2994 */
2995 --***********************************************
2996 PROCEDURE adjust_baseline_spreads
2997 (
2998 p_api_version IN NUMBER,
2999 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
3000 p_commit IN VARCHAR2 := FND_API.g_false,
3001 p_obj_type IN VARCHAR2,
3002 p_obj_id IN NUMBER,
3003 p_forecast_id IN NUMBER,
3004 p_activity_metric_fact_id IN NUMBER,
3005 p_new_tpr_percent IN NUMBER,
3006 p_new_incremental_sales OUT NOCOPY NUMBER,
3007 x_return_status OUT NOCOPY VARCHAR2,
3008 x_msg_count OUT NOCOPY NUMBER,
3009 x_msg_data OUT NOCOPY VARCHAR2
3010 )
3011 IS
3012 l_api_version CONSTANT NUMBER := 1.0;
3013 l_api_name CONSTANT VARCHAR2(30) := 'adjust_baseline_spreads';
3014 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3015 l_return_status VARCHAR2(1);
3016 l_msg_count number;
3017 l_msg_data varchar2(2000);
3018
3019 CURSOR c_fcst_rec (l_fcst_id IN NUMBER) IS
3020 SELECT
3021 PERIOD_LEVEL,
3022 BASE_QUANTITY_TYPE,
3023 BASE_QUANTITY_REF,
3024 FORECAST_SPREAD_TYPE,
3025 DIMENTION1,
3026 DIMENTION2,
3027 DIMENTION3,
3028 BASE_QUANTITY_START_DATE,
3029 BASE_QUANTITY_END_DATE,
3030 INCREMENT_QUOTA,
3031 FORECAST_UOM_CODE,
3032 LAST_SCENARIO_ID
3033 FROM OZF_ACT_FORECASTS_ALL
3034 WHERE FORECAST_ID = l_fcst_id;
3035
3036 CURSOR c_wkst_fcst_rec IS
3037 SELECT
3038 a.PERIOD_LEVEL,
3039 a.BASE_QUANTITY_TYPE,
3040 a.BASE_QUANTITY_REF,
3041 a.FORECAST_SPREAD_TYPE,
3042 a.DIMENTION1,
3043 a.DIMENTION2,
3044 a.DIMENTION3,
3045 trunc(b.start_date_active) wkst_start_date_active,
3046 trunc(b.end_date_active) wkst_end_date_active,
3047 a.INCREMENT_QUOTA,
3048 a.forecast_uom_code,
3049 a.LAST_SCENARIO_ID
3050 FROM ozf_act_forecasts_all a,
3051 ozf_worksheet_headers_b b
3052 WHERE a.FORECAST_ID = p_forecast_id
3053 AND b.worksheet_header_id = NVL(p_obj_id, b.worksheet_header_id)
3054 AND a.arc_act_fcast_used_by = NVL(p_obj_type, 'WKST')
3055 AND a.act_fcast_used_by_id = b.worksheet_header_id
3056 AND b.forecast_generated = DECODE(p_obj_id, NULL, 'N',b.forecast_generated);
3057
3058 CURSOR level_one_facts IS
3059 SELECT activity_metric_fact_id,
3060 fact_reference,
3061 fact_type,
3062 incremental_sales
3063 FROM ozf_act_metric_facts_all
3064 WHERE activity_metric_fact_id = p_activity_metric_fact_id;
3065
3066 CURSOR level_two_facts IS
3067 SELECT activity_metric_fact_id,
3068 fact_reference,
3069 fact_type
3070 FROM ozf_act_metric_facts_all
3071 WHERE arc_act_metric_used_by = 'FCST'
3072 AND act_metric_used_by_id = p_forecast_id
3073 AND previous_fact_id = p_activity_metric_fact_id
3074 AND root_fact_id IS NULL;
3075
3076 CURSOR level_three_facts(p_previous_fact_id IN NUMBER) IS
3077 SELECT activity_metric_fact_id,
3078 fact_reference,
3079 fact_type
3080 FROM ozf_act_metric_facts_all
3081 WHERE arc_act_metric_used_by = 'FCST'
3082 AND act_metric_used_by_id = p_forecast_id
3083 AND previous_fact_id = p_previous_fact_id
3084 AND root_fact_id = p_activity_metric_fact_id;
3085
3086 CURSOR get_product_qualfiers(p_forecast_dimention_id IN NUMBER) IS
3087 SELECT product_attribute_context,
3088 product_attribute,
3089 product_attr_value
3090 FROM ozf_forecast_dimentions
3091 WHERE forecast_dimention_id = p_forecast_dimention_id
3092 AND forecast_id = p_forecast_id;
3093
3094 CURSOR get_market_qualifiers(p_forecast_dimention_id IN NUMBER) IS
3095 SELECT qualifier_grouping_no
3096 FROM ozf_forecast_dimentions
3097 WHERE forecast_dimention_id = p_forecast_dimention_id
3098 AND forecast_id = p_forecast_id;
3099
3100 CURSOR get_products(l_qualifier_grouping_no IN NUMBER) IS
3101 SELECT min(forecast_dimention_id) forecast_dimention_id,
3102 product_attribute_context,
3103 product_attribute,
3104 product_attr_value
3105 FROM ozf_forecast_dimentions
3106 WHERE obj_type = p_obj_type
3107 AND obj_id = p_obj_id
3108 AND forecast_id = p_forecast_id
3109 AND qualifier_grouping_no = NVL(l_qualifier_grouping_no, qualifier_grouping_no)
3110 GROUP BY
3111 product_attribute_context,
3112 product_attribute,
3113 product_attr_value ;
3114
3115 CURSOR get_markets (l_product_attribute_context IN VARCHAR2,
3116 l_product_attribute IN VARCHAR2,
3117 l_product_attr_value IN VARCHAR2 )
3118 IS
3119 SELECT min(forecast_dimention_id) forecast_dimention_id,
3120 min(qualifier_grouping_no) qualifier_grouping_no
3121 FROM ozf_forecast_dimentions
3122 WHERE obj_type = p_obj_type
3123 AND obj_id = p_obj_id
3124 AND forecast_id = p_forecast_id
3125 AND product_attribute_context = NVL(l_product_attribute_context, product_attribute_context)
3126 AND product_attribute = NVL(l_product_attribute, product_attribute)
3127 AND product_attr_value = NVL(l_product_attr_value, product_attr_value)
3128 GROUP BY
3129 qualifier_context,
3130 qualifier_attribute,
3131 qualifier_attr_value,
3132 qualifier_grouping_no ;
3133
3134 CURSOR periods_csr IS
3135 SELECT period_number,
3136 start_date,
3137 end_date,
3138 period_type_id
3139 FROM ozf_forecast_periods
3140 WHERE obj_type = p_obj_type
3141 AND obj_id = p_obj_id;
3142
3143 CURSOR get_sales_period IS
3144 SELECT period_number
3145 FROM ozf_forecast_periods
3146 WHERE obj_type = p_obj_type -- 'OFFR'
3147 AND obj_id = p_obj_id
3148 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
3149 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version ;
3150
3151 l_orig_incremental_sales NUMBER := 0;
3152 l_new_incremental_sales NUMBER := 0;
3153 l_activity_metric_id NUMBER := 0;
3154 l_base_sales NUMBER := 0;
3155 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
3156 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
3157 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
3158 l_qualifier_grouping_no NUMBER;
3159 l_period_number NUMBER;
3160 l_previous_fact_id NUMBER ;
3161 l_root_fact_id NUMBER;
3162 l_period_level OZF_ACT_FORECASTS_ALL.period_level%TYPE;
3163 l_base_quantity_type OZF_ACT_FORECASTS_ALL.base_quantity_type%TYPE;
3164 l_base_quantity_ref OZF_ACT_FORECASTS_ALL.base_quantity_ref%TYPE;
3165 l_forecast_spread_type OZF_ACT_FORECASTS_ALL.forecast_spread_type%TYPE;
3166 l_dimention1 OZF_ACT_FORECASTS_ALL.dimention1%TYPE;
3167 l_dimention2 OZF_ACT_FORECASTS_ALL.dimention2%TYPE;
3168 l_dimention3 OZF_ACT_FORECASTS_ALL.dimention3%TYPE;
3169 l_base_quantity_start_date OZF_ACT_FORECASTS_ALL.base_quantity_start_date%TYPE;
3170 l_base_quantity_end_date OZF_ACT_FORECASTS_ALL.base_quantity_end_date%TYPE;
3171 l_increment_quota OZF_ACT_FORECASTS_ALL.increment_quota%TYPE;
3172 l_forecast_uom_code OZF_ACT_FORECASTS_ALL.forecast_uom_code%TYPE;
3173 l_last_scenario_id OZF_ACT_FORECASTS_ALL.last_scenario_id%TYPE;
3174 l_tpr_percent NUMBER;
3175 l_baseline_sales NUMBER;
3176 l_incremental_sales NUMBER;
3177 l_node_id NUMBER;
3178 l_offer_type VARCHAR2(30) := 'OFFR';
3179
3180 BEGIN
3181
3182
3183 IF (OZF_DEBUG_HIGH_ON) THEN
3184 OZF_Utility_PVT.debug_message(l_full_name || ': Start adjusting baseline product, market and time spreads');
3185 END IF;
3186
3187 --
3188 -- Initialize savepoint.
3189 --
3190 SAVEPOINT adjust_baseline_spreads;
3191
3192 IF FND_API.to_boolean(p_init_msg_list) THEN
3193 FND_MSG_PUB.initialize;
3194 END IF;
3195
3196 IF NOT FND_API.compatible_api_call(l_api_version,
3197 p_api_version,
3198 l_api_name,
3199 g_pkg_name)
3200 THEN
3201 RAISE FND_API.g_exc_unexpected_error;
3202 END IF;
3203
3204 x_return_status := FND_API.g_ret_sts_success;
3205
3206
3207 -- First: Get Offer or Wkst Forecast Header Level Details from the forecast id
3208 IF p_obj_type = 'OFFR'
3209 THEN
3210 -- for OFFR
3211 OPEN c_fcst_rec(p_forecast_id);
3212 FETCH c_fcst_rec INTO
3213 l_period_level,
3214 l_base_quantity_type,
3215 l_base_quantity_ref,
3216 l_forecast_spread_type,
3217 l_dimention1,
3218 l_dimention2,
3219 l_dimention3,
3220 l_base_quantity_start_date,
3221 l_base_quantity_end_date,
3222 l_increment_quota,
3223 l_forecast_uom_code,
3224 l_last_scenario_id;
3225 CLOSE c_fcst_rec;
3226
3227 ELSIF p_obj_type = 'WKST'
3228 THEN
3229 -- for WKST
3230 OPEN c_fcst_rec(p_forecast_id);
3231 FETCH c_fcst_rec INTO
3232 l_period_level,
3233 l_base_quantity_type,
3234 l_base_quantity_ref,
3235 l_forecast_spread_type,
3236 l_dimention1,
3237 l_dimention2,
3238 l_dimention3,
3239 l_base_quantity_start_date,
3240 l_base_quantity_end_date,
3241 l_increment_quota,
3242 l_forecast_uom_code,
3243 l_last_scenario_id;
3244 CLOSE c_fcst_rec;
3245
3246 END IF;
3247
3248
3249 FOR i IN level_one_facts
3250 LOOP
3251 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~ Inside i Loop ~~~~~~~~~~~~~~~~~~~ ' );
3252 --dbms_output.put_line( ' i Loop ~~: i.activity_metric_fact_id == '|| i.activity_metric_fact_id);
3253
3254 l_root_fact_id := i.activity_metric_fact_id ;
3255 l_orig_incremental_sales := i.incremental_sales;
3256
3257 OPEN get_product_qualfiers(i.fact_reference) ;
3258 FETCH get_product_qualfiers INTO l_product_attribute_context,
3259 l_product_attribute,
3260 l_product_attr_value ;
3261 CLOSE get_product_qualfiers;
3262
3263 l_tpr_percent := p_new_tpr_percent;
3264
3265 FOR j IN level_two_facts
3266 LOOP
3267
3268 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~ Inside j Loop ~~~~~~~~~~~~~~~~~~~ ' );
3269 --dbms_output.put_line( ' ~ j Loop ~~: j.activity_metric_fact_id == '|| j.activity_metric_fact_id);
3270
3271 l_previous_fact_id := j.activity_metric_fact_id ;
3272
3273 IF (j.fact_type = 'MARKET')
3274 THEN
3275
3276 OPEN get_market_qualifiers(j.fact_reference);
3277 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
3278 CLOSE get_market_qualifiers;
3279
3280 ELSIF (j.fact_type = 'TIME')
3281 THEN
3282
3283 l_period_number := j.fact_reference ;
3284
3285 END IF;
3286
3287
3288 FOR k IN level_three_facts(j.activity_metric_fact_id)
3289 LOOP
3290
3291 IF (k.fact_type = 'MARKET')
3292 THEN
3293
3294 OPEN get_market_qualifiers(k.fact_reference);
3295 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
3296 CLOSE get_market_qualifiers;
3297
3298 ELSIF (k.fact_type = 'TIME')
3299 THEN
3300 l_period_number := k.fact_reference ;
3301
3302 END IF;
3303
3304
3305 -- Now, all three dimensions are available: P, T, M
3306 BEGIN
3307
3308 UPDATE ozf_act_metric_facts_all outer
3309 SET
3310 outer.incremental_sales =
3311 (
3312 select
3313 ROUND(NVL (SUM(sales.baseline_sales * NVL(OZF_FORECAST_UTIL_PVT.get_best_fit_lift
3314 (
3315 p_obj_type,
3316 p_obj_id,
3317 p_forecast_id,
3318 l_base_quantity_ref,
3319 sales.market_type,
3320 sales.market_id,
3321 dim.product_attribute_context,
3322 dim.product_attribute,
3323 dim.product_attr_value,
3324 sales.item_id,
3325 l_tpr_percent,
3326 rpt.report_date
3327 ), 0)
3328 ) ,0) ) incremental_sales
3329 from OZF_BASEline_sales_v sales,
3330 ozf_time_day rpt,
3331 (select cust.qualifier_grouping_no,
3332 cust.cust_account_id,
3333 cust.site_use_code site_use_code,
3334 cust.site_use_id site_use_id,
3335 prod.product_attribute_context,
3336 prod.product_attribute,
3337 prod.product_attr_value,
3338 prod.product_id inventory_item_id
3339 from ozf_forecast_customers cust,
3340 ozf_forecast_products prod
3341 where prod.obj_type = p_obj_type
3342 and prod.obj_id = p_obj_id
3343 and prod.obj_type = cust.obj_type
3344 and prod.obj_id = cust.obj_id
3345 and cust.site_use_code = 'SHIP_TO'
3346 ) cust_prod,
3347 ozf_forecast_dimentions dim,
3348 ozf_forecast_periods period
3349 where dim.obj_type = p_obj_type
3350 and dim.obj_id = p_obj_id
3351 AND dim.forecast_id = p_forecast_id
3352 and dim.product_attribute_context = cust_prod.product_attribute_context
3353 and dim.product_attribute = cust_prod.product_attribute
3354 and dim.product_attr_value = cust_prod.product_attr_value
3355 and dim.qualifier_grouping_no = cust_prod.qualifier_grouping_no
3356 and cust_prod.site_use_code = sales.market_type
3357 and cust_prod.site_use_id = sales.market_id
3358 and sales.item_level = 'PRICING_ATTRIBUTE1'
3359 and sales.item_id = cust_prod.inventory_item_id
3360 and period.obj_type = 'DISP'
3361 and period.obj_id = p_obj_id
3362 and period.forecast_id = p_forecast_id
3363 and rpt.report_date between period.start_date and period.end_date
3364 and rpt.report_date_julian = sales.time_id
3365 and sales.period_type_id = 1
3366 and dim.product_attribute_context = l_product_attribute_context
3367 and dim.product_attribute = l_product_attribute
3368 and dim.product_attr_value = l_product_attr_value
3369 and dim.qualifier_grouping_no = l_qualifier_grouping_no
3370 and period.forecast_period_id = l_period_number
3371 ),
3372 outer.forecast_remaining_quantity = 0
3373 WHERE outer.activity_metric_fact_id = k.activity_metric_fact_id
3374 AND outer.arc_act_metric_used_by = 'FCST'
3375 AND outer.act_metric_used_by_id = p_forecast_id;
3376
3377 EXCEPTION
3378 WHEN OTHERS THEN
3379 NULL;
3380 --dbms_output.put_line( ' ~~~~ ERROR in Update Baseline Sales for new TPR Percent -- ');
3381 END;
3382
3383 END LOOP; -- End of Level Three Records(k)
3384
3385 END LOOP; -- End of Level Two Records(j)
3386
3387 END LOOP; -- End Level One Records(i)
3388
3389 --- At this point, all numbers will be there at the most granular i.e. at level3
3390
3391 --- NOW, ROLLUP all numbers FOR LEVEL 2
3392 UPDATE ozf_act_metric_facts_all outer
3393 SET (outer.baseline_sales, outer.incremental_sales) =
3394 ( SELECT NVL(SUM(inner.baseline_sales),0),NVL(SUM(inner.incremental_sales),0)
3395 FROM ozf_act_metric_facts_all inner
3396 WHERE inner.previous_fact_id = outer.activity_metric_fact_id
3397 AND inner.arc_act_metric_used_by = 'FCST'
3398 AND inner.act_metric_used_by_id = p_forecast_id
3399 AND inner.fact_type = l_dimention3),
3400 outer.forecast_remaining_quantity = 0
3401 WHERE
3402 outer.arc_act_metric_used_by = 'FCST'
3403 AND outer.act_metric_used_by_id = p_forecast_id
3404 AND outer.fact_type = l_dimention2
3405 AND outer.previous_fact_id = p_activity_metric_fact_id;
3406
3407
3408 IF p_obj_type = 'OFFR'
3409 THEN
3410 --- NOW, ROLLUP all numbers FOR LEVEL 1 (this is always 'PRODUCT') -- only for OFFR, not for WKST
3411 UPDATE ozf_act_metric_facts_all outer
3412 SET (outer.baseline_sales, outer.incremental_sales) =
3413 ( SELECT NVL(SUM(inner.baseline_sales),0),NVL(SUM(inner.incremental_sales),0)
3414 FROM ozf_act_metric_facts_all inner
3415 WHERE inner.previous_fact_id = outer.activity_metric_fact_id
3416 AND inner.arc_act_metric_used_by = 'FCST'
3417 AND inner.act_metric_used_by_id = p_forecast_id
3418 AND inner.fact_type = l_dimention2),
3419 outer.tpr_percent = l_tpr_percent,
3420 outer.forecast_remaining_quantity = 0
3421 WHERE
3422 outer.arc_act_metric_used_by = 'FCST'
3423 AND outer.act_metric_used_by_id = p_forecast_id
3424 AND outer.fact_type = l_dimention1
3425 AND outer.activity_metric_fact_id = p_activity_metric_fact_id;
3426
3427 ---- NOW, ROLLUP all numbers FOR FORECAST Header LEVEL
3428 SELECT NVL(inner.incremental_sales,0) INTO l_new_incremental_sales
3429 FROM ozf_act_metric_facts_all inner
3430 WHERE inner.arc_act_metric_used_by = 'FCST'
3431 AND inner.act_metric_used_by_id = p_forecast_id
3432 AND inner.activity_metric_fact_id = p_activity_metric_fact_id;
3433
3434 UPDATE ozf_act_forecasts_all outer
3435 SET outer.forecast_quantity = outer.forecast_quantity + (l_new_incremental_sales - l_orig_incremental_sales)
3436 WHERE outer.forecast_id = p_forecast_id;
3437
3438 ELSIF p_obj_type = 'WKST'
3439 THEN
3440
3441 SELECT NVL(SUM(inner.incremental_sales), 0) INTO l_new_incremental_sales
3442 FROM ozf_act_metric_facts_all inner
3443 WHERE inner.previous_fact_id = p_activity_metric_fact_id
3444 AND inner.arc_act_metric_used_by = 'FCST'
3445 AND inner.act_metric_used_by_id = p_forecast_id
3446 AND inner.fact_type = l_dimention2;
3447
3448 END IF;
3449
3450 -- return new incr sales
3451 p_new_incremental_sales := l_new_incremental_sales;
3452
3453 IF (OZF_DEBUG_HIGH_ON) THEN
3454 OZF_Utility_PVT.debug_message(l_full_name || ': End adjusting baseline product, market and time spreads');
3455 END IF;
3456
3457 EXCEPTION
3458
3459 WHEN OTHERS THEN
3460
3461 ROLLBACK TO adjust_baseline_spreads;
3462
3463 x_return_status := FND_API.g_ret_sts_unexp_error;
3464
3465 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
3466 THEN
3467 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
3468 END IF;
3469
3470 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
3471 p_count => x_msg_count,
3472 p_data => x_msg_data);
3473
3474 END adjust_baseline_spreads; --end of procedure
3475
3476 --- Forward Declaration of the procedure
3477 PROCEDURE get_discount_percent (
3478 p_api_version IN NUMBER,
3479 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
3480 p_commit IN VARCHAR2 := FND_API.g_false,
3481 p_obj_type IN VARCHAR2,
3482 p_obj_id IN NUMBER,
3483 p_forecast_id IN NUMBER,
3484 p_product_attribute IN VARCHAR2,
3485 p_product_attr_value IN VARCHAR2,
3486 p_currency_code IN VARCHAR2,
3487 x_tpr_percent OUT NOCOPY NUMBER,
3488 x_return_status OUT NOCOPY VARCHAR2,
3489 x_msg_count OUT NOCOPY NUMBER,
3490 x_msg_data OUT NOCOPY VARCHAR2 );
3491
3492 --***********************************************
3493 --R12 Baseline
3494 --***********************************************
3495 PROCEDURE process_baseline_forecast(
3496 p_api_version IN NUMBER,
3497 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
3498 p_commit IN VARCHAR2 := FND_API.g_false,
3499 p_obj_type IN VARCHAR2,
3500 p_obj_id IN NUMBER,
3501 p_forecast_id IN NUMBER,
3502 p_period_level IN NUMBER,
3503 p_activity_metric_id IN NUMBER,
3504 p_fcst_uom IN VARCHAR2,
3505 x_return_status OUT NOCOPY VARCHAR2,
3506 x_msg_count OUT NOCOPY NUMBER,
3507 x_msg_data OUT NOCOPY VARCHAR2 )
3508 IS
3509
3510 l_api_version CONSTANT NUMBER := 1.0;
3511 l_api_name CONSTANT VARCHAR2(30) := 'process_baseline_forecast';
3512 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3513 l_return_status VARCHAR2(1);
3514 l_msg_count number(10);
3515 l_msg_data varchar2(2000);
3516
3517 CURSOR c_fcst_rec IS
3518 SELECT
3519 a.PERIOD_LEVEL,
3520 a.BASE_QUANTITY_TYPE,
3521 a.BASE_QUANTITY_REF,
3522 a.FORECAST_SPREAD_TYPE,
3523 a.DIMENTION1,
3524 a.DIMENTION2,
3525 a.DIMENTION3,
3526 a.BASE_QUANTITY_START_DATE,
3527 a.BASE_QUANTITY_END_DATE,
3528 a.INCREMENT_QUOTA,
3529 a.FORECAST_UOM_CODE,
3530 a.LAST_SCENARIO_ID,
3531 b.transaction_currency_code
3532 FROM OZF_ACT_FORECASTS_ALL a, ozf_offers b
3533 WHERE a.FORECAST_ID = p_forecast_id
3534 AND a.arc_act_fcast_used_by = p_obj_type
3535 AND a.act_fcast_used_by_id = p_obj_id
3536 AND b.qp_list_header_id = a.act_fcast_used_by_id;
3537
3538 CURSOR c_wkst_fcst_rec IS
3539 SELECT
3540 a.PERIOD_LEVEL,
3541 a.BASE_QUANTITY_TYPE,
3542 a.BASE_QUANTITY_REF,
3543 a.FORECAST_SPREAD_TYPE,
3544 a.DIMENTION1,
3545 a.DIMENTION2,
3546 a.DIMENTION3,
3547 trunc(b.start_date_active) wkst_start_date_active,
3548 trunc(b.end_date_active) wkst_end_date_active,
3549 a.INCREMENT_QUOTA,
3550 a.forecast_uom_code,
3551 a.LAST_SCENARIO_ID,
3552 b.currency_code
3553 FROM ozf_act_forecasts_all a,
3554 ozf_worksheet_headers_b b
3555 WHERE a.FORECAST_ID = p_forecast_id
3556 AND b.worksheet_header_id = NVL(p_obj_id, b.worksheet_header_id)
3557 AND a.arc_act_fcast_used_by = NVL(p_obj_type, 'WKST')
3558 AND a.act_fcast_used_by_id = b.worksheet_header_id
3559 AND b.forecast_generated = DECODE(p_obj_id, NULL, 'N',b.forecast_generated);
3560
3561 CURSOR level_one_facts IS
3562 SELECT activity_metric_fact_id,
3563 fact_reference,
3564 fact_type
3565 FROM ozf_act_metric_facts_all
3566 WHERE arc_act_metric_used_by = 'FCST'
3567 AND act_metric_used_by_id = p_forecast_id
3568 AND previous_fact_id IS NULL
3569 AND root_fact_id IS NULL;
3570
3571 CURSOR level_two_facts(p_previous_fact_id IN NUMBER) IS
3572 SELECT activity_metric_fact_id,
3573 fact_reference,
3574 fact_type
3575 FROM ozf_act_metric_facts_all
3576 WHERE arc_act_metric_used_by = 'FCST'
3577 AND act_metric_used_by_id = p_forecast_id
3578 AND previous_fact_id = p_previous_fact_id
3579 AND root_fact_id IS NULL;
3580
3581 CURSOR level_three_facts(p_root_fact_id IN NUMBER, p_previous_fact_id IN NUMBER) IS
3582 SELECT activity_metric_fact_id,
3583 fact_reference,
3584 fact_type
3585 FROM ozf_act_metric_facts_all
3586 WHERE arc_act_metric_used_by = 'FCST'
3587 AND act_metric_used_by_id = p_forecast_id
3588 AND previous_fact_id = p_previous_fact_id
3589 AND root_fact_id = p_root_fact_id;
3590
3591 CURSOR get_product_qualfiers(p_forecast_dimention_id IN NUMBER) IS
3592 SELECT product_attribute_context,
3593 product_attribute,
3594 product_attr_value
3595 FROM ozf_forecast_dimentions
3596 WHERE forecast_dimention_id = p_forecast_dimention_id
3597 AND forecast_id = p_forecast_id;
3598
3599 CURSOR get_market_qualifiers(p_forecast_dimention_id IN NUMBER) IS
3600 SELECT qualifier_grouping_no
3601 FROM ozf_forecast_dimentions
3602 WHERE forecast_dimention_id = p_forecast_dimention_id
3603 AND forecast_id = p_forecast_id;
3604
3605 CURSOR get_products(l_qualifier_grouping_no IN NUMBER) IS
3606 SELECT min(forecast_dimention_id) forecast_dimention_id,
3607 product_attribute_context,
3608 product_attribute,
3609 product_attr_value
3610 FROM ozf_forecast_dimentions
3611 WHERE obj_type = p_obj_type
3612 AND obj_id = p_obj_id
3613 AND forecast_id = p_forecast_id
3614 AND qualifier_grouping_no = NVL(l_qualifier_grouping_no, qualifier_grouping_no)
3615 GROUP BY
3616 product_attribute_context,
3617 product_attribute,
3618 product_attr_value ;
3619
3620 CURSOR get_markets (l_product_attribute_context IN VARCHAR2,
3621 l_product_attribute IN VARCHAR2,
3622 l_product_attr_value IN VARCHAR2 )
3623 IS
3624 SELECT min(forecast_dimention_id) forecast_dimention_id,
3625 min(qualifier_grouping_no) qualifier_grouping_no
3626 FROM ozf_forecast_dimentions
3627 WHERE obj_type = p_obj_type
3628 AND obj_id = p_obj_id
3629 AND forecast_id = p_forecast_id
3630 AND product_attribute_context = NVL(l_product_attribute_context, product_attribute_context)
3631 AND product_attribute = NVL(l_product_attribute, product_attribute)
3632 AND product_attr_value = NVL(l_product_attr_value, product_attr_value)
3633 GROUP BY
3634 qualifier_context,
3635 qualifier_attribute,
3636 qualifier_attr_value,
3637 qualifier_grouping_no ;
3638
3639 CURSOR periods_csr IS
3640 SELECT period_number,
3641 start_date,
3642 end_date,
3643 period_type_id
3644 FROM ozf_forecast_periods
3645 WHERE obj_type = p_obj_type
3646 AND obj_id = p_obj_id;
3647
3648 CURSOR get_sales_period IS
3649 SELECT period_number
3650 FROM ozf_forecast_periods
3651 WHERE obj_type = p_obj_type -- 'OFFR'
3652 AND obj_id = p_obj_id
3653 AND (forecast_id IS NULL -- inanaiah: For compatibility with older release
3654 OR forecast_id = p_forecast_id); -- inanaiah: making periods bound to forecast_id as is the case when creating new version ;
3655
3656
3657 l_activity_metric_id NUMBER := p_activity_metric_id;
3658 l_base_sales NUMBER := 0;
3659 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
3660 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
3661 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
3662 l_qualifier_grouping_no NUMBER;
3663 l_period_number NUMBER;
3664 l_previous_fact_id NUMBER ;
3665 l_root_fact_id NUMBER;
3666 l_period_level OZF_ACT_FORECASTS_ALL.period_level%TYPE;
3667 l_base_quantity_type OZF_ACT_FORECASTS_ALL.base_quantity_type%TYPE;
3668 l_base_quantity_ref OZF_ACT_FORECASTS_ALL.base_quantity_ref%TYPE;
3669 l_forecast_spread_type OZF_ACT_FORECASTS_ALL.forecast_spread_type%TYPE;
3670 l_dimention1 OZF_ACT_FORECASTS_ALL.dimention1%TYPE;
3671 l_dimention2 OZF_ACT_FORECASTS_ALL.dimention2%TYPE;
3672 l_dimention3 OZF_ACT_FORECASTS_ALL.dimention3%TYPE;
3673 l_base_quantity_start_date OZF_ACT_FORECASTS_ALL.base_quantity_start_date%TYPE;
3674 l_base_quantity_end_date OZF_ACT_FORECASTS_ALL.base_quantity_end_date%TYPE;
3675 l_increment_quota OZF_ACT_FORECASTS_ALL.increment_quota%TYPE;
3676 l_forecast_uom_code OZF_ACT_FORECASTS_ALL.forecast_uom_code%TYPE;
3677 l_last_scenario_id OZF_ACT_FORECASTS_ALL.last_scenario_id%TYPE;
3678 l_tpr_percent NUMBER;
3679 l_baseline_sales NUMBER;
3680 l_incremental_sales NUMBER;
3681
3682 /* Added for promotional goods offer */
3683 l_node_id NUMBER;
3684 l_offer_type VARCHAR2(30) := 'OFFR';
3685 l_currency_code VARCHAR2(30) := 'USD';
3686
3687 CURSOR get_offer_type
3688 IS
3689 SELECT offer_type
3690 FROM ozf_offers
3691 WHERE qp_list_header_id = p_obj_id;
3692
3693 CURSOR get_promotion_type(l_product_attribute_context IN VARCHAR2,
3694 l_product_attribute IN VARCHAR2,
3695 l_product_attr_value IN VARCHAR2 )
3696 IS
3697 SELECT DECODE(qpl.list_line_type_code
3698 ,'DIS', DECODE(qpl.operand
3699 ,100 , DECODE(qpl.arithmetic_operator
3700 ,'%', 3
3701 , 2 )
3702 , 2)
3703 , 1) promotion_type
3704 FROM qp_list_lines qpl,
3705 qp_pricing_attributes qp
3706 WHERE qpl.list_header_id = p_obj_id
3707 AND qpl.list_line_id = qp.list_line_id
3708 AND qp.excluder_flag = 'N'
3709 AND qp.product_attribute_context = l_product_attribute_context
3710 AND qp.product_attribute = l_product_attribute
3711 AND qp.product_attr_value = l_product_attr_value
3712 ORDER BY promotion_type;
3713
3714
3715 BEGIN
3716
3717
3718 IF (OZF_DEBUG_HIGH_ON) THEN
3719 OZF_Utility_PVT.debug_message(l_full_name || ': Start Process Baseline Forecast ');
3720 END IF;
3721
3722 --
3723 -- Initialize savepoint.
3724 --
3725 SAVEPOINT process_baseline_forecast;
3726
3727 IF FND_API.to_boolean(p_init_msg_list) THEN
3728 FND_MSG_PUB.initialize;
3729 END IF;
3730
3731 IF NOT FND_API.compatible_api_call(l_api_version,
3732 p_api_version,
3733 l_api_name,
3734 g_pkg_name)
3735 THEN
3736 RAISE FND_API.g_exc_unexpected_error;
3737 END IF;
3738
3739 x_return_status := FND_API.g_ret_sts_success;
3740
3741
3742 -- First: Get Offer or Wkst Forecast Header Level Details from the forecast id
3743 IF p_obj_type = 'OFFR'
3744 THEN
3745 -- for OFFR
3746 OPEN c_fcst_rec;
3747 FETCH c_fcst_rec INTO
3748 l_period_level,
3749 l_base_quantity_type,
3750 l_base_quantity_ref,
3751 l_forecast_spread_type,
3752 l_dimention1,
3753 l_dimention2,
3754 l_dimention3,
3755 l_base_quantity_start_date,
3756 l_base_quantity_end_date,
3757 l_increment_quota,
3758 l_forecast_uom_code,
3759 l_last_scenario_id,
3760 l_currency_code;
3761 CLOSE c_fcst_rec;
3762
3763 ELSIF p_obj_type = 'WKST'
3764 THEN
3765 -- for WKST
3766 OPEN c_wkst_fcst_rec;
3767 FETCH c_wkst_fcst_rec INTO
3768 l_period_level,
3769 l_base_quantity_type,
3770 l_base_quantity_ref,
3771 l_forecast_spread_type,
3772 l_dimention1,
3773 l_dimention2,
3774 l_dimention3,
3775 l_base_quantity_start_date,
3776 l_base_quantity_end_date,
3777 l_increment_quota,
3778 l_forecast_uom_code,
3779 l_last_scenario_id,
3780 l_currency_code;
3781 CLOSE c_wkst_fcst_rec;
3782
3783 END IF;
3784
3785 -- Second: Set Defaults, both for, OFFR and WKST
3786 IF (l_dimention1 IS NULL OR l_dimention2 IS NULL OR l_dimention3 IS NULL )
3787 THEN
3788 l_dimention1 := 'PRODUCT';
3789 l_dimention2 := 'MARKET';
3790 l_dimention3 := 'TIME';
3791 END IF;
3792
3793
3794 -- If period_level is not chosen by the user on the UI, then default it to WEEKLY
3795 l_period_level := NVL(p_period_level, NVL(l_period_level, 16));
3796
3797
3798 -- Third : create fact rows for all 3 dimensions
3799 create_fcst_facts(p_api_version,
3800 p_init_msg_list,
3801 p_commit,
3802 l_base_quantity_type,
3803 p_obj_type,
3804 p_obj_id,
3805 p_forecast_id,
3806 l_activity_metric_id,
3807 'ONE', -- p_level,
3808 l_dimention1,
3809 l_forecast_uom_code,
3810 l_base_quantity_start_date,
3811 l_base_quantity_end_date,
3812 l_return_status,
3813 x_msg_count,
3814 x_msg_data);
3815
3816 create_fcst_facts(p_api_version,
3817 p_init_msg_list,
3818 p_commit,
3819 l_base_quantity_type,
3820 p_obj_type,
3821 p_obj_id,
3822 p_forecast_id,
3823 l_activity_metric_id,
3824 'TWO', -- p_level,
3825 l_dimention2,
3826 l_forecast_uom_code,
3827 l_base_quantity_start_date,
3828 l_base_quantity_end_date,
3829 l_return_status,
3830 x_msg_count,
3831 x_msg_data);
3832
3833 create_fcst_facts(p_api_version,
3834 p_init_msg_list,
3835 p_commit,
3836 l_base_quantity_type,
3837 p_obj_type,
3838 p_obj_id,
3839 p_forecast_id,
3840 l_activity_metric_id,
3841 'THREE', -- p_level,
3842 l_dimention3,
3843 l_forecast_uom_code,
3844 l_base_quantity_start_date,
3845 l_base_quantity_end_date,
3846 l_return_status,
3847 x_msg_count,
3848 x_msg_data);
3849 --dbms_output.put_line( ' STATUS After level 3 facts ~~~~~~ => '||l_return_status );
3850
3851
3852
3853 -- Fourth : Get baseline sales from 3rd party baseline sales MV
3854 -- : Get best fit Lift from 3rd party Lift factors
3855
3856 -- Process for P->M->T or P->T->M
3857 ---- At this point all FACTS are present
3858 ---- Now PROCESS the THIRD LEVEL records only (most granular record)
3859
3860 ---- For each 1st level
3861 ---------For each 2nd level
3862 ------------For each 3rd level records
3863 ---------------- GET the Base Sales for each record
3864 ---------------- GET the best-fit-lift for each record (offer_id, forecast_id will be passed)
3865 ---------------- Calculate the incremental sales
3866 ------------end loop; 3rd level
3867 ---------end loop; 2nd level
3868 ---- end loop; 1st level
3869
3870
3871 FOR i IN level_one_facts
3872 LOOP
3873 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~ Inside i Loop ~~~~~~~~~~~~~~~~~~~ ' );
3874 --dbms_output.put_line( ' i Loop ~~: i.activity_metric_fact_id == '|| i.activity_metric_fact_id);
3875
3876 l_root_fact_id := i.activity_metric_fact_id ;
3877
3878 OPEN get_product_qualfiers(i.fact_reference) ;
3879 FETCH get_product_qualfiers INTO l_product_attribute_context,
3880 l_product_attribute,
3881 l_product_attr_value ;
3882 CLOSE get_product_qualfiers;
3883
3884 --dbms_output.put_line( ' ~~~~~~~i.activity_metric_fact_id~~~~~~~~~~~~ '||i.activity_metric_fact_id );
3885 --dbms_output.put_line( ' ~~ level_one_facts ~~: p_obj_type == '|| p_obj_type);
3886 --dbms_output.put_line( ' ~~ level_one_facts ~~: p_obj_id == '|| p_obj_id);
3887 --dbms_output.put_line( ' ~~ level_one_facts ~~: p_forecast_id == '||p_forecast_id );
3888 --dbms_output.put_line( ' ~~ level_one_facts ~~: l_product_attribute == '|| l_product_attribute);
3889 --dbms_output.put_line( ' ~~ level_one_facts ~~: l_product_attr_value == '|| l_product_attr_value);
3890 --dbms_output.put_line( ' ~~ level_one_facts ~~: l_currency_code == '|| l_currency_code);
3891 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' );
3892
3893 get_discount_percent
3894 (p_api_version,
3895 p_init_msg_list,
3896 p_commit,
3897 p_obj_type,
3898 p_obj_id,
3899 p_forecast_id,
3900 l_product_attribute,
3901 l_product_attr_value,
3902 l_currency_code,
3903 l_tpr_percent,
3904 x_return_status,
3905 x_msg_count,
3906 x_msg_data);
3907 --dbms_output.put_line( ' ~~ level_one_facts ~~: x_return_status == '|| x_return_status );
3908 --dbms_output.put_line( ' ~~ level_one_facts ~~: l_tpr_percent == '|| l_tpr_percent );
3909
3910 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
3911 RAISE FND_API.G_EXC_ERROR;
3912 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3913 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3914 END IF;
3915
3916 UPDATE ozf_act_metric_facts_all prod_fact
3917 SET tpr_percent = NVL(l_tpr_percent,0)
3918 WHERE prod_fact.activity_metric_fact_id = i.activity_metric_fact_id
3919 AND prod_fact.arc_act_metric_used_by = 'FCST'
3920 AND prod_fact.act_metric_used_by_id = p_forecast_id;
3921
3922 FOR j IN level_two_facts(i.activity_metric_fact_id)
3923 LOOP
3924
3925 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~ Inside j Loop ~~~~~~~~~~~~~~~~~~~ ' );
3926 --dbms_output.put_line( ' ~ j Loop ~~: j.activity_metric_fact_id == '|| j.activity_metric_fact_id);
3927
3928 l_previous_fact_id := j.activity_metric_fact_id ;
3929
3930 IF (j.fact_type = 'MARKET')
3931 THEN
3932
3933 OPEN get_market_qualifiers(j.fact_reference);
3934 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
3935 CLOSE get_market_qualifiers;
3936
3937 ELSIF (j.fact_type = 'TIME')
3938 THEN
3939
3940 l_period_number := j.fact_reference ;
3941
3942 END IF;
3943
3944
3945 FOR k IN level_three_facts(i.activity_metric_fact_id, j.activity_metric_fact_id)
3946 LOOP
3947
3948 IF (k.fact_type = 'MARKET')
3949 THEN
3950
3951 OPEN get_market_qualifiers(k.fact_reference);
3952 FETCH get_market_qualifiers INTO l_qualifier_grouping_no;
3953 CLOSE get_market_qualifiers;
3954
3955 ELSIF (k.fact_type = 'TIME')
3956 THEN
3957 l_period_number := k.fact_reference ;
3958
3959 END IF;
3960
3961 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~~~~~~ Inside k Loop ~~~~~~~~~~~~~~~~~~~ ' );
3962 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~ ' );
3963 --dbms_output.put_line( ' ~~ k Loop ~~: l_forecast_period_id == '|| l_period_number);
3964 --dbms_output.put_line( ' ~~ k Loop ~~: k.activity_metric_fact_id == '|| k.activity_metric_fact_id);
3965 --dbms_output.put_line( ' ~~ k Loop ~~: l_product_attribute_context == '|| l_product_attribute_context );
3966 --dbms_output.put_line( ' ~~ k Loop ~~: l_product_attribute == '|| l_product_attribute);
3967 --dbms_output.put_line( ' ~~ k Loop ~~: l_product_attr_value == '|| l_product_attr_value );
3968 --dbms_output.put_line( ' ~~ k Loop ~~: l_qualifier_grouping_no == '|| l_qualifier_grouping_no );
3969 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~ ' );
3970 --dbms_output.put_line( ' ~~ k Loop ~~: l_tpr_percent == '|| l_tpr_percent );
3971 --dbms_output.put_line( ' ~~ k Loop ~~: p_obj_type == '|| p_obj_type);
3972 --dbms_output.put_line( ' ~~ k Loop ~~: p_obj_id == '|| p_obj_id);
3973 --dbms_output.put_line( ' ~~ k Loop ~~: p_forecast_id == '||p_forecast_id );
3974 --dbms_output.put_line( ' ~~ k Loop ~~: l_base_quantity_ref == '|| l_base_quantity_ref);
3975 --dbms_output.put_line( ' ~~~~~~~~~~~~~~~~~~~ ' );
3976
3977
3978 -- Now, all three dimensions are available: P, T, M
3979 BEGIN
3980
3981 UPDATE ozf_act_metric_facts_all outer
3982 SET (outer.baseline_sales, outer.incremental_sales) =
3983 (
3984 select
3985 ROUND(NVL (SUM(sales.baseline_sales) ,0) ) baseline_sales,
3986 DECODE(l_tpr_percent, NULL, 0, ROUND(NVL (SUM(sales.baseline_sales * NVL(OZF_FORECAST_UTIL_PVT.get_best_fit_lift
3987 (
3988 p_obj_type,
3989 p_obj_id,
3990 p_forecast_id,
3991 l_base_quantity_ref,
3992 sales.market_type,
3993 sales.market_id,
3994 dim.product_attribute_context,
3995 dim.product_attribute,
3996 dim.product_attr_value,
3997 sales.item_id,
3998 l_tpr_percent,
3999 rpt.report_date
4000 ), 0)
4001 ) ,0) ) )incremental_sales
4002 from OZF_BASEline_sales_v sales,
4003 ozf_time_day rpt,
4004 (select cust.qualifier_grouping_no,
4005 cust.cust_account_id,
4006 cust.site_use_code site_use_code,
4007 cust.site_use_id site_use_id,
4008 prod.product_attribute_context,
4009 prod.product_attribute,
4010 prod.product_attr_value,
4011 prod.product_id inventory_item_id
4012 from ozf_forecast_customers cust,
4013 ozf_forecast_products prod
4014 where prod.obj_type = p_obj_type
4015 and prod.obj_id = p_obj_id
4016 and prod.obj_type = cust.obj_type
4017 and prod.obj_id = cust.obj_id
4018 and cust.site_use_code = 'SHIP_TO'
4019 ) cust_prod,
4020 ozf_forecast_dimentions dim,
4021 ozf_forecast_periods period
4022 where dim.obj_type = p_obj_type
4023 and dim.obj_id = p_obj_id
4024 AND dim.forecast_id = p_forecast_id
4025 and dim.product_attribute_context = cust_prod.product_attribute_context
4026 and dim.product_attribute = cust_prod.product_attribute
4027 and dim.product_attr_value = cust_prod.product_attr_value
4028 and dim.qualifier_grouping_no = cust_prod.qualifier_grouping_no
4029 and cust_prod.site_use_code = sales.market_type
4030 and cust_prod.site_use_id = sales.market_id
4031 and sales.item_level = 'PRICING_ATTRIBUTE1'
4032 and sales.item_id = cust_prod.inventory_item_id
4033 and period.obj_type = 'DISP'
4034 and period.obj_id = p_obj_id
4035 and period.forecast_id = p_forecast_id
4036 and rpt.report_date between period.start_date and period.end_date
4037 and rpt.report_date_julian = sales.time_id
4038 and sales.period_type_id = 1
4039 and dim.product_attribute_context = l_product_attribute_context
4040 and dim.product_attribute = l_product_attribute
4041 and dim.product_attr_value = l_product_attr_value
4042 and dim.qualifier_grouping_no = l_qualifier_grouping_no
4043 and period.forecast_period_id = l_period_number
4044 ),
4045 outer.forecast_remaining_quantity = 0
4046 WHERE outer.activity_metric_fact_id = k.activity_metric_fact_id
4047 AND outer.arc_act_metric_used_by = 'FCST'
4048 AND outer.act_metric_used_by_id = p_forecast_id;
4049
4050 EXCEPTION
4051 WHEN OTHERS THEN
4052 NULL;
4053 --dbms_output.put_line( ' ~~~~ ERROR in Update Baseline Sales for ABOVE record -- ');
4054 END;
4055
4056
4057 UPDATE ozf_act_metric_facts_all outer2
4058 SET outer2.baseline_sales=0
4059 WHERE outer2.activity_metric_fact_id = k.activity_metric_fact_id
4060 AND outer2.arc_act_metric_used_by = 'FCST'
4061 AND outer2.act_metric_used_by_id = p_forecast_id
4062 AND outer2.baseline_sales IS NULL;
4063
4064 UPDATE ozf_act_metric_facts_all outer3
4065 SET outer3.incremental_sales=0
4066 WHERE outer3.activity_metric_fact_id = k.activity_metric_fact_id
4067 AND outer3.arc_act_metric_used_by = 'FCST'
4068 AND outer3.act_metric_used_by_id = p_forecast_id
4069 AND outer3.incremental_sales IS NULL;
4070
4071
4072 END LOOP; -- End of Level Three Records(k)
4073
4074 END LOOP; -- End of Level Two Records(j)
4075
4076 END LOOP; -- End Level One Records(i)
4077
4078
4079 --- At this point, all numbers will be there at the most granular i.e. at level3
4080 --- NOW, ROLLUP all numbers FOR LEVEL 2
4081 UPDATE ozf_act_metric_facts_all outer
4082 SET (outer.baseline_sales, outer.incremental_sales) =
4083 ( SELECT NVL(SUM(inner.baseline_sales),0),NVL(SUM(inner.incremental_sales),0)
4084 FROM ozf_act_metric_facts_all inner
4085 WHERE inner.previous_fact_id = outer.activity_metric_fact_id
4086 AND inner.arc_act_metric_used_by = 'FCST'
4087 AND inner.act_metric_used_by_id = p_forecast_id
4088 AND inner.fact_type = l_dimention3),
4089 outer.forecast_remaining_quantity = 0
4090 WHERE
4091 outer.arc_act_metric_used_by = 'FCST'
4092 AND outer.act_metric_used_by_id = p_forecast_id
4093 AND outer.fact_type = l_dimention2;
4094
4095
4096 --- NOW, ROLLUP all numbers FOR LEVEL 1 (this is always 'PRODUCT')
4097 UPDATE ozf_act_metric_facts_all outer
4098 SET (outer.baseline_sales, outer.incremental_sales) =
4099 ( SELECT NVL(SUM(inner.baseline_sales),0),NVL(SUM(inner.incremental_sales),0)
4100 FROM ozf_act_metric_facts_all inner
4101 WHERE inner.previous_fact_id = outer.activity_metric_fact_id
4102 AND inner.arc_act_metric_used_by = 'FCST'
4103 AND inner.act_metric_used_by_id = p_forecast_id
4104 AND inner.fact_type = l_dimention2),
4105 outer.forecast_remaining_quantity = 0
4106 WHERE
4107 outer.arc_act_metric_used_by = 'FCST'
4108 AND outer.act_metric_used_by_id = p_forecast_id
4109 AND outer.fact_type = l_dimention1;
4110 --dbms_output.put_line( ' ~~~~~~~ DONE -- ROLLUP all numbers FOR LEVEL 1 ~~~~~~~~ ' );
4111
4112
4113 --- NOW, ROLLUP all numbers FOR FORECAST Header LEVEL
4114 --- Also, Make Sure that dimentions are updated to default selection
4115 UPDATE ozf_act_forecasts_all outer
4116 SET (outer.forecast_quantity, outer.base_quantity) =
4117 ( SELECT (NVL(SUM(inner.baseline_sales),0) + NVL(SUM(inner.incremental_sales),0)) total_forecast,
4118 NVL(SUM(inner.baseline_sales),0) baseline_sales
4119 FROM ozf_act_metric_facts_all inner
4120 WHERE inner.arc_act_metric_used_by = 'FCST'
4121 AND inner.act_metric_used_by_id = p_forecast_id
4122 AND inner.fact_type = l_dimention1),
4123 outer.dimention1 = l_dimention1,
4124 outer.dimention2 = l_dimention2,
4125 outer.dimention3 = l_dimention3,
4126 outer.period_level = l_period_level,
4127 outer.forecast_remaining_quantity = 0
4128 --last_scenario_id = NVL(last_scenario_id,0)+1
4129 WHERE outer.forecast_id = p_forecast_id;
4130
4131 IF (OZF_DEBUG_HIGH_ON) THEN
4132 OZF_Utility_PVT.debug_message(l_full_name || ': End Process Baseline Forecast ');
4133 END IF;
4134
4135 EXCEPTION
4136
4137 WHEN OTHERS THEN
4138
4139 ROLLBACK TO process_baseline_forecast;
4140
4141 x_return_status := FND_API.g_ret_sts_unexp_error;
4142
4143 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
4144 THEN
4145 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
4146 END IF;
4147
4148 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
4149 p_count => x_msg_count,
4150 p_data => x_msg_data);
4151
4152
4153 END process_baseline_forecast; --end of procedure
4154 --***********************************************
4155
4156 PROCEDURE create_wkst_forecasts(
4157 p_api_version IN NUMBER,
4158 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
4159 p_commit IN VARCHAR2 := FND_API.g_false,
4160 p_worksheet_header_id IN NUMBER ,
4161 x_return_status OUT NOCOPY VARCHAR2,
4162 x_msg_count OUT NOCOPY NUMBER,
4163 x_msg_data OUT NOCOPY VARCHAR2 )
4164 IS
4165 l_api_version CONSTANT NUMBER := 1.0;
4166 l_api_name CONSTANT VARCHAR2(30) := 'create_wkst_forecasts';
4167 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4168 l_return_status VARCHAR2(1);
4169
4170 CURSOR c_fcst_rec IS
4171 SELECT b.worksheet_header_id,
4172 trunc(b.start_date_active) wkst_start_date_active,
4173 trunc(b.end_date_active) wkst_end_date_active,
4174 a.forecast_id ,
4175 a.period_level, /* DAY, WEEK, MONTH, QTR */
4176 a.forecast_uom_code,
4177 a.base_quantity_type, /* LAST_YEAR_SAME_PERIOD, OFFER_CODE, CUSTOM_DATE_RANGE */
4178 a.base_quantity_start_date,
4179 a.base_quantity_end_date,
4180 a.base_quantity_ref /* OFFER_CODE or BASELINE SOURCE */
4181 FROM ozf_act_forecasts_all a,
4182 ozf_worksheet_headers_b b
4183 WHERE b.worksheet_header_id = NVL(p_worksheet_header_id, b.worksheet_header_id)
4184 AND a.arc_act_fcast_used_by = 'WKST'
4185 AND a.act_fcast_used_by_id = b.worksheet_header_id
4186 AND b.forecast_generated = DECODE(p_worksheet_header_id, NULL, 'N',b.forecast_generated);
4187
4188 CURSOR offer_dates_csr(p_offer_code IN VARCHAR2) IS
4189 SELECT NVL(qp.start_date_active,trunc(SYSDATE)) start_date_active,
4190 NVL(qp.end_date_active, trunc(SYSDATE)) end_date_active
4191 FROM qp_list_headers_b qp,
4192 ozf_offers off
4193 WHERE off.offer_code = p_offer_code
4194 AND off.qp_list_header_id = qp.list_header_id ;
4195
4196 l_forecast_id NUMBER;
4197 l_period_level VARCHAR2(30);
4198 l_forecast_uom_code VARCHAR2(30);
4199 l_base_quantity_type VARCHAR2(30);
4200 l_base_quantity_start_date DATE;
4201 l_base_quantity_end_date DATE;
4202 l_base_quantity_ref VARCHAR2(30);
4203
4204 l_wkst_start_date DATE;
4205 l_wkst_end_date DATE;
4206
4207 l_activity_metric_id NUMBER;
4208 l_worksheet_header_id NUMBER;
4209
4210 BEGIN
4211
4212 IF (OZF_DEBUG_HIGH_ON)
4213 THEN
4214 OZF_Utility_PVT.debug_message(l_full_name || ': Start Create Wkst Forecasts');
4215 END IF;
4216
4217 --
4218 -- Initialize savepoint.
4219 --
4220
4221 SAVEPOINT Create_Wkst_Forecasts;
4222
4223 IF FND_API.to_boolean(p_init_msg_list) THEN
4224 FND_MSG_PUB.initialize;
4225 END IF;
4226
4227 IF NOT FND_API.compatible_api_call(l_api_version,
4228 p_api_version,
4229 l_api_name,
4230 g_pkg_name)
4231 THEN
4232 RAISE FND_API.g_exc_unexpected_error;
4233 END IF;
4234
4235 x_return_status := FND_API.g_ret_sts_success;
4236
4237 -- Start
4238 -- Process for all Worksheets for which forecast is not generated
4239 FOR i IN c_fcst_rec
4240 LOOP
4241
4242 l_worksheet_header_id := i.worksheet_header_id;
4243 l_wkst_start_date := i.wkst_start_date_active;
4244 l_wkst_end_date := i.wkst_end_date_active;
4245 l_forecast_id := i.forecast_id;
4246 l_period_level := i.period_level;
4247 l_forecast_uom_code := i.forecast_uom_code;
4248 l_base_quantity_type := i.base_quantity_type;
4249 l_base_quantity_ref := i.base_quantity_ref;
4250
4251 IF l_base_quantity_type = 'LAST_YEAR_SAME_PERIOD'
4252 THEN
4253
4254 l_base_quantity_start_date := ADD_MONTHS(l_wkst_start_date, -12);
4255 l_base_quantity_end_date := ADD_MONTHS(l_wkst_end_date, -12);
4256
4257 ELSIF l_base_quantity_type = 'OFFER_CODE'
4258 THEN
4259
4260 OPEN offer_dates_csr(l_base_quantity_ref);
4261 FETCH offer_dates_csr INTO l_base_quantity_start_date,l_base_quantity_end_date;
4262 CLOSE offer_dates_csr;
4263
4264 ELSIF l_base_quantity_type = 'CUSTOM_DATE_RANGE'
4265 THEN
4266
4267 l_base_quantity_start_date := i.base_quantity_start_date;
4268 l_base_quantity_end_date := i.base_quantity_end_date;
4269
4270 --R12 Baseline
4271 ELSIF (l_base_quantity_type = 'BASELINE')
4272 THEN
4273
4274 l_base_quantity_start_date := l_wkst_start_date;
4275 l_base_quantity_end_date := l_wkst_end_date;
4276 END IF;
4277
4278 -- R12 modified
4279 -- Create Forecast
4280 create_forecast(
4281 p_api_version,
4282 p_init_msg_list,
4283 p_commit,
4284 'WKST', -- p_obj_type ,
4285 l_worksheet_header_id, -- p_obj_id ,
4286 l_forecast_uom_code ,
4287
4288 l_base_quantity_start_date,
4289 l_base_quantity_end_date,
4290 l_base_quantity_type,
4291 l_base_quantity_ref,
4292 null,
4293 l_base_quantity_ref,
4294
4295 l_forecast_id,
4296 l_activity_metric_id, -- 11510
4297 l_return_status,
4298 x_msg_count,
4299 x_msg_data) ;
4300
4301 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4302 RAISE FND_API.G_EXC_ERROR;
4303 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4304 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4305 END IF;
4306 -- Create dimentions
4307
4308 create_dimentions (
4309 p_api_version,
4310 p_init_msg_list,
4311 p_commit,
4312 'WKST', -- p_obj_type ,
4313 l_worksheet_header_id, --p_obj_id ,
4314 l_forecast_id,
4315 l_return_status,
4316 x_msg_count,
4317 x_msg_data ) ;
4318
4319
4320 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4321 RAISE FND_API.G_EXC_ERROR;
4322 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4323 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4324 END IF;
4325
4326 -- Create products
4327
4328 populate_fcst_products(
4329 p_api_version,
4330 p_init_msg_list,
4331 p_commit,
4332 'WKST', --p_obj_type ,
4333 l_worksheet_header_id, --p_obj_id ,
4334 l_forecast_id,
4335 l_return_status,
4336 x_msg_count,
4337 x_msg_data ) ;
4338
4339
4340 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4341 RAISE FND_API.G_EXC_ERROR;
4342 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4343 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4344 END IF;
4345
4346 -- Create customers
4347
4348 populate_fcst_customers(
4349 p_api_version,
4350 p_init_msg_list,
4351 p_commit,
4352 'WKST', -- p_obj_type,
4353 l_worksheet_header_id, --p_obj_id,
4354 l_forecast_id,
4355 l_return_status,
4356 x_msg_count,
4357 x_msg_data);
4358
4359
4360 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4361 RAISE FND_API.G_EXC_ERROR;
4362 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4363 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4364 END IF;
4365
4366
4367 IF l_base_quantity_type <> 'BASELINE' AND l_period_level IS NOT NULL
4368 THEN
4369
4370 populate_fcst_periods(p_api_version,
4371 p_init_msg_list,
4372 p_commit,
4373 'WKST', --p_obj_type,
4374 l_worksheet_header_id, --p_obj_id,
4375 l_base_quantity_start_date,
4376 l_base_quantity_end_date,
4377 l_period_level,
4378 l_forecast_id,
4379 l_return_status,
4380 x_msg_count,
4381 x_msg_data);
4382
4383 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4384 RAISE FND_API.G_EXC_ERROR;
4385 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4386 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4387 END IF;
4388
4389 END IF;
4390
4391
4392 IF (l_base_quantity_type = 'BASELINE')
4393 THEN
4394
4395 l_period_level := NVL(l_period_level, 16); -- WEEKLY
4396
4397 populate_fcst_periods(p_api_version,
4398 p_init_msg_list,
4399 p_commit,
4400 'DISP', --p_obj_type,
4401 l_worksheet_header_id, --p_obj_id,
4402 l_base_quantity_start_date,
4403 l_base_quantity_end_date,
4404 l_period_level,
4405 l_forecast_id,
4406 l_return_status,
4407 x_msg_count,
4408 x_msg_data);
4409
4410 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4411 RAISE FND_API.G_EXC_ERROR;
4412 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4413 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4414 END IF;
4415
4416 populate_fcst_periods(p_api_version,
4417 p_init_msg_list,
4418 p_commit,
4419 'WKST', --p_obj_type,
4420 l_worksheet_header_id, --p_obj_id,
4421 l_base_quantity_start_date,
4422 l_base_quantity_end_date,
4423 l_period_level,
4424 l_forecast_id,
4425 l_return_status,
4426 x_msg_count,
4427 x_msg_data);
4428
4429 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4430 RAISE FND_API.G_EXC_ERROR;
4431 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4432 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4433 END IF;
4434
4435
4436 process_baseline_forecast(p_api_version,
4437 p_init_msg_list,
4438 p_commit,
4439 'WKST',
4440 l_worksheet_header_id,
4441 l_forecast_id,
4442 l_period_level,
4443 l_activity_metric_id,
4444 l_forecast_uom_code,
4445 l_return_status,
4446 x_msg_count,
4447 x_msg_data);
4448
4449 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4450 RAISE FND_API.G_EXC_ERROR;
4451 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4452 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4453 END IF;
4454
4455
4456 ELSE
4457
4458 create_fcst_facts(p_api_version,
4459 p_init_msg_list,
4460 p_commit,
4461 l_base_quantity_type,
4462 'WKST', -- p_obj_type,
4463 l_worksheet_header_id, -- p_obj_id,
4464 l_forecast_id,
4465 l_activity_metric_id,
4466 'ONE', -- p_level,
4467 'PRODUCT', -- p_dimention,
4468 l_forecast_uom_code,
4469 l_base_quantity_start_date,
4470 l_base_quantity_end_date,
4471 l_return_status,
4472 x_msg_count,
4473 x_msg_data);
4474
4475
4476 IF l_return_status = FND_API.g_ret_sts_error THEN
4477 RAISE FND_API.g_exc_error;
4478 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4479 RAISE FND_API.g_exc_unexpected_error;
4480 END IF;
4481
4482
4483 create_fcst_facts(p_api_version,
4484 p_init_msg_list,
4485 p_commit,
4486 l_base_quantity_type,
4487 'WKST', --p_obj_type,
4488 l_worksheet_header_id , -- p_obj_id,
4489 l_forecast_id,
4490 l_activity_metric_id,
4491 'TWO', -- p_level,
4492 'TIME', -- p_dimention,
4493 l_forecast_uom_code,
4494 l_base_quantity_start_date,
4495 l_base_quantity_end_date,
4496 l_return_status,
4497 x_msg_count,
4498 x_msg_data);
4499
4500 IF l_return_status = FND_API.g_ret_sts_error THEN
4501 RAISE FND_API.g_exc_error;
4502 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4503 RAISE FND_API.g_exc_unexpected_error;
4504 END IF;
4505
4506
4507 UPDATE ozf_act_forecasts_all
4508 SET base_quantity = ( SELECT NVL(SUM(base_quantity),0)
4509 FROM ozf_act_metric_facts_all
4510 WHERE arc_act_metric_used_by = 'FCST'
4511 AND act_metric_used_by_id = l_forecast_id
4512 AND fact_type = 'PRODUCT') ,
4513 dimention1 = 'PRODUCT',
4514 dimention2 = 'TIME'
4515 WHERE forecast_id = l_forecast_id;
4516
4517
4518 END IF; --IF (l_base_quantity_type = 'BASELINE')
4519
4520
4521 --IF p_worksheet_header_id is null THEN
4522 UPDATE ozf_worksheet_headers_b
4523 SET forecast_generated = 'Y'
4524 WHERE worksheet_header_id = l_worksheet_header_id;
4525
4526
4527 END LOOP;
4528
4529 IF (OZF_DEBUG_HIGH_ON)
4530 THEN
4531 OZF_Utility_PVT.debug_message(l_full_name || ': End Create Wkst Forecasts');
4532 END IF;
4533
4534 EXCEPTION
4535 WHEN FND_API.G_EXC_ERROR THEN
4536
4537 ROLLBACK TO Create_Wkst_Forecasts;
4538 x_return_status := FND_API.G_RET_STS_ERROR;
4539 FND_MSG_PUB.Count_And_Get (
4540 p_encoded => FND_API.g_false,
4541 p_count => x_msg_count,
4542 p_data => x_msg_data
4543 );
4544
4545 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4546
4547 ROLLBACK TO Create_Wkst_Forecasts;
4548 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4549 FND_MSG_PUB.Count_And_Get (
4550 p_count => x_msg_count,
4551 p_data => x_msg_data
4552 );
4553
4554 WHEN OTHERS THEN
4555
4556 ROLLBACK TO Create_Wkst_Forecasts;
4557 x_return_status := FND_API.g_ret_sts_unexp_error;
4558
4559 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
4560 THEN
4561 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
4562 END IF;
4563
4564 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
4565 p_count => x_msg_count,
4566 p_data => x_msg_data);
4567 END ; -- create_wkst_forecasts
4568
4569
4570 ------------------------------------------------
4571 PROCEDURE create_base_sales(
4572 p_api_version IN NUMBER,
4573 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
4574 p_commit IN VARCHAR2 := FND_API.g_false,
4575
4576 p_obj_type IN VARCHAR2,
4577 p_obj_id IN NUMBER,
4578 p_forecast_id IN NUMBER,
4579 p_activity_metric_id IN NUMBER,
4580
4581 p_level IN VARCHAR2,
4582 p_dimention IN VARCHAR2,
4583 p_fcst_uom IN VARCHAR2,
4584
4585 p_start_date IN DATE,
4586 p_end_date IN DATE,
4587 p_period_level IN VARCHAR2,
4588 --R12
4589 p_base_quantity_type IN VARCHAR2,
4590 p_base_quantity_ref IN VARCHAR2,
4591 p_last_forecast_id IN NUMBER,
4592 p_base_quantity_start_date IN DATE,
4593 p_base_quantity_end_date IN DATE,
4594 p_offer_code IN VARCHAR2,
4595
4596 x_fcst_return_rec OUT NOCOPY fcst_return_rec_type,
4597 x_return_status OUT NOCOPY VARCHAR2,
4598 x_msg_count OUT NOCOPY NUMBER,
4599 x_msg_data OUT NOCOPY VARCHAR2
4600
4601 )
4602 IS
4603 l_api_version CONSTANT NUMBER := 1.0;
4604 l_api_name CONSTANT VARCHAR2(30) := 'create_base_sales';
4605 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4606 l_return_status VARCHAR2(1);
4607
4608 TYPE uom_tbl IS TABLE OF varchar2(3);
4609 l_uom_tbl uom_tbl;
4610 l_count NUMBER;
4611 l_tbl_count NUMBER;
4612
4613 l_forecast_id NUMBER;
4614 l_base_sales NUMBER := 0;
4615 l_spread_type VARCHAR2(30);
4616 l_period_level VARCHAR2(30);
4617 l_fcst_uom VARCHAR2(3);
4618 l_flag_error boolean := false;
4619
4620 -- 11510
4621 l_activity_metric_id NUMBER;
4622
4623 -- For R12
4624 l_base_quantity_type VARCHAR2(30);
4625 l_base_quantity_start_date DATE;
4626 l_base_quantity_end_date DATE;
4627 l_base_quantity_ref VARCHAR2(30);
4628 l_last_scenario_id NUMBER;
4629 l_offer_code VARCHAR2(30);
4630 l_offer_id NUMBER;
4631 l_disp_type VARCHAR2(4) := 'DISP';
4632 l_new_count NUMBER;
4633 l_common_count NUMBER;
4634
4635 -- For R12, use for copy_forecast
4636 l_base_quantity_start_dttemp DATE;
4637 l_base_quantity_end_dttemp DATE;
4638
4639 CURSOR c_fcst_rec (l_fcst_id IN NUMBER) IS
4640 SELECT forecast_spread_type,
4641 period_level,
4642 forecast_uom_code,
4643 base_quantity_type,
4644 base_quantity_start_date,
4645 base_quantity_end_date,
4646 base_quantity_ref, /* Third party*/
4647 last_scenario_id,
4648 offer_code
4649 FROM ozf_act_forecasts_all
4650 WHERE forecast_id = l_fcst_id;
4651
4652 CURSOR offer_dates_csr(p_offer_code IN VARCHAR2) IS
4653 SELECT NVL(qp.start_date_active,trunc(SYSDATE)) start_date_active,
4654 NVL(qp.end_date_active, trunc(SYSDATE)) end_date_active
4655 FROM qp_list_headers_b qp,
4656 ozf_offers off
4657 WHERE off.offer_code = p_offer_code
4658 AND off.qp_list_header_id = qp.list_header_id ;
4659
4660 CURSOR offer_id_csr(p_offer_code IN VARCHAR2) IS
4661 SELECT qp_list_header_id --offer_id
4662 FROM ozf_offers off
4663 WHERE off.offer_code = p_offer_code;
4664 -- AND offer_type = 'OFFR' ;
4665
4666 CURSOR c_get_activity_metric_id(p_fcast_id IN NUMBER) IS
4667 SELECT activity_metric_id
4668 FROM ozf_act_metrics_all
4669 WHERE arc_act_metric_used_by = 'FCST'
4670 AND act_metric_used_by_id = p_fcast_id;
4671
4672 BEGIN
4673
4674 IF (OZF_DEBUG_HIGH_ON) THEN
4675
4676 OZF_Utility_PVT.debug_message(l_full_name || ': Start Create Base Sales');
4677
4678 END IF;
4679
4680 --
4681 -- Initialize savepoint.
4682 --
4683
4684 SAVEPOINT Create_Base_Sales;
4685
4686
4687 IF FND_API.to_boolean(p_init_msg_list) THEN
4688 FND_MSG_PUB.initialize;
4689 END IF;
4690
4691 IF NOT FND_API.compatible_api_call(l_api_version,
4692 p_api_version,
4693 l_api_name,
4694 g_pkg_name)
4695 THEN
4696 RAISE FND_API.g_exc_unexpected_error;
4697 END IF;
4698
4699 x_return_status := FND_API.g_ret_sts_success;
4700
4701
4702 --dbms_output.put_line( ' -- b4 starting p_base_quantity_type: -- '||p_base_quantity_type);
4703 l_base_quantity_start_date := p_start_date;
4704 l_base_quantity_end_date := p_end_date;
4705
4706 -- Dates used for calculating periods and sales
4707 -- Use p_start_date, p_end_date for the second iteration and
4708 -- do not use it to call get_sales. Useful for display.
4709
4710 -- For LYSP, calculate the value in this procedure.
4711 --dbms_output.put_line( ' -- b4 setting dates, start_date: -- '||l_base_quantity_start_date);
4712 --dbms_output.put_line( ' -- b4 setting dates, end_date: -- '||l_base_quantity_end_date);
4713 IF (p_base_quantity_type = 'LAST_YEAR_SAME_PERIOD' )
4714 THEN
4715 l_base_quantity_start_date := ADD_MONTHS(l_base_quantity_start_date,-12);
4716 l_base_quantity_end_date := ADD_MONTHS(l_base_quantity_end_date,-12);
4717 ELSIF (p_base_quantity_type = 'OFFER_CODE' )
4718 THEN
4719 OPEN offer_dates_csr(p_offer_code);
4720 FETCH offer_dates_csr INTO l_base_quantity_start_date, l_base_quantity_end_date;
4721 CLOSE offer_dates_csr;
4722 ELSIF (p_base_quantity_type = 'CUSTOM_DATE_RANGE')
4723 THEN
4724 l_base_quantity_start_date := p_base_quantity_start_date ;
4725 l_base_quantity_end_date := p_base_quantity_end_date ;
4726 --R12 Baseline
4727 ELSIF (p_base_quantity_type = 'BASELINE')
4728 THEN
4729 l_base_quantity_start_date := l_base_quantity_start_date; -- curr offer start date
4730 l_base_quantity_end_date := l_base_quantity_end_date ; -- curr offer end date
4731 END IF;
4732
4733 IF ( p_forecast_id IS NULL )
4734 THEN
4735 ----dbms_output.put_line( ' -- p_forecast_id is NULL -- ');
4736 IF p_last_forecast_id <> 0 -- This will determine the button clicked
4737 THEN
4738 --dbms_output.put_line( ' -- p_last_forecast_id <> 0: -- '||p_last_forecast_id );
4739 OPEN c_fcst_rec(p_last_forecast_id);
4740 FETCH c_fcst_rec INTO l_spread_type, l_period_level, l_fcst_uom,
4741 l_base_quantity_type, l_base_quantity_start_dttemp, l_base_quantity_end_dttemp,
4742 l_base_quantity_ref, l_last_scenario_id, l_offer_code;
4743 CLOSE c_fcst_rec;
4744
4745 END IF; --IF p_last_forecast_id <> 0 -- This will determine the button clicked
4746
4747 --dbms_output.put_line( ' -- AFTER setting dates, start_date: -- '||l_base_quantity_start_date);
4748 --dbms_output.put_line( ' -- AFTER setting dates, end_date: -- '||l_base_quantity_end_date);
4749 -- Create forecast Header
4750 --dbms_output.put_line( ' -- 1 -- ');
4751 create_forecast(
4752 p_api_version,
4753 p_init_msg_list,
4754 p_commit,
4755 p_obj_type ,
4756 p_obj_id ,
4757 p_fcst_uom ,
4758 l_base_quantity_start_date,
4759 l_base_quantity_end_date,
4760 p_base_quantity_type,
4761 p_base_quantity_ref,
4762 l_last_scenario_id,
4763 p_offer_code,
4764 l_forecast_id,
4765 l_activity_metric_id, -- 11510
4766 l_return_status,
4767 x_msg_count,
4768 x_msg_data) ;
4769
4770 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4771 RAISE FND_API.G_EXC_ERROR;
4772 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4773 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4774 END IF;
4775
4776 x_fcst_return_rec.forecast_id := l_forecast_id;
4777
4778 -- Create dimentions
4779 --dbms_output.put_line( ' -- 2 -- ');
4780
4781 create_dimentions (
4782 p_api_version,
4783 p_init_msg_list,
4784 p_commit,
4785 p_obj_type ,
4786 p_obj_id ,
4787 l_forecast_id,
4788 l_return_status,
4789 x_msg_count,
4790 x_msg_data ) ;
4791
4792
4793 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4794 RAISE FND_API.G_EXC_ERROR;
4795 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4796 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4797 END IF;
4798
4799
4800 -- Create products
4801 --dbms_output.put_line( ' -- 3 -- ');
4802
4803 populate_fcst_products(
4804 p_api_version,
4805 p_init_msg_list,
4806 p_commit,
4807 p_obj_type ,
4808 p_obj_id ,
4809 l_forecast_id,
4810 l_return_status,
4811 x_msg_count,
4812 x_msg_data ) ;
4813
4814
4815 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4816 RAISE FND_API.G_EXC_ERROR;
4817 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4818 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4819 END IF;
4820
4821 -- Create customers
4822
4823 --dbms_output.put_line( ' -- 4 -- ');
4824 populate_fcst_customers(
4825 p_api_version,
4826 p_init_msg_list,
4827 p_commit,
4828 p_obj_type,
4829 p_obj_id,
4830 l_forecast_id,
4831 l_return_status,
4832 x_msg_count,
4833 x_msg_data);
4834
4835
4836 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4837 RAISE FND_API.G_EXC_ERROR;
4838 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4839 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4840 END IF;
4841
4842
4843 --dbms_output.put_line( ' -- test offer_code -- ');
4844 IF (p_base_quantity_type = 'OFFER_CODE')
4845 THEN
4846 --dbms_output.put_line( ' -- Yes Offer code:p_offer_code - -- '||p_offer_code);
4847
4848 OPEN offer_id_csr(p_offer_code);
4849 FETCH offer_id_csr INTO l_offer_id;
4850 CLOSE offer_id_csr;
4851 --dbms_output.put_line( ' -- Offer id: -- '|| l_offer_id);
4852
4853 create_dimentions (
4854 p_api_version,
4855 p_init_msg_list,
4856 p_commit,
4857 p_obj_type,--l_disp_type ,
4858 l_offer_id ,
4859 l_forecast_id,
4860 l_return_status,
4861 x_msg_count,
4862 x_msg_data ) ;
4863
4864 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4865 RAISE FND_API.G_EXC_ERROR;
4866 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4867 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4868 END IF;
4869 --dbms_output.put_line( ' -- Got dimension: -- ');
4870 -- Create products
4871 populate_fcst_products(
4872 p_api_version,
4873 p_init_msg_list,
4874 p_commit,
4875 p_obj_type,--l_disp_type ,
4876 l_offer_id ,
4877 l_forecast_id,
4878 l_return_status,
4879 x_msg_count,
4880 x_msg_data ) ;
4881
4882
4883 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4884 RAISE FND_API.G_EXC_ERROR;
4885 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4886 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4887 END IF;
4888
4889 -- Create customers
4890 populate_fcst_customers(
4891 p_api_version,
4892 p_init_msg_list,
4893 p_commit,
4894 p_obj_type,--l_disp_type,
4895 l_offer_id,
4896 l_forecast_id,
4897 l_return_status,
4898 x_msg_count,
4899 x_msg_data);
4900
4901
4902 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4903 RAISE FND_API.G_EXC_ERROR;
4904 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4905 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4906 END IF;
4907
4908 --dbms_output.put_line( ' -- 5 -- ');
4909 populate_fcst_periods(p_api_version,
4910 p_init_msg_list,
4911 p_commit,
4912 l_disp_type,
4913 l_offer_id,
4914 l_base_quantity_start_date,
4915 l_base_quantity_end_date,
4916 128, -- p_period_level,
4917 l_forecast_id,
4918 l_return_status,
4919 x_msg_count,
4920 x_msg_data);
4921
4922 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4923 RAISE FND_API.G_EXC_ERROR;
4924 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4925 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4926 END IF;
4927
4928 --dbms_output.put_line( ' -- 5.a -- ');
4929 -- for get_sales() useful for period csr
4930 populate_fcst_periods(p_api_version,
4931 p_init_msg_list,
4932 p_commit,
4933 p_obj_type,
4934 l_offer_id,
4935 l_base_quantity_start_date,
4936 l_base_quantity_end_date,
4937 128, -- p_period_level,
4938 l_forecast_id,
4939 l_return_status,
4940 x_msg_count,
4941 x_msg_data);
4942
4943 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4944 RAISE FND_API.G_EXC_ERROR;
4945 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4946 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4947 END IF;
4948
4949 END IF; -- IF (p_base_quantity_type = 'OFFER_CODE')
4950
4951
4952 --R12 Baseline
4953 IF (p_base_quantity_type <> 'BASELINE')
4954 THEN
4955 -- Create periods
4956 -- two entries - one for display purpose and other for get_sales
4957
4958 --dbms_output.put_line( ' -- 5 a-- ');
4959 populate_fcst_periods(p_api_version,
4960 p_init_msg_list,
4961 p_commit,
4962 l_disp_type,
4963 p_obj_id,
4964 p_start_date,
4965 p_end_date,
4966 128, -- p_period_level,
4967 l_forecast_id,
4968 l_return_status,
4969 x_msg_count,
4970 x_msg_data);
4971
4972 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4973 RAISE FND_API.G_EXC_ERROR;
4974 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4975 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4976 END IF;
4977
4978 --dbms_output.put_line( ' -- 5 b-- ');
4979 populate_fcst_periods(p_api_version,
4980 p_init_msg_list,
4981 p_commit,
4982 p_obj_type,
4983 p_obj_id,
4984 l_base_quantity_start_date,
4985 l_base_quantity_end_date,
4986 128, -- p_period_level,
4987 l_forecast_id,
4988 l_return_status,
4989 x_msg_count,
4990 x_msg_data);
4991
4992 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4993 RAISE FND_API.G_EXC_ERROR;
4994 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4995 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4996 END IF;
4997
4998 END IF; --IF (p_base_quantity_type <> 'BASELINE')
4999
5000
5001 -- consider BASELINE later
5002 --dbms_output.put_line( ' -- 5 c-- ');
5003 IF (p_base_quantity_type = 'OFFER_CODE')
5004 THEN
5005 SELECT count(*) INTO l_new_count FROM (
5006 SELECT product_attribute_context, product_attribute, product_attr_value,
5007 qualifier_grouping_no, qualifier_context, qualifier_attribute,
5008 qualifier_attr_value
5009 FROM ozf_forecast_dimentions
5010 WHERE obj_id = p_obj_id
5011 AND obj_type = p_obj_type
5012 AND forecast_id = l_forecast_id);
5013
5014 SELECT count(*) INTO l_common_count FROM (
5015 SELECT product_attribute_context, product_attribute, product_attr_value,
5016 qualifier_grouping_no, qualifier_context, qualifier_attribute,
5017 qualifier_attr_value
5018 FROM ozf_forecast_dimentions
5019 WHERE obj_id = p_obj_id
5020 AND obj_type = p_obj_type
5021 AND forecast_id = l_forecast_id
5022 INTERSECT
5023 SELECT product_attribute_context, product_attribute, product_attr_value,
5024 qualifier_grouping_no, qualifier_context, qualifier_attribute,
5025 qualifier_attr_value
5026 FROM ozf_forecast_dimentions
5027 WHERE obj_id = l_offer_id
5028 AND obj_type = l_disp_type
5029 AND forecast_id = l_forecast_id);
5030
5031 IF (l_new_count = l_common_count)
5032 THEN
5033 --dbms_output.put_line( ' -- EQ x_spread_count -- ' || x_spread_count);
5034 x_fcst_return_rec.spread_count := 2;
5035
5036 get_sales ( p_obj_type, --l_disp_type,
5037 l_offer_id,
5038 NULL , -- p_product_attribute_context IN VARCHAR2,
5039 NULL , -- p_product_attribute IN VARCHAR2,
5040 NULL , -- p_product_attr_value IN VARCHAR2,
5041 NULL , -- p_qualifier_grouping_no IN NUMBER,
5042 NULL , -- p_period_number IN NUMBER,
5043 l_forecast_id,
5044 l_base_sales ) ;
5045
5046 ELSE
5047 --dbms_output.put_line( ' -- NEQ x_spread_count -- ' || x_spread_count);
5048 x_fcst_return_rec.spread_count := 1;
5049
5050 l_base_sales := 0;
5051 END IF;
5052 --dbms_output.put_line( ' -- x_spread_count -- ' || x_spread_count);
5053
5054
5055 --R12 Baseline
5056 -- ELSE
5057 ELSIF (p_base_quantity_type <> 'BASELINE')
5058 THEN
5059
5060 get_sales ( p_obj_type ,
5061 p_obj_id ,
5062 NULL , -- p_product_attribute_context IN VARCHAR2,
5063 NULL , -- p_product_attribute IN VARCHAR2,
5064 NULL , -- p_product_attr_value IN VARCHAR2,
5065 NULL , -- p_qualifier_grouping_no IN NUMBER,
5066 NULL , -- p_period_number IN NUMBER,
5067 l_forecast_id,
5068 l_base_sales ) ;
5069 --dbms_output.put_line( ' -- NO x_spread_count -- ' || x_spread_count);
5070
5071 END IF; -- IF (p_base_quantity_type = 'OFFER_CODE')
5072
5073
5074 --R12 Baseline
5075 IF (p_base_quantity_type <> 'BASELINE')
5076 THEN
5077 --dbms_output.put_line( ' -- 6 -- ' || l_base_sales);
5078 UPDATE ozf_act_forecasts_all
5079 SET base_quantity = ROUND(NVL(l_base_sales,0)),
5080 dimention1 = p_dimention,
5081 base_quantity_ref = x_fcst_return_rec.spread_count -- base_quantity_ref used in OFFER_CODE basis
5082 WHERE forecast_id = l_forecast_id;
5083 --dbms_output.put_line( ' -- 7 -- '|| l_forecast_id);
5084 END IF;
5085
5086
5087 ELSE -- IF ( p_forecast_id IS NULL )
5088
5089
5090 ----dbms_output.put_line( ' -- **** UPDATing **** p_forecast_id == '||p_forecast_id);
5091 OPEN c_fcst_rec(p_forecast_id);
5092 FETCH c_fcst_rec INTO l_spread_type, l_period_level, l_fcst_uom,
5093 l_base_quantity_type, l_base_quantity_start_date, l_base_quantity_end_date,
5094 l_base_quantity_ref, l_last_scenario_id, l_offer_code;
5095
5096 CLOSE c_fcst_rec;
5097
5098 OPEN c_get_activity_metric_id (p_forecast_id);
5099 FETCH c_get_activity_metric_id INTO l_activity_metric_id;
5100 CLOSE c_get_activity_metric_id;
5101
5102 --R12 Baseline
5103 IF (p_base_quantity_type = 'BASELINE')
5104 THEN
5105
5106 -- If period_level is not chosen by the user on the UI, then default it to WEEKLY
5107 l_period_level := NVL(p_period_level, NVL(l_period_level, 16));
5108
5109 populate_fcst_periods(p_api_version,
5110 p_init_msg_list,
5111 p_commit,
5112 l_disp_type,---'DISP'
5113 p_obj_id,
5114 p_start_date,
5115 p_end_date,
5116 l_period_level,
5117 p_forecast_id,
5118 l_return_status,
5119 x_msg_count,
5120 x_msg_data);
5121
5122 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5123 RAISE FND_API.G_EXC_ERROR;
5124 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5125 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5126 END IF;
5127
5128 populate_fcst_periods(p_api_version,
5129 p_init_msg_list,
5130 p_commit,
5131 p_obj_type,---'OFFR' or 'WKST'
5132 p_obj_id,
5133 p_start_date,
5134 p_end_date,
5135 l_period_level,
5136 p_forecast_id,
5137 l_return_status,
5138 x_msg_count,
5139 x_msg_data);
5140
5141 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5142 RAISE FND_API.G_EXC_ERROR;
5143 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5144 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5145 END IF;
5146
5147 process_baseline_forecast(p_api_version,
5148 p_init_msg_list,
5149 p_commit,
5150 p_obj_type,
5151 p_obj_id,
5152 p_forecast_id,
5153 l_period_level,
5154 l_activity_metric_id,
5155 p_fcst_uom,
5156 l_return_status,
5157 x_msg_count,
5158 x_msg_data);
5159
5160 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5161 RAISE FND_API.G_EXC_ERROR;
5162 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5163 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5164 END IF;
5165
5166 GOTO end_of_create_base_sales;
5167 END IF;
5168
5169
5170 --dbms_output.put_line( ' -- UPDATE FCST -- ');
5171 IF (p_dimention='TIME')
5172 THEN
5173 -- baseline not considered.
5174 IF (l_base_quantity_type = 'OFFER_CODE')
5175 THEN
5176 OPEN offer_id_csr(l_offer_code);
5177 FETCH offer_id_csr INTO l_offer_id;
5178 CLOSE offer_id_csr;
5179
5180 populate_fcst_periods(p_api_version,
5181 p_init_msg_list,
5182 p_commit,
5183 l_disp_type,
5184 l_offer_id,
5185 l_base_quantity_start_date,
5186 l_base_quantity_end_date,
5187 p_period_level,
5188 p_forecast_id,
5189 l_return_status,
5190 x_msg_count,
5191 x_msg_data);
5192
5193 -- for get_sales() useful for period csr
5194 populate_fcst_periods(p_api_version,
5195 p_init_msg_list,
5196 p_commit,
5197 p_obj_type,
5198 l_offer_id,
5199 l_base_quantity_start_date,
5200 l_base_quantity_end_date,
5201 p_period_level,
5202 p_forecast_id,
5203 l_return_status,
5204 x_msg_count,
5205 x_msg_data);
5206
5207 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5208 RAISE FND_API.G_EXC_ERROR;
5209 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5210 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5211 END IF;
5212 END IF;
5213
5214 --dbms_output.put_line( ' -- Update - periods 2222 -- ');
5215 populate_fcst_periods(p_api_version,
5216 p_init_msg_list,
5217 p_commit,
5218 l_disp_type,
5219 p_obj_id,
5220 p_start_date,
5221 p_end_date,
5222 p_period_level,
5223 p_forecast_id,
5224 l_return_status,
5225 x_msg_count,
5226 x_msg_data);
5227
5228 populate_fcst_periods(p_api_version,
5229 p_init_msg_list,
5230 p_commit,
5231 p_obj_type,
5232 p_obj_id,
5233 l_base_quantity_start_date,
5234 l_base_quantity_end_date,
5235 p_period_level,
5236 p_forecast_id,
5237 l_return_status,
5238 x_msg_count,
5239 x_msg_data);
5240
5241 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5242 RAISE FND_API.G_EXC_ERROR;
5243 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5244 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5245 END IF;
5246
5247 END IF;
5248
5249 IF l_fcst_uom <> FND_PROFILE.VALUE('OZF_FORECAST_DEFAULT_UOM')
5250 THEN
5251 NULL;
5252 /*
5253 UPDATE ozf_act_forecasts_all
5254 SET base_quantity = ROUND(NVL(l_base_sales,0))
5255 WHERE forecast_id = p_forecast_id;
5256 */
5257 END IF;
5258
5259 --dbms_output.put_line( ' -- Update - create_fcst_facts -- ');
5260 -- Now create facts for the level
5261 -- R12 modified
5262 create_fcst_facts(p_api_version,
5263 p_init_msg_list,
5264 p_commit,
5265 l_base_quantity_type,
5266 p_obj_type,
5267 p_obj_id,
5268 p_forecast_id,
5269 p_activity_metric_id,
5270 p_level,
5271 p_dimention,
5272 p_fcst_uom,
5273 l_base_quantity_start_date, --p_start_date,
5274 l_base_quantity_end_date, --p_end_date,
5275 l_return_status,
5276 x_msg_count,
5277 x_msg_data);
5278
5279 IF l_return_status = FND_API.g_ret_sts_error THEN
5280 RAISE FND_API.g_exc_error;
5281 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5282 RAISE FND_API.g_exc_unexpected_error;
5283 END IF;
5284 --dbms_output.put_line( ' -- Update - allocate_facts -- ');
5285 allocate_facts(
5286 p_api_version ,
5287 p_init_msg_list ,
5288 p_commit ,
5289
5290 p_forecast_id ,
5291 p_dimention ,
5292
5293 l_return_status ,
5294 x_msg_count ,
5295 x_msg_data );
5296
5297 IF l_return_status = FND_API.g_ret_sts_error THEN
5298 RAISE FND_API.g_exc_error;
5299 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5300 RAISE FND_API.g_exc_unexpected_error;
5301 END IF;
5302
5303
5304 END IF; -- forecast_id null ?
5305
5306 --dbms_output.put_line( ' -- 13 -- ');
5307
5308
5309 <<end_of_create_base_sales>>
5310
5311 IF (OZF_DEBUG_HIGH_ON) THEN
5312
5313 OZF_Utility_PVT.debug_message(l_full_name || ': End Create Base Sales');
5314
5315 END IF;
5316 --dbms_output.put_line( ' -- 15 -- ');
5317
5318 EXCEPTION
5319
5320 WHEN FND_API.G_EXC_ERROR THEN
5321
5322 ROLLBACK TO Create_Base_Sales;
5323 x_return_status := FND_API.G_RET_STS_ERROR;
5324 FND_MSG_PUB.Count_And_Get (
5325 p_encoded => FND_API.g_false,
5326 p_count => x_msg_count,
5327 p_data => x_msg_data
5328 );
5329
5330 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5331
5332 ROLLBACK TO Create_Base_Sales;
5333 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5334 FND_MSG_PUB.Count_And_Get (
5335 p_count => x_msg_count,
5336 p_data => x_msg_data
5337 );
5338
5339 WHEN OTHERS THEN
5340
5341 ROLLBACK TO Create_Base_Sales;
5342 x_return_status := FND_API.g_ret_sts_unexp_error;
5343
5344 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
5345 THEN
5346 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5347 END IF;
5348
5349 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
5350 p_count => x_msg_count,
5351 p_data => x_msg_data);
5352
5353 END create_base_sales;
5354
5355
5356 ---------------------------------------------------------------
5357 ---------------------------------------------------------------
5358
5359 PROCEDURE fcst_remqty(
5360 p_api_version IN NUMBER,
5361 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
5362 p_commit IN VARCHAR2 := FND_API.g_false,
5363
5364 p_forecast_id IN NUMBER,
5365
5366 x_return_status OUT NOCOPY VARCHAR2,
5367 x_msg_count OUT NOCOPY NUMBER,
5368 x_msg_data OUT NOCOPY VARCHAR2
5369 )
5370 IS
5371
5372 l_one_f_quan NUMBER := 0;
5373 l_two_f_quan NUMBER := 0;
5374 l_three_f_quan NUMBER := 0;
5375
5376 CURSOR C1(p_fcast_id IN NUMBER) IS
5377 SELECT activity_metric_fact_id, fact_value
5378 FROM ozf_act_metric_facts_all
5379 WHERE arc_act_metric_used_by = 'FCST'
5380 AND act_metric_used_by_id = p_fcast_id
5381 AND previous_fact_id IS NULL
5382 AND root_fact_id IS NULL
5383 and nvl(node_id,1) <> 3 ;
5384
5385 CURSOR C2(prev_fact_id IN NUMBER, p_used_by_id IN NUMBER) IS
5386 SELECT activity_metric_fact_id, fact_value
5387 FROM ozf_act_metric_facts_all
5388 WHERE arc_act_metric_used_by = 'FCST'
5389 AND act_metric_used_by_id = p_used_by_id
5390 AND root_fact_id IS NULL
5391 AND previous_fact_id = prev_fact_id
5392 and nvl(node_id,1) <> 3 ;
5393
5394
5395 CURSOR C3(prev_fact_id IN NUMBER, p_used_by_id IN NUMBER) IS
5396 SELECT activity_metric_fact_id, fact_value
5397 FROM ozf_act_metric_facts_all
5398 WHERE arc_act_metric_used_by = 'FCST'
5399 AND act_metric_used_by_id = p_used_by_id
5400 AND root_fact_id IS NOT NULL
5401 AND previous_fact_id = prev_fact_id
5402 and nvl(node_id,1) <> 3;
5403
5404 l_api_version CONSTANT NUMBER := 1.0;
5405 l_api_name CONSTANT VARCHAR2(30) := 'Fcst_Remaining_Qty';
5406 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5407 l_return_status VARCHAR2(1);
5408
5409 BEGIN
5410
5411 IF (OZF_DEBUG_HIGH_ON) THEN
5412
5413 OZF_Utility_PVT.debug_message(l_full_name || ': Start Fcst Remaining Qty');
5414
5415 END IF;
5416 SAVEPOINT Fcst_Remaining_Qty;
5417
5418 IF FND_API.to_boolean(p_init_msg_list) THEN
5419 FND_MSG_PUB.initialize;
5420 END IF;
5421
5422 IF NOT FND_API.compatible_api_call(l_api_version,
5423 p_api_version,
5424 l_api_name,
5425 g_pkg_name)
5426 THEN
5427 RAISE FND_API.g_exc_unexpected_error;
5428 END IF;
5429 x_return_status := FND_API.g_ret_sts_success;
5430
5431
5432 FOR record_l_one IN C1(p_forecast_id) LOOP
5433
5434 l_two_f_quan := 0;
5435
5436 FOR record_l_two IN C2(record_l_one.activity_metric_fact_id, p_forecast_id) LOOP
5437 l_three_f_quan := 0;
5438
5439 FOR record_l_three IN C3(record_l_two.activity_metric_fact_id, p_forecast_id) LOOP
5440
5441 l_three_f_quan := l_three_f_quan + record_l_three.fact_value;
5442
5443 END LOOP;
5444
5445 IF(l_three_f_quan <> 0) THEN
5446 UPDATE ozf_act_metric_facts_all
5447 SET FORECAST_REMAINING_QUANTITY = record_l_two.fact_value - l_three_f_quan
5448 WHERE activity_metric_fact_id = record_l_two.activity_metric_fact_id;
5449
5450 END IF;
5451
5452 l_two_f_quan := l_two_f_quan + record_l_two.fact_value;
5453
5454 END LOOP;
5455
5456 IF(l_two_f_quan <> 0) THEN
5457 UPDATE ozf_act_metric_facts_all
5458 SET FORECAST_REMAINING_QUANTITY = record_l_one.fact_value - l_two_f_quan
5459 WHERE activity_metric_fact_id = record_l_one.activity_metric_fact_id;
5460
5461 END IF;
5462
5463 l_one_f_quan := l_one_f_quan + record_l_one.fact_value;
5464
5465 END LOOP;
5466
5467 UPDATE ozf_act_forecasts_all
5468 SET FORECAST_REMAINING_QUANTITY = forecast_quantity - l_one_f_quan
5469 WHERE forecast_id = p_forecast_id;
5470
5471
5472 IF (OZF_DEBUG_HIGH_ON) THEN
5473
5474 OZF_Utility_PVT.debug_message(l_full_name || ': End Fcst Remaining Qty');
5475
5476 END IF;
5477
5478 EXCEPTION
5479
5480 WHEN OTHERS THEN
5481 x_return_status := FND_API.g_ret_sts_unexp_error;
5482 ROLLBACK TO Fcst_Remaining_Qty;
5483
5484 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
5485 THEN
5486 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5487 END IF;
5488
5489 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
5490 p_count => x_msg_count,
5491 p_data => x_msg_data);
5492
5493
5494 END fcst_remqty;
5495
5496 PROCEDURE fcst_BL_remqty(
5497 p_api_version IN NUMBER,
5498 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
5499 p_commit IN VARCHAR2 := FND_API.g_false,
5500
5501 p_forecast_id IN NUMBER,
5502
5503 x_return_status OUT NOCOPY VARCHAR2,
5504 x_msg_count OUT NOCOPY NUMBER,
5505 x_msg_data OUT NOCOPY VARCHAR2
5506 )
5507 IS
5508
5509 l_one_f_quan NUMBER := 0;
5510 l_two_f_quan NUMBER := 0;
5511 l_three_f_quan NUMBER := 0;
5512
5513 CURSOR C1(p_fcast_id IN NUMBER) IS
5514 SELECT activity_metric_fact_id, incremental_sales
5515 FROM ozf_act_metric_facts_all
5516 WHERE arc_act_metric_used_by = 'FCST'
5517 AND act_metric_used_by_id = p_fcast_id
5518 AND previous_fact_id IS NULL
5519 AND root_fact_id IS NULL
5520 and nvl(node_id,1) <> 3 ;
5521
5522 CURSOR C2(prev_fact_id IN NUMBER, p_used_by_id IN NUMBER) IS
5523 SELECT activity_metric_fact_id, incremental_sales
5524 FROM ozf_act_metric_facts_all
5525 WHERE arc_act_metric_used_by = 'FCST'
5526 AND act_metric_used_by_id = p_used_by_id
5527 AND root_fact_id IS NULL
5528 AND previous_fact_id = prev_fact_id
5529 and nvl(node_id,1) <> 3 ;
5530
5531
5532 CURSOR C3(prev_fact_id IN NUMBER, p_used_by_id IN NUMBER) IS
5533 SELECT activity_metric_fact_id, incremental_sales
5534 FROM ozf_act_metric_facts_all
5535 WHERE arc_act_metric_used_by = 'FCST'
5536 AND act_metric_used_by_id = p_used_by_id
5537 AND root_fact_id IS NOT NULL
5538 AND previous_fact_id = prev_fact_id
5539 and nvl(node_id,1) <> 3;
5540
5541 l_api_version CONSTANT NUMBER := 1.0;
5542 l_api_name CONSTANT VARCHAR2(30) := 'Fcst_BL_Remaining_Qty';
5543 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5544 l_return_status VARCHAR2(1);
5545
5546 BEGIN
5547
5548 IF (OZF_DEBUG_HIGH_ON) THEN
5549
5550 OZF_Utility_PVT.debug_message(l_full_name || ': Start Fcst Baseline Remaining Qty');
5551
5552 END IF;
5553 SAVEPOINT Fcst_BL_Remaining_Qty;
5554
5555 IF FND_API.to_boolean(p_init_msg_list) THEN
5556 FND_MSG_PUB.initialize;
5557 END IF;
5558
5559 IF NOT FND_API.compatible_api_call(l_api_version,
5560 p_api_version,
5561 l_api_name,
5562 g_pkg_name)
5563 THEN
5564 RAISE FND_API.g_exc_unexpected_error;
5565 END IF;
5566 x_return_status := FND_API.g_ret_sts_success;
5567
5568 FOR record_l_one IN C1(p_forecast_id) LOOP
5569
5570 l_two_f_quan := 0;
5571
5572 FOR record_l_two IN C2(record_l_one.activity_metric_fact_id, p_forecast_id) LOOP
5573 l_three_f_quan := 0;
5574
5575 FOR record_l_three IN C3(record_l_two.activity_metric_fact_id, p_forecast_id) LOOP
5576
5577 l_three_f_quan := l_three_f_quan + record_l_three.incremental_sales;
5578
5579 END LOOP;
5580
5581 IF(l_three_f_quan <> 0) THEN
5582 UPDATE ozf_act_metric_facts_all
5583 SET FORECAST_REMAINING_QUANTITY = record_l_two.incremental_sales - l_three_f_quan
5584 WHERE activity_metric_fact_id = record_l_two.activity_metric_fact_id;
5585
5586 END IF;
5587
5588 l_two_f_quan := l_two_f_quan + record_l_two.incremental_sales;
5589
5590 END LOOP;
5591
5592 IF(l_two_f_quan <> 0) THEN
5593 UPDATE ozf_act_metric_facts_all
5594 SET FORECAST_REMAINING_QUANTITY = record_l_one.incremental_sales - l_two_f_quan
5595 WHERE activity_metric_fact_id = record_l_one.activity_metric_fact_id;
5596
5597 END IF;
5598
5599 l_one_f_quan := l_one_f_quan + record_l_one.incremental_sales;
5600
5601 END LOOP;
5602
5603 UPDATE ozf_act_forecasts_all
5604 SET FORECAST_REMAINING_QUANTITY = forecast_quantity - base_quantity - l_one_f_quan
5605 WHERE forecast_id = p_forecast_id;
5606
5607
5608 IF (OZF_DEBUG_HIGH_ON) THEN
5609
5610 OZF_Utility_PVT.debug_message(l_full_name || ': End Fcst Remaining Qty');
5611
5612 END IF;
5613
5614 EXCEPTION
5615
5616 WHEN OTHERS THEN
5617 x_return_status := FND_API.g_ret_sts_unexp_error;
5618 ROLLBACK TO Fcst_BL_Remaining_Qty;
5619
5620 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
5621 THEN
5622 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5623 END IF;
5624
5625 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
5626 p_count => x_msg_count,
5627 p_data => x_msg_data);
5628
5629
5630 END fcst_BL_remqty;
5631
5632 PROCEDURE freeze_check(
5633 p_api_version IN NUMBER,
5634 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
5635 p_commit IN VARCHAR2 := FND_API.g_false,
5636
5637 p_forecast_id IN NUMBER,
5638
5639 x_return_status OUT NOCOPY VARCHAR2,
5640 x_msg_count OUT NOCOPY NUMBER,
5641 x_msg_data OUT NOCOPY VARCHAR2
5642 )
5643 IS
5644
5645 CURSOR C_FcstRecord(p_fcast_id IN NUMBER) IS
5646 SELECT forecast_remaining_quantity
5647 FROM ozf_act_forecasts_all
5648 WHERE forecast_id = p_fcast_id;
5649
5650 CURSOR C_LevelOneRecords(p_fcast_id IN NUMBER) IS
5651 SELECT activity_metric_fact_id, fact_type, forecast_remaining_quantity
5652 FROM ozf_act_metric_facts_all
5653 WHERE arc_act_metric_used_by = 'FCST'
5654 AND act_metric_used_by_id = p_fcast_id
5655 AND previous_fact_id IS NULL
5656 AND root_fact_id IS NULL;
5657
5658 CURSOR C_LevelTwoRecords(p_fcast_id IN NUMBER, p_prev_id IN NUMBER) IS
5659 SELECT activity_metric_fact_id, fact_type, forecast_remaining_quantity
5660 FROM ozf_act_metric_facts_all
5661 WHERE arc_act_metric_used_by = 'FCST'
5662 AND act_metric_used_by_id = p_fcast_id
5663 AND previous_fact_id IS NOT NULL
5664 AND root_fact_id IS NULL
5665 AND previous_fact_id = p_prev_id;
5666
5667 -- variable to hold the forecast_remaining_quantity for forecast record
5668 l_fcast_remaining_qty NUMBER := 0;
5669 l_flag_fcst boolean := false;
5670 l_flag_level_one boolean := false;
5671 l_flag_level_two boolean := false;
5672 l_flag_error boolean := false;
5673 l_dimention1 VARCHAR2(9);
5674 l_dimention2 VARCHAR2(9);
5675
5676
5677 l_api_version CONSTANT NUMBER := 1.0;
5678 l_api_name CONSTANT VARCHAR2(30) := 'Freeze_Check';
5679 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5680 l_return_status VARCHAR2(1);
5681
5682 BEGIN
5683
5684 IF (OZF_DEBUG_HIGH_ON) THEN
5685
5686 OZF_Utility_PVT.debug_message(l_full_name || ': Start Freeze Check');
5687
5688 END IF;
5689 SAVEPOINT freeze_check;
5690
5691 IF FND_API.to_boolean(p_init_msg_list) THEN
5692 FND_MSG_PUB.initialize;
5693 END IF;
5694
5695 IF NOT FND_API.compatible_api_call(l_api_version,
5696 p_api_version,
5697 l_api_name,
5698 g_pkg_name)
5699 THEN
5700 RAISE FND_API.g_exc_unexpected_error;
5701 END IF;
5702 x_return_status := FND_API.g_ret_sts_success;
5703
5704 -- Check if the forecast_remaining_quantity (=0 or not) for the forecast record
5705 OPEN C_FcstRecord(p_forecast_id);
5706 FETCH C_FcstRecord INTO l_fcast_remaining_qty ;
5707 CLOSE C_FcstRecord;
5708
5709 IF (l_fcast_remaining_qty <> 0) THEN
5710 l_flag_fcst := true;
5711 l_flag_error := true;
5712 END IF;
5713
5714
5715 FOR level_one_record IN C_LevelOneRecords(p_forecast_id) LOOP
5716 -- See if we can have an array and store the
5717 -- activity_metric_fact_id's of those recs for which forecast_remaining_quantity <> 0
5718
5719 IF (level_one_record.forecast_remaining_quantity <> 0) THEN
5720 l_flag_level_one := true;
5721 l_flag_error := true;
5722 l_dimention1 := level_one_record.fact_type;
5723 END IF;
5724
5725 FOR level_two_record IN C_LevelTwoRecords(p_forecast_id, level_one_record.activity_metric_fact_id) LOOP
5726 IF (level_two_record.forecast_remaining_quantity <> 0) THEN
5727 l_flag_level_two := true;
5728 l_flag_error := true;
5729 l_dimention2 := level_two_record.fact_type;
5730 END IF;
5731 END LOOP;
5732 END LOOP;
5733
5734
5735 IF (l_flag_error = true) THEN
5736 -- forecast_remaining_quantity <> 0 for some record
5737 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5738
5739 IF (l_flag_fcst = true) THEN
5740 FND_MESSAGE.Set_Name ('OZF', 'OZF_FCST_HEADER_QTY_REMAINING');
5741 FND_MSG_PUB.Add;
5742 END IF;
5743
5744 IF (l_flag_level_one = true) THEN
5745 FND_MESSAGE.Set_Name ('OZF', 'OZF_FCST_LEVEL_QTY_REMAINING');
5746 FND_MESSAGE.Set_Token('DIMENTION', l_dimention1 );
5747 FND_MSG_PUB.Add;
5748 END IF;
5749
5750 IF (l_flag_level_two = true) THEN
5751 FND_MESSAGE.Set_Name ('OZF', 'OZF_FCST_LEVEL_QTY_REMAINING');
5752 FND_MESSAGE.Set_Token('DIMENTION', l_dimention2 );
5753 FND_MSG_PUB.Add;
5754 END IF;
5755
5756 END IF;
5757 x_return_status := FND_API.G_RET_STS_ERROR;
5758 RAISE FND_API.G_EXC_ERROR;
5759 END IF;
5760
5761 IF (OZF_DEBUG_HIGH_ON) THEN
5762
5763 OZF_Utility_PVT.debug_message(l_full_name || ': End Freeze Check');
5764
5765 END IF;
5766
5767 EXCEPTION
5768
5769 WHEN FND_API.G_EXC_ERROR THEN
5770 ROLLBACK TO freeze_check;
5771 x_return_status := FND_API.G_RET_STS_ERROR;
5772 FND_MSG_PUB.Count_And_Get (
5773 p_encoded => FND_API.g_false,
5774 p_count => x_msg_count,
5775 p_data => x_msg_data
5776 );
5777
5778 WHEN OTHERS THEN
5779 x_return_status := FND_API.g_ret_sts_unexp_error;
5780
5781 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
5782 THEN
5783 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5784 END IF;
5785
5786 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
5787 p_count => x_msg_count,
5788 p_data => x_msg_data);
5789
5790
5791 END freeze_check;
5792
5793
5794
5795 --Procedure for creating a copy of an existing forecast
5796 PROCEDURE copy_forecast(
5797 p_api_version IN NUMBER,
5798 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
5799 p_commit IN VARCHAR2 := FND_API.g_false,
5800 p_forecast_id IN NUMBER,
5801 x_return_status OUT NOCOPY VARCHAR2,
5802 x_msg_count OUT NOCOPY NUMBER,
5803 x_msg_data OUT NOCOPY VARCHAR2
5804 )
5805 IS
5806
5807 -- cursor to generate new Forecast ID's
5808 CURSOR c_act_forecast_id IS
5809 SELECT ozf_act_forecasts_all_s.NEXTVAL
5810 FROM dual;
5811
5812 -- cursor to generate new Activity Metric ID's
5813 CURSOR c_act_metric_id IS
5814 SELECT ozf_act_metrics_all_s.NEXTVAL
5815 FROM dual;
5816
5817 -- obtain the activity_metric_id based on a given forecast_id
5818 CURSOR c_get_activity_metric_id(p_fcast_id IN NUMBER) IS
5819 SELECT activity_metric_id
5820 FROM ozf_act_metrics_all
5821 WHERE arc_act_metric_used_by = 'FCST'
5822 AND act_metric_used_by_id = p_fcast_id;
5823
5824
5825 CURSOR C_GetFactsLevelOne(p_fcast_id IN NUMBER, p_activity_metric_id IN NUMBER) IS
5826 SELECT activity_metric_fact_id,
5827 fact_type,
5828 base_quantity,
5829 fact_reference,
5830 from_date,
5831 to_date,
5832 fact_value,
5833 fact_percent,
5834 previous_fact_id,
5835 root_fact_id,
5836 forecast_remaining_quantity,
5837 forward_buy_quantity,
5838 node_id
5839 FROM ozf_act_metric_facts_all
5840 WHERE arc_act_metric_used_by = 'FCST'
5841 AND act_metric_used_by_id = p_fcast_id
5842 AND activity_metric_id = p_activity_metric_id
5843 AND root_fact_id IS NULL
5844 AND previous_fact_id IS NULL;
5845
5846 CURSOR C_GetFactsLevelTwo(p_fcast_id IN NUMBER, p_activity_metric_id IN NUMBER, p_previous_fact_id IN NUMBER) IS
5847 SELECT activity_metric_fact_id,
5848 fact_type,
5849 base_quantity,
5850 fact_reference,
5851 from_date,
5852 to_date,
5853 fact_value,
5854 fact_percent,
5855 previous_fact_id,
5856 root_fact_id,
5857 forecast_remaining_quantity,
5858 forward_buy_quantity,
5859 node_id
5860 FROM ozf_act_metric_facts_all
5861 WHERE arc_act_metric_used_by = 'FCST'
5862 AND act_metric_used_by_id = p_fcast_id
5863 AND activity_metric_id = p_activity_metric_id
5864 AND root_fact_id IS NULL
5865 AND previous_fact_id IS NOT NULL
5866 AND previous_fact_id = p_previous_fact_id;
5867
5868 CURSOR C_GetFactsLevelThree(p_fcast_id IN NUMBER, p_activity_metric_id IN NUMBER,
5869 p_previous_fact_id IN NUMBER, p_root_fact_id IN NUMBER) IS
5870 SELECT activity_metric_fact_id,
5871 fact_type,
5872 base_quantity,
5873 fact_reference,
5874 from_date,
5875 to_date,
5876 fact_value,
5877 fact_percent,
5878 previous_fact_id,
5879 root_fact_id,
5880 forecast_remaining_quantity,
5881 forward_buy_quantity,
5882 node_id
5883 FROM ozf_act_metric_facts_all
5884 WHERE arc_act_metric_used_by = 'FCST'
5885 AND act_metric_used_by_id = p_fcast_id
5886 AND activity_metric_id = p_activity_metric_id
5887 AND previous_fact_id = p_previous_fact_id
5888 AND root_fact_id = p_root_fact_id;
5889
5890 l_forecast_id NUMBER := 0;
5891 l_activity_metric_id NUMBER := 0;
5892 l_previous_activity_metric_id NUMBER := 0;
5893 l_act_metric_fact_id_level_1 NUMBER := 0;
5894 l_act_metric_fact_id_level_2 NUMBER := 0;
5895 l_act_metric_fact_id_level_3 NUMBER := 0;
5896
5897
5898 l_api_version CONSTANT NUMBER := 1.0;
5899 l_api_name CONSTANT VARCHAR2(30) := 'copy_forecast';
5900 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5901 l_return_status VARCHAR2(1);
5902
5903
5904 BEGIN
5905
5906 SAVEPOINT copy_forecast;
5907
5908 IF (OZF_DEBUG_HIGH_ON) THEN
5909
5910 OZF_Utility_PVT.debug_message(l_full_name || ': start refresh parties');
5911
5912 END IF;
5913
5914 IF FND_API.to_boolean(p_init_msg_list) THEN
5915 FND_MSG_PUB.initialize;
5916 END IF;
5917
5918 IF NOT FND_API.compatible_api_call(l_api_version,
5919 p_api_version,
5920 l_api_name,
5921 g_pkg_name)
5922 THEN
5923 RAISE FND_API.g_exc_unexpected_error;
5924 END IF;
5925 x_return_status := FND_API.g_ret_sts_success;
5926
5927
5928 -- Insert a new forecast record in the ozf_act_forecasts_all table taking the given forecastId as input
5929 OPEN c_act_forecast_id;
5930 FETCH c_act_forecast_id INTO l_forecast_id;
5931 CLOSE c_act_forecast_id;
5932
5933 INSERT INTO ozf_act_forecasts_all
5934 (forecast_id
5935 ,forecast_type
5936 ,arc_act_fcast_used_by
5937 ,act_fcast_used_by_id
5938 ,creation_date
5939 ,created_from
5940 ,created_by
5941 ,last_update_date
5942 ,last_updated_by
5943 ,last_update_login
5944 ,program_application_id
5945 ,program_id
5946 ,program_update_date
5947 ,request_id
5948 ,object_version_number
5949 ,hierarchy
5950 ,hierarchy_level
5951 ,level_value
5952 ,forecast_calendar
5953 ,period_level
5954 ,forecast_period_id
5955 ,forecast_date
5956 ,forecast_uom_code
5957 ,forecast_quantity
5958 ,forward_buy_quantity
5959 ,forward_buy_period
5960 ,base_quantity
5961 ,context
5962 ,attribute_category
5963 ,org_id
5964 ,forecast_remaining_quantity
5965 ,forecast_remaining_percent
5966 ,base_quantity_type
5967 ,forecast_spread_type
5968 ,dimention1
5969 ,dimention2
5970 ,dimention3
5971 ,last_scenario_id
5972 ,freeze_flag
5973 ,price_list_id
5974 ,base_quantity_start_date
5975 ,base_quantity_end_date
5976 ,base_quantity_ref
5977 ,offer_code
5978 )
5979 SELECT l_forecast_id
5980 ,a.forecast_type
5981 ,a.arc_act_fcast_used_by
5982 ,a.act_fcast_used_by_id
5983 ,SYSDATE
5984 ,a.created_from
5985 ,FND_GLOBAL.User_ID
5986 ,SYSDATE
5987 ,FND_GLOBAL.User_ID
5988 ,FND_GLOBAL.Conc_Login_ID
5989 ,a.program_application_id
5990 ,a.program_id
5991 ,a.program_update_date
5992 ,a.request_id
5993 ,1 --object_version_number
5994 ,a.hierarchy
5995 ,a.hierarchy_level
5996 ,a.level_value
5997 ,a.forecast_calendar
5998 ,a.period_level
5999 ,a.forecast_period_id
6000 ,a.forecast_date
6001 ,a.forecast_uom_code
6002 ,a.forecast_quantity
6003 ,a.forward_buy_quantity
6004 ,a.forward_buy_period
6005 ,a.base_quantity
6006 ,a.context
6007 ,a.attribute_category
6008 ,MO_GLOBAL.GET_CURRENT_ORG_ID()-- org_id
6009 ,a.forecast_remaining_quantity
6010 ,a.forecast_remaining_percent
6011 ,a.base_quantity_type
6012 ,a.forecast_spread_type
6013 ,a.dimention1
6014 ,a.dimention2
6015 ,a.dimention3
6016 ,a.last_scenario_id + 1
6017 ,'N'
6018 ,a.price_list_id
6019 ,a.base_quantity_start_date
6020 ,a.base_quantity_end_date
6021 ,a.base_quantity_ref
6022 ,a.offer_code
6023 FROM ozf_act_forecasts_all a
6024 WHERE forecast_id = p_forecast_id;
6025
6026
6027 -- Insert a new activity metric record in the ozf_act_metrics_all table taking the given forecastId as input
6028
6029 OPEN c_act_metric_id;
6030 FETCH c_act_metric_id INTO l_activity_metric_id;
6031 CLOSE c_act_metric_id;
6032
6033 INSERT INTO ozf_act_metrics_all (
6034 activity_metric_id,
6035 creation_date,
6036 created_by,
6037 last_update_date,
6038 last_updated_by,
6039 last_update_login,
6040 object_version_number,
6041 act_metric_used_by_id,
6042 arc_act_metric_used_by,
6043 purchase_req_raised_flag,
6044 application_id,
6045 sensitive_data_flag,
6046 budget_id,
6047 metric_id,
6048 transaction_currency_code,
6049 trans_forecasted_value,
6050 trans_committed_value,
6051 trans_actual_value,
6052 functional_currency_code,
6053 func_forecasted_value,
6054 dirty_flag,
6055 func_committed_value,
6056 func_actual_value,
6057 last_calculated_date,
6058 variable_value,
6059 computed_using_function_value,
6060 metric_uom_code,
6061 org_id,
6062 attribute_category,
6063 difference_since_last_calc,
6064 activity_metric_origin_id,
6065 arc_activity_metric_origin,
6066 days_since_last_refresh,
6067 scenario_id,
6068 SUMMARIZE_TO_METRIC,
6069 hierarchy_id,
6070 start_node,
6071 from_level,
6072 to_level,
6073 from_date,
6074 TO_DATE,
6075 amount1,
6076 amount2,
6077 amount3,
6078 percent1,
6079 percent2,
6080 percent3,
6081 published_flag,
6082 pre_function_name,
6083 post_function_name,
6084 attribute1,
6085 attribute2,
6086 attribute3,
6087 attribute4,
6088 attribute5,
6089 attribute6,
6090 attribute7,
6091 attribute8,
6092 attribute9,
6093 attribute10,
6094 attribute11,
6095 attribute12,
6096 attribute13,
6097 attribute14,
6098 attribute15,
6099 description,
6100 act_metric_date,
6101 depend_act_metric
6102 )
6103
6104 SELECT l_activity_metric_id,
6105 SYSDATE,
6106 Fnd_Global.User_ID,
6107 SYSDATE,
6108 Fnd_Global.User_ID,
6109 Fnd_Global.Conc_Login_ID,
6110 1, --Object Version Number
6111 l_forecast_id,
6112 b.arc_act_metric_used_by,
6113 NVL(b.purchase_req_raised_flag,'N'),
6114 b.application_id,
6115 b.sensitive_data_flag,
6116 b.budget_id,
6117 b.metric_id,
6118 b.transaction_currency_code,
6119 b.trans_forecasted_value,
6120 b.trans_committed_value,
6121 b.trans_actual_value,
6122 b.functional_currency_code,
6123 b.func_forecasted_value,
6124 NVL(b.dirty_flag,'Y'),
6125 b.func_committed_value,
6126 b.func_actual_value,
6127 b.last_calculated_date,
6128 b.variable_value,
6129 b.computed_using_function_value,
6130 b.metric_uom_code,
6131 MO_GLOBAL.GET_CURRENT_ORG_ID() , -- org_id
6132 b.attribute_category,
6133 b.difference_since_last_calc,
6134 b.activity_metric_origin_id,
6135 b.arc_activity_metric_origin,
6136 b.days_since_last_refresh,
6137 b.scenario_id,
6138 b.SUMMARIZE_TO_METRIC,
6139 b.hierarchy_id,
6140 b.start_node,
6141 b.from_level,
6142 b.to_level,
6143 b.from_date,
6144 b.TO_DATE,
6145 b.amount1,
6146 b.amount2,
6147 b.amount3,
6148 b.percent1,
6149 b.percent2,
6150 b.percent3,
6151 b.published_flag,
6152 b.pre_function_name,
6153 b.post_function_name,
6154 b.attribute1,
6155 b.attribute2,
6156 b.attribute3,
6157 b.attribute4,
6158 b.attribute5,
6159 b.attribute6,
6160 b.attribute7,
6161 b.attribute8,
6162 b.attribute9,
6163 b.attribute10,
6164 b.attribute11,
6165 b.attribute12,
6166 b.attribute13,
6167 b.attribute14,
6168 b.attribute15,
6169 b.description,
6170 b.act_metric_date,
6171 b.depend_act_metric
6172 FROM ozf_act_metrics_all b
6173 WHERE act_metric_used_by_id = p_forecast_id
6174 AND arc_act_metric_used_by = 'FCST';
6175
6176 -- Insert new row in the ozf_act_metric_facts_all table for
6177 -- each existing row in ozf_act_metric_facts_all (based on a given act_metric_used_by_id and activity_metric_id)
6178
6179 OPEN c_get_activity_metric_id(p_forecast_id);
6180 FETCH c_get_activity_metric_id INTO l_previous_activity_metric_id;
6181 CLOSE c_get_activity_metric_id;
6182
6183 -- Looping through existing level one fact records and inserting new level one records
6184 FOR level_one_fact_record IN C_GetFactsLevelOne(
6185 p_forecast_id,
6186 l_previous_activity_metric_id
6187 )
6188 LOOP
6189 -- generating activity_metric_fact_id for each record in Level One with the sequence
6190 --l_act_metric_fact_id_level_1 := ozf_act_metric_facts_all_s.nextval;
6191 SELECT ozf_act_metric_facts_all_s.nextval INTO l_act_metric_fact_id_level_1 FROM dual;
6192
6193 INSERT INTO ozf_act_metric_facts_all (
6194 ACTIVITY_METRIC_FACT_ID ,
6195 LAST_UPDATE_DATE ,
6196 LAST_UPDATED_BY,
6197 CREATION_DATE,
6198 CREATED_BY,
6199 OBJECT_VERSION_NUMBER,
6200 ACT_METRIC_USED_BY_ID,
6201 ARC_ACT_METRIC_USED_BY,
6202 VALUE_TYPE,
6203 ACTIVITY_METRIC_ID,
6204 TRANS_FORECASTED_VALUE,
6205 FUNCTIONAL_CURRENCY_CODE,
6206 FUNC_FORECASTED_VALUE,
6207 ORG_ID,
6208 DE_METRIC_ID,
6209 TIME_ID1,
6210 FROM_DATE,
6211 TO_DATE,
6212 FACT_VALUE,
6213 FACT_PERCENT,
6214 BASE_QUANTITY,
6215 ROOT_FACT_ID,
6216 PREVIOUS_FACT_ID,
6217 FACT_TYPE,
6218 FACT_REFERENCE,
6219 last_update_login,
6220 FORECAST_REMAINING_QUANTITY,
6221 FORWARD_BUY_QUANTITY,
6222 NODE_ID
6223 )
6224 VALUES ( l_act_metric_fact_id_level_1,
6225 SYSDATE,
6226 Fnd_Global.User_ID,
6227 SYSDATE,
6228 Fnd_Global.User_ID,
6229 1,
6230 l_forecast_id,
6231 'FCST',
6232 'NUMERIC',
6233 l_activity_metric_id,
6234 0,
6235 'NONE',
6236 0,
6237 MO_GLOBAL.GET_CURRENT_ORG_ID(),
6238 0,
6239 0,
6240 level_one_fact_record.from_date,
6241 level_one_fact_record.to_date,
6242 level_one_fact_record.fact_value,
6243 level_one_fact_record.fact_percent,
6244 NVL(level_one_fact_record.base_quantity,0),
6245 level_one_fact_record.root_fact_id, -- will be NULL
6246 level_one_fact_record.previous_fact_id, -- will be NULL
6247 level_one_fact_record.fact_type,
6248 level_one_fact_record.fact_reference,
6249 fnd_global.login_id,
6250 level_one_fact_record.forecast_remaining_quantity,
6251 level_one_fact_record.forward_buy_quantity,
6252 level_one_fact_record.node_id
6253 );
6254
6255 -- loop through each existing record in Level Two (for a given previous_fact_id)
6256 -- and insert new level two record for each one of them
6257 FOR level_two_fact_record IN C_GetFactsLevelTwo(
6258 p_forecast_id,
6259 l_previous_activity_metric_id,
6260 level_one_fact_record.activity_metric_fact_id -- previous_fact_id
6261 )
6262 LOOP
6263
6264 -- generating activity_metric_fact_id for each record in Level Two with the sequence
6265 --l_act_metric_fact_id_level_2 := ozf_act_metric_facts_all_s.nextval;
6266 SELECT ozf_act_metric_facts_all_s.nextval INTO l_act_metric_fact_id_level_2 FROM dual;
6267
6268 INSERT INTO ozf_act_metric_facts_all (
6269 ACTIVITY_METRIC_FACT_ID ,
6270 LAST_UPDATE_DATE ,
6271 LAST_UPDATED_BY,
6272 CREATION_DATE,
6273 CREATED_BY,
6274 OBJECT_VERSION_NUMBER,
6275 ACT_METRIC_USED_BY_ID,
6276 ARC_ACT_METRIC_USED_BY,
6277 VALUE_TYPE,
6278 ACTIVITY_METRIC_ID,
6279 TRANS_FORECASTED_VALUE,
6280 FUNCTIONAL_CURRENCY_CODE,
6281 FUNC_FORECASTED_VALUE,
6282 ORG_ID,
6283 DE_METRIC_ID,
6284 TIME_ID1,
6285 FROM_DATE,
6286 TO_DATE,
6287 FACT_VALUE,
6288 FACT_PERCENT,
6289 BASE_QUANTITY,
6290 ROOT_FACT_ID,
6291 PREVIOUS_FACT_ID,
6292 FACT_TYPE,
6293 FACT_REFERENCE,
6294 last_update_login,
6295 FORECAST_REMAINING_QUANTITY,
6296 FORWARD_BUY_QUANTITY,
6297 NODE_ID
6298 )
6299 VALUES ( l_act_metric_fact_id_level_2,
6300 SYSDATE,
6301 Fnd_Global.User_ID,
6302 SYSDATE,
6303 Fnd_Global.User_ID,
6304 1,
6305 l_forecast_id,
6306 'FCST',
6307 'NUMERIC',
6308 l_activity_metric_id,
6309 0,
6310 'NONE',
6311 0,
6312 MO_GLOBAL.GET_CURRENT_ORG_ID(),
6313 0,
6314 0,
6315 level_two_fact_record.from_date,
6316 level_two_fact_record.to_date,
6317 level_two_fact_record.fact_value,
6318 level_two_fact_record.fact_percent,
6319 NVL(level_two_fact_record.base_quantity,0),
6320 level_two_fact_record.root_fact_id, -- will be NULL
6321 l_act_metric_fact_id_level_1, -- newly generated Level One activity_metric_fact_id
6322 level_two_fact_record.fact_type,
6323 level_two_fact_record.fact_reference,
6324 fnd_global.login_id,
6325 level_two_fact_record.forecast_remaining_quantity,
6326 level_two_fact_record.forward_buy_quantity,
6327 level_two_fact_record.node_id
6328 );
6329
6330
6331 -- loop through each existing record in Level Three( for a given previous_fact_id and root_fact_id)
6332 -- and insert new level three record for each one of them
6333 FOR level_three_fact_record IN C_GetFactsLevelThree(
6334 p_forecast_id,
6335 l_previous_activity_metric_id,
6336 level_two_fact_record.activity_metric_fact_id,
6337 level_one_fact_record.activity_metric_fact_id
6338 )
6339 LOOP
6340
6341 -- generating activity_metric_fact_id for each new record in Level Three with the sequence
6342 --l_act_metric_fact_id_level_3 := ozf_act_metric_facts_all_s.nextval;
6343 SELECT ozf_act_metric_facts_all_s.nextval INTO l_act_metric_fact_id_level_3 FROM dual;
6344
6345 INSERT INTO ozf_act_metric_facts_all (
6346 ACTIVITY_METRIC_FACT_ID ,
6347 LAST_UPDATE_DATE ,
6348 LAST_UPDATED_BY,
6349 CREATION_DATE,
6350 CREATED_BY,
6351 OBJECT_VERSION_NUMBER,
6352 ACT_METRIC_USED_BY_ID,
6353 ARC_ACT_METRIC_USED_BY,
6354 VALUE_TYPE,
6355 ACTIVITY_METRIC_ID,
6356 TRANS_FORECASTED_VALUE,
6357 FUNCTIONAL_CURRENCY_CODE,
6358 FUNC_FORECASTED_VALUE,
6359 ORG_ID,
6360 DE_METRIC_ID,
6361 TIME_ID1,
6362 FROM_DATE,
6363 TO_DATE,
6364 FACT_VALUE,
6365 FACT_PERCENT,
6366 BASE_QUANTITY,
6367 ROOT_FACT_ID,
6368 PREVIOUS_FACT_ID,
6369 FACT_TYPE,
6370 FACT_REFERENCE,
6371 last_update_login,
6372 FORECAST_REMAINING_QUANTITY,
6373 FORWARD_BUY_QUANTITY,
6374 NODE_ID
6375 )
6376 VALUES ( l_act_metric_fact_id_level_3,
6377 SYSDATE,
6378 Fnd_Global.User_ID,
6379 SYSDATE,
6380 Fnd_Global.User_ID,
6381 1,
6382 l_forecast_id,
6383 'FCST',
6384 'NUMERIC',
6385 l_activity_metric_id,
6386 0,
6387 'NONE',
6388 0,
6389 MO_GLOBAL.GET_CURRENT_ORG_ID(),
6390 0,
6391 0,
6392 level_three_fact_record.from_date,
6393 level_three_fact_record.to_date,
6394 level_three_fact_record.fact_value,
6395 level_three_fact_record.fact_percent,
6396 NVL(level_three_fact_record.base_quantity,0),
6397 l_act_metric_fact_id_level_1, -- newly generated Level One activity_metric_fact_id
6398 l_act_metric_fact_id_level_2, -- newly generated Level Two activity_metric_fact_id
6399 level_three_fact_record.fact_type,
6400 level_three_fact_record.fact_reference,
6401 fnd_global.login_id,
6402 level_three_fact_record.forecast_remaining_quantity,
6403 level_three_fact_record.forward_buy_quantity,
6404 level_three_fact_record.node_id
6405 );
6406
6407 END LOOP; -- end of level three loop
6408
6409 END LOOP; -- end of level two loop
6410
6411 END LOOP; -- end of level one loop
6412
6413
6414
6415 EXCEPTION
6416 WHEN OTHERS THEN
6417 x_return_status := FND_API.g_ret_sts_unexp_error;
6418
6419 ROLLBACK TO copy_forecast;
6420
6421 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
6422 THEN
6423 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
6424 END IF;
6425
6426 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
6427 p_count => x_msg_count,
6428 p_data => x_msg_data);
6429
6430
6431
6432
6433 END copy_forecast;
6434
6435
6436
6437 PROCEDURE cascade_update(
6438 p_api_version IN NUMBER,
6439 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
6440 p_commit IN VARCHAR2 := FND_API.g_false,
6441
6442 p_id IN NUMBER,
6443 p_value IN NUMBER,
6444 p_fwd_buy_value IN NUMBER,
6445 p_fcast_id IN NUMBER,
6446 p_cascade_flag IN NUMBER,
6447
6448 x_return_status OUT NOCOPY VARCHAR2,
6449 x_msg_count OUT NOCOPY NUMBER,
6450 x_msg_data OUT NOCOPY VARCHAR2
6451 )
6452 IS
6453
6454 l_fact_percent NUMBER := 0;
6455 l_fact_value NUMBER := 0;
6456 l_forward_buy_quantity NUMBER := 0;
6457 l_parent_fact_value NUMBER := 0;
6458 l_parent_fwd_buy_qty NUMBER := 0;
6459 l_temp_parent_fact_value NUMBER := 0;
6460 l_temp_parent_fwd_buy_qty NUMBER := 0;
6461 l_fcst_remaining_quantity NUMBER := 0;
6462 l_cascade_flag NUMBER := 0;
6463
6464 l_temp_count NUMBER := 0;
6465 l_temp_sub_count NUMBER := 0;
6466 l_temp_counter NUMBER := 0;
6467 l_temp_sub_counter NUMBER := 0;
6468 l_fval_sum_minus_last_rec NUMBER := 0;
6469 l_fwdbuy_sum_minus_last_rec NUMBER := 0;
6470 l_fwd_buy_sum_all_recs NUMBER := 0;
6471 l_fwd_buy_sum_all_sub_recs NUMBER := 0;
6472 l_temp_previous_fact_id NUMBER := 1;
6473 l_temp_sub_previous_fact_id NUMBER := 1;
6474
6475
6476
6477 CURSOR C_FindRecords(p_prev_id IN NUMBER,
6478 p_fcast_id IN NUMBER ) IS
6479 SELECT activity_metric_fact_id,
6480 previous_fact_id,
6481 forecast_remaining_quantity,
6482 fact_type,
6483 fact_reference,
6484 from_date,
6485 to_date,
6486 fact_value,
6487 fact_percent,
6488 root_fact_id,
6489 forward_buy_quantity
6490 FROM ozf_act_metric_facts_all
6491 WHERE arc_act_metric_used_by = 'FCST'
6492 AND act_metric_used_by_id = p_fcast_id
6493 AND previous_fact_id = p_prev_id
6494 order by 6; -- added this on 04/09/02 for Forward Buy calculations for TIME
6495
6496
6497 CURSOR C_FindSubRecords(p_prev_id IN NUMBER,
6498 p_fcast_id IN NUMBER ) IS
6499 SELECT activity_metric_fact_id,
6500 previous_fact_id,
6501 fact_type,
6502 fact_reference,
6503 from_date,
6504 to_date,
6505 fact_value,
6506 fact_percent,
6507 root_fact_id,
6508 forward_buy_quantity
6509 FROM ozf_act_metric_facts_all
6510 WHERE arc_act_metric_used_by = 'FCST'
6511 AND act_metric_used_by_id = p_fcast_id
6512 AND previous_fact_id = p_prev_id
6513 AND root_fact_id IS NOT NULL
6514 order by 6; -- added this on 04/09/02 for Forward Buy calculations for TIME
6515
6516 l_api_version CONSTANT NUMBER := 1.0;
6517 l_api_name CONSTANT VARCHAR2(30) := 'Cascade_Update';
6518 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6519 l_return_status VARCHAR2(1);
6520
6521 BEGIN
6522
6523 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message(l_full_name || ': start refresh parties'); END IF;
6524
6525 IF FND_API.to_boolean(p_init_msg_list) THEN
6526 FND_MSG_PUB.initialize;
6527 END IF;
6528
6529 IF NOT FND_API.compatible_api_call(l_api_version,
6530 p_api_version,
6531 l_api_name,
6532 g_pkg_name)
6533 THEN
6534 RAISE FND_API.g_exc_unexpected_error;
6535 END IF;
6536
6537 x_return_status := FND_API.g_ret_sts_success;
6538
6539
6540 IF (p_cascade_flag = 4) THEN
6541 -- Cascade_Update called on its own (not from Cascade_Level_One)
6542
6543 -- Get the fact value and forward buy qty of parent from database and compare them with the input API values.
6544 -- There can be 4 scenarios:
6545 -- 1. None of the values have been changed on UI (could happen when they change and reset back to previous values )
6546 -- so, dont need to do anything, i.e. DO NOT CASCADE (set l_cascade_flag = 0)
6547 -- 2. Just the fact value has been changed on UI (UI fact value different from database fact value)
6548 -- so, just cascade down the fact value change (set l_cascade_flag = 1)
6549 -- 3. Just the forward buy value has been changed on UI (UI forward buy value different from database forward buy value)
6550 -- so, just cascade down the forward buy value change (set l_cascade_flag = 2)
6551 -- 4. Both the fact value and forward buy changed on UI
6552 -- so, cascade down both the value changes. (set l_cascade_flag = 3)
6553
6554
6555 -- Get the fact value and forward buy value for the parent
6556 SELECT fact_value, forward_buy_quantity
6557 INTO l_parent_fact_value, l_parent_fwd_buy_qty
6558 FROM ozf_act_metric_facts_all
6559 WHERE arc_act_metric_used_by = 'FCST'
6560 AND act_metric_used_by_id = p_fcast_id
6561 AND activity_metric_fact_id = p_id;
6562
6563 IF ( (p_value = l_parent_fact_value) AND (p_fwd_buy_value = l_parent_fwd_buy_qty) ) THEN
6564 l_cascade_flag := 0;
6565 ELSIF ( (p_value <> l_parent_fact_value) AND (p_fwd_buy_value = l_parent_fwd_buy_qty) ) THEN
6566 l_cascade_flag := 1;
6567 ELSIF ( (p_value = l_parent_fact_value) AND (p_fwd_buy_value <> l_parent_fwd_buy_qty) ) THEN
6568 l_cascade_flag := 2;
6569 ELSIF ( (p_value <> l_parent_fact_value) AND (p_fwd_buy_value <> l_parent_fwd_buy_qty) ) THEN
6570 l_cascade_flag := 3;
6571 END IF;
6572
6573 ELSIF (p_cascade_flag <> 4) THEN
6574 -- Cascade_Update called from Cascade_Level_One procedure
6575 l_cascade_flag := p_cascade_flag;
6576
6577 END IF;
6578
6579 ----dbms_output.put_line('l_cascade_flag before entering 1st loop ' || l_cascade_flag );
6580
6581 --Only do something if values have been changed
6582 IF ( l_cascade_flag <> 0 ) THEN
6583
6584 -- Loop through possible existing second level facts
6585 FOR facts_record IN C_FindRecords(p_id, p_fcast_id) LOOP
6586 ----dbms_output.put_line('Entered 1st loop ' );
6587
6588 IF (l_temp_previous_fact_id <> facts_record.previous_fact_id) THEN
6589 SELECT count(*), sum(forward_buy_quantity)
6590 INTO l_temp_count, l_fwd_buy_sum_all_recs
6591 FROM ozf_act_metric_facts_all
6592 WHERE arc_act_metric_used_by = 'FCST'
6593 AND act_metric_used_by_id = p_fcast_id
6594 AND previous_fact_id = facts_record.previous_fact_id;
6595
6596 SELECT forecast_remaining_quantity INTO l_fcst_remaining_quantity
6597 FROM ozf_act_metric_facts_all
6598 WHERE arc_act_metric_used_by = 'FCST'
6599 AND act_metric_used_by_id = p_fcast_id
6600 AND activity_metric_fact_id = facts_record.previous_fact_id;
6601
6602 ----dbms_output.put_line('The count with previous_fact_id ' || facts_record.previous_fact_id || ' is ' || l_temp_count);
6603 l_temp_previous_fact_id := facts_record.previous_fact_id;
6604 END IF;
6605
6606 -- Increment the counter to check for the last record in each set
6607 l_temp_counter := l_temp_counter + 1;
6608
6609 IF ( (l_temp_counter <> l_temp_count) OR (l_fcst_remaining_quantity <> 0) ) THEN
6610
6611 -- this check is true when last rec reached and this if loop entered, so set counter = 0
6612 IF ( l_temp_counter = l_temp_count) THEN
6613 l_temp_counter := 0;
6614 END IF;
6615
6616 IF (l_cascade_flag = 1) THEN
6617 l_fact_value := round(p_value * facts_record.fact_percent * .01);
6618 IF (p_value <> 0) THEN
6619 l_fact_percent := l_fact_value * 100 / p_value;
6620 ELSIF (p_value = 0) THEN
6621 l_fact_percent := facts_record.fact_percent;
6622 END IF;
6623
6624 -- forward buy remains unchanged
6625 l_forward_buy_quantity := facts_record.forward_buy_quantity;
6626
6627 ELSIF (l_cascade_flag = 2) THEN
6628 -- Changed on 04/09/02
6629 IF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
6630 l_forward_buy_quantity := 0;
6631 ELSIF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
6632 l_forward_buy_quantity := p_fwd_buy_value;
6633 ELSE
6634 IF (l_fwd_buy_sum_all_recs <> 0) THEN
6635 l_forward_buy_quantity := (facts_record.forward_buy_quantity * p_fwd_buy_value) / l_fwd_buy_sum_all_recs;
6636 ELSIF (l_fwd_buy_sum_all_recs = 0) THEN
6637 -- for time being, assigning the values equally (if all of the child recs have 0's)
6638 -- l_forward_buy_quantity := p_fwd_buy_value / l_temp_count; -- Commented on 04/09/02
6639 l_forward_buy_quantity := p_fwd_buy_value * facts_record.fact_percent * .01;
6640 END IF;
6641 END IF;
6642
6643 -- fact value and fact percent remain unchanged
6644 l_fact_value := facts_record.fact_value;
6645 l_fact_percent := facts_record.fact_percent;
6646
6647 ELSIF (l_cascade_flag = 3) THEN
6648 l_fact_value := round(p_value * facts_record.fact_percent * .01);
6649
6650 IF (p_value <> 0) THEN
6651 l_fact_percent := l_fact_value * 100 / p_value;
6652 ELSIF (p_value = 0) THEN
6653 l_fact_percent := facts_record.fact_percent;
6654 END IF;
6655
6656 -- changed on 04/09/02
6657 IF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
6658 l_forward_buy_quantity := 0;
6659 ELSIF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
6660 l_forward_buy_quantity := p_fwd_buy_value;
6661 ELSE
6662 IF (l_fwd_buy_sum_all_recs <> 0) THEN
6663 l_forward_buy_quantity := (facts_record.forward_buy_quantity * p_fwd_buy_value) / l_fwd_buy_sum_all_recs;
6664 ELSIF (l_fwd_buy_sum_all_recs = 0) THEN
6665 -- for time being, assigning the values equally (if all of the child recs have 0's)
6666 -- l_forward_buy_quantity := p_fwd_buy_value / l_temp_count; -- Commented on 04/09/02
6667 l_forward_buy_quantity := p_fwd_buy_value * facts_record.fact_percent * .01;
6668 END IF;
6669 END IF;
6670
6671 END IF;
6672
6673 -- Not the last record with this given previous_fact_id.
6674 -- So do a normal update of fact_percent and fact_value
6675 -- this will also work for the last record if the RemainingFcstQty of its parent <> 0
6676
6677 ----dbms_output.put_line('Update 1st : factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4) ||' fwd ' || round(l_forward_buy_quantity));
6678
6679 UPDATE ozf_act_metric_facts_all
6680 SET fact_value = l_fact_value,
6681 fact_percent = round(l_fact_percent,4),
6682 forward_buy_quantity = round(l_forward_buy_quantity)
6683 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
6684
6685 l_temp_parent_fact_value := l_fact_value;
6686 l_temp_parent_fwd_buy_qty := round(l_forward_buy_quantity);
6687
6688
6689 ELSIF ( (l_temp_counter = l_temp_count) AND (l_fcst_remaining_quantity = 0) ) THEN
6690
6691 -- Last record in the current set with the given previous_fact_id.
6692 -- Counter reset to 0 for the next set of records with another previous_fact_id
6693 -- this will only work for the last record if the RemainingFcstQty of its parent = 0
6694 -- this logic is needed so that RemainingFcstQty is never negative
6695 l_temp_counter := 0;
6696
6697 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
6698 SELECT NVL(sum(fact_value),0), NVL(sum(forward_buy_quantity),0)
6699 INTO l_fval_sum_minus_last_rec, l_fwdbuy_sum_minus_last_rec
6700 FROM ozf_act_metric_facts_all
6701 WHERE arc_act_metric_used_by = 'FCST'
6702 AND act_metric_used_by_id = p_fcast_id
6703 AND previous_fact_id = facts_record.previous_fact_id
6704 AND activity_metric_fact_id <> facts_record.activity_metric_fact_id ;
6705
6706 IF (l_cascade_flag = 1) THEN
6707 l_fact_value := round(p_value - l_fval_sum_minus_last_rec);
6708 IF (p_value <> 0) THEN
6709 l_fact_percent := l_fact_value * 100 / p_value;
6710 ELSIF (p_value = 0) THEN
6711 l_fact_percent := facts_record.fact_percent;
6712 END IF;
6713
6714 -- forward buy remains unchanged
6715 l_forward_buy_quantity := facts_record.forward_buy_quantity;
6716 ELSIF (l_cascade_flag = 2) THEN
6717 l_forward_buy_quantity := round(p_fwd_buy_value - l_fwdbuy_sum_minus_last_rec);
6718
6719 -- fact value and fact percent remain unchanged
6720 l_fact_value := facts_record.fact_value;
6721 l_fact_percent := facts_record.fact_percent;
6722 ELSIF (l_cascade_flag = 3) THEN
6723 l_fact_value := round(p_value - l_fval_sum_minus_last_rec);
6724 IF (p_value <> 0) THEN
6725 l_fact_percent := l_fact_value * 100 / p_value;
6726 ELSIF (p_value = 0) THEN
6727 l_fact_percent := facts_record.fact_percent;
6728 END IF;
6729
6730 l_forward_buy_quantity := round(p_fwd_buy_value - l_fwdbuy_sum_minus_last_rec);
6731 END IF;
6732
6733 ----dbms_output.put_line('Update: factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4) || ' fwd ' || round(l_forward_buy_quantity));
6734
6735 UPDATE ozf_act_metric_facts_all
6736 SET fact_value = l_fact_value,
6737 fact_percent = round(l_fact_percent,4),
6738 forward_buy_quantity = l_forward_buy_quantity
6739 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
6740
6741 l_temp_parent_fact_value := l_fact_value;
6742 l_temp_parent_fwd_buy_qty := l_forward_buy_quantity;
6743
6744 END IF;
6745
6746 -- -- Loop through possible existing third level facts
6747 FOR facts_subrecord IN C_FindSubRecords(facts_record.activity_metric_fact_id, p_fcast_id) LOOP
6748
6749 IF (l_temp_sub_previous_fact_id <> facts_subrecord.previous_fact_id) THEN
6750 SELECT count(*), sum(forward_buy_quantity)
6751 INTO l_temp_sub_count, l_fwd_buy_sum_all_sub_recs
6752 FROM ozf_act_metric_facts_all
6753 WHERE arc_act_metric_used_by = 'FCST'
6754 AND act_metric_used_by_id = p_fcast_id
6755 AND previous_fact_id = facts_subrecord.previous_fact_id
6756 AND root_fact_id IS NOT NULL;
6757
6758 ----dbms_output.put_line('The count with previous_fact_id ' || facts_subrecord.previous_fact_id || ' is ' || l_temp_count);
6759 l_temp_sub_previous_fact_id := facts_subrecord.previous_fact_id;
6760 END IF;
6761
6762 -- Increment the counter to check for the last record in each set
6763 l_temp_sub_counter := l_temp_sub_counter + 1;
6764
6765 IF ( (l_temp_sub_counter <> l_temp_sub_count) OR (facts_record.forecast_remaining_quantity <> 0) ) THEN
6766
6767 -- this check is true when last rec reached and this if loop entered, so set counter = 0
6768 IF ( l_temp_sub_counter = l_temp_sub_count) THEN
6769 l_temp_sub_counter := 0;
6770 END IF;
6771
6772 IF (l_cascade_flag = 1) THEN
6773 l_fact_value := round(l_temp_parent_fact_value * facts_subrecord.fact_percent * .01);
6774 IF (l_temp_parent_fact_value <> 0) THEN
6775 l_fact_percent := l_fact_value * 100 / l_temp_parent_fact_value;
6776 ELSIF (l_temp_parent_fact_value = 0) THEN
6777 l_fact_percent := facts_subrecord.fact_percent;
6778 END IF;
6779
6780 -- forward buy remains unchanged
6781 l_forward_buy_quantity := facts_subrecord.forward_buy_quantity;
6782
6783 ELSIF (l_cascade_flag = 2) THEN
6784 -- Changed on 04/09/02
6785 IF ( (facts_subrecord.fact_type = 'TIME') AND (l_temp_sub_counter <> l_temp_sub_count) ) THEN
6786 l_forward_buy_quantity := 0;
6787 ELSIF ( (facts_subrecord.fact_type = 'TIME') AND (l_temp_sub_counter = l_temp_sub_count) ) THEN
6788 l_forward_buy_quantity := l_temp_parent_fwd_buy_qty;
6789 ELSE
6790 IF (l_fwd_buy_sum_all_sub_recs <> 0) THEN
6791 l_forward_buy_quantity :=
6792 (facts_subrecord.forward_buy_quantity * l_temp_parent_fwd_buy_qty) / l_fwd_buy_sum_all_sub_recs;
6793 ELSIF (l_fwd_buy_sum_all_sub_recs = 0) THEN
6794 -- for time being, assigning the values equally (if all of the child recs have 0's)
6795 -- l_forward_buy_quantity := l_temp_parent_fwd_buy_qty / l_temp_sub_count; -- Commented on 04/09/02
6796 l_forward_buy_quantity := l_temp_parent_fwd_buy_qty * facts_subrecord.fact_percent * .01;
6797 END IF;
6798 END IF;
6799
6800 -- fact value and fact percent remain unchanged
6801 l_fact_value := facts_subrecord.fact_value;
6802 l_fact_percent := facts_subrecord.fact_percent;
6803
6804 ELSIF (l_cascade_flag = 3) THEN
6805 l_fact_value := round(l_temp_parent_fact_value * facts_subrecord.fact_percent * .01);
6806 ----dbms_output.put_line('ParentfactVal ' || facts_record.fact_value || 'subPer ' || facts_subrecord.fact_percent || ' SubfactVal ' || l_fact_value);
6807 IF (l_temp_parent_fact_value <> 0) THEN
6808 l_fact_percent := l_fact_value * 100 / l_temp_parent_fact_value;
6809 ELSIF (l_temp_parent_fact_value = 0) THEN
6810 l_fact_percent := facts_subrecord.fact_percent;
6811 END IF;
6812
6813 -- Changed on 04/09/02
6814 IF ( (facts_subrecord.fact_type = 'TIME') AND (l_temp_sub_counter <> l_temp_sub_count) ) THEN
6815 l_forward_buy_quantity := 0;
6816 ELSIF ( (facts_subrecord.fact_type = 'TIME') AND (l_temp_sub_counter = l_temp_sub_count) ) THEN
6817 l_forward_buy_quantity := l_temp_parent_fwd_buy_qty;
6818 ELSE
6819 IF (l_fwd_buy_sum_all_sub_recs <> 0) THEN
6820 l_forward_buy_quantity :=
6821 (facts_subrecord.forward_buy_quantity * l_temp_parent_fwd_buy_qty) / l_fwd_buy_sum_all_sub_recs;
6822 ELSIF (l_fwd_buy_sum_all_sub_recs = 0) THEN
6823 -- for time being, assigning the values equally (if all of the child recs have 0's)
6824 -- l_forward_buy_quantity := l_temp_parent_fwd_buy_qty / l_temp_sub_count; -- Commented on 04/09/02
6825 l_forward_buy_quantity := l_temp_parent_fwd_buy_qty * facts_subrecord.fact_percent * .01;
6826 END IF;
6827 END IF;
6828
6829 END IF;
6830
6831 -- Not the last record with this given previous_fact_id.
6832 -- So do a normal update of fact_percent and fact_value
6833 -- this will also work for the last record if the RemainingFcstQty of its parent <> 0
6834
6835 ----dbms_output.put_line('Update: factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4)|| ' fwd ' || round(l_forward_buy_quantity));
6836
6837 UPDATE ozf_act_metric_facts_all
6838 SET fact_value = l_fact_value,
6839 fact_percent = round(l_fact_percent,4),
6840 forward_buy_quantity = round(l_forward_buy_quantity)
6841 WHERE activity_metric_fact_id = facts_subrecord.activity_metric_fact_id;
6842
6843 ELSIF ( (l_temp_sub_counter = l_temp_sub_count) AND (facts_record.forecast_remaining_quantity = 0) ) THEN
6844 -- Last record in the current set with the given previous_fact_id.
6845 -- Counter reset to 0 for the next set of records with another previous_fact_id
6846 -- this will only work for the last record if the RemainingFcstQty of its parent = 0
6847 -- this logic is needed so that RemainingFcstQty is never negative
6848 l_temp_sub_counter := 0;
6849
6850 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
6851 SELECT NVL(sum(fact_value),0), NVL(sum(forward_buy_quantity),0)
6852 INTO l_fval_sum_minus_last_rec, l_fwdbuy_sum_minus_last_rec
6853 FROM ozf_act_metric_facts_all
6854 WHERE arc_act_metric_used_by = 'FCST'
6855 AND act_metric_used_by_id = p_fcast_id
6856 AND previous_fact_id = facts_subrecord.previous_fact_id
6857 AND root_fact_id IS NOT NULL
6858 AND activity_metric_fact_id <> facts_subrecord.activity_metric_fact_id ;
6859
6860 IF (l_cascade_flag = 1) THEN
6861 l_fact_value := round(l_temp_parent_fact_value - l_fval_sum_minus_last_rec);
6862 IF (l_temp_parent_fact_value <> 0) THEN
6863 l_fact_percent := l_fact_value * 100 / l_temp_parent_fact_value;
6864 ELSIF (l_temp_parent_fact_value = 0) THEN
6865 l_fact_percent := facts_subrecord.fact_percent;
6866 END IF;
6867
6868 -- forward buy remains unchanged
6869 l_forward_buy_quantity := facts_subrecord.forward_buy_quantity;
6870 ELSIF (l_cascade_flag = 2) THEN
6871 l_forward_buy_quantity := round(l_temp_parent_fwd_buy_qty - l_fwdbuy_sum_minus_last_rec);
6872
6873 -- fact value and fact percent remain unchanged
6874 l_fact_value := facts_subrecord.fact_value;
6875 l_fact_percent := facts_subrecord.fact_percent;
6876 ELSIF (l_cascade_flag = 3) THEN
6877 l_fact_value := round(l_temp_parent_fact_value - l_fval_sum_minus_last_rec);
6878 IF (l_temp_parent_fact_value <> 0) THEN
6879 l_fact_percent := l_fact_value * 100 / l_temp_parent_fact_value;
6880 ELSIF (l_temp_parent_fact_value = 0) THEN
6881 l_fact_percent := facts_subrecord.fact_percent;
6882 END IF;
6883
6884 l_forward_buy_quantity := round(l_temp_parent_fwd_buy_qty - l_fwdbuy_sum_minus_last_rec);
6885 END IF;
6886
6887 ----dbms_output.put_line('Update: factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4) || ' fwd ' || round(l_forward_buy_quantity));
6888
6889 UPDATE ozf_act_metric_facts_all
6890 SET fact_value = l_fact_value,
6891 fact_percent = round(l_fact_percent,4),
6892 forward_buy_quantity = l_forward_buy_quantity
6893 WHERE activity_metric_fact_id = facts_subrecord.activity_metric_fact_id;
6894
6895 END IF;
6896
6897
6898 END LOOP;
6899
6900 END LOOP;
6901
6902 -- commented here , call placed in java after Update called
6903 --fcst_remqty(p_fcast_id);
6904
6905
6906 END IF;
6907
6908 EXCEPTION
6909 WHEN OTHERS THEN
6910 x_return_status := FND_API.g_ret_sts_unexp_error;
6911
6912 FND_MESSAGE.set_name('OZF', 'OZF_OFFER_PARTY_STMT_FAILED');
6913 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
6914 FND_MSG_PUB.add;
6915
6916 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
6917 THEN
6918 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
6919 END IF;
6920
6921 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
6922 p_count => x_msg_count,
6923 p_data => x_msg_data);
6924
6925
6926 END cascade_update;
6927
6928
6929
6930 PROCEDURE cascade_first_level(
6931 p_api_version IN NUMBER,
6932 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
6933 p_commit IN VARCHAR2 := FND_API.g_false,
6934
6935 p_fcast_value IN NUMBER,
6936 p_fwd_buy_value IN NUMBER,
6937 p_fcast_id IN NUMBER,
6938 p_cascade_flag IN NUMBER,
6939
6940 x_return_status OUT NOCOPY VARCHAR2,
6941 x_msg_count OUT NOCOPY NUMBER,
6942 x_msg_data OUT NOCOPY VARCHAR2
6943 )
6944 IS
6945
6946 l_fact_percent NUMBER := 0;
6947 l_fact_value NUMBER := 0;
6948 l_forward_buy_quantity NUMBER := 0;
6949 l_parent_fact_value NUMBER := 0;
6950 l_parent_fwd_buy_qty NUMBER := 0;
6951 l_fcst_remaining_quantity NUMBER := 0;
6952 l_cascade_flag NUMBER := 0;
6953 l_temp_count NUMBER := 0;
6954 l_temp_counter NUMBER := 0;
6955 l_fwd_buy_sum_all_recs NUMBER := 0;
6956 l_fval_sum_minus_last_rec NUMBER := 0;
6957 l_fwdbuy_sum_minus_last_rec NUMBER := 0;
6958
6959 CURSOR C_LevelOneRecords(p_forecast_id IN NUMBER) IS
6960 SELECT activity_metric_fact_id,
6961 previous_fact_id,
6962 forecast_remaining_quantity,
6963 fact_type,
6964 fact_reference,
6965 from_date,
6966 to_date,
6967 fact_value,
6968 fact_percent,
6969 root_fact_id,
6970 forward_buy_quantity
6971 FROM ozf_act_metric_facts_all
6972 WHERE arc_act_metric_used_by = 'FCST'
6973 AND act_metric_used_by_id = p_forecast_id
6974 AND previous_fact_id IS NULL
6975 AND root_fact_id IS NULL
6976 order by 6; --changed on 04/09/02
6977
6978 l_api_version CONSTANT NUMBER := 1.0;
6979 l_api_name CONSTANT VARCHAR2(30) := 'Cascade_Level_One';
6980 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6981 l_return_status VARCHAR2(1);
6982
6983
6984 BEGIN
6985
6986 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message(l_full_name || ': start refresh parties'); END IF;
6987
6988 IF FND_API.to_boolean(p_init_msg_list) THEN
6989 FND_MSG_PUB.initialize;
6990 END IF;
6991
6992 IF NOT FND_API.compatible_api_call(l_api_version,
6993 p_api_version,
6994 l_api_name,
6995 g_pkg_name)
6996 THEN
6997 RAISE FND_API.g_exc_unexpected_error;
6998 END IF;
6999
7000 x_return_status := FND_API.g_ret_sts_success;
7001
7002 /* Commented for now (since values retrieved in Java class
7003 SELECT forecast_quantity, forward_buy_quantity, forecast_remaining_quantity
7004 INTO l_parent_fact_value, l_parent_fwd_buy_qty, l_fcst_remaining_quantity
7005 FROM ozf_act_forecasts_all
7006 WHERE forecast_id = p_fcast_id;
7007 */
7008
7009 SELECT forecast_remaining_quantity
7010 INTO l_fcst_remaining_quantity
7011 FROM ozf_act_forecasts_all
7012 WHERE forecast_id = p_fcast_id;
7013
7014 /* Commented for now (since values retrieved in Java class
7015 IF ( (p_fcast_value = l_parent_fact_value) AND (p_fwd_buy_value = l_parent_fwd_buy_qty) ) THEN
7016 l_cascade_flag := 0;
7017 ELSIF ( (p_fcast_value <> l_parent_fact_value) AND (p_fwd_buy_value = l_parent_fwd_buy_qty) ) THEN
7018 l_cascade_flag := 1;
7019 ELSIF ( (p_fcast_value = l_parent_fact_value) AND (p_fwd_buy_value <> l_parent_fwd_buy_qty) ) THEN
7020 l_cascade_flag := 2;
7021 ELSIF ( (p_fcast_value <> l_parent_fact_value) AND (p_fwd_buy_value <> l_parent_fwd_buy_qty) ) THEN
7022 l_cascade_flag := 3;
7023 END IF;
7024 */
7025
7026 l_cascade_flag := p_cascade_flag;
7027
7028 -- Consider if we need to enter the loop if l_cascade_flag := 0
7029 --------------------------------
7030
7031 SELECT count(*), sum(forward_buy_quantity)
7032 INTO l_temp_count, l_fwd_buy_sum_all_recs
7033 FROM ozf_act_metric_facts_all
7034 WHERE arc_act_metric_used_by = 'FCST'
7035 AND act_metric_used_by_id = p_fcast_id
7036 AND previous_fact_id IS NULL
7037 AND root_fact_id IS NULL;
7038
7039 FOR facts_record IN C_LevelOneRecords(p_fcast_id) LOOP
7040
7041 -- Increment the counter to check for the last record in each set
7042 l_temp_counter := l_temp_counter + 1;
7043
7044 IF ( (l_temp_counter <> l_temp_count) OR (l_fcst_remaining_quantity <> 0) ) THEN
7045
7046 IF (l_cascade_flag = 1) THEN
7047 l_fact_value := round(p_fcast_value * facts_record.fact_percent * .01);
7048 IF (p_fcast_value <> 0) THEN
7049 l_fact_percent := l_fact_value * 100 / p_fcast_value;
7050 ELSIF (p_fcast_value = 0) THEN
7051 l_fact_percent := facts_record.fact_percent;
7052 END IF;
7053
7054 -- forward buy remains unchanged
7055 l_forward_buy_quantity := facts_record.forward_buy_quantity;
7056 ELSIF (l_cascade_flag = 2) THEN
7057 -- Changed on 04/09/02
7058 IF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
7059 l_forward_buy_quantity := 0;
7060 ELSIF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
7061 l_forward_buy_quantity := p_fwd_buy_value;
7062 ELSE
7063 IF (l_fwd_buy_sum_all_recs <> 0) THEN
7064 l_forward_buy_quantity := (facts_record.forward_buy_quantity * p_fwd_buy_value) / l_fwd_buy_sum_all_recs;
7065 ELSIF (l_fwd_buy_sum_all_recs = 0) THEN
7066 -- for time being, assigning the values equally (if all of the child recs have 0's)
7067 --l_forward_buy_quantity := p_fwd_buy_value / l_temp_count; -- Commented on APR 04/09/02
7068 l_forward_buy_quantity := p_fwd_buy_value * facts_record.fact_percent * .01;
7069 END IF;
7070 END IF;
7071
7072 -- fact value and fact percent remain unchanged
7073 l_fact_value := facts_record.fact_value;
7074 l_fact_percent := facts_record.fact_percent;
7075
7076 ELSIF (l_cascade_flag = 3) THEN
7077 l_fact_value := round(p_fcast_value * facts_record.fact_percent * .01);
7078 IF (p_fcast_value <> 0) THEN
7079 l_fact_percent := l_fact_value * 100 / p_fcast_value;
7080 ELSIF (p_fcast_value = 0) THEN
7081 l_fact_percent := facts_record.fact_percent;
7082 END IF;
7083
7084 -- Changed on 04/09/02
7085 IF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
7086 l_forward_buy_quantity := 0;
7087 ELSIF ( (facts_record.fact_type = 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
7088 l_forward_buy_quantity := p_fwd_buy_value;
7089 ELSE
7090 IF (l_fwd_buy_sum_all_recs <> 0) THEN
7091 l_forward_buy_quantity := (facts_record.forward_buy_quantity * p_fwd_buy_value) / l_fwd_buy_sum_all_recs;
7092 ELSIF (l_fwd_buy_sum_all_recs = 0) THEN
7093 -- for time being, assigning the values equally (if all of the child recs have 0's)
7094 --l_forward_buy_quantity := p_fwd_buy_value / l_temp_count; -- Commented on APR 04/09/02
7095 l_forward_buy_quantity := p_fwd_buy_value * facts_record.fact_percent * .01;
7096 END IF;
7097 END IF;
7098
7099 END IF;
7100
7101 UPDATE ozf_act_metric_facts_all
7102 SET fact_value = l_fact_value,
7103 fact_percent = round(l_fact_percent,4),
7104 forward_buy_quantity = round(l_forward_buy_quantity)
7105 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
7106
7107 ----dbms_output.put_line('Updated: factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4)
7108 --|| ' fwd ' || round(l_forward_buy_quantity) || ' cascadeFlag '||l_cascade_flag);
7109
7110 -- call Cascade_Update with the proper cascade flag
7111 cascade_update(p_api_version,
7112 p_init_msg_list,
7113 p_commit,
7114 facts_record.activity_metric_fact_id,
7115 l_fact_value,
7116 round(l_forward_buy_quantity),
7117 p_fcast_id,
7118 l_cascade_flag,
7119 x_return_status,
7120 x_msg_count,
7121 x_msg_data
7122 );
7123
7124 ELSIF ( (l_temp_counter = l_temp_count) AND (l_fcst_remaining_quantity = 0) ) THEN
7125
7126 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
7127 SELECT NVL(sum(fact_value),0), NVL(sum(forward_buy_quantity),0)
7128 INTO l_fval_sum_minus_last_rec, l_fwdbuy_sum_minus_last_rec
7129 FROM ozf_act_metric_facts_all
7130 WHERE arc_act_metric_used_by = 'FCST'
7131 AND act_metric_used_by_id = p_fcast_id
7132 AND previous_fact_id IS NULL
7133 AND root_fact_id IS NULL
7134 AND activity_metric_fact_id <> facts_record.activity_metric_fact_id ;
7135
7136 IF (l_cascade_flag = 1) THEN
7137 l_fact_value := round(p_fcast_value - l_fval_sum_minus_last_rec);
7138 IF (p_fcast_value <> 0) THEN
7139 l_fact_percent := l_fact_value * 100 / p_fcast_value;
7140 ELSIF (p_fcast_value = 0) THEN
7141 l_fact_percent := facts_record.fact_percent;
7142 END IF;
7143
7144 -- forward buy remains unchanged
7145 l_forward_buy_quantity := facts_record.forward_buy_quantity;
7146 ELSIF (l_cascade_flag = 2) THEN
7147 l_forward_buy_quantity := round(p_fwd_buy_value - l_fwdbuy_sum_minus_last_rec);
7148
7149 -- fact value and fact percent remain unchanged
7150 l_fact_value := facts_record.fact_value;
7151 l_fact_percent := facts_record.fact_percent;
7152 ELSIF (l_cascade_flag = 3) THEN
7153 l_fact_value := round(p_fcast_value - l_fval_sum_minus_last_rec);
7154 IF (p_fcast_value <> 0) THEN
7155 l_fact_percent := l_fact_value * 100 / p_fcast_value;
7156 ELSIF (p_fcast_value = 0) THEN
7157 l_fact_percent := facts_record.fact_percent;
7158 END IF;
7159
7160 l_forward_buy_quantity := round(p_fwd_buy_value - l_fwdbuy_sum_minus_last_rec);
7161 END IF;
7162
7163
7164 UPDATE ozf_act_metric_facts_all
7165 SET fact_value = l_fact_value,
7166 fact_percent = round(l_fact_percent,4),
7167 forward_buy_quantity = l_forward_buy_quantity
7168 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
7169 ----dbms_output.put_line('Updated: factVal = ' || l_fact_value || ' Perc ' || round(l_fact_percent,4)
7170 --|| ' fwd ' || round(l_forward_buy_quantity) || ' cascadeFlag '||l_cascade_flag);
7171
7172 -- call Cascade_Update with the proper cascade flag
7173 cascade_update(p_api_version,
7174 p_init_msg_list,
7175 p_commit,
7176 facts_record.activity_metric_fact_id,
7177 l_fact_value,
7178 round(l_forward_buy_quantity),
7179 p_fcast_id,
7180 l_cascade_flag,
7181 x_return_status,
7182 x_msg_count,
7183 x_msg_data
7184 );
7185
7186 END IF;
7187
7188 END LOOP;
7189
7190 EXCEPTION
7191 WHEN OTHERS THEN
7192 x_return_status := FND_API.g_ret_sts_unexp_error;
7193
7194 FND_MESSAGE.set_name('OZF', 'OZF_OFFER_PARTY_STMT_FAILED');
7195 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
7196 FND_MSG_PUB.add;
7197
7198 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
7199 THEN
7200 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
7201 END IF;
7202
7203 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
7204 p_count => x_msg_count,
7205 p_data => x_msg_data);
7206
7207
7208 END cascade_first_level;
7209
7210
7211
7212 PROCEDURE p_Calc_Val(p_base_quantity IN NUMBER,
7213 p_fcast_quantity IN NUMBER,
7214 p_spread_type IN VARCHAR2,
7215 b_quantity IN NUMBER,
7216 act_metric_fact_id IN NUMBER,
7217 count_records IN NUMBER,
7218 x_fact_value OUT NOCOPY NUMBER
7219 )
7220 IS
7221 BEGIN
7222
7223 IF (p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7224 -- Split Total Forecast Qty by total number of rows
7225 x_fact_value := p_fcast_quantity / count_records;
7226
7227 ELSIF (p_spread_type = 'BASELINE_RATIO') THEN
7228 IF ( p_base_quantity = 0 )
7229 THEN
7230 x_fact_value := 0;
7231 ELSE
7232 x_fact_value := p_fcast_quantity * b_quantity / p_base_quantity;
7233 END IF;
7234 END IF;
7235
7236 END p_Calc_Val;
7237
7238
7239 PROCEDURE calc_perc(
7240 p_api_version IN NUMBER,
7241 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
7242 p_commit IN VARCHAR2 := FND_API.g_false,
7243
7244 p_used_by_id IN NUMBER,
7245 p_level_num IN NUMBER,
7246 p_spread_type IN VARCHAR2,
7247
7248 x_return_status OUT NOCOPY VARCHAR2,
7249 x_msg_count OUT NOCOPY NUMBER,
7250 x_msg_data OUT NOCOPY VARCHAR2
7251 )
7252 IS
7253
7254 l_temp_count NUMBER := 1;
7255 l_temp_counter NUMBER := 0;
7256 l_fval_sum_minus_last_rec NUMBER := 0;
7257 l_fwdbuy_sum_minus_last_rec NUMBER := 0;
7258 l_fact_percent NUMBER := 0;
7259 l_fact_value NUMBER := 0;
7260 l_forward_buy_quantity NUMBER := 0;
7261 l_temp_fact_value NUMBER := 0;
7262 l_temp_previous_fact_id NUMBER := 1;
7263 l_level_num NUMBER := 0;
7264
7265 l_rounded_val NUMBER := 0;
7266 l_counter NUMBER := 0;
7267 l_x_counter NUMBER := 0;
7268 l_x_value NUMBER := 0;
7269 l_y_counter NUMBER := 0;
7270 l_y_value NUMBER := 0;
7271 l_check_counter NUMBER := 0;
7272 l_check_count_counter NUMBER := 0;
7273
7274 CURSOR C1 IS
7275 SELECT a.activity_metric_fact_id,
7276 a.previous_fact_id,
7277 a.base_quantity level_one_bq,
7278 a.fact_type level_one_fact_type,
7279 a.fact_reference,
7280 a.from_date,
7281 a.to_date,
7282 a.fact_value,
7283 a.fact_percent,
7284 a.root_fact_id,
7285 b.base_quantity overall_base_quantity,
7286 b.forecast_quantity overall_forecast_quantity,
7287 b.forward_buy_quantity overall_fwd_buy_qty
7288 FROM ozf_act_metric_facts_all a, ozf_act_forecasts_all b
7289 WHERE a.arc_act_metric_used_by = 'FCST'
7290 AND a.act_metric_used_by_id = p_used_by_id
7291 AND a.previous_fact_id IS NULL
7292 AND b.forecast_id = a.act_metric_used_by_id
7293 and nvl(a.node_id,1) <> 3
7294 order by 6;
7295
7296 CURSOR C2 IS
7297 SELECT f1.base_quantity level_one_bq,
7298 f1.fact_value level_one_fact_val,
7299 f.activity_metric_fact_id level_two_fact_id,
7300 f.previous_fact_id,
7301 f.base_quantity level_two_bq,
7302 f.fact_type level_two_fact_type,
7303 f.fact_reference,
7304 f.from_date,
7305 f.to_date,
7306 f.fact_value,
7307 f.fact_percent,
7308 f.root_fact_id,
7309 f1.forward_buy_quantity level_one_fwd_buy_qty
7310 FROM ozf_act_metric_facts_all f, ozf_act_metric_facts_all f1
7311 WHERE f.arc_act_metric_used_by = 'FCST'
7312 AND f.act_metric_used_by_id = p_used_by_id
7313 AND f.previous_fact_id IS NOT NULL
7314 AND f.root_fact_id IS NULL
7315 AND f.previous_fact_id = f1.activity_metric_fact_id
7316 and nvl(f.node_id,1) <> 3
7317 order by 4,8;
7318
7319 CURSOR C3 IS
7320 SELECT f1.base_quantity level_two_bq,
7321 f1.fact_value level_two_fact_val,
7322 f.activity_metric_fact_id level_three_fact_id,
7323 f.previous_fact_id,
7324 f.base_quantity level_three_bq,
7325 f.fact_type level_three_fact_type,
7326 f.fact_reference,
7327 f.from_date,
7328 f.to_date,
7329 f.fact_value,
7330 f.fact_percent,
7331 f.root_fact_id,
7332 f1.forward_buy_quantity level_two_fwd_buy_qty
7333 FROM ozf_act_metric_facts_all f, ozf_act_metric_facts_all f1
7334 WHERE f.arc_act_metric_used_by = 'FCST'
7335 AND f.act_metric_used_by_id = p_used_by_id
7336 AND f.root_fact_id IS NOT NULL
7337 AND f.previous_fact_id = f1.activity_metric_fact_id
7338 and nvl(f.node_id,1) <> 3
7339 order by 4,8;
7340
7341 l_api_version CONSTANT NUMBER := 1.0;
7342 l_api_name CONSTANT VARCHAR2(30) := 'Calc_Perc';
7343 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7344 l_return_status VARCHAR2(1);
7345
7346
7347 BEGIN
7348
7349 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message(l_full_name || ': start refresh parties'); END IF;
7350
7351 IF FND_API.to_boolean(p_init_msg_list) THEN
7352 FND_MSG_PUB.initialize;
7353 END IF;
7354
7355 IF NOT FND_API.compatible_api_call(l_api_version,
7356 p_api_version,
7357 l_api_name,
7358 g_pkg_name)
7359 THEN
7360 RAISE FND_API.g_exc_unexpected_error;
7361 END IF;
7362
7363 x_return_status := FND_API.g_ret_sts_success;
7364
7365 l_level_num := p_level_num;
7366
7367 LOOP
7368
7369 IF (l_level_num = 1) THEN
7370
7371 SELECT count(*)
7372 INTO l_temp_count
7373 FROM ozf_act_metric_facts_all
7374 WHERE arc_act_metric_used_by = 'FCST'
7375 AND act_metric_used_by_id = p_used_by_id
7376 AND previous_fact_id IS NULL
7377 AND root_fact_id IS NULL
7378 and nvl(node_id,1) <> 3;
7379
7380 FOR rec IN C1 LOOP
7381 l_temp_counter := l_temp_counter + 1;
7382 l_counter := l_counter + 1;
7383
7384 IF(p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7385 IF( l_check_counter = 0 ) THEN
7386 l_rounded_val := round(rec.overall_forecast_quantity / l_temp_count);
7387 IF( (l_temp_count * l_rounded_val) > rec.overall_forecast_quantity ) THEN
7388 l_x_counter := (l_rounded_val * l_temp_count) - rec.overall_forecast_quantity;
7389 l_x_value := l_rounded_val - 1;
7390 l_y_counter := l_temp_count - l_x_counter;
7391 l_y_value := l_rounded_val;
7392 ELSIF( (l_temp_count * l_rounded_val) < rec.overall_forecast_quantity ) THEN
7393 l_x_counter := rec.overall_forecast_quantity - (l_rounded_val * l_temp_count);
7394 l_x_value := l_rounded_val + 1;
7395 l_y_counter := l_temp_count - l_x_counter;
7396 l_y_value := l_rounded_val;
7397 ELSE
7398 l_x_counter := 0;
7399 l_y_counter := l_temp_count;
7400 l_y_value := l_rounded_val;
7401 END IF;
7402
7403 l_check_counter := 1;
7404 END IF;
7405
7406 IF( l_x_counter = 0 ) THEN
7407 l_fact_value := l_y_value;
7408 ELSIF( (l_x_counter <> 0) AND (l_counter <= l_x_counter) ) THEN
7409 l_fact_value := l_x_value;
7410 ELSIF( (l_x_counter <> 0) AND (l_counter > l_x_counter) ) THEN
7411 l_fact_value := l_y_value;
7412 END IF;
7413
7414 ELSIF(p_spread_type = 'BASELINE_RATIO') THEN
7415 IF (l_temp_counter <> l_temp_count) THEN
7416 p_Calc_Val(rec.overall_base_quantity,
7417 rec.overall_forecast_quantity,
7418 p_spread_type,
7419 rec.level_one_bq,
7420 rec.activity_metric_fact_id,
7421 l_temp_count,
7422 l_temp_fact_value);
7423
7424 l_fact_value := round(l_temp_fact_value);
7425 ELSIF (l_temp_counter = l_temp_count) THEN
7426 SELECT NVL(sum(fact_value),0)
7427 INTO l_fval_sum_minus_last_rec
7428 FROM ozf_act_metric_facts_all
7429 WHERE arc_act_metric_used_by = 'FCST'
7430 AND act_metric_used_by_id = p_used_by_id
7431 AND previous_fact_id IS NULL
7432 AND root_fact_id IS NULL
7433 AND activity_metric_fact_id <> rec.activity_metric_fact_id
7434 and nvl(node_id,1) <> 3;
7435
7436 l_fact_value := round(rec.overall_forecast_quantity - l_fval_sum_minus_last_rec);
7437 END IF;
7438
7439 END IF;
7440
7441 IF( rec.overall_forecast_quantity = 0 ) THEN
7442 l_fact_percent := 0.0000;
7443 ELSIF ( rec.overall_forecast_quantity <> 0 ) THEN
7444 l_fact_percent := l_fact_value * 100 / rec.overall_forecast_quantity;
7445 END IF;
7446
7447 -- Changed on 04/09/02
7448 IF( (rec.level_one_fact_type = 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
7449 l_forward_buy_quantity := 0;
7450 ELSIF ( (rec.level_one_fact_type = 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
7451 l_forward_buy_quantity := rec.overall_fwd_buy_qty;
7452 ELSIF ( (rec.level_one_fact_type <> 'TIME') AND (l_temp_counter <> l_temp_count) ) THEN
7453 l_forward_buy_quantity := round(rec.overall_fwd_buy_qty * l_fact_percent * 0.01);
7454 ELSIF ( (rec.level_one_fact_type <> 'TIME') AND (l_temp_counter = l_temp_count) ) THEN
7455 -- So, calculate the last record's fact value such that the total sum of fact values = Total Fcast Qty.
7456 SELECT NVL(sum(forward_buy_quantity),0)
7457 INTO l_fwdbuy_sum_minus_last_rec
7458 FROM ozf_act_metric_facts_all
7459 WHERE arc_act_metric_used_by = 'FCST'
7460 AND act_metric_used_by_id = p_used_by_id
7461 AND previous_fact_id IS NULL
7462 AND root_fact_id IS NULL
7463 AND activity_metric_fact_id <> rec.activity_metric_fact_id
7464 and nvl(node_id,1) <> 3 ;
7465
7466 l_forward_buy_quantity := round(rec.overall_fwd_buy_qty - l_fwdbuy_sum_minus_last_rec);
7467 END IF;
7468
7469 UPDATE ozf_act_metric_facts_all
7470 SET fact_value = l_fact_value,
7471 fact_percent = round(l_fact_percent,4),
7472 forward_buy_quantity = l_forward_buy_quantity
7473 WHERE activity_metric_fact_id = rec.activity_metric_fact_id;
7474
7475
7476 END LOOP;
7477
7478 -- fcst_remqty(p_used_by_id);
7479
7480
7481 ELSIF(l_level_num = 2) THEN
7482
7483 -- The exact count is sent for any SPREAD TYPE to update the last record appropriately in p_Calc_Val
7484 -- and avoid the RemToForecast rounding problem
7485
7486 FOR rec IN C2 LOOP
7487
7488 l_counter := l_counter + 1;
7489
7490 IF (l_temp_previous_fact_id <> rec.previous_fact_id) THEN
7491 -- counter set to 1 so that we can loop thru subset recs properly and update values
7492 l_counter := 1;
7493
7494
7495 SELECT count(*) INTO l_temp_count
7496 FROM ozf_act_metric_facts_all
7497 WHERE arc_act_metric_used_by = 'FCST'
7498 AND act_metric_used_by_id = p_used_by_id
7499 AND previous_fact_id = rec.previous_fact_id
7500 AND root_fact_id IS NULL
7501 and nvl(node_id,1) <> 3;
7502
7503
7504
7505 -- Calculating fact values and the x, y counters for each subset once for EVENLY
7506 IF(p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7507 l_rounded_val := round(rec.level_one_fact_val / l_temp_count);
7508 IF( (l_temp_count * l_rounded_val) > rec.level_one_fact_val ) THEN
7509 l_x_counter := (l_rounded_val * l_temp_count) - rec.level_one_fact_val;
7510 l_x_value := l_rounded_val - 1;
7511 l_y_counter := l_temp_count - l_x_counter;
7512 l_y_value := l_rounded_val;
7513 ELSIF( (l_temp_count * l_rounded_val) < rec.level_one_fact_val ) THEN
7514 l_x_counter := rec.level_one_fact_val - (l_rounded_val * l_temp_count);
7515 l_x_value := l_rounded_val + 1;
7516 l_y_counter := l_temp_count - l_x_counter;
7517 l_y_value := l_rounded_val;
7518 ELSE
7519 l_x_counter := 0;
7520 l_y_counter := l_temp_count;
7521 l_y_value := l_rounded_val;
7522 END IF;
7523 END IF;
7524
7525 -- set previous fact id so that we dont enter this one for just the first rec in each subset
7526 l_temp_previous_fact_id := rec.previous_fact_id;
7527
7528 END IF;
7529
7530 IF(p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7531 IF( l_x_counter = 0 ) THEN
7532 l_fact_value := l_y_value;
7533 ELSIF( (l_x_counter <> 0) AND (l_counter <= l_x_counter) ) THEN
7534 l_fact_value := l_x_value;
7535 ELSIF( (l_x_counter <> 0) AND (l_counter > l_x_counter) ) THEN
7536 l_fact_value := l_y_value;
7537 END IF;
7538 ELSIF(p_spread_type = 'BASELINE_RATIO') THEN
7539 IF (l_counter <> l_temp_count) THEN
7540 p_Calc_Val(rec.level_one_bq,
7541 rec.level_one_fact_val,
7542 p_spread_type,
7543 rec.level_two_bq,
7544 rec.level_two_fact_id,
7545 l_temp_count,
7546 l_temp_fact_value);
7547
7548 l_fact_value := round(l_temp_fact_value);
7549 ELSIF (l_counter = l_temp_count) THEN
7550 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
7551 SELECT NVL(sum(fact_value),0)
7552 INTO l_fval_sum_minus_last_rec
7553 FROM ozf_act_metric_facts_all
7554 WHERE arc_act_metric_used_by = 'FCST'
7555 AND act_metric_used_by_id = p_used_by_id
7556 AND previous_fact_id = rec.previous_fact_id
7557 AND root_fact_id IS NULL
7558 AND activity_metric_fact_id <> rec.level_two_fact_id
7559 and nvl(node_id,1) <> 3 ;
7560
7561 l_fact_value := round(rec.level_one_fact_val - l_fval_sum_minus_last_rec);
7562 END IF;
7563 END IF;
7564
7565 IF ( rec.level_one_fact_val = 0 ) THEN
7566 l_fact_percent := 0.0000;
7567 ELSIF ( rec.level_one_fact_val <> 0 ) THEN
7568 l_fact_percent := l_fact_value * 100 / rec.level_one_fact_val;
7569 END IF;
7570
7571 -- Changed on 04/09/02
7572 IF( (rec.level_two_fact_type = 'TIME') AND (l_counter <> l_temp_count) ) THEN
7573 l_forward_buy_quantity := 0;
7574 ELSIF ( (rec.level_two_fact_type = 'TIME') AND (l_counter = l_temp_count) ) THEN
7575 l_forward_buy_quantity := rec.level_one_fwd_buy_qty;
7576 ELSIF ( (rec.level_two_fact_type <> 'TIME') AND (l_counter <> l_temp_count) ) THEN
7577 l_forward_buy_quantity := round(rec.level_one_fwd_buy_qty * l_fact_percent * 0.01);
7578 ELSIF ( (rec.level_two_fact_type <> 'TIME') AND (l_counter = l_temp_count) ) THEN
7579 -- So, calculate the last record's fact value such that the total sum of fact values = Total Fcast Qty.
7580 SELECT NVL(sum(forward_buy_quantity),0)
7581 INTO l_fwdbuy_sum_minus_last_rec
7582 FROM ozf_act_metric_facts_all
7583 WHERE arc_act_metric_used_by = 'FCST'
7584 AND act_metric_used_by_id = p_used_by_id
7585 AND previous_fact_id = rec.previous_fact_id
7586 AND root_fact_id IS NULL
7587 AND activity_metric_fact_id <> rec.level_two_fact_id
7588 and nvl(node_id,1) <> 3 ;
7589
7590 l_forward_buy_quantity := round(rec.level_one_fwd_buy_qty - l_fwdbuy_sum_minus_last_rec);
7591 END IF;
7592
7593 UPDATE ozf_act_metric_facts_all
7594 SET fact_value = l_fact_value,
7595 fact_percent = round(l_fact_percent,4),
7596 forward_buy_quantity = l_forward_buy_quantity
7597 WHERE activity_metric_fact_id = rec.level_two_fact_id
7598 and nvl( node_id,1) <> 3;
7599
7600
7601 END LOOP;
7602
7603
7604 ELSIF(l_level_num = 3) THEN
7605
7606 -- The exact count is sent for any SPREAD TYPE to update the last record appropriately in p_Calc_Val
7607 -- and avoid the RemToForecast rounding problem
7608
7609 FOR rec IN C3 LOOP
7610
7611 l_counter := l_counter + 1;
7612
7613 IF (l_temp_previous_fact_id <> rec.previous_fact_id) THEN
7614 -- counter set to 1 so that we can loop thru subset recs properly and update values
7615 l_counter := 1;
7616
7617
7618 SELECT count(*) INTO l_temp_count
7619 FROM ozf_act_metric_facts_all
7620 WHERE arc_act_metric_used_by = 'FCST'
7621 AND act_metric_used_by_id = p_used_by_id
7622 AND previous_fact_id = rec.previous_fact_id
7623 AND root_fact_id IS NOT NULL
7624 and nvl(node_id,1) <> 3;
7625
7626
7627
7628 -- Calculating fact values and the x, y counters for each subset once for EVENLY
7629 IF(p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7630 l_rounded_val := round(rec.level_two_fact_val / l_temp_count);
7631 IF( (l_temp_count * l_rounded_val) > rec.level_two_fact_val ) THEN
7632 l_x_counter := (l_rounded_val * l_temp_count) - rec.level_two_fact_val;
7633 l_x_value := l_rounded_val - 1;
7634 l_y_counter := l_temp_count - l_x_counter;
7635 l_y_value := l_rounded_val;
7636 ELSIF( (l_temp_count * l_rounded_val) < rec.level_two_fact_val ) THEN
7637 l_x_counter := rec.level_two_fact_val - (l_rounded_val * l_temp_count);
7638 l_x_value := l_rounded_val + 1;
7639 l_y_counter := l_temp_count - l_x_counter;
7640 l_y_value := l_rounded_val;
7641 ELSE
7642 l_x_counter := 0;
7643 l_y_counter := l_temp_count;
7644 l_y_value := l_rounded_val;
7645 END IF;
7646 END IF;
7647
7648 -- set previous fact id so that we dont enter this one for just the first rec in each subset
7649 l_temp_previous_fact_id := rec.previous_fact_id;
7650
7651 END IF;
7652
7653 IF(p_spread_type = 'ACROSS_ALL_EVENLY') THEN
7654 IF( l_x_counter = 0 ) THEN
7655 l_fact_value := l_y_value;
7656 ELSIF( (l_x_counter <> 0) AND (l_counter <= l_x_counter) ) THEN
7657 l_fact_value := l_x_value;
7658 ELSIF( (l_x_counter <> 0) AND (l_counter > l_x_counter) ) THEN
7659 l_fact_value := l_y_value;
7660 END IF;
7661 ELSIF(p_spread_type = 'BASELINE_RATIO') THEN
7662 IF (l_counter <> l_temp_count) THEN
7663 p_Calc_Val(rec.level_two_bq,
7664 rec.level_two_fact_val,
7665 p_spread_type,
7666 rec.level_three_bq,
7667 rec.level_three_fact_id,
7668 l_temp_count,
7669 l_temp_fact_value);
7670
7671 l_fact_value := round(l_temp_fact_value);
7672 ELSIF (l_counter = l_temp_count) THEN
7673 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
7674 SELECT NVL(sum(fact_value),0)
7675 INTO l_fval_sum_minus_last_rec
7676 FROM ozf_act_metric_facts_all
7677 WHERE arc_act_metric_used_by = 'FCST'
7678 AND act_metric_used_by_id = p_used_by_id
7679 AND previous_fact_id = rec.previous_fact_id
7680 AND root_fact_id IS NOT NULL
7681 AND activity_metric_fact_id <> rec.level_three_fact_id
7682 and nvl(node_id,1) <> 3;
7683
7684 l_fact_value := round(rec.level_two_fact_val - l_fval_sum_minus_last_rec);
7685 END IF;
7686 END IF;
7687
7688 IF ( rec.level_two_fact_val = 0 ) THEN
7689 l_fact_percent := 0.0000;
7690 ELSIF ( rec.level_two_fact_val <> 0 ) THEN
7691 l_fact_percent := l_fact_value * 100 / rec.level_two_fact_val;
7692 END IF;
7693
7694 -- Changed on 04/09/02
7695 IF( (rec.level_three_fact_type = 'TIME') AND (l_counter <> l_temp_count) ) THEN
7696 l_forward_buy_quantity := 0;
7697 ELSIF ( (rec.level_three_fact_type = 'TIME') AND (l_counter = l_temp_count) ) THEN
7698 l_forward_buy_quantity := rec.level_two_fwd_buy_qty;
7699 ELSIF ( (rec.level_three_fact_type <> 'TIME') AND (l_counter <> l_temp_count) ) THEN
7700 l_forward_buy_quantity := round(rec.level_two_fwd_buy_qty * l_fact_percent * 0.01);
7701 ELSIF ( (rec.level_three_fact_type <> 'TIME') AND (l_counter = l_temp_count) ) THEN
7702 -- So, calculate the last record's fact value such that the total sum of fact values = Total Fcast Qty.
7703 SELECT NVL(sum(forward_buy_quantity),0)
7704 INTO l_fwdbuy_sum_minus_last_rec
7705 FROM ozf_act_metric_facts_all
7706 WHERE arc_act_metric_used_by = 'FCST'
7707 AND act_metric_used_by_id = p_used_by_id
7708 AND previous_fact_id = rec.previous_fact_id
7709 AND root_fact_id IS NOT NULL
7710 AND activity_metric_fact_id <> rec.level_three_fact_id
7711 and nvl(node_id,1) <> 3;
7712
7713 l_forward_buy_quantity := round(rec.level_two_fwd_buy_qty - l_fwdbuy_sum_minus_last_rec);
7714 END IF;
7715
7716 UPDATE ozf_act_metric_facts_all
7717 SET fact_value = l_fact_value,
7718 fact_percent = round(l_fact_percent,4),
7719 forward_buy_quantity = l_forward_buy_quantity
7720 WHERE activity_metric_fact_id = rec.level_three_fact_id;
7721
7722 END LOOP;
7723
7724
7725 END IF;
7726
7727 --- Incremented so that calc_perc gets called for all the present levels when CalculateSpreads button clicked
7728 l_level_num := l_level_num + 1;
7729
7730 -- Exits after this check when calc_perc called on clicking the Generate button
7731 IF( p_level_num IN (1, 2, 3)) THEN
7732 EXIT;
7733 END IF;
7734
7735 EXIT WHEN l_level_num > 3;
7736
7737 END LOOP;
7738
7739 EXCEPTION
7740 WHEN OTHERS THEN
7741 x_return_status := FND_API.g_ret_sts_unexp_error;
7742
7743 FND_MESSAGE.set_name('OZF', 'OZF_OFFER_PARTY_STMT_FAILED');
7744 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
7745 FND_MSG_PUB.add;
7746
7747 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
7748 THEN
7749 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
7750 END IF;
7751
7752 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
7753 p_count => x_msg_count,
7754 p_data => x_msg_data);
7755
7756 END calc_perc;
7757
7758 PROCEDURE get_list_price(
7759 p_api_version IN NUMBER,
7760 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
7761 p_commit IN VARCHAR2 := FND_API.g_false,
7762
7763 p_obj_type IN VARCHAR2,
7764 p_obj_id IN NUMBER,
7765 p_forecast_id IN NUMBER,
7766 p_product_attribute IN VARCHAR2,
7767 p_product_attr_value IN VARCHAR2,
7768 p_fcst_uom IN VARCHAR2,
7769 p_currency_code IN VARCHAR2,
7770 p_price_list_id IN NUMBER,
7771
7772 x_list_price OUT NOCOPY NUMBER,
7773 x_return_status OUT NOCOPY VARCHAR2,
7774 x_msg_count OUT NOCOPY NUMBER,
7775 x_msg_data OUT NOCOPY VARCHAR2
7776 )
7777 IS
7778
7779
7780 p_line_tbl QP_PREQ_GRP.LINE_TBL_TYPE;
7781 p_qual_tbl QP_PREQ_GRP.QUAL_TBL_TYPE;
7782 p_line_attr_tbl QP_PREQ_GRP.LINE_ATTR_TBL_TYPE;
7783 p_LINE_DETAIL_tbl QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
7784 p_LINE_DETAIL_qual_tbl QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE;
7785 p_LINE_DETAIL_attr_tbl QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE;
7786 p_related_lines_tbl QP_PREQ_GRP.RELATED_LINES_TBL_TYPE;
7787 p_control_rec QP_PREQ_GRP.CONTROL_RECORD_TYPE;
7788 x_line_tbl QP_PREQ_GRP.LINE_TBL_TYPE;
7789 x_line_qual QP_PREQ_GRP.QUAL_TBL_TYPE;
7790 x_line_attr_tbl QP_PREQ_GRP.LINE_ATTR_TBL_TYPE;
7791 x_line_detail_tbl QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
7792 x_line_detail_qual_tbl QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE;
7793 x_line_detail_attr_tbl QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE;
7794 x_related_lines_tbl QP_PREQ_GRP.RELATED_LINES_TBL_TYPE;
7795 x_return_stat VARCHAR2(240);
7796 x_return_status_text VARCHAR2(240);
7797 qual_rec QP_PREQ_GRP.QUAL_REC_TYPE;
7798 line_attr_rec QP_PREQ_GRP.LINE_ATTR_REC_TYPE;
7799 line_rec QP_PREQ_GRP.LINE_REC_TYPE;
7800 rltd_rec QP_PREQ_GRP.RELATED_LINES_REC_TYPE;
7801
7802 l_version VARCHAR2(240);
7803 l_counter NUMBER;
7804 I BINARY_INTEGER;
7805
7806 l_status_code VARCHAR2(240);
7807 l_status_text VARCHAR2(2000);
7808
7809 CURSOR c_market_qualifiers IS
7810 SELECT qualifier_context,
7811 qualifier_attribute,
7812 qualifier_attr_value,
7813 comparison_operator_code
7814 FROM ozf_forecast_dimentions
7815 WHERE obj_type = p_obj_type
7816 AND obj_id = p_obj_id
7817 AND forecast_id = p_forecast_id
7818 AND product_attribute_context = 'ITEM'
7819 AND product_attribute = p_product_attribute
7820 AND product_attr_value = p_product_attr_value;
7821
7822 CURSOR c_wkst_qualifiers IS
7823 SELECT qualifier_context,
7824 qualifier_attribute,
7825 qualifier_attr_value,
7826 comparison_operator_code
7827 FROM ozf_worksheet_qualifiers
7828 WHERE worksheet_header_id = p_obj_id;
7829
7830 l_api_version CONSTANT NUMBER := 1.0;
7831 l_api_name CONSTANT VARCHAR2(30) := 'Get_List_Price';
7832 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7833 l_return_status VARCHAR2(1);
7834
7835
7836 BEGIN
7837
7838 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message(l_full_name || ': start get_list_price '); END IF;
7839
7840 IF FND_API.to_boolean(p_init_msg_list) THEN
7841 FND_MSG_PUB.initialize;
7842 END IF;
7843
7844 IF NOT FND_API.compatible_api_call(l_api_version,
7845 p_api_version,
7846 l_api_name,
7847 g_pkg_name)
7848 THEN
7849 RAISE FND_API.g_exc_unexpected_error;
7850 END IF;
7851
7852 x_return_status := FND_API.g_ret_sts_success;
7853
7854 -- Passing Information to the Pricing Engine
7855
7856 -- Setting up the control record variables
7857 p_control_rec.pricing_event := 'LINE';
7858 p_control_rec.calculate_flag := 'N';
7859 p_control_rec.simulation_flag := 'Y';
7860
7861 -- Request Line (Order Line) Information
7862 line_rec.request_type_code :='ONT';
7863 line_rec.line_id :=999;
7864 line_rec.line_Index := 1 ; -- Request Line Index
7865 line_rec.line_type_code := 'LINE'; -- LINE or ORDER(Summary Line)
7866 line_rec.pricing_effective_date := SYSDATE; -- Pricing as of what date ?
7867 line_rec.active_date_first := SYSDATE; -- Can be Ordered Date or Ship Date
7868 line_rec.active_date_second := SYSDATE; -- Can be Ordered Date or Ship Date
7869 line_rec.active_date_first_type := 'NO TYPE'; -- ORD/SHIP
7870 line_rec.active_date_second_type :='NO TYPE'; -- ORD/SHIP
7871 line_rec.line_quantity := 1; -- Ordered Quantity
7872 line_rec.line_uom_code := p_fcst_uom; -- Ordered UOM Code
7873 line_rec.currency_code := p_currency_code; -- Currency Code
7874 line_rec.price_flag := 'Y'; -- Price Flag can have 'Y' ,
7875 -- 'N'(No pricing) , 'P'(Phase)
7876 p_line_tbl(1) := line_rec;
7877
7878 -- Pricing Attributes Passed In
7879 line_attr_rec.LINE_INDEX := 1 ;
7880 line_attr_rec.PRICING_CONTEXT := 'ITEM';
7881 line_attr_rec.PRICING_ATTRIBUTE := p_product_attribute;
7882 line_attr_rec.PRICING_ATTR_VALUE_FROM := p_product_attr_value;
7883
7884 line_attr_rec.VALIDATED_FLAG :='N';
7885 p_line_attr_tbl(1):= line_attr_rec;
7886
7887 -- Market Qualifiers
7888 l_counter := 1;
7889
7890 qual_rec.LINE_INDEX := 1;
7891 qual_rec.QUALIFIER_CONTEXT :='MODLIST';
7892 qual_rec.QUALIFIER_ATTRIBUTE :='QUALIFIER_ATTRIBUTE4';
7893 qual_rec.QUALIFIER_ATTR_VALUE_FROM := TO_CHAR(p_price_list_id);
7894 qual_rec.COMPARISON_OPERATOR_CODE := '=';
7895 qual_rec.VALIDATED_FLAG :='Y';
7896 p_qual_tbl(l_counter):= qual_rec;
7897
7898 IF p_obj_type <> 'WKST'
7899 THEN
7900 --
7901 FOR i IN c_market_qualifiers
7902 LOOP
7903 l_counter := l_counter+1 ;
7904
7905 qual_rec.LINE_INDEX := 1;
7906 qual_rec.QUALIFIER_CONTEXT := i.QUALIFIER_CONTEXT;
7907 qual_rec.QUALIFIER_ATTRIBUTE := i.QUALIFIER_ATTRIBUTE;
7908 qual_rec.QUALIFIER_ATTR_VALUE_FROM := i.QUALIFIER_ATTR_VALUE;
7909 qual_rec.COMPARISON_OPERATOR_CODE := i.COMPARISON_OPERATOR_CODE;
7910 qual_rec.VALIDATED_FLAG :='Y';
7911
7912 p_qual_tbl(l_counter):= qual_rec;
7913 --
7914 END LOOP;
7915 ELSE
7916 null;
7917
7918 FOR i IN c_wkst_qualifiers
7919 LOOP
7920 l_counter := l_counter+1 ;
7921
7922 qual_rec.LINE_INDEX := 1;
7923 qual_rec.QUALIFIER_CONTEXT := i.QUALIFIER_CONTEXT;
7924 qual_rec.QUALIFIER_ATTRIBUTE := i.QUALIFIER_ATTRIBUTE;
7925 qual_rec.QUALIFIER_ATTR_VALUE_FROM := i.QUALIFIER_ATTR_VALUE;
7926 qual_rec.COMPARISON_OPERATOR_CODE := i.COMPARISON_OPERATOR_CODE;
7927 qual_rec.VALIDATED_FLAG :='Y';
7928
7929 p_qual_tbl(l_counter):= qual_rec;
7930 --
7931 END LOOP;
7932
7933 END IF;
7934
7935 -- Actual Call to the Pricing Engine
7936 QP_PREQ_GRP.PRICE_REQUEST
7937 (p_line_tbl,
7938 p_qual_tbl,
7939 p_line_attr_tbl,
7940 p_line_detail_tbl,
7941 p_line_detail_qual_tbl,
7942 p_line_detail_attr_tbl,
7943 p_related_lines_tbl,
7944 p_control_rec,
7945 x_line_tbl,
7946 x_line_qual,
7947 x_line_attr_tbl,
7948 x_line_detail_tbl,
7949 x_line_detail_qual_tbl,
7950 x_line_detail_attr_tbl,
7951 x_related_lines_tbl,
7952 x_return_stat,
7953 x_return_status_text);
7954
7955 IF x_return_stat = 'E'
7956 THEN
7957 x_return_status := FND_API.G_RET_STS_ERROR;
7958 FND_MESSAGE.set_name('OZF', 'OZF_FCST_GET_LISTPRICE_FAILURE');
7959 FND_MESSAGE.set_token('ERR_MSG',x_return_status_text);
7960 FND_MSG_PUB.add;
7961 RAISE FND_API.G_EXC_ERROR;
7962 ELSE
7963
7964 I := x_line_tbl.FIRST;
7965 IF I IS NOT NULL
7966 THEN
7967 x_list_price := x_line_tbl(I).line_unit_price;
7968 l_status_code := x_line_tbl(I).status_code ;
7969 l_status_text := x_line_tbl(I).status_text;
7970 END IF;
7971
7972 IF l_status_code <> 'UPDATED'
7973 THEN
7974 x_return_status := FND_API.G_RET_STS_ERROR;
7975 FND_MESSAGE.set_name('OZF', 'OZF_FCST_GET_LISTPRICE_FAILURE');
7976 FND_MESSAGE.set_token('ERR_MSG',l_status_text);
7977 FND_MSG_PUB.add;
7978 RAISE FND_API.G_EXC_ERROR;
7979
7980 END IF;
7981
7982 END IF;
7983
7984
7985 EXCEPTION
7986
7987 WHEN FND_API.G_EXC_ERROR THEN
7988 IF (OZF_DEBUG_HIGH_ON) THEN
7989
7990 OZF_Utility_PVT.debug_message('Validate_get_list_price_of_goods: ' || substr(sqlerrm, 1, 100));
7991 END IF;
7992 x_return_status := FND_API.G_RET_STS_ERROR;
7993
7994 FND_MSG_PUB.Count_And_Get (
7995 p_encoded => FND_API.g_false,
7996 p_count => x_msg_count,
7997 p_data => x_msg_data
7998 );
7999
8000 WHEN OTHERS THEN
8001 x_return_status := FND_API.g_ret_sts_unexp_error;
8002
8003 FND_MESSAGE.set_name('OZF', 'OZF_FCST_GET_LISTPRICE_FAILURE');
8004 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
8005 FND_MSG_PUB.add;
8006
8007 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
8008 THEN
8009 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8010 END IF;
8011
8012 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
8013 p_count => x_msg_count,
8014 p_data => x_msg_data);
8015
8016
8017 END get_list_price;
8018
8019
8020 --R12 : called from Wkst Forecast - Baseline
8021 FUNCTION get_product_list_price(
8022 p_activity_metric_fact_id IN NUMBER)
8023 RETURN NUMBER IS
8024
8025 l_api_version CONSTANT NUMBER := 1.0;
8026 l_api_name CONSTANT VARCHAR2(30) := 'get_product_list_price';
8027 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8028 l_init_msg_list VARCHAR2(30) := FND_API.g_false;
8029 l_commit VARCHAR2(30) := FND_API.g_false;
8030 l_return_status VARCHAR2(1);
8031 l_msg_count NUMBER;
8032 l_msg_data VARCHAR2(2000);
8033
8034 l_list_price NUMBER;
8035
8036 l_obj_type VARCHAR2(30);
8037 l_obj_id NUMBER;
8038 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
8039 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
8040 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
8041 l_fcst_uom OZF_ACT_FORECASTS_ALL.forecast_uom_code%TYPE;
8042 l_currency_code ozf_worksheet_headers_b.currency_code%TYPE;
8043 l_price_list_id NUMBER;
8044 l_forecast_id NUMBER;
8045
8046
8047 BEGIN
8048
8049 SELECT
8050 fcst.ARC_ACT_FCAST_USED_BY,
8051 wkst.WORKSHEET_HEADER_ID,
8052 dim.product_attribute_context,
8053 dim.product_attribute,
8054 dim.product_attr_value,
8055 fcst.FORECAST_UOM_CODE,
8056 wkst.currency_code,
8057 wkst.price_list_id,
8058 fcst.forecast_id
8059 INTO
8060 l_obj_type ,
8061 l_obj_id ,
8062 l_product_attribute_context,
8063 l_product_attribute ,
8064 l_product_attr_value ,
8065 l_fcst_uom ,
8066 l_currency_code ,
8067 l_price_list_id ,
8068 l_forecast_id
8069 FROM
8070 ozf_act_metric_facts_all fact,
8071 OZF_ACT_FORECASTS_ALL fcst,
8072 ozf_forecast_dimentions dim,
8073 ozf_worksheet_headers_b wkst
8074 WHERE
8075 fact.activity_metric_fact_id = p_activity_metric_fact_id
8076 AND fcst.FORECAST_ID = fact.act_metric_used_by_id
8077 AND fact.arc_act_metric_used_by = 'FCST'
8078 AND dim.forecast_dimention_id = fact.fact_reference
8079 AND dim.forecast_id = fact.act_metric_used_by_id
8080 AND wkst.WORKSHEET_HEADER_ID = fcst.ACT_FCAST_USED_BY_ID
8081 AND fcst.ARC_ACT_FCAST_USED_BY = 'WKST';
8082
8083 get_list_price(
8084 l_api_version ,
8085 l_init_msg_list ,
8086 l_commit ,
8087 l_obj_type ,
8088 l_obj_id ,
8089 l_forecast_id ,
8090 l_product_attribute ,
8091 l_product_attr_value ,
8092 l_fcst_uom ,
8093 l_currency_code ,
8094 l_price_list_id ,
8095 l_list_price ,
8096 l_return_status ,
8097 l_msg_count ,
8098 l_msg_data );
8099
8100 RETURN NVL(l_list_price,0);
8101
8102 EXCEPTION
8103 WHEN OTHERS THEN
8104 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
8105 THEN
8106 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8107 END IF;
8108 --OZF_Utility_PVT.debug_message(' get_product_list_price : OTHER ERROR ' || sqlerrm );
8109 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
8110 p_count => l_msg_count,
8111 p_data => l_msg_data);
8112 Return 33; -- i.e. list price is ZERO
8113 END get_product_list_price; --end of function
8114
8115
8116 PROCEDURE calc_cost_of_goods(
8117 p_api_version IN NUMBER,
8118 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
8119 p_commit IN VARCHAR2 := FND_API.g_false,
8120
8121 p_obj_type IN VARCHAR2,
8122 p_obj_id IN NUMBER,
8123 p_product_attribute IN VARCHAR2,
8124 p_product_attr_value IN VARCHAR2,
8125 p_fcst_uom IN VARCHAR2,
8126
8127 x_standard_cost OUT NOCOPY NUMBER,
8128 x_return_status OUT NOCOPY VARCHAR2,
8129 x_msg_count OUT NOCOPY NUMBER,
8130 x_msg_data OUT NOCOPY VARCHAR2
8131 )
8132 IS
8133
8134 l_temp_item_cost NUMBER := 0;
8135 l_standard_cost NUMBER := 0;
8136 l_flag_error boolean := false;
8137 /*
8138 CURSOR c_products IS
8139 SELECT product_id
8140 FROM ozf_forecast_products
8141 WHERE obj_type = p_obj_type
8142 AND obj_id = p_obj_id
8143 AND product_attribute_context = 'ITEM'
8144 AND product_attribute = p_product_attribute
8145 AND product_attr_value = p_product_attr_value ;
8146 */
8147 CURSOR c_products (p_org_id NUMBER) IS
8148 SELECT prod.product_id,
8149 inv_prod.primary_uom_code
8150 FROM ozf_forecast_products prod,
8151 mtl_system_items_b inv_prod
8152 WHERE prod.obj_type = p_obj_type
8153 AND prod.obj_id = p_obj_id
8154 AND product_attribute_context = 'ITEM'
8155 AND product_attribute = p_product_attribute
8156 AND product_attr_value = p_product_attr_value
8157 AND prod.product_id = inv_prod.inventory_item_id
8158 AND inv_prod.organization_id = p_org_id;
8159
8160 l_api_version CONSTANT NUMBER := 1.0;
8161 l_api_name CONSTANT VARCHAR2(30) := 'Calc_Cost_Of_Goods';
8162 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8163 l_return_status VARCHAR2(1);
8164
8165 l_org_id NUMBER ;
8166 l_counter NUMBER := 0;
8167 l_conv_item_cost NUMBER;
8168
8169 BEGIN
8170
8171 SAVEPOINT calc_cost_of_goods;
8172
8173 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message(l_full_name || ': start refresh parties'); END IF;
8174
8175 IF FND_API.to_boolean(p_init_msg_list) THEN
8176 FND_MSG_PUB.initialize;
8177 END IF;
8178
8179 IF NOT FND_API.compatible_api_call(l_api_version,
8180 p_api_version,
8181 l_api_name,
8182 g_pkg_name)
8183 THEN
8184 RAISE FND_API.g_exc_unexpected_error;
8185 END IF;
8186
8187 x_return_status := FND_API.g_ret_sts_success;
8188
8189 l_org_id := FND_PROFILE.VALUE('QP_ORGANIZATION_ID') ;
8190
8191 FOR i IN c_products(l_org_id)
8192 LOOP
8193
8194 l_temp_item_cost := CST_COST_API.get_item_cost( 1
8195 ,i.product_id
8196 ,l_org_id
8197 ,NULL
8198 ,NULL);
8199
8200 IF p_fcst_uom <> i.primary_uom_code
8201 THEN
8202
8203 IF l_temp_item_cost IS NOT NULL
8204 THEN
8205 l_conv_item_cost := inv_convert.inv_um_convert( i.product_id,
8206 null,
8207 1,
8208 i.primary_uom_code,
8209 p_fcst_uom,
8210 null, null);
8211 END IF;
8212 IF l_conv_item_cost = -99999
8213 THEN
8214 l_temp_item_cost := NULL;
8215 ELSE
8216 l_temp_item_cost := l_conv_item_cost;
8217 END IF;
8218 END IF;
8219
8220 IF (l_temp_item_cost is null)
8221 THEN
8222
8223 l_flag_error := true;
8224 l_standard_cost := null;
8225
8226 ELSIF (l_temp_item_cost is not null)
8227 THEN
8228 l_counter := l_counter + 1;
8229 l_standard_cost := l_standard_cost + l_temp_item_cost;
8230
8231 END IF;
8232
8233 END LOOP;
8234
8235 -- Cost of Good for a Item Category is always the average cost
8236 -- of all the items in the Category.
8237
8238 IF l_standard_cost IS NOT NULL
8239 THEN
8240 x_standard_cost := round(l_standard_cost/l_counter,2);
8241 ELSE
8242 x_standard_cost := NULL;
8243 END IF;
8244
8245 EXCEPTION
8246
8247 WHEN FND_API.G_EXC_ERROR THEN
8248 -- IF (OZF_DEBUG_HIGH_ON) THEN OZF_Utility_PVT.debug_message('Validate_Standard_Cost_Of_Goods: ' || substr(sqlerrm, 1, 100)); END IF;
8249 ROLLBACK TO calc_cost_of_goods;
8250 x_return_status := FND_API.G_RET_STS_ERROR;
8251 FND_MSG_PUB.Count_And_Get (
8252 p_encoded => FND_API.g_false,
8253 p_count => x_msg_count,
8254 p_data => x_msg_data
8255 );
8256
8257 WHEN OTHERS THEN
8258 x_return_status := FND_API.g_ret_sts_unexp_error;
8259
8260 FND_MESSAGE.set_name('OZF', 'OZF_FCST_CALC_COG_FAILED');
8261 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
8262 FND_MSG_PUB.add;
8263
8264 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
8265 THEN
8266 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8267 END IF;
8268
8269 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
8270 p_count => x_msg_count,
8271 p_data => x_msg_data);
8272
8273
8274 END calc_cost_of_goods;
8275
8276 PROCEDURE get_other_costs (p_obj_type IN VARCHAR2,
8277 p_obj_id IN VARCHAR2,
8278 p_product_attribute IN VARCHAR2,
8279 p_product_attr_value IN VARCHAR2,
8280 p_uom IN VARCHAR2,
8281 p_other_costs OUT NOCOPY VARCHAR2)
8282 IS
8283 l_item_key varchar2(30);
8284 l_parameter_list wf_parameter_list_t;
8285
8286 BEGIN
8287
8288 l_item_key := p_obj_id ||'_'|| TO_CHAR(SYSDATE,'DDMMRRRRHH24MISS');
8289 l_parameter_list := WF_PARAMETER_LIST_T();
8290
8291 wf_event.AddParameterToList(p_name => 'P_OBJ_TYPE',
8292 p_value => p_obj_type,
8293 p_parameterlist => l_parameter_list);
8294 wf_event.AddParameterToList(p_name => 'P_OBJ_ID',
8295 p_value => p_obj_id,
8296 p_parameterlist => l_parameter_list);
8297 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTRIBUTE_CONTEXT',
8298 p_value => 'ITEM',
8299 p_parameterlist => l_parameter_list);
8300 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTRIBUTE',
8301 p_value => p_product_attribute,
8302 p_parameterlist => l_parameter_list);
8303 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTR_VALUE',
8304 p_value => p_product_attr_value,
8305 p_parameterlist => l_parameter_list);
8306 wf_event.AddParameterToList(p_name => 'P_UOM',
8307 p_value => p_uom,
8308 p_parameterlist => l_parameter_list);
8309
8310
8311 wf_event.raise3( p_event_name => 'oracle.apps.ozf.planning.OtherCosts',
8312 p_event_key => l_item_key,
8313 p_parameter_list => l_parameter_list);
8314
8315 p_other_costs := wf_event.GetValueForParameter(p_name => 'P_OTHER_COSTS',
8316 p_parameterlist => l_parameter_list);
8317
8318 END;
8319
8320
8321 --R12 : called from Wlst Forecast - Baseline
8322 FUNCTION get_product_cost(
8323 p_activity_metric_fact_id IN NUMBER)
8324 RETURN NUMBER IS
8325
8326 l_api_version CONSTANT NUMBER := 1.0;
8327 l_api_name CONSTANT VARCHAR2(30) := 'get_product_cost';
8328 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8329 l_init_msg_list VARCHAR2(30) := FND_API.g_false;
8330 l_commit VARCHAR2(30) := FND_API.g_false;
8331 l_return_status VARCHAR2(1);
8332 l_msg_count NUMBER;
8333 l_msg_data VARCHAR2(2000);
8334
8335 l_standard_cost NUMBER;
8336 l_other_costs NUMBER;
8337
8338 l_obj_type VARCHAR2(30);
8339 l_obj_id NUMBER;
8340 l_product_attribute_context ozf_forecast_dimentions.product_attribute_context%TYPE;
8341 l_product_attribute ozf_forecast_dimentions.product_attribute%TYPE;
8342 l_product_attr_value ozf_forecast_dimentions.product_attr_value%TYPE;
8343 l_fcst_uom OZF_ACT_FORECASTS_ALL.forecast_uom_code%TYPE;
8344 l_currency_code ozf_worksheet_headers_b.currency_code%TYPE;
8345 l_price_list_id NUMBER;
8346
8347
8348 BEGIN
8349
8350 SELECT
8351 fcst.ARC_ACT_FCAST_USED_BY,
8352 wkst.WORKSHEET_HEADER_ID,
8353 dim.product_attribute_context,
8354 dim.product_attribute,
8355 dim.product_attr_value,
8356 fcst.FORECAST_UOM_CODE,
8357 wkst.currency_code,
8358 wkst.price_list_id
8359 INTO
8360 l_obj_type ,
8361 l_obj_id ,
8362 l_product_attribute_context,
8363 l_product_attribute ,
8364 l_product_attr_value ,
8365 l_fcst_uom ,
8366 l_currency_code ,
8367 l_price_list_id
8368 FROM
8369 ozf_act_metric_facts_all fact,
8370 OZF_ACT_FORECASTS_ALL fcst,
8371 ozf_forecast_dimentions dim,
8372 ozf_worksheet_headers_b wkst
8373 WHERE
8374 fact.activity_metric_fact_id = p_activity_metric_fact_id
8375 AND fcst.FORECAST_ID = fact.act_metric_used_by_id
8376 AND fact.arc_act_metric_used_by = 'FCST'
8377 AND dim.forecast_dimention_id = fact.fact_reference
8378 AND dim.forecast_id = fact.act_metric_used_by_id
8379 AND wkst.WORKSHEET_HEADER_ID = fcst.ACT_FCAST_USED_BY_ID
8380 AND fcst.ARC_ACT_FCAST_USED_BY = 'WKST';
8381
8382 calc_cost_of_goods(
8383 l_api_version ,
8384 l_init_msg_list ,
8385 l_commit ,
8386 l_obj_type ,
8387 l_obj_id ,
8388 l_product_attribute ,
8389 l_product_attr_value ,
8390 l_fcst_uom ,
8391 l_standard_cost ,
8392 l_return_status ,
8393 l_msg_count ,
8394 l_msg_data );
8395
8396
8397 -- Get Other Costs here
8398 get_other_costs (l_obj_type ,
8399 l_obj_id ,
8400 l_product_attribute ,
8401 l_product_attr_value ,
8402 l_fcst_uom ,
8403 l_other_costs ) ;
8404
8405
8406
8407 IF l_other_costs IS NOT NULL
8408 THEN
8409 l_standard_cost := NVL(l_standard_cost,0) + l_other_costs;
8410 END IF;
8411
8412 RETURN NVL(l_standard_cost,0); -- return total cost for Product
8413
8414 EXCEPTION
8415 WHEN OTHERS THEN
8416 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
8417 THEN
8418 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8419 END IF;
8420 --OZF_Utility_PVT.debug_message(' get_product_cost : OTHER ERROR ' || sqlerrm );
8421 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
8422 p_count => l_msg_count,
8423 p_data => l_msg_data);
8424 Return 100; -- i.e. cost is ZERO
8425 END get_product_cost; --end of function
8426
8427
8428 --R12 : gives exact or equivalent discount percent
8429 PROCEDURE get_discount_percent (
8430 p_api_version IN NUMBER,
8431 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
8432 p_commit IN VARCHAR2 := FND_API.g_false,
8433 p_obj_type IN VARCHAR2,
8434 p_obj_id IN NUMBER,
8435 p_forecast_id IN NUMBER,
8436 p_product_attribute IN VARCHAR2,
8437 p_product_attr_value IN VARCHAR2,
8438 p_currency_code IN VARCHAR2,
8439 x_tpr_percent OUT NOCOPY NUMBER,
8440 x_return_status OUT NOCOPY VARCHAR2,
8441 x_msg_count OUT NOCOPY NUMBER,
8442 x_msg_data OUT NOCOPY VARCHAR2 )
8443 IS
8444
8445 l_discount_value NUMBER := 0 ;
8446
8447 CURSOR c_fcst_info IS
8448 SELECT a.forecast_uom_code,
8449 a.price_list_id
8450 FROM ozf_act_forecasts_all a
8451 WHERE a.forecast_id = p_forecast_id ;
8452
8453 CURSOR c_type_of_offer IS
8454 SELECT offer_type
8455 FROM ozf_offers
8456 WHERE qp_list_header_id = p_obj_id;
8457
8458 CURSOR c_offer_type IS
8459 SELECT min(b.offer_type) offer_type,
8460 sum(a.line_lumpsum_qty) total_qty
8461 FROM ams_act_products a ,
8462 ozf_offers b
8463 WHERE a.arc_act_product_used_by = p_obj_type
8464 AND a.act_product_used_by_id = p_obj_id
8465 AND b.qp_list_header_id = a.act_product_used_by_id ;
8466
8467
8468 CURSOR c_lumpsum_discount(p_lumpsum_qty NUMBER) IS
8469 SELECT DECODE(b.distribution_type,
8470 'AMT', 100 * a.line_lumpsum_qty/b.lumpsum_amount,
8471 '%' , a.line_lumpsum_qty,
8472 'QTY', 100 * a.line_lumpsum_qty/p_lumpsum_qty ) lumpsum_disc
8473 from ams_act_products a,
8474 ozf_offers b
8475 where a.arc_act_product_used_by = p_obj_type
8476 and a.act_product_used_by_id = p_obj_id
8477 and a.act_product_used_by_id = b.qp_list_header_id
8478 and a.excluded_flag = 'N'
8479 and NVL(a.inventory_item_id,a.category_id) = p_product_attr_value;
8480
8481 CURSOR c_offer_discounts IS
8482 SELECT qpl.operand,
8483 qpl.arithmetic_operator
8484 FROM qp_pricing_attributes pa,
8485 qp_list_lines qpl,
8486 ozf_offers a
8487 WHERE a.qp_list_header_id = p_obj_id
8488 AND qpl.list_header_id = a.qp_list_header_id
8489 AND qpl.list_line_id = pa.list_line_id
8490 AND pa.excluder_flag = 'N'
8491 AND pa.product_attribute_context = 'ITEM'
8492 AND pa.product_attribute = p_product_attribute
8493 AND pa.product_attr_value = p_product_attr_value ;
8494
8495 --R12--Volume Offer Discount is MAX discount
8496 CURSOR c_volume_offer_discounts IS
8497 SELECT
8498 ODL.DISCOUNT_TYPE arithmetic_operator,
8499 MAX(DIS.DISCOUNT) operand
8500 FROM
8501 OZF_OFFERS OFFR,
8502 OZF_OFFER_DISCOUNT_LINES ODL,
8503 OZF_OFFER_DISCOUNT_PRODUCTS ODP,
8504 OZF_OFFER_DISCOUNT_LINES DIS
8505 WHERE
8506 OFFR.QP_LIST_HEADER_ID = p_obj_id
8507 AND OFFR.OFFER_ID = ODL.OFFER_ID
8508 AND ODL.TIER_TYPE = 'PBH'
8509 AND ODP.OFFER_ID = OFFR.OFFER_ID
8510 AND ODP.OFFER_DISCOUNT_LINE_ID = ODL.OFFER_DISCOUNT_LINE_ID
8511 AND ODP.APPLY_DISCOUNT_FLAG = 'Y'
8512 AND DIS.parent_discount_line_id = ODL.OFFER_DISCOUNT_LINE_ID
8513 AND DIS.TIER_TYPE = 'DIS'
8514 AND DIS.OFFER_ID = ODL.OFFER_ID
8515 AND ODP.PRODUCT_CONTEXT = 'ITEM'
8516 AND ODP.PRODUCT_ATTRIBUTE = p_product_attribute
8517 AND ODP.PRODUCT_ATTR_VALUE = p_product_attr_value
8518 GROUP BY
8519 ODL.DISCOUNT_TYPE;
8520
8521
8522 CURSOR c_wkst_discounts IS
8523 SELECT prd.operand,
8524 prd.arithmetic_operator
8525 from ozf_worksheet_lines prd,
8526 ozf_worksheet_headers_b hdr
8527 where 'WKST' = p_obj_type
8528 and hdr.worksheet_header_id = p_obj_id
8529 and hdr.worksheet_header_id = prd.worksheet_header_id
8530 AND prd.exclude_flag = 'N'
8531 AND prd.product_attribute_context = 'ITEM'
8532 AND prd.product_attribute = p_product_attribute
8533 AND prd.product_attr_value = p_product_attr_value;
8534
8535 l_currency VARCHAR2(240);
8536 l_fcst_uom VARCHAR2(30);
8537 l_price_list_id NUMBER;
8538 l_list_price NUMBER;
8539 l_standard_cost NUMBER;
8540 l_offer_type2 VARCHAR2(30);
8541 l_offer_type VARCHAR2(30);
8542 l_lumpsum_qty NUMBER;
8543 l_api_version CONSTANT NUMBER := 1.0;
8544 l_api_name CONSTANT VARCHAR2(30) := 'get_discount_percent';
8545 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8546 l_return_status VARCHAR2(1);
8547
8548
8549 BEGIN
8550
8551 SAVEPOINT get_discount_percent;
8552
8553 IF FND_API.to_boolean(p_init_msg_list) THEN
8554 FND_MSG_PUB.initialize;
8555 END IF;
8556
8557 IF NOT FND_API.compatible_api_call(l_api_version,
8558 p_api_version,
8559 l_api_name,
8560 g_pkg_name)
8561 THEN
8562 RAISE FND_API.g_exc_unexpected_error;
8563 END IF;
8564
8565 x_return_status := FND_API.g_ret_sts_success;
8566
8567
8568 OPEN c_fcst_info;
8569 FETCH c_fcst_info INTO l_fcst_uom,l_price_list_id;
8570 CLOSE c_fcst_info;
8571
8572
8573 get_list_price(
8574 p_api_version ,
8575 p_init_msg_list ,
8576 p_commit ,
8577
8578 p_obj_type ,
8579 p_obj_id ,
8580 p_forecast_id ,
8581 p_product_attribute ,
8582 p_product_attr_value ,
8583 l_fcst_uom ,
8584 p_currency_code ,
8585 l_price_list_id ,
8586
8587 l_list_price ,
8588 x_return_status ,
8589 x_msg_count ,
8590 x_msg_data );
8591
8592 --- l_list_price := 100;
8593
8594 /*
8595 IF x_return_status = FND_API.g_ret_sts_error THEN
8596 RAISE FND_API.g_exc_error;
8597 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
8598 RAISE FND_API.g_exc_unexpected_error;
8599 END IF;
8600 */
8601 IF p_obj_type = 'OFFR'
8602 THEN
8603
8604 OPEN c_offer_type;
8605 FETCH c_offer_type INTO l_offer_type2, l_lumpsum_qty;
8606 CLOSE c_offer_type;
8607
8608 --R12 ---------
8609 OPEN c_type_of_offer;
8610 FETCH c_type_of_offer INTO l_offer_type;
8611 CLOSE c_type_of_offer;
8612
8613 -- Support Forecast: LUMPSUM, ACCRUAL,DEAL,OFF_INVOICE, ORDER,TERMS, OID,VOLUME_OFFER
8614 -- Do Not Support Forecast: SCAN_DATA, NET_ACCRUAL
8615
8616
8617 IF l_offer_type = 'LUMPSUM' --- LUMPSUM
8618 THEN
8619
8620 OPEN c_lumpsum_discount(l_lumpsum_qty);
8621 FETCH c_lumpsum_discount INTO l_discount_value;
8622 CLOSE c_lumpsum_discount;
8623
8624 ELSIF l_offer_type = 'VOLUME_OFFER' --- VOLUME_OFFER
8625 THEN
8626
8627 FOR i IN c_volume_offer_discounts
8628 LOOP
8629
8630 IF (i.arithmetic_operator = '%')
8631 THEN
8632 l_discount_value := NVL(i.operand,0);
8633 ELSIF (i.arithmetic_operator = 'AMT') and NVL(l_list_price,0) <> 0
8634 THEN
8635 l_discount_value := 100 * NVL(i.operand,0)/ l_list_price ;
8636 ELSE
8637 l_discount_value := 0;
8638 END IF;
8639
8640 END LOOP;
8641
8642
8643 ELSE -- ACCRUAL,DEAL,OFF_INVOICE,OID,ORDER,TERMS
8644 FOR i IN c_offer_discounts
8645 LOOP
8646
8647 IF (i.arithmetic_operator = '%')
8648 THEN
8649 l_discount_value := NVL(i.operand,0);
8650 ELSIF (i.arithmetic_operator = 'NEWPRICE') and NVL(l_list_price,0) <> 0
8651 THEN
8652 l_discount_value := 100 * (1 - NVL(i.operand,0)/ l_list_price) ;
8653 ELSIF (i.arithmetic_operator = 'AMT') and NVL(l_list_price,0) <> 0
8654 THEN
8655 l_discount_value := 100 * NVL(i.operand,0)/ l_list_price ;
8656 ELSIF (i.arithmetic_operator = 'LUMPSUM')
8657 THEN
8658 l_discount_value := 0; -- Functionally, is there a better approach
8659 ELSE
8660 l_discount_value := 0;
8661 END IF;
8662
8663 END LOOP;
8664
8665 END IF;
8666
8667
8668 ELSIF p_obj_type = 'WKST'
8669 THEN
8670 ---- Worksheet Discounts (same for all offer types)
8671
8672 FOR i IN c_wkst_discounts
8673 LOOP
8674
8675 IF (i.arithmetic_operator = '%')
8676 THEN
8677 l_discount_value := NVL(i.operand,0);
8678 ELSIF (i.arithmetic_operator = 'NEWPRICE') and NVL(l_list_price,0) <> 0
8679 THEN
8680 l_discount_value := 100 * (1 - NVL(i.operand,0)/ l_list_price) ;
8681 ELSIF (i.arithmetic_operator = 'AMT') and NVL(l_list_price,0) <> 0
8682 THEN
8683 l_discount_value := 100 * NVL(i.operand,0)/ l_list_price ;
8684 ELSIF (i.arithmetic_operator = 'LUMPSUM')
8685 THEN
8686 l_discount_value := 0; -- Functionally, is there a better approach
8687 ELSE
8688 l_discount_value := 0;
8689 END IF;
8690
8691 END LOOP;
8692
8693 ELSE
8694 l_discount_value := 0;
8695 END IF;
8696
8697 x_tpr_percent := l_discount_value;
8698
8699 EXCEPTION
8700
8701 WHEN FND_API.g_exc_error THEN
8702
8703 ROLLBACK TO get_discount_percent;
8704 x_return_status := FND_API.g_ret_sts_error;
8705 FND_MSG_PUB.Count_And_Get (
8706 p_encoded => FND_API.g_false,
8707 p_count => x_msg_count,
8708 p_data => x_msg_data
8709 );
8710
8711 WHEN FND_API.g_exc_unexpected_error THEN
8712
8713 ROLLBACK TO get_discount_percent;
8714 x_return_status := FND_API.g_ret_sts_unexp_error;
8715 FND_MSG_PUB.Count_And_Get (
8716 p_encoded => FND_API.g_false,
8717 p_count => x_msg_count,
8718 p_data => x_msg_data
8719 );
8720
8721 WHEN OTHERS THEN
8722 ROLLBACK TO get_discount_percent;
8723 x_return_status := FND_API.g_ret_sts_unexp_error;
8724
8725 FND_MESSAGE.set_name('OZF', 'OZF_FCST_GET_DISC_FAILED');
8726 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
8727 FND_MSG_PUB.add;
8728
8729 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
8730 THEN
8731 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8732 END IF;
8733
8734 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
8735 p_count => x_msg_count,
8736 p_data => x_msg_data);
8737
8738
8739 END get_discount_percent ;
8740
8741
8742 PROCEDURE get_discount_info(
8743 p_api_version IN NUMBER,
8744 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
8745 p_commit IN VARCHAR2 := FND_API.g_false,
8746
8747 p_obj_type IN VARCHAR2,
8748 p_obj_id IN NUMBER,
8749 p_forecast_id IN NUMBER,
8750 p_currency_code IN VARCHAR2,
8751 p_product_attribute IN VARCHAR2,
8752 p_product_attr_value IN VARCHAR2,
8753 p_node_id IN NUMBER,
8754
8755 x_list_price OUT NOCOPY NUMBER,
8756 x_discount_type OUT NOCOPY VARCHAR2,
8757 x_discount_value OUT NOCOPY NUMBER,
8758 x_standard_cost OUT NOCOPY NUMBER,
8759
8760 x_return_status OUT NOCOPY VARCHAR2,
8761 x_msg_count OUT NOCOPY NUMBER,
8762 x_msg_data OUT NOCOPY VARCHAR2 )
8763 IS
8764
8765 l_discount_type VARCHAR2(60);
8766 l_discount_value NUMBER := 0 ;
8767
8768 CURSOR c_fcst_info IS
8769 SELECT a.forecast_uom_code,
8770 a.price_list_id
8771 FROM ozf_act_forecasts_all a
8772 WHERE a.forecast_id = p_forecast_id ;
8773
8774 CURSOR c_offer_type IS
8775 SELECT min(b.offer_type) offer_type,
8776 sum(a.line_lumpsum_qty) total_qty
8777 FROM ams_act_products a ,
8778 ozf_offers b
8779 WHERE a.arc_act_product_used_by = p_obj_type
8780 AND a.act_product_used_by_id = p_obj_id
8781 AND b.qp_list_header_id = a.act_product_used_by_id ;
8782
8783 --R12 ----
8784 CURSOR c_type_of_offer IS
8785 SELECT offer_type
8786 FROM ozf_offers
8787 WHERE qp_list_header_id = p_obj_id;
8788
8789 CURSOR c_lumpsum_discount(p_lumpsum_qty NUMBER) IS
8790 SELECT DECODE(b.distribution_type,
8791 'AMT', a.line_lumpsum_qty,
8792 '%' , (b.lumpsum_amount*a.line_lumpsum_qty)/100 ,
8793 'QTY', (a.line_lumpsum_qty * b.lumpsum_amount)/p_lumpsum_qty ) lumpsum_disc
8794 from ams_act_products a,
8795 ozf_offers b
8796 where a.arc_act_product_used_by = p_obj_type
8797 and a.act_product_used_by_id = p_obj_id
8798 and a.act_product_used_by_id = b.qp_list_header_id
8799 and a.excluded_flag = 'N'
8800 and NVL(a.inventory_item_id,a.category_id) = p_product_attr_value;
8801
8802 /*
8803 ,'VOLUME_OFFER'
8804 ,''
8805 ,OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE', a.offer_type)
8806 )
8807 */
8808
8809 CURSOR c_offer_discounts IS
8810 SELECT TRIM(
8811 DECODE(a.offer_type
8812 ,'DEAL'
8813 ,DECODE(qpl.accrual_flag
8814 ,'Y', OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','ACCRUAL')
8815 , OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','OFF_INVOICE')
8816 )
8817 ,'VOLUME_OFFER'
8818 ,DECODE(qpl.accrual_flag
8819 ,'Y', OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','ACCRUAL')
8820 , OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','OFF_INVOICE')
8821 ) ||':'
8822 , '') ||
8823 ' ' || qpl.operand || ' ' ||
8824 DECODE(qpl.arithmetic_operator,'%','%',' ')
8825 ) discount,
8826 qpl.operand,
8827 qpl.arithmetic_operator
8828 FROM qp_pricing_attributes pa,
8829 qp_list_lines qpl,
8830 ozf_offers a
8831 WHERE a.qp_list_header_id = p_obj_id
8832 AND qpl.list_header_id = a.qp_list_header_id
8833 AND qpl.list_line_id = pa.list_line_id
8834 AND pa.excluder_flag = 'N'
8835 AND pa.product_attribute_context = 'ITEM'
8836 AND pa.product_attribute = p_product_attribute
8837 AND pa.product_attr_value = p_product_attr_value ;
8838
8839
8840 CURSOR c_obj_discounts IS
8841 SELECT DECODE(a.offer_type
8842 ,'DEAL'
8843 ,DECODE(qpl.accrual_flag
8844 ,'Y', OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','ACCRUAL')
8845 , OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','OFF_INVOICE')
8846 )
8847 ,OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE', a.offer_type)
8848 ) ||
8849 ' ' ||
8850 qpl.operand ||
8851 ' ' ||
8852 DECODE(qpl.arithmetic_operator,'%','%',' ') discount,
8853 qpl.operand,
8854 qpl.arithmetic_operator
8855 FROM qp_pricing_attributes pa,
8856 qp_list_lines qpl,
8857 ozf_act_offers a
8858 WHERE a.arc_act_offer_used_by = p_obj_type
8859 AND a.act_offer_used_by_id = p_obj_id
8860 AND qpl.list_header_id = a.qp_list_header_id
8861 AND qpl.list_line_id = pa.list_line_id
8862 AND pa.excluder_flag = 'N'
8863 AND pa.product_attribute_context = 'ITEM'
8864 AND pa.product_attribute = p_product_attribute
8865 AND pa.product_attr_value = p_product_attr_value ;
8866
8867 --R12 -- Volume Offer Discounts
8868 CURSOR c_volume_offer_discounts IS
8869 SELECT TRIM(
8870 DECODE(OFFR.VOLUME_OFFER_TYPE
8871 ,'ACCRUAL', OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','ACCRUAL')
8872 , OZF_Utility_PVT.get_lookup_meaning('OZF_OFFER_TYPE','OFF_INVOICE')
8873 )
8874 || ':'
8875 || ' '
8876 || MAX(DIS.DISCOUNT)
8877 || ' '
8878 || DECODE(ODL.DISCOUNT_TYPE,'%','%',' ')
8879 ) discount,
8880 ODL.DISCOUNT_TYPE arithmetic_operator,
8881 MAX(DIS.DISCOUNT) operand
8882 FROM
8883 OZF_OFFERS OFFR,
8884 OZF_OFFER_DISCOUNT_LINES ODL,
8885 OZF_OFFER_DISCOUNT_PRODUCTS ODP,
8886 OZF_OFFER_DISCOUNT_LINES DIS
8887 WHERE
8888 OFFR.QP_LIST_HEADER_ID = p_obj_id
8889 AND OFFR.OFFER_ID = ODL.OFFER_ID
8890 AND ODL.TIER_TYPE = 'PBH'
8891 AND ODP.OFFER_ID = OFFR.OFFER_ID
8892 AND ODP.OFFER_DISCOUNT_LINE_ID = ODL.OFFER_DISCOUNT_LINE_ID
8893 AND ODP.APPLY_DISCOUNT_FLAG = 'Y'
8894 AND DIS.parent_discount_line_id = ODL.OFFER_DISCOUNT_LINE_ID
8895 AND DIS.TIER_TYPE = 'DIS'
8896 AND DIS.OFFER_ID = ODL.OFFER_ID
8897 AND ODP.PRODUCT_CONTEXT = 'ITEM'
8898 AND ODP.PRODUCT_ATTRIBUTE = p_product_attribute
8899 AND ODP.PRODUCT_ATTR_VALUE = p_product_attr_value
8900 GROUP BY
8901 ODL.DISCOUNT_TYPE,
8902 OFFR.VOLUME_OFFER_TYPE;
8903
8904 l_currency VARCHAR2(240);
8905 l_fcst_uom VARCHAR2(30);
8906 l_price_list_id NUMBER;
8907 l_list_price NUMBER;
8908 l_standard_cost NUMBER;
8909
8910 l_offer_type2 VARCHAR2(30);
8911 l_offer_type VARCHAR2(30);
8912 l_lumpsum_qty NUMBER;
8913
8914 l_api_version CONSTANT NUMBER := 1.0;
8915 l_api_name CONSTANT VARCHAR2(30) := 'get_discount_info';
8916 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8917 l_return_status VARCHAR2(1);
8918
8919 -- Used by other costs event
8920 l_item_key varchar2(30);
8921 l_parameter_list wf_parameter_list_t;
8922 l_offer_id NUMBER;
8923 l_other_costs VARCHAR2(2000);
8924
8925 BEGIN
8926
8927 SAVEPOINT get_discount_info;
8928
8929 IF FND_API.to_boolean(p_init_msg_list) THEN
8930 FND_MSG_PUB.initialize;
8931 END IF;
8932
8933 IF NOT FND_API.compatible_api_call(l_api_version,
8934 p_api_version,
8935 l_api_name,
8936 g_pkg_name)
8937 THEN
8938 RAISE FND_API.g_exc_unexpected_error;
8939 END IF;
8940
8941 x_return_status := FND_API.g_ret_sts_success;
8942
8943
8944 OPEN c_fcst_info;
8945 FETCH c_fcst_info INTO l_fcst_uom,l_price_list_id;
8946 CLOSE c_fcst_info;
8947
8948
8949 get_list_price(
8950 p_api_version ,
8951 p_init_msg_list ,
8952 p_commit ,
8953
8954 p_obj_type ,
8955 p_obj_id ,
8956 p_forecast_id ,
8957 p_product_attribute ,
8958 p_product_attr_value ,
8959 l_fcst_uom ,
8960 p_currency_code ,
8961 l_price_list_id ,
8962
8963 l_list_price ,
8964 x_return_status ,
8965 x_msg_count ,
8966 x_msg_data );
8967
8968 /*
8969 IF x_return_status = FND_API.g_ret_sts_error THEN
8970 RAISE FND_API.g_exc_error;
8971 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
8972 RAISE FND_API.g_exc_unexpected_error;
8973 END IF;
8974 */
8975 IF p_obj_type = 'OFFR'
8976 THEN
8977
8978 OPEN c_offer_type;
8979 FETCH c_offer_type INTO l_offer_type2, l_lumpsum_qty;
8980 CLOSE c_offer_type;
8981
8982 --R12---------------
8983 OPEN c_type_of_offer;
8984 FETCH c_type_of_offer INTO l_offer_type;
8985 CLOSE c_type_of_offer;
8986
8987 IF (l_offer_type = 'LUMPSUM')
8988 THEN
8989
8990 OPEN c_lumpsum_discount(l_lumpsum_qty);
8991 FETCH c_lumpsum_discount INTO l_discount_value;
8992 CLOSE c_lumpsum_discount;
8993
8994 l_discount_type := l_offer_type;
8995
8996 ELSIF (l_offer_type = 'VOLUME_OFFER')
8997 THEN
8998
8999 --begin: volume offer ------------------------------------
9000 IF NVL(p_node_id,2) > 1
9001 THEN
9002 FOR i IN c_volume_offer_discounts
9003 LOOP
9004 IF l_discount_type IS NULL
9005 THEN
9006 l_discount_type := i.discount ;
9007 ELSE
9008 l_discount_type := l_discount_type || ' + ' || i.discount;
9009 END IF;
9010
9011 IF (i.arithmetic_operator = '%')
9012 THEN
9013 l_discount_value := NVL(l_discount_value,0) +
9014 (( NVL(l_list_price,0) * NVL(i.operand,0) )/100);
9015 ELSE
9016 l_discount_value := NVL(l_discount_value,0) + NVL(i.operand,0) ;
9017 END IF;
9018
9019 END LOOP;
9020 ELSE
9021 l_discount_type := ' - ';
9022 l_discount_value := 0 ;
9023 END IF;
9024 --END: volume offer ------------------------------------
9025
9026 ELSE
9027
9028 IF NVL(p_node_id,2) > 1
9029 THEN
9030 FOR i IN c_offer_discounts
9031 LOOP
9032 IF l_discount_type IS NULL
9033 THEN
9034 l_discount_type := i.discount ;
9035 ELSE
9036 l_discount_type := l_discount_type || ' + ' || i.discount;
9037 END IF;
9038
9039 IF (i.arithmetic_operator = '%')
9040 THEN
9041 l_discount_value := NVL(l_discount_value,0) +
9042 (( NVL(l_list_price,0) * NVL(i.operand,0) )/100);
9043 ELSIF (i.arithmetic_operator = 'NEWPRICE')
9044 THEN
9045 l_discount_value := NVL(l_discount_value,0) + (NVL(l_list_price,0) - NVL(i.operand,0));
9046 ELSE
9047 l_discount_value := NVL(l_discount_value,0) + NVL(i.operand,0) ;
9048 END IF;
9049
9050 END LOOP;
9051 ELSE
9052 l_discount_type := ' - ';
9053 l_discount_value := 0 ;
9054 END IF;
9055
9056 END IF;
9057
9058
9059 ELSE
9060
9061 FOR i IN c_obj_discounts
9062 LOOP
9063
9064 IF l_discount_type IS NULL
9065 THEN
9066 l_discount_type := i.discount ;
9067 ELSE
9068 l_discount_type := l_discount_type || ' + ' || i.discount;
9069 END IF;
9070
9071 IF (i.arithmetic_operator = '%')
9072 THEN
9073 l_discount_value := l_discount_value + ( ( NVL(l_list_price,0) * i.operand )/100 ) ;
9074 ELSE
9075 l_discount_value := l_discount_value + i.operand ;
9076 END IF;
9077
9078 END LOOP;
9079
9080 END IF;
9081
9082 x_discount_type := l_discount_type;
9083 x_discount_value := l_discount_value;
9084 x_list_price := l_list_price;
9085
9086 calc_cost_of_goods(
9087 p_api_version,
9088 p_init_msg_list,
9089 p_commit ,
9090
9091 p_obj_type ,
9092 p_obj_id ,
9093 p_product_attribute,
9094 p_product_attr_value,
9095 l_fcst_uom,
9096
9097 l_standard_cost ,
9098 x_return_status ,
9099 x_msg_count ,
9100 x_msg_data
9101 ) ;
9102
9103 IF x_return_status = FND_API.g_ret_sts_error THEN
9104 RAISE FND_API.g_exc_error;
9105 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
9106 RAISE FND_API.g_exc_unexpected_error;
9107 END IF;
9108
9109 -- x_standard_cost := l_standard_cost ;
9110
9111 -- Get Other Costs here
9112 OZF_FORECAST_UTIL_PVT.get_other_costs (p_obj_type ,
9113 p_obj_id ,
9114 p_product_attribute ,
9115 p_product_attr_value ,
9116 l_fcst_uom ,
9117 l_other_costs ) ;
9118
9119 /*
9120 l_item_key := p_obj_id ||'_'|| TO_CHAR(SYSDATE,'DDMMRRRRHH24MISS');
9121 l_parameter_list := WF_PARAMETER_LIST_T();
9122
9123 wf_event.AddParameterToList(p_name => 'P_OBJ_TYPE',
9124 p_value => 'OFFR',
9125 p_parameterlist => l_parameter_list);
9126 wf_event.AddParameterToList(p_name => 'P_OBJ_ID',
9127 p_value => p_obj_id,
9128 p_parameterlist => l_parameter_list);
9129 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTRIBUTE_CONTEXT',
9130 p_value => 'ITEM',
9131 p_parameterlist => l_parameter_list);
9132 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTRIBUTE',
9133 p_value => p_product_attribute,
9134 p_parameterlist => l_parameter_list);
9135 wf_event.AddParameterToList(p_name => 'P_PRODUCT_ATTR_VALUE',
9136 p_value => p_product_attr_value,
9137 p_parameterlist => l_parameter_list);
9138 wf_event.AddParameterToList(p_name => 'P_UOM',
9139 p_value => l_fcst_uom,
9140 p_parameterlist => l_parameter_list);
9141
9142
9143 wf_event.raise3( p_event_name => 'oracle.apps.ozf.planning.OtherCosts',
9144 p_event_key => l_item_key,
9145 p_parameter_list => l_parameter_list);
9146
9147
9148 l_other_costs := wf_event.GetValueForParameter(p_name => 'P_OTHER_COSTS',
9149 p_parameterlist => l_parameter_list);
9150 */
9151
9152 --
9153 IF l_other_costs IS NOT NULL
9154 THEN
9155 l_standard_cost := NVL(l_standard_cost,0) + l_other_costs;
9156 END IF;
9157
9158 IF l_standard_cost IS NULL
9159 THEN
9160
9161 NULL;
9162 /*
9163 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
9164 THEN
9165 FND_MESSAGE.Set_Name ('OZF', 'OZF_TP_COG_MISSING');
9166 FND_MESSAGE.Set_Token('PRODUCT', p_product_attr_value );
9167 FND_MSG_PUB.Add;
9168 RAISE FND_API.g_exc_error;
9169 END IF;
9170 */
9171 ELSE
9172 x_standard_cost := l_standard_cost;
9173 END IF;
9174
9175 EXCEPTION
9176
9177 WHEN FND_API.g_exc_error THEN
9178
9179 ROLLBACK TO get_discount_info;
9180 x_return_status := FND_API.g_ret_sts_error;
9181 FND_MSG_PUB.Count_And_Get (
9182 p_encoded => FND_API.g_false,
9183 p_count => x_msg_count,
9184 p_data => x_msg_data
9185 );
9186
9187 WHEN FND_API.g_exc_unexpected_error THEN
9188
9189 ROLLBACK TO get_discount_info;
9190 x_return_status := FND_API.g_ret_sts_unexp_error;
9191 FND_MSG_PUB.Count_And_Get (
9192 p_encoded => FND_API.g_false,
9193 p_count => x_msg_count,
9194 p_data => x_msg_data
9195 );
9196
9197 WHEN OTHERS THEN
9198 ROLLBACK TO get_discount_info;
9199 x_return_status := FND_API.g_ret_sts_unexp_error;
9200
9201 FND_MESSAGE.set_name('OZF', 'OZF_FCST_GET_DISC_FAILED');
9202 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
9203 FND_MSG_PUB.add;
9204
9205 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
9206 THEN
9207 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
9208 END IF;
9209
9210 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
9211 p_count => x_msg_count,
9212 p_data => x_msg_data);
9213
9214
9215 END get_discount_info ;
9216
9217
9218
9219 PROCEDURE get_actual_sales(
9220 p_api_version IN NUMBER,
9221 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
9222 p_commit IN VARCHAR2 := FND_API.g_false,
9223
9224 p_obj_type IN VARCHAR2,
9225 p_obj_id IN NUMBER,
9226 p_product_attribute IN VARCHAR2,
9227 p_product_attr_value IN VARCHAR2,
9228 p_fcst_uom IN VARCHAR2,
9229 p_cogs IN NUMBER,
9230
9231 x_actual_units OUT NOCOPY NUMBER,
9232 x_actual_revenue OUT NOCOPY NUMBER,
9233 x_actual_costs OUT NOCOPY NUMBER,
9234 x_roi OUT NOCOPY NUMBER,
9235
9236 x_return_status OUT NOCOPY VARCHAR2,
9237 x_msg_count OUT NOCOPY NUMBER,
9238 x_msg_data OUT NOCOPY VARCHAR2 )
9239 IS
9240
9241 CURSOR c_actual_data IS
9242 SELECT o.offer_type,
9243 p.product_id,
9244 line.order_quantity_uom,
9245 NVL(line.shipped_quantity, line.ordered_quantity) ordered_quantity,
9246 inv_convert.inv_um_convert( p.product_id,
9247 null,
9248 DECODE(line.line_category_code
9249 ,'ORDER', line.shipped_quantity
9250 ,-NVL(line.shipped_quantity,line.ordered_quantity)
9251 ),
9252 line.order_quantity_uom,
9253 p_fcst_uom,
9254 null, null) conv_ordered_quantity,
9255 DECODE(line.line_category_code,
9256 'ORDER', line.unit_list_price,
9257 -line.unit_list_price) unit_list_price,
9258 DECODE(line.line_category_code,
9259 'ORDER', -adj.adjusted_amount
9260 , adj.adjusted_amount) adjusted_amount,
9261 adj.accrual_flag
9262 FROM ozf_forecast_products p,
9263 ozf_offers o,
9264 oe_price_adjustments adj,
9265 oe_order_lines_all line
9266 WHERE p.obj_type = p_obj_type
9267 AND p.obj_id = p_obj_id
9268 AND p.product_attribute_context = 'ITEM'
9269 AND p.product_attribute = p_product_attribute
9270 AND p.product_attr_value = p_product_attr_value
9271 AND o.qp_list_header_id = p.obj_id
9272 AND adj.list_header_id = p.obj_id
9273 AND adj.line_id = line.line_id
9274 AND line.inventory_item_id = p.product_id
9275 AND line.open_flag = 'N'
9276 AND line.cancelled_flag = 'N';
9277
9278 --
9279 -- AND << add filter on oe_order_lines to pick closed lines >>
9280 -- AND << add filter to process returns >>
9281 --
9282
9283 l_api_version CONSTANT NUMBER := 1.0;
9284 l_api_name CONSTANT VARCHAR2(30) := 'get_actual_sales';
9285 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
9286 l_return_status VARCHAR2(1);
9287
9288 l_actual_revenue NUMBER ;
9289 l_tot_actual_revenue NUMBER := 0;
9290
9291 l_roi_revenue NUMBER ;
9292 l_tot_roi_revenue NUMBER := 0;
9293
9294 l_promotion_cost NUMBER ;
9295 l_tot_promotion_cost NUMBER := 0;
9296
9297 l_actual_units NUMBER ;
9298 l_tot_actual_units NUMBER := 0;
9299
9300 l_actual_costs NUMBER ;
9301 l_is_disc_exp VARCHAR2(10) := FND_PROFILE.VALUE('OZF_TREAT_DISCOUNT_AS_EXPENSE') ;
9302
9303 BEGIN
9304
9305 IF FND_API.to_boolean(p_init_msg_list) THEN
9306 FND_MSG_PUB.initialize;
9307 END IF;
9308
9309 IF NOT FND_API.compatible_api_call(l_api_version,
9310 p_api_version,
9311 l_api_name,
9312 g_pkg_name)
9313 THEN
9314 RAISE FND_API.g_exc_unexpected_error;
9315 END IF;
9316 x_return_status := FND_API.g_ret_sts_success;
9317
9318
9319 FOR i IN c_actual_data
9320 LOOP
9321
9322 IF l_is_disc_exp = 'Y'
9323 THEN
9324 -- Discount must be treated as expense.
9325 -- It will increase the cost and does not effect the revenue
9326 l_actual_revenue := i.ordered_quantity * i.unit_list_price ;
9327 l_promotion_cost := i.ordered_quantity * i.adjusted_amount ;
9328 ELSE
9329 -- Discount is not an expense
9330 -- It will reduce the revenue and does not effect the cost
9331 l_actual_revenue := i.ordered_quantity * (i.unit_list_price - i.adjusted_amount);
9332 l_promotion_cost := 0;
9333 END IF;
9334
9335 l_tot_actual_revenue := l_tot_actual_revenue + l_actual_revenue;
9336 l_tot_actual_units := l_tot_actual_units + i.conv_ordered_quantity;
9337 l_tot_promotion_cost := l_tot_promotion_cost + l_promotion_cost;
9338
9339
9340 /*
9341 IF i.accrual_flag = 'Y'
9342 THEN
9343 l_actual_revenue := i.ordered_quantity * i.unit_list_price ;
9344 l_roi_revenue := i.ordered_quantity * i.unit_list_price;
9345 ELSE
9346 l_actual_revenue := i.ordered_quantity * (i.unit_list_price - i.adjusted_amount);
9347 l_roi_revenue := i.ordered_quantity * i.unit_list_price ;
9348 END IF;
9349
9350 l_promotion_cost := i.ordered_quantity * i.adjusted_amount;
9351
9352 l_tot_actual_revenue := l_tot_actual_revenue + l_actual_revenue;
9353 l_tot_roi_revenue := l_tot_roi_revenue + l_roi_revenue;
9354 l_tot_actual_units := l_tot_actual_units + i.conv_ordered_quantity;
9355 l_tot_promotion_cost := l_tot_promotion_cost + l_promotion_cost;
9356 */
9357
9358 END LOOP;
9359
9360 l_actual_units := l_tot_actual_units;
9361 l_actual_revenue := l_tot_actual_revenue;
9362 l_actual_costs := (l_actual_units * p_cogs) + l_tot_promotion_cost;
9363
9364 x_roi := round((l_tot_actual_revenue - l_actual_costs)/l_actual_costs,2) ;
9365
9366 x_actual_units := l_actual_units;
9367 x_actual_revenue := l_actual_revenue;
9368 x_actual_costs := l_actual_costs;
9369
9370 EXCEPTION
9371 WHEN FND_API.G_EXC_ERROR THEN
9372
9373 x_return_status := FND_API.G_RET_STS_ERROR;
9374 -- Standard call to get message count and if count=1, get the message
9375 FND_MSG_PUB.Count_And_Get (
9376 p_encoded => FND_API.G_FALSE,
9377 p_count => x_msg_count,
9378 p_data => x_msg_data
9379 );
9380 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9381
9382 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9383 -- Standard call to get message count and if count=1, get the message
9384 FND_MSG_PUB.Count_And_Get (
9385 p_encoded => FND_API.G_FALSE,
9386 p_count => x_msg_count,
9387 p_data => x_msg_data
9388 );
9389 WHEN OTHERS THEN
9390
9391 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9392
9393 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9394 THEN
9395 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
9396 END IF;
9397 -- Standard call to get message count and if count=1, get the message
9398 FND_MSG_PUB.Count_And_Get (
9399 p_encoded => FND_API.G_FALSE,
9400 p_count => x_msg_count,
9401 p_data => x_msg_data
9402 );
9403
9404 END get_actual_sales;
9405
9406
9407 PROCEDURE allocate_facts(
9408 p_api_version IN NUMBER,
9409 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
9410 p_commit IN VARCHAR2 := FND_API.g_false,
9411
9412 p_used_by_id IN NUMBER,
9413 p_dimention IN VARCHAR2,
9414
9415 x_return_status OUT NOCOPY VARCHAR2,
9416 x_msg_count OUT NOCOPY NUMBER,
9417 x_msg_data OUT NOCOPY VARCHAR2
9418 ) IS
9419
9420 l_api_version CONSTANT NUMBER := 1.0;
9421 l_api_name CONSTANT VARCHAR2(30) := 'Allocate_Facts';
9422 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
9423 l_return_status VARCHAR2(1);
9424
9425 -- RUP1: Modified Where Clause
9426
9427 CURSOR c1 IS
9428 SELECT a.offer_type,
9429 nvl(a.transaction_currency_code,a.fund_request_curr_code),
9430 b.forecast_spread_type
9431 FROM ozf_offers a,
9432 ozf_act_forecasts_all b
9433 WHERE b.forecast_id = p_used_by_id
9434 AND DECODE(b.arc_act_fcast_used_by,'OFFR',b.act_fcast_used_by_id,-99)
9435 = a.qp_list_header_id(+);
9436
9437 CURSOR c2 IS
9438 SELECT distinct count(act_metric_used_by_id)
9439 FROM ozf_act_metric_facts_all
9440 WHERE arc_act_metric_used_by = 'FCST'
9441 AND act_metric_used_by_id = p_used_by_id
9442 AND fact_type = p_dimention
9443 GROUP by previous_fact_id;
9444
9445 l_offer_type VARCHAR2(30);
9446 l_currency_code VARCHAR2(30);
9447 l_spread_type VARCHAR2(30);
9448
9449 l_dimention_count NUMBER := 0;
9450
9451 BEGIN
9452
9453 SAVEPOINT allocate_facts;
9454
9455 IF FND_API.to_boolean(p_init_msg_list) THEN
9456 FND_MSG_PUB.initialize;
9457 END IF;
9458
9459 IF NOT FND_API.compatible_api_call(l_api_version,
9460 p_api_version,
9461 l_api_name,
9462 g_pkg_name)
9463 THEN
9464 RAISE FND_API.g_exc_unexpected_error;
9465 END IF;
9466
9467 x_return_status := FND_API.g_ret_sts_success;
9468
9469 OPEN c1;
9470 FETCH c1 INTO l_offer_type, l_currency_code, l_spread_type;
9471 CLOSE c1;
9472
9473 IF (l_offer_type = 'OID' AND p_dimention='PRODUCT')
9474 THEN
9475 allocate_pg_facts( p_api_version ,
9476 p_init_msg_list,
9477 p_commit,
9478 p_used_by_id ,
9479 p_dimention ,
9480 l_currency_code,
9481 x_return_status ,
9482 x_msg_count ,
9483 x_msg_data );
9484
9485 IF x_return_status = FND_API.g_ret_sts_error THEN
9486 RAISE FND_API.g_exc_error;
9487 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
9488 RAISE FND_API.g_exc_unexpected_error;
9489 END IF;
9490 ELSE
9491 -- Update all records
9492
9493 IF (l_spread_type <> 'BASELINE_RATIO')
9494 THEN
9495 OPEN c2;
9496 FETCH c2 INTO l_dimention_count;
9497 CLOSE c2;
9498 END IF;
9499
9500 UPDATE ozf_act_metric_facts_all f
9501 SET (fact_value, fact_percent, forward_buy_quantity ) =
9502 ( SELECT ROUND( a.fact_value ) ,
9503 ROUND( a.fact_value * 100 / a.total_forecast_quantity ) fact_percent,
9504 ROUND( (a.fact_value * 100 / a.total_forecast_quantity)
9505 * DECODE(f.fact_type,'TIME',0,a.total_forward_buy_quantity)
9506 * 0.01 ) forward_buy_quantity
9507 FROM
9508 ( SELECT DECODE(fcst.forecast_spread_type , 'BASELINE_RATIO'
9509 , ( NVL(previous_fact.fact_value,fcst.forecast_quantity)
9510 * fact.base_quantity
9511 )/DECODE( NVL(previous_fact.base_quantity, fcst.base_quantity),0,1,
9512 NVL(previous_fact.base_quantity, fcst.base_quantity)
9513 )
9514
9515 , ( NVL(previous_fact.fact_value, fcst.forecast_quantity)/l_dimention_count
9516 /*( SELECT COUNT(f1.act_metric_used_by_id)
9517 FROM ozf_act_metric_facts_all f1
9518 WHERE f1.act_metric_used_by_id = fact.act_metric_used_by_id
9519 AND f1.arc_act_metric_used_by = 'FCST'
9520 AND f1.fact_type= p_dimention
9521 AND NVL(f1.previous_fact_id,-99) =
9522 NVL(previous_fact.activity_metric_fact_id,-99)
9523 ) */
9524 )
9525 ) fact_value,
9526 fact.activity_metric_fact_id,
9527 DECODE( NVL(previous_fact.fact_value, fcst.forecast_quantity),
9528 0,1,
9529 NVL(previous_fact.fact_value, fcst.forecast_quantity)
9530 ) total_forecast_quantity,
9531 NVL(previous_fact.forward_buy_quantity, fcst.forward_buy_quantity) total_forward_buy_quantity
9532 FROM
9533 ozf_act_forecasts_all fcst,
9534 ozf_act_metric_facts_all fact,
9535 ozf_act_metric_facts_all previous_fact
9536 WHERE
9537 fact.act_metric_used_by_id = fcst.forecast_id
9538 AND fact.previous_fact_id = previous_fact.activity_metric_fact_id(+)
9539 AND fact.act_metric_used_by_id = p_used_by_id
9540 AND fact.arc_act_metric_used_by = 'FCST'
9541 AND fact.fact_type = p_dimention
9542 ) a
9543 WHERE a.activity_metric_fact_id = f.activity_metric_fact_id
9544 )
9545 WHERE f.act_metric_used_by_id = p_used_by_id
9546 AND f.arc_act_metric_used_by = 'FCST'
9547 AND f.fact_type = p_dimention ;
9548
9549 END IF;
9550 -- Adjust the last record
9551
9552 UPDATE ozf_act_metric_facts_all f
9553 SET ( fact_value, forward_buy_quantity) =
9554 ( SELECT f.fact_value + a.adj_fact_value,
9555 f.forward_buy_quantity + a.adj_fwd_buy_quantity
9556 FROM
9557 ( SELECT NVL(MIN(previous_fact.fact_value), MIN(fcst.forecast_quantity)) -
9558 SUM(fact.fact_value) adj_fact_value,
9559 NVL(MIN(previous_fact.forward_buy_quantity), MIN(fcst.forward_buy_quantity)) -
9560 SUM(fact.forward_buy_quantity) adj_fwd_buy_quantity,
9561 MAX(fact.activity_metric_fact_id) activity_metric_fact_id
9562 FROM ozf_act_forecasts_all fcst,
9563 ozf_act_metric_facts_all fact,
9564 ozf_act_metric_facts_all previous_fact
9565 WHERE fact.act_metric_used_by_id = p_used_by_id
9566 AND fact.arc_act_metric_used_by = 'FCST'
9567 AND fact.fact_type = p_dimention
9568 AND fact.act_metric_used_by_id = fcst.forecast_id
9569 AND NVL(fact.node_id,1) <> 3
9570 AND fact.previous_fact_id = previous_fact.activity_metric_fact_id(+)
9571 GROUP BY fact.previous_fact_id
9572 ) a
9573 WHERE a.activity_metric_fact_id = f.activity_metric_fact_id
9574 )
9575 WHERE activity_metric_fact_id in (SELECT MAX(activity_metric_fact_id)
9576 FROM ozf_act_metric_facts_all
9577 WHERE act_metric_used_by_id = p_used_by_id
9578 AND arc_act_metric_used_by = 'FCST'
9579 AND fact_type = p_dimention
9580 AND NVL(node_id,1) <> 3
9581 GROUP BY previous_fact_id ) ;
9582
9583 EXCEPTION
9584 WHEN FND_API.G_EXC_ERROR THEN
9585 ROLLBACK TO allocate_facts ;
9586 x_return_status := FND_API.G_RET_STS_ERROR;
9587 -- Standard call to get message count and if count=1, get the message
9588 FND_MSG_PUB.Count_And_Get (
9589 p_encoded => FND_API.G_FALSE,
9590 p_count => x_msg_count,
9591 p_data => x_msg_data
9592 );
9593 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9594 ROLLBACK TO allocate_facts;
9595 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9596 -- Standard call to get message count and if count=1, get the message
9597 FND_MSG_PUB.Count_And_Get (
9598 p_encoded => FND_API.G_FALSE,
9599 p_count => x_msg_count,
9600 p_data => x_msg_data
9601 );
9602 WHEN OTHERS THEN
9603 ROLLBACK TO allocate_facts;
9604 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9605 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9606 THEN
9607 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
9608 END IF;
9609 -- Standard call to get message count and if count=1, get the message
9610 FND_MSG_PUB.Count_And_Get (
9611 p_encoded => FND_API.G_FALSE,
9612 p_count => x_msg_count,
9613 p_data => x_msg_data
9614 );
9615
9616 END allocate_facts ;
9617
9618
9619
9620 PROCEDURE get_volume_offer_discount(
9621 p_api_version IN NUMBER,
9622 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
9623 p_commit IN VARCHAR2 := FND_API.g_false,
9624
9625 p_obj_type IN VARCHAR2,
9626 p_obj_id IN NUMBER,
9627 p_forecast_id IN NUMBER,
9628 p_currency_code IN VARCHAR2,
9629
9630 p_product_attribute IN VARCHAR2,
9631 p_product_attr_value IN VARCHAR2,
9632
9633 x_discount_type_code OUT NOCOPY VARCHAR2,
9634 x_discount OUT NOCOPY NUMBER,
9635
9636 x_return_status OUT NOCOPY VARCHAR2,
9637 x_msg_count OUT NOCOPY NUMBER,
9638 x_msg_data OUT NOCOPY VARCHAR2 )
9639 IS
9640
9641 l_last_discount NUMBER :=0;
9642 l_discount NUMBER ;
9643 l_counter NUMBER := 0;
9644 l_volume_type NUMBER := 0;
9645 l_overall_volume NUMBER := 0;
9646 l_overall_fcst_volume NUMBER := 0;
9647 l_overall_converted_volume NUMBER := 0;
9648 l_flag_first_visit BOOLEAN := true;
9649 l_flag_error BOOLEAN := false;
9650 l_list_price NUMBER;
9651 l_fcst_uom VARCHAR2(30);
9652 l_price_list_id NUMBER;
9653
9654 CURSOR c_fcst_info IS
9655 SELECT a.forecast_uom_code,
9656 a.price_list_id
9657 FROM ozf_act_forecasts_all a
9658 WHERE a.forecast_id = p_forecast_id ;
9659
9660 --R12 ---
9661 CURSOR c_fcst_products_info (p_offer_discount_line_id NUMBER) IS
9662 SELECT dim.product_attribute,
9663 dim.product_attribute_context,
9664 dim.product_attr_value,
9665 prod.qty,
9666 prod.forecast_dimention_id
9667 FROM ozf_forecast_dimentions dim,
9668 (select fact.fact_reference forecast_dimention_id,
9669 DECODE(fcst.BASE_QUANTITY_TYPE,
9670 'BASELINE',
9671 SUM(fact.BASELINE_SALES + fact.INCREMENTAL_SALES),
9672 sum(fact.fact_value)) qty
9673 from ozf_act_metric_facts_all fact,
9674 OZF_ACT_FORECASTS_ALL fcst
9675 where fact.fact_type = 'PRODUCT'
9676 and fact.arc_act_metric_used_by = 'FCST'
9677 and fact.act_metric_used_by_id = p_forecast_id
9678 AND FACT.ACT_METRIC_USED_BY_ID = FCST.FORECAST_ID
9679 group by fact.fact_reference,fcst.BASE_QUANTITY_TYPE) prod,
9680 OZF_OFFER_DISCOUNT_LINES ODL,
9681 OZF_OFFER_DISCOUNT_PRODUCTS ODP
9682 WHERE prod.forecast_dimention_id = dim.forecast_dimention_id
9683 AND dim.forecast_id = p_forecast_id
9684 AND ODL.OFFER_DISCOUNT_LINE_ID = p_offer_discount_line_id
9685 AND ODL.TIER_TYPE = 'PBH'
9686 AND ODP.OFFER_DISCOUNT_LINE_ID = ODL.OFFER_DISCOUNT_LINE_ID
9687 -- AND ODP.APPLY_DISCOUNT_FLAG = 'Y'
9688 AND ODP.INCLUDE_VOLUME_FLAG = 'Y' -- get those products whoose sales is to be counted
9689 AND ODP.PRODUCT_CONTEXT = dim.product_attribute_context
9690 AND ODP.PRODUCT_ATTRIBUTE = dim.product_attribute
9691 AND ODP.PRODUCT_ATTR_VALUE = dim.product_attr_value;
9692
9693 /*
9694 CURSOR c_fcst_products_info IS
9695 SELECT dim.product_attribute,
9696 dim.product_attribute_context,
9697 dim.product_attr_value,
9698 prod.qty,
9699 prod.forecast_dimention_id
9700 FROM ozf_forecast_dimentions dim,
9701 (select fact_reference forecast_dimention_id, sum(fact_value) qty
9702 from ozf_act_metric_facts_all
9703 where fact_type = 'PRODUCT'
9704 and arc_act_metric_used_by = 'FCST'
9705 and act_metric_used_by_id = p_forecast_id
9706 group by fact_reference ) prod
9707 WHERE prod.forecast_dimention_id = dim.forecast_dimention_id
9708 AND dim.forecast_id = p_forecast_id;
9709 */
9710
9711 --R12 ----
9712 CURSOR c_volume_tiers_info IS
9713 SELECT
9714 ODP.OFFER_DISCOUNT_LINE_ID ,
9715 DIS.volume_from tier_value_from,
9716 DIS.volume_to tier_value_to,
9717 DIS.discount discount,
9718 ODL.discount_type discount_type_code,
9719 ODL.volume_type volume_type,
9720 ODL.uom_code uom_code
9721 FROM
9722 OZF_OFFERS OFFR,
9723 OZF_OFFER_DISCOUNT_LINES ODL,
9724 OZF_OFFER_DISCOUNT_PRODUCTS ODP,
9725 OZF_OFFER_DISCOUNT_LINES DIS
9726 WHERE
9727 OFFR.QP_LIST_HEADER_ID = p_obj_id
9728 AND OFFR.OFFER_ID = ODL.OFFER_ID
9729 AND ODL.TIER_TYPE = 'PBH'
9730 AND ODP.OFFER_ID = OFFR.OFFER_ID
9731 AND ODP.OFFER_DISCOUNT_LINE_ID = ODL.OFFER_DISCOUNT_LINE_ID
9732 AND ODP.APPLY_DISCOUNT_FLAG = 'Y'
9733 AND DIS.parent_discount_line_id = ODL.OFFER_DISCOUNT_LINE_ID
9734 AND DIS.TIER_TYPE = 'DIS'
9735 AND DIS.OFFER_ID = ODL.OFFER_ID
9736 AND ODP.PRODUCT_CONTEXT = 'ITEM'
9737 AND ODP.PRODUCT_ATTRIBUTE = p_product_attribute
9738 AND ODP.PRODUCT_ATTR_VALUE = p_product_attr_value;
9739
9740 /*
9741 CURSOR c_volume_tiers_info IS
9742 SELECT tier_value_from,
9743 tier_value_to,
9744 discount,
9745 discount_type_code,
9746 volume_type,
9747 uom_code
9748 FROM ozf_volume_offer_tiers
9749 WHERE qp_list_header_id = p_obj_id;
9750 */
9751
9752
9753 CURSOR c_fcst_to_voloffr_uom_conv(l_fcst_qty IN NUMBER,
9754 l_fcst_uom IN VARCHAR2,
9755 l_voloffr_uom IN VARCHAR2) IS
9756 SELECT inv_convert.inv_um_convert( null,
9757 null,
9758 l_fcst_qty,
9759 l_fcst_uom,
9760 l_voloffr_uom, null, null) converted_qty
9761 from dual;
9762
9763 l_api_version CONSTANT NUMBER := 1.0;
9764 l_api_name CONSTANT VARCHAR2(30) := 'get_volume_offer_discount';
9765 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
9766 l_return_status VARCHAR2(1);
9767
9768 BEGIN
9769
9770 SAVEPOINT get_volume_offer_discount;
9771
9772 IF FND_API.to_boolean(p_init_msg_list) THEN
9773 FND_MSG_PUB.initialize;
9774 END IF;
9775
9776 IF NOT FND_API.compatible_api_call(l_api_version,
9777 p_api_version,
9778 l_api_name,
9779 g_pkg_name)
9780 THEN
9781 RAISE FND_API.g_exc_unexpected_error;
9782 END IF;
9783
9784 x_return_status := FND_API.g_ret_sts_success;
9785
9786 OPEN c_fcst_info;
9787 FETCH c_fcst_info INTO l_fcst_uom,l_price_list_id;
9788 CLOSE c_fcst_info;
9789
9790 FOR i IN c_volume_tiers_info
9791 LOOP
9792 -- Do this only once when initial counter is = 0;
9793 IF (l_counter = 0) THEN
9794 IF (i.volume_type = 'PRICING_ATTRIBUTE10') THEN
9795 l_volume_type := 1;
9796 FOR j IN c_fcst_products_info (i.offer_discount_line_id)
9797 LOOP
9798 l_overall_fcst_volume := l_overall_fcst_volume + j.qty;
9799 END LOOP;
9800 ELSIF (i.volume_type = 'PRICING_ATTRIBUTE12') THEN
9801 l_volume_type := 2;
9802 FOR j IN c_fcst_products_info (i.offer_discount_line_id)
9803 LOOP
9804 get_list_price(
9805 p_api_version ,
9806 p_init_msg_list ,
9807 p_commit ,
9808
9809 p_obj_type ,
9810 p_obj_id ,
9811 p_forecast_id ,
9812 j.product_attribute ,
9813 j.product_attr_value ,
9814 l_fcst_uom ,
9815 p_currency_code ,
9816 l_price_list_id ,
9817
9818 l_list_price ,
9819 x_return_status ,
9820 x_msg_count ,
9821 x_msg_data );
9822 /*
9823 IF x_return_status = FND_API.g_ret_sts_error THEN
9824 RAISE FND_API.g_exc_error;
9825 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
9826 RAISE FND_API.g_exc_unexpected_error;
9827 END IF;
9828 */
9829 -- Get List price and multiply by quantity to get overall value in amount
9830 l_overall_volume := l_overall_volume + l_list_price * j.qty ;
9831 END LOOP;
9832 END IF;
9833
9834 l_counter := 1;
9835 x_discount_type_code := i.discount_type_code;
9836
9837 END IF;
9838
9839
9840 IF( (l_volume_type = 1) AND (l_flag_first_visit = true) ) THEN
9841
9842 OPEN c_fcst_to_voloffr_uom_conv(l_overall_fcst_volume, l_fcst_uom, i.uom_code);
9843 FETCH c_fcst_to_voloffr_uom_conv INTO l_overall_volume ;
9844 CLOSE c_fcst_to_voloffr_uom_conv ;
9845
9846 IF l_overall_volume = -99999
9847 THEN
9848
9849 l_flag_error := true;
9850
9851 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
9852 THEN
9853 FND_MESSAGE.Set_Name ('OZF', 'OZF_TP_UOM_CONVERSION_MISSING');
9854 FND_MESSAGE.Set_Token('CURRENT_UOM', l_fcst_uom); -- replace with p_fcst_uom
9855 FND_MESSAGE.Set_Token('ORDER_UOM', i.uom_code);
9856 FND_MSG_PUB.Add;
9857 END IF;
9858
9859 END IF;
9860
9861 IF(l_flag_error = true) THEN
9862 x_return_status := FND_API.G_RET_STS_ERROR;
9863 RAISE FND_API.G_EXC_ERROR;
9864 END IF;
9865
9866 -- Set to false since we need to find this overall converted volume just once
9867 l_flag_first_visit := false;
9868
9869 END IF;
9870
9871 -- Compare this overall number with the tier number ranges and get the discount. Set the discount and code.
9872 /*
9873 IF ( (i.tier_value_from IS NOT NULL) AND
9874 (i.tier_value_to IS NOT NULL) AND
9875 (l_overall_volume >= i.tier_value_from) AND
9876 (l_overall_volume <= i.tier_value_to) )
9877 THEN
9878 l_discount := i.discount;
9879 EXIT;
9880 END IF;
9881 */
9882
9883 IF l_overall_volume <= NVL(i.tier_value_to,l_overall_volume)
9884 THEN
9885 l_discount := i.discount;
9886 EXIT;
9887 END IF;
9888 l_last_discount := i.discount;
9889 END LOOP;
9890
9891 IF( l_discount IS NOT NULL ) THEN
9892 x_discount := l_discount;
9893 ELSE
9894 x_discount := l_last_discount;
9895 END IF;
9896
9897
9898 EXCEPTION
9899
9900 WHEN FND_API.g_exc_error THEN
9901
9902 ROLLBACK TO get_volume_offer_discount;
9903 x_return_status := FND_API.g_ret_sts_error;
9904 FND_MSG_PUB.Count_And_Get (
9905 p_encoded => FND_API.g_false,
9906 p_count => x_msg_count,
9907 p_data => x_msg_data
9908 );
9909
9910 WHEN FND_API.g_exc_unexpected_error THEN
9911
9912 ROLLBACK TO get_volume_offer_discount;
9913 x_return_status := FND_API.g_ret_sts_unexp_error;
9914 FND_MSG_PUB.Count_And_Get (
9915 p_encoded => FND_API.g_false,
9916 p_count => x_msg_count,
9917 p_data => x_msg_data
9918 );
9919
9920 WHEN OTHERS THEN
9921
9922 ROLLBACK TO get_volume_offer_discount;
9923 x_return_status := FND_API.g_ret_sts_unexp_error;
9924
9925 FND_MESSAGE.set_name('OZF', 'OZF_GET_VOLUME_OFFER_DISCOUNT_FAILED');
9926 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
9927 FND_MSG_PUB.add;
9928
9929 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
9930 THEN
9931 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
9932 END IF;
9933
9934 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
9935 p_count => x_msg_count,
9936 p_data => x_msg_data);
9937
9938 END get_volume_offer_discount;
9939
9940
9941
9942 PROCEDURE allocate_pg_facts(
9943 p_api_version IN NUMBER,
9944 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
9945 p_commit IN VARCHAR2 := FND_API.g_false,
9946
9947 p_used_by_id IN NUMBER,
9948 p_dimention IN VARCHAR2,
9949 p_currency_code IN VARCHAR2,
9950
9951 x_return_status OUT NOCOPY VARCHAR2,
9952 x_msg_count OUT NOCOPY NUMBER,
9953 x_msg_data OUT NOCOPY VARCHAR2
9954 ) IS
9955
9956 l_api_version CONSTANT NUMBER := 1.0;
9957 l_api_name CONSTANT VARCHAR2(30) := 'allocate_pg_facts';
9958 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
9959 l_return_status VARCHAR2(1);
9960
9961 TYPE products_ratio_rec IS RECORD
9962 (
9963 product_attribute_context VARCHAR2(30),
9964 product_attribute VARCHAR2(30),
9965 product_attr_value VARCHAR2(240),
9966 ratio_qty NUMBER,
9967 node_id NUMBER(1)
9968 );
9969
9970 TYPE products_ratio_tbl IS TABLE OF products_ratio_rec;
9971
9972 CURSOR get_product_facts IS
9973 select dim.product_attribute_context,
9974 dim.product_attribute,
9975 dim.product_attr_value,
9976 fact.activity_metric_fact_id,
9977 fact.node_id,
9978 NVL(previous_fact.fact_value,fcst.forecast_quantity) total_forecast,
9979 NVL(previous_fact.forward_buy_quantity, fcst.forward_buy_quantity) total_forward_buy,
9980 fcst.forecast_uom_code
9981 from ozf_act_metric_facts_all fact,
9982 ozf_forecast_dimentions dim ,
9983 ozf_act_metric_facts_all previous_fact,
9984 ozf_act_forecasts_all fcst
9985 where fcst.forecast_id = p_used_by_id
9986 and fact.arc_act_metric_used_by = 'FCST'
9987 and fact.act_metric_used_by_id = fcst.forecast_id
9988 and fact.fact_type = p_dimention
9989 and fact.fact_reference = dim.forecast_dimention_id
9990 AND dim.forecast_id = p_used_by_id
9991 and fact.previous_fact_id = previous_fact.activity_metric_fact_id(+)
9992 order by fact.activity_metric_fact_id;
9993
9994 CURSOR get_all_ratios IS
9995 select NVL(prod.pricing_attribute,'PRICING_ATTRIBUTE10') pricing_attribute,
9996 DECODE(disc.list_line_type_code,
9997 'DIS',disc.benefit_uom_code
9998 ,prod.product_uom_code) offer_product_uom_code,
9999 DECODE(disc.list_line_type_code,
10000 'DIS',disc.benefit_qty
10001 ,prod.pricing_attr_value_from) offer_product_qty,
10002 fcst.forecast_uom_code,
10003 inv_convert.inv_um_convert(
10004 null,
10005 null,
10006 DECODE(disc.list_line_type_code,
10007 'DIS',disc.benefit_qty
10008 ,prod.pricing_attr_value_from) ,
10009 DECODE(disc.list_line_type_code,
10010 'DIS',disc.benefit_uom_code
10011 ,prod.product_uom_code) ,
10012 fcst.forecast_uom_code,
10013 null,
10014 null) converted_ratio,
10015 disc.operand,
10016 disc.arithmetic_operator,
10017 prod.product_attribute_context,
10018 prod.product_attribute,
10019 prod.product_attr_value,
10020 disc.list_line_type_code,
10021 fcst.price_list_id,
10022 disc.list_header_id
10023 from qp_pricing_attributes prod,
10024 qp_list_lines disc,
10025 ozf_act_forecasts_all fcst
10026 where fcst.forecast_id = p_used_by_id
10027 and fcst.arc_act_fcast_used_by = 'OFFR'
10028 and disc.list_header_id = fcst.act_fcast_used_by_id
10029 and disc.list_line_id = prod.list_line_id;
10030
10031 l_fact_forward_buy NUMBER;
10032 l_total_forecast NUMBER;
10033 l_list_price NUMBER;
10034 l_rec_count NUMBER := 0;
10035 l_fact_value NUMBER;
10036 l_fact_percent NUMBER;
10037 l_ratio NUMBER;
10038 l_total_ratio NUMBER := 0;
10039 l_per_unit_value NUMBER := 0;
10040 l_flag_error boolean := false;
10041 l_products_ratio_tbl products_ratio_tbl;
10042
10043 BEGIN
10044
10045 SAVEPOINT allocate_pg_facts;
10046
10047 IF FND_API.to_boolean(p_init_msg_list) THEN
10048 FND_MSG_PUB.initialize;
10049 END IF;
10050
10051 IF NOT FND_API.compatible_api_call(l_api_version,
10052 p_api_version,
10053 l_api_name,
10054 g_pkg_name)
10055 THEN
10056 RAISE FND_API.g_exc_unexpected_error;
10057 END IF;
10058
10059 x_return_status := FND_API.g_ret_sts_success;
10060
10061 /*
10062 1. Get all conversions first
10063 2. If pricing_attribute is PRICING_ATTRBUTE12, then the Buy is in
10064 amount. Convert the amount into quantity.
10065 3. If all conversions are complete, then populated the product_ration_tbl
10066 */
10067
10068 l_products_ratio_tbl := products_ratio_tbl();
10069
10070
10071 FOR i IN get_all_ratios
10072 LOOP
10073 l_ratio := 0;
10074
10075
10076 IF i.pricing_attribute = 'PRICING_ATTRIBUTE10'
10077 THEN
10078 IF i.converted_ratio = -99999
10079 THEN
10080 l_flag_error := true;
10081
10082 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
10083 THEN
10084 FND_MESSAGE.Set_Name ('OZF', 'OZF_TP_UOM_CONVERSION_MISSING');
10085 FND_MESSAGE.Set_Token('CURRENT_UOM', i.forecast_uom_code);
10086 FND_MESSAGE.Set_Token('ORDER_UOM', i.offer_product_uom_code);
10087 FND_MSG_PUB.Add;
10088 END IF;
10089 ELSE
10090 l_ratio := i.converted_ratio ;
10091 END IF;
10092 ELSE
10093
10094 IF i.price_list_id IS NULL
10095 THEN
10096 l_flag_error := true;
10097
10098 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
10099 THEN
10100 FND_MESSAGE.Set_Name ('OZF', 'OZF_PRICE_LIST_NEEDED');
10101 FND_MSG_PUB.Add;
10102 END IF;
10103
10104 ELSE
10105
10106 get_list_price(
10107 p_api_version ,
10108 p_init_msg_list ,
10109 p_commit ,
10110
10111 'OFFR' ,
10112 i.list_header_id ,
10113 p_used_by_id , -- forecast_id
10114 i.product_attribute ,
10115 i.product_attr_value ,
10116 i.forecast_uom_code ,
10117 p_currency_code ,
10118 i.price_list_id ,
10119
10120 l_list_price ,
10121 x_return_status ,
10122 x_msg_count ,
10123 x_msg_data );
10124
10125 IF x_return_status = FND_API.g_ret_sts_error THEN
10126 RAISE FND_API.g_exc_error;
10127 ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
10128 RAISE FND_API.g_exc_unexpected_error;
10129 END IF;
10130
10131 l_ratio := i.offer_product_qty/l_list_price ;
10132
10133 END IF;
10134
10135 END IF;
10136
10137 l_rec_count := l_rec_count + 1;
10138 l_products_ratio_tbl.extend;
10139 l_products_ratio_tbl(l_rec_count).product_attribute_context := i.product_attribute_context;
10140 l_products_ratio_tbl(l_rec_count).product_attribute := i.product_attribute;
10141 l_products_ratio_tbl(l_rec_count).product_attr_value := i.product_attr_value;
10142 l_products_ratio_tbl(l_rec_count).ratio_qty := l_ratio;
10143
10144 IF (i.list_line_type_code = 'DIS')
10145 THEN
10146 IF (i.operand = 100 AND i.arithmetic_operator = '%')
10147 THEN
10148 l_products_ratio_tbl(l_rec_count).node_id := 3;
10149 ELSE
10150 l_products_ratio_tbl(l_rec_count).node_id := 2;
10151 l_total_ratio := l_total_ratio + l_ratio;
10152 END IF;
10153 ELSE
10154 l_products_ratio_tbl(l_rec_count).node_id := 1;
10155 l_total_ratio := l_total_ratio + l_ratio;
10156 END IF;
10157
10158 END LOOP;
10159
10160 IF(l_flag_error = true)
10161 THEN
10162 x_return_status := FND_API.G_RET_STS_ERROR;
10163 RAISE FND_API.G_EXC_ERROR;
10164 END IF;
10165
10166 -- Proceed only when all the conversions and ratios are resolved
10167
10168 l_ratio := 0;
10169
10170 FOR i IN get_product_facts
10171 LOOP
10172
10173 FOR j IN 1..l_products_ratio_tbl.count
10174 LOOP
10175
10176 IF ( l_products_ratio_tbl(j).product_attribute = i.product_attribute
10177 AND
10178 l_products_ratio_tbl(j).product_attr_value = i.product_attr_value
10179 AND
10180 l_products_ratio_tbl(j).node_id = i.node_id
10181 )
10182 THEN
10183 l_ratio := l_products_ratio_tbl(j).ratio_qty;
10184 EXIT;
10185 END IF;
10186
10187 END LOOP;
10188
10189 IF i.node_id = 3
10190 THEN
10191 l_per_unit_value := round(i.total_forecast/l_total_ratio) ;
10192 l_fact_value := l_per_unit_value * l_ratio;
10193 l_fact_percent := 0;
10194 ELSE
10195 IF (i.total_forecast = 0)
10196 THEN
10197 l_total_forecast := 1;
10198 ELSE
10199 l_total_forecast := i.total_forecast ;
10200 END IF;
10201
10202 l_fact_value := round( (i.total_forecast*l_ratio)/l_total_ratio );
10203 l_fact_percent := round(l_fact_value*100/l_total_forecast);
10204 l_fact_forward_buy := round( (i.total_forward_buy*l_ratio)/l_total_ratio );
10205
10206 END IF;
10207
10208 UPDATE ozf_act_metric_facts_all
10209 SET fact_value = l_fact_value,
10210 fact_percent = l_fact_percent,
10211 forward_buy_quantity = l_fact_forward_buy
10212 WHERE activity_metric_fact_id = i.activity_metric_fact_id;
10213
10214 END LOOP;
10215
10216 EXCEPTION
10217 WHEN FND_API.G_EXC_ERROR THEN
10218 ROLLBACK TO allocate_pg_facts ;
10219 x_return_status := FND_API.G_RET_STS_ERROR;
10220 -- Standard call to get message count and if count=1, get the message
10221 FND_MSG_PUB.Count_And_Get (
10222 p_encoded => FND_API.G_FALSE,
10223 p_count => x_msg_count,
10224 p_data => x_msg_data
10225 );
10226 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10227 ROLLBACK TO allocate_pg_facts;
10228 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10229 -- Standard call to get message count and if count=1, get the message
10230 FND_MSG_PUB.Count_And_Get (
10231 p_encoded => FND_API.G_FALSE,
10232 p_count => x_msg_count,
10233 p_data => x_msg_data
10234 );
10235 WHEN OTHERS THEN
10236 ROLLBACK TO allocate_pg_facts;
10237 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10238 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10239 THEN
10240 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
10241 END IF;
10242 -- Standard call to get message count and if count=1, get the message
10243 FND_MSG_PUB.Count_And_Get (
10244 p_encoded => FND_API.G_FALSE,
10245 p_count => x_msg_count,
10246 p_data => x_msg_data
10247 );
10248
10249 END ;
10250
10251 PROCEDURE cascade_baseline_update(
10252 p_api_version IN NUMBER,
10253 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
10254 p_commit IN VARCHAR2 := FND_API.g_false,
10255 p_id IN NUMBER,
10256 p_value IN NUMBER,
10257 p_fcast_id IN NUMBER,
10258 p_rem_value IN NUMBER,
10259 p_cascade_flag IN NUMBER,
10260 p_tpr_percent IN NUMBER,
10261 p_obj_type IN VARCHAR2,
10262 p_obj_id IN NUMBER,
10263 x_return_status OUT NOCOPY VARCHAR2,
10264 x_msg_count OUT NOCOPY NUMBER,
10265 x_msg_data OUT NOCOPY VARCHAR2
10266 )
10267 IS
10268
10269 l_fact_percent NUMBER := 0;
10270 l_fact_value NUMBER := 0;
10271 l_parent_fact_value NUMBER := 0;
10272 l_tpr_percent NUMBER := 0;
10273 l_fact_type VARCHAR2(10);
10274 l_temp_parent_fact_value NUMBER := 0;
10275 l_cascade_flag NUMBER := 0;
10276
10277 l_temp_count NUMBER := 0;
10278 l_temp_sub_count NUMBER := 0;
10279 l_temp_counter NUMBER := 0;
10280 l_temp_sub_counter NUMBER := 0;
10281 l_fval_sum_minus_last_rec NUMBER := 0;
10282 l_fact_value_sum_all_recs NUMBER := 0;
10283 l_temp_sub_previous_fact_id NUMBER := 1;
10284 l_fact_value_sum_all_sub_recs NUMBER := 0;
10285 l_total_rem_value NUMBER := 0;
10286
10287 l_current_fact_value NUMBER := 0;
10288 l_rem_value NUMBER := 0;
10289 l_new_incr NUMBER := 0;
10290 l_delta NUMBER := 0;
10291
10292 CURSOR C_FindRecords(p_prev_id IN NUMBER,
10293 p_fcast_id IN NUMBER ) IS
10294 SELECT activity_metric_fact_id,
10295 previous_fact_id,
10296 forecast_remaining_quantity,
10297 fact_type,
10298 fact_reference,
10299 from_date,
10300 to_date,
10301 incremental_sales,
10302 root_fact_id
10303 FROM ozf_act_metric_facts_all
10304 WHERE arc_act_metric_used_by = 'FCST'
10305 AND act_metric_used_by_id = p_fcast_id
10306 AND previous_fact_id = p_prev_id
10307 order by 6;
10308
10309 CURSOR C_FindSubRecords(p_prev_id IN NUMBER,
10310 p_fcast_id IN NUMBER ) IS
10311 SELECT activity_metric_fact_id,
10312 previous_fact_id,
10313 fact_type,
10314 fact_reference,
10315 from_date,
10316 to_date,
10317 incremental_sales,
10318 root_fact_id
10319 FROM ozf_act_metric_facts_all
10320 WHERE arc_act_metric_used_by = 'FCST'
10321 AND act_metric_used_by_id = p_fcast_id
10322 AND previous_fact_id = p_prev_id
10323 AND root_fact_id IS NOT NULL
10324 order by 6;
10325
10326 l_api_version CONSTANT NUMBER := 1.0;
10327 l_api_name CONSTANT VARCHAR2(30) := 'Cascade_Baseline_Update';
10328 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
10329 l_return_status VARCHAR2(1);
10330
10331 BEGIN
10332
10333 IF FND_API.to_boolean(p_init_msg_list) THEN
10334 FND_MSG_PUB.initialize;
10335 END IF;
10336
10337 IF NOT FND_API.compatible_api_call(l_api_version,
10338 p_api_version,
10339 l_api_name,
10340 g_pkg_name)
10341 THEN
10342 RAISE FND_API.g_exc_unexpected_error;
10343 END IF;
10344
10345 x_return_status := FND_API.g_ret_sts_success;
10346
10347 l_delta := p_rem_value;
10348
10349 -- fact_value is the incremental_sales
10350
10351 IF (p_cascade_flag = 4) THEN
10352 -- Cascade_Baseline_Update called directly (not from Cascade_baseline_levels)
10353 -- Get the fact value for the parent
10354 SELECT incremental_sales, tpr_percent, fact_type
10355 INTO l_parent_fact_value, l_tpr_percent, l_fact_type
10356 FROM ozf_act_metric_facts_all
10357 WHERE arc_act_metric_used_by = 'FCST'
10358 AND act_metric_used_by_id = p_fcast_id
10359 AND activity_metric_fact_id = p_id;
10360
10361 IF ( l_fact_type = 'PRODUCT' AND p_tpr_percent <> l_tpr_percent ) THEN
10362 adjust_baseline_spreads(l_api_version,
10363 p_init_msg_list,
10364 p_commit,
10365 p_obj_type,
10366 p_obj_id,
10367 p_fcast_id,
10368 p_id,
10369 p_tpr_percent,
10370 l_new_incr,
10371 l_return_status,
10372 x_msg_count,
10373 x_msg_data
10374 );
10375
10376 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10377 RAISE FND_API.G_EXC_ERROR;
10378 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10379 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10380 END IF;
10381
10382 GOTO end_of_cascade_baseline_update;
10383
10384 END IF;
10385
10386 IF ( p_value = l_parent_fact_value) THEN
10387 l_cascade_flag := 0;
10388 ELSIF (p_value <> l_parent_fact_value) THEN
10389 l_cascade_flag := 1;
10390 END IF;
10391
10392 ELSIF (p_cascade_flag <> 4) THEN
10393 -- Cascade_Baseline_Update called from Cascade_baseline_levels procedure
10394 l_cascade_flag := p_cascade_flag;
10395 END IF;
10396
10397 --Only do something if values have been changed
10398 IF ( l_cascade_flag <> 0 ) THEN
10399
10400 SELECT count(*), sum(incremental_sales)
10401 INTO l_temp_count, l_fact_value_sum_all_recs
10402 FROM ozf_act_metric_facts_all
10403 WHERE arc_act_metric_used_by = 'FCST'
10404 AND act_metric_used_by_id = p_fcast_id
10405 AND previous_fact_id = p_id;
10406
10407 SELECT incremental_sales, forecast_remaining_quantity
10408 INTO l_current_fact_value, l_total_rem_value
10409 FROM ozf_act_metric_facts_all
10410 WHERE arc_act_metric_used_by = 'FCST'
10411 AND act_metric_used_by_id = p_fcast_id
10412 AND activity_metric_fact_id = p_id;
10413
10414 l_delta := p_value - l_current_fact_value + l_total_rem_value;
10415
10416 -- Loop through possible existing second level facts
10417 FOR facts_record IN C_FindRecords(p_id, p_fcast_id) LOOP
10418 -- Increment the counter to check for the last record in each set
10419 l_temp_counter := l_temp_counter + 1;
10420 l_fact_value := 0;
10421
10422 IF (l_temp_counter <> l_temp_count) THEN
10423 --(old Incr / (total old incr) * l_delta) + old Incr
10424 IF (l_fact_value_sum_all_recs = 0) THEN
10425 l_fact_value := round(facts_record.incremental_sales * l_delta);
10426 ELSE
10427 l_fact_value := round(facts_record.incremental_sales / l_fact_value_sum_all_recs * l_delta);
10428 END IF;
10429 l_fact_value := l_fact_value + facts_record.incremental_sales;
10430
10431 ELSIF (l_temp_counter = l_temp_count) THEN
10432 -- Last record in the current set with the given previous_fact_id.
10433 -- Counter reset to 0 for the next set of records with another previous_fact_id
10434 l_temp_counter := 0;
10435
10436 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
10437 SELECT NVL(sum(incremental_sales),0)
10438 INTO l_fval_sum_minus_last_rec
10439 FROM ozf_act_metric_facts_all
10440 WHERE arc_act_metric_used_by = 'FCST'
10441 AND act_metric_used_by_id = p_fcast_id
10442 AND previous_fact_id = facts_record.previous_fact_id
10443 AND activity_metric_fact_id <> facts_record.activity_metric_fact_id ;
10444
10445 l_fact_value := round(p_value - l_fval_sum_minus_last_rec);
10446
10447 END IF;
10448
10449 l_rem_value := l_fact_value - facts_record.incremental_sales + facts_record.forecast_remaining_quantity;
10450
10451 -- update the Remaining to Forecast only it is no the last level. Else, set it to 0.
10452 UPDATE ozf_act_metric_facts_all
10453 SET incremental_sales = l_fact_value
10454 --forecast_remaining_quantity = decode(sign(l_rem_value), -1, decode(root_fact_id,NULL,l_rem_value, 0),0)
10455 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
10456
10457 l_temp_parent_fact_value := l_fact_value;
10458
10459 -- cascade the changes down always
10460 --IF (l_rem_value > 0) THEN
10461
10462 -- Loop through possible existing third level facts
10463 FOR facts_subrecord IN C_FindSubRecords(facts_record.activity_metric_fact_id, p_fcast_id) LOOP
10464 IF (l_temp_sub_previous_fact_id <> facts_subrecord.previous_fact_id) THEN
10465 SELECT count(*), sum(incremental_sales)
10466 INTO l_temp_sub_count, l_fact_value_sum_all_sub_recs
10467 FROM ozf_act_metric_facts_all
10468 WHERE arc_act_metric_used_by = 'FCST'
10469 AND act_metric_used_by_id = p_fcast_id
10470 AND previous_fact_id = facts_subrecord.previous_fact_id
10471 AND root_fact_id IS NOT NULL;
10472
10473 l_temp_sub_previous_fact_id := facts_subrecord.previous_fact_id;
10474 END IF;
10475
10476 -- Increment the counter to check for the last record in each set
10477 l_temp_sub_counter := l_temp_sub_counter + 1;
10478
10479 IF (l_temp_sub_counter <> l_temp_sub_count) THEN
10480
10481 --(old Incr / (total old incr) * l_rem_value) + old Incr
10482 IF (l_fact_value_sum_all_sub_recs = 0) THEN
10483 l_fact_value := round(facts_subrecord.incremental_sales * l_rem_value);
10484 ELSE
10485 l_fact_value := round(facts_subrecord.incremental_sales / l_fact_value_sum_all_sub_recs * l_rem_value);
10486 END IF;
10487 l_fact_value := l_fact_value + facts_subrecord.incremental_sales;
10488
10489 ELSIF (l_temp_sub_counter = l_temp_sub_count) THEN
10490 -- Last record in the current set with the given previous_fact_id.
10491 -- Counter reset to 0 for the next set of records with another previous_fact_id
10492 l_temp_sub_counter := 0;
10493
10494 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
10495 SELECT NVL(sum(incremental_sales),0)
10496 INTO l_fval_sum_minus_last_rec
10497 FROM ozf_act_metric_facts_all
10498 WHERE arc_act_metric_used_by = 'FCST'
10499 AND act_metric_used_by_id = p_fcast_id
10500 AND previous_fact_id = facts_subrecord.previous_fact_id
10501 AND root_fact_id IS NOT NULL
10502 AND activity_metric_fact_id <> facts_subrecord.activity_metric_fact_id ;
10503
10504 l_fact_value := round(l_temp_parent_fact_value - l_fval_sum_minus_last_rec);
10505
10506 END IF;
10507
10508 UPDATE ozf_act_metric_facts_all
10509 SET incremental_sales = l_fact_value
10510 WHERE activity_metric_fact_id = facts_subrecord.activity_metric_fact_id;
10511
10512 END LOOP; -- subrecord
10513
10514 --END IF;
10515
10516 END LOOP; --fact_record
10517
10518 END IF;
10519
10520 <<end_of_cascade_baseline_update>>
10521
10522 IF (OZF_DEBUG_HIGH_ON) THEN
10523
10524 OZF_Utility_PVT.debug_message(l_full_name || ': End cascade baseline update');
10525
10526 END IF;
10527
10528 EXCEPTION
10529 WHEN OTHERS THEN
10530 x_return_status := FND_API.g_ret_sts_unexp_error;
10531
10532 FND_MESSAGE.set_name('OZF', 'OZF_OFFER_PARTY_STMT_FAILED');
10533 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
10534 FND_MSG_PUB.add;
10535
10536 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
10537 THEN
10538 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
10539 END IF;
10540
10541 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
10542 p_count => x_msg_count,
10543 p_data => x_msg_data);
10544
10545 END cascade_baseline_update;
10546
10547 PROCEDURE cascade_baseline_levels(
10548 p_api_version IN NUMBER,
10549 p_init_msg_list IN VARCHAR2 := FND_API.g_false,
10550 p_commit IN VARCHAR2 := FND_API.g_false,
10551 p_fcast_value IN NUMBER,
10552 p_fcast_id IN NUMBER,
10553 p_cascade_flag IN NUMBER,
10554 p_obj_type IN VARCHAR2,
10555 p_obj_id IN NUMBER,
10556 x_return_status OUT NOCOPY VARCHAR2,
10557 x_msg_count OUT NOCOPY NUMBER,
10558 x_msg_data OUT NOCOPY VARCHAR2
10559 )
10560 IS
10561
10562 l_total_fcst_value NUMBER := 0;
10563 l_total_base_qty NUMBER := 0;
10564
10565 l_fact_percent NUMBER := 0;
10566 l_fact_value NUMBER := 0;
10567 l_rem_value NUMBER := 0;
10568 l_total_rem_value NUMBER := 0;
10569 l_delta NUMBER := 0;
10570
10571 l_temp_count NUMBER := 0;
10572 l_temp_counter NUMBER := 0;
10573 l_fact_value_sum_all_recs NUMBER := 0;
10574 l_fval_sum_minus_last_rec NUMBER := 0;
10575 l_tpr_percent NUMBER := 0;
10576
10577 CURSOR C_LevelOneRecords(p_forecast_id IN NUMBER) IS
10578 SELECT activity_metric_fact_id,
10579 previous_fact_id,
10580 forecast_remaining_quantity,
10581 fact_type,
10582 fact_reference,
10583 from_date,
10584 to_date,
10585 incremental_sales,
10586 root_fact_id
10587 FROM ozf_act_metric_facts_all
10588 WHERE arc_act_metric_used_by = 'FCST'
10589 AND act_metric_used_by_id = p_forecast_id
10590 AND previous_fact_id IS NULL
10591 AND root_fact_id IS NULL
10592 order by 6;
10593
10594 l_api_version CONSTANT NUMBER := 1.0;
10595 l_api_name CONSTANT VARCHAR2(30) := 'Cascade_baseline_levels';
10596 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
10597 l_return_status VARCHAR2(1);
10598
10599 BEGIN
10600 IF (OZF_DEBUG_HIGH_ON) THEN
10601 OZF_Utility_PVT.debug_message(l_full_name || ': Start Cascade Baseline Levels');
10602 END IF;
10603
10604 IF FND_API.to_boolean(p_init_msg_list) THEN
10605 FND_MSG_PUB.initialize;
10606 END IF;
10607
10608 IF NOT FND_API.compatible_api_call(l_api_version,
10609 p_api_version,
10610 l_api_name,
10611 g_pkg_name)
10612 THEN
10613 RAISE FND_API.g_exc_unexpected_error;
10614 END IF;
10615
10616 x_return_status := FND_API.g_ret_sts_success;
10617
10618 -- fact_value is the incremental_sales
10619
10620 SELECT forecast_quantity, base_quantity, forecast_remaining_quantity
10621 INTO l_total_fcst_value, l_total_base_qty, l_total_rem_value
10622 FROM ozf_act_forecasts_all
10623 WHERE forecast_id = p_fcast_id;
10624
10625 SELECT count(*), sum(incremental_sales)
10626 INTO l_temp_count, l_fact_value_sum_all_recs
10627 FROM ozf_act_metric_facts_all
10628 WHERE arc_act_metric_used_by = 'FCST'
10629 AND act_metric_used_by_id = p_fcast_id
10630 AND previous_fact_id IS NULL
10631 AND root_fact_id IS NULL;
10632
10633 l_delta := p_fcast_value - l_total_fcst_value + l_total_rem_value;
10634
10635 FOR facts_record IN C_LevelOneRecords(p_fcast_id) LOOP
10636
10637 -- Increment the counter to check for the last record in each set
10638 l_temp_counter := l_temp_counter + 1;
10639 l_fact_value := 0;
10640
10641 IF (l_temp_counter <> l_temp_count) THEN
10642 -- here l_delta = NewTF - OldTF + Rem
10643 --(old Incr / (total old incr) * (NewTF - OldTF + Rem) ) + old Incr
10644 --(old Incr / (total old incr) * Parent's Rem Qty) + old Incr
10645 IF (l_fact_value_sum_all_recs = 0) THEN
10646 l_fact_value := round(facts_record.incremental_sales * l_delta);
10647 ELSE
10648 l_fact_value := round(facts_record.incremental_sales / l_fact_value_sum_all_recs * l_delta);
10649 END IF;
10650 l_fact_value := l_fact_value + facts_record.incremental_sales;
10651
10652 ELSIF (l_temp_counter = l_temp_count) THEN
10653
10654 --Calculating the l_fval_sum_minus_last_rec since this is the last record in this set
10655 SELECT NVL(sum(incremental_sales),0)
10656 INTO l_fval_sum_minus_last_rec
10657 FROM ozf_act_metric_facts_all
10658 WHERE arc_act_metric_used_by = 'FCST'
10659 AND act_metric_used_by_id = p_fcast_id
10660 AND previous_fact_id IS NULL
10661 AND root_fact_id IS NULL
10662 AND activity_metric_fact_id <> facts_record.activity_metric_fact_id ;
10663
10664 -- base_quantity is subtracted from new TF to get the Incr value of the header
10665 l_fact_value := round(p_fcast_value - l_total_base_qty - l_fval_sum_minus_last_rec);
10666
10667 END IF;
10668
10669 l_rem_value := l_fact_value - facts_record.incremental_sales + facts_record.forecast_remaining_quantity;
10670
10671 -- cascade the changes down always
10672 --IF (l_rem_value > 0) THEN
10673 -- call Cascade_Baseline_Update with the proper cascade flag
10674 cascade_baseline_update(p_api_version,
10675 p_init_msg_list,
10676 p_commit,
10677 facts_record.activity_metric_fact_id,
10678 l_fact_value,
10679 p_fcast_id,
10680 l_rem_value,
10681 p_cascade_flag,
10682 l_tpr_percent,
10683 p_obj_type,
10684 p_obj_id,
10685 x_return_status,
10686 x_msg_count,
10687 x_msg_data
10688 );
10689
10690 UPDATE ozf_act_metric_facts_all
10691 SET incremental_sales = l_fact_value
10692 --forecast_remaining_quantity = decode(sign(l_rem_value), -1, l_rem_value, 0)
10693 WHERE activity_metric_fact_id = facts_record.activity_metric_fact_id;
10694
10695 END LOOP;
10696
10697 UPDATE ozf_act_forecasts_all
10698 SET forecast_quantity = p_fcast_value
10699 WHERE forecast_id = p_fcast_id;
10700
10701 IF (OZF_DEBUG_HIGH_ON) THEN
10702 OZF_Utility_PVT.debug_message(l_full_name || ': End Cascade Baseline Levels');
10703 END IF;
10704
10705 EXCEPTION
10706 WHEN OTHERS THEN
10707 x_return_status := FND_API.g_ret_sts_unexp_error;
10708
10709 FND_MESSAGE.set_name('OZF', 'OZF_OFFER_PARTY_STMT_FAILED');
10710 FND_MESSAGE.set_token('ERR_MSG',SQLERRM);
10711 FND_MSG_PUB.add;
10712
10713 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error)
10714 THEN
10715 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
10716 END IF;
10717
10718 FND_MSG_PUB.count_and_get(p_encoded => FND_API.g_false,
10719 p_count => x_msg_count,
10720 p_data => x_msg_data);
10721
10722
10723 END cascade_baseline_levels;
10724
10725 END OZF_FORECAST_UTIL_PVT ;