DBA Data[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 ;