DBA Data[Home] [Help]

PACKAGE BODY: APPS.MSC_POST_PRO

Source


1 PACKAGE BODY MSC_POST_PRO
2 -- $Header: MSCPOSTB.pls 120.8.12010000.5 2008/11/28 10:05:26 sbnaik ship $
3 AS
4 
5 MAXVALUE                CONSTANT NUMBER := 999999;
6 
7 PG_DEBUG VARCHAR2(1) := NVL(FND_PROFILE.value('MSC_ATP_DEBUG'), 'N');
8 
9 -- for summary enhancement
10 G_ALLOC_ATP                     VARCHAR2(1);
11 G_CLASS_HRCHY                   NUMBER;
12 G_ALLOC_METHOD                  NUMBER;
13 
14 -- Declaration of new private procedures for summary enhancement - Begin
15 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id        IN NUMBER,
16                                 p_applsys_schema        IN varchar2);
17 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id               IN NUMBER,
18                                 p_share_partition       IN varchar2,
19                                 p_optimized_plan        IN NUMBER,  -- 1:Yes, 2:No
20                                 p_full_refresh          IN NUMBER,  -- 1:Yes, 2:No
21                                 p_time_phased_pf        IN NUMBER,  -- 1:Yes, 2:No
22                                 p_plan_type             IN NUMBER,  -- ATP4drp
23                                 p_last_refresh_number   IN NUMBER,
24                                 p_new_refresh_number    IN NUMBER,
25                                 p_sys_date              IN DATE);
26 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id                  IN NUMBER,
27                              p_sys_date                 IN DATE);
28 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id            IN NUMBER,
29                                    p_sys_date           IN DATE);
30 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id         IN NUMBER,
31                                       p_sys_date        IN DATE);
32 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id          IN NUMBER,
33                                      p_sys_date         IN DATE);
34 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id       IN NUMBER,
35                                         p_sys_date      IN DATE);
36 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id                   IN NUMBER,
37                             p_last_refresh_number       IN NUMBER,
38                             p_new_refresh_number        IN NUMBER,
39                             p_sys_date                  IN DATE);
40 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id                 IN NUMBER,
41                               p_last_refresh_number     IN NUMBER,
42                               p_new_refresh_number      IN NUMBER,
43                               p_time_phased_pf          IN NUMBER,  -- 1:Yes, 2:No
44                               p_sys_date                IN DATE);
45 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id                  IN NUMBER,
46                              p_sys_date                 IN DATE);
47 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id                   IN NUMBER,
48                             p_last_refresh_number       IN NUMBER,
49                             p_new_refresh_number        IN NUMBER,
50                             p_sys_date                  IN DATE);
51 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id           IN NUMBER,
52                                     p_plan_start_date   IN DATE,
53                                     p_sys_date          IN DATE);
54 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id             IN NUMBER,
55                                   p_plan_start_date     IN DATE,
56                                   p_sys_date            IN DATE);
57 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id         IN NUMBER,
58                                       p_plan_start_date IN DATE,
59                                       p_sys_date        IN DATE);
60 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id           IN NUMBER,
61                                     p_plan_start_date   IN DATE,
62                                     p_sys_date          IN DATE);
63 PROCEDURE LOAD_RES_DATA_NET(p_plan_id                   IN NUMBER,
64                             p_last_refresh_number       IN NUMBER,
65                             p_new_refresh_number        IN NUMBER,
66                             p_sys_date                  IN DATE);
67 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id              IN NUMBER,
68                                  p_share_partition      IN varchar2);
69 -- Declaration of new private procedures for summary enhancement - End
70 
71 
72 
73 PROCEDURE LOAD_SUPPLY_DEMAND ( ERRBUF             OUT    NoCopy VARCHAR2,
74                               RETCODE           OUT    NoCopy NUMBER,
75                               P_INSTANCE_ID      IN     NUMBER,
76                               P_COLLECT_TYPE     IN     NUMBER)
77 AS
78 
79 -- p_collect type is used to decide on what entity do we need to do full refresh on:
80 --   1-  Full refresh on Sales Orders -- ATP is not available
81 --   2-  Full refresh on supply/demands-- ATP is available
82 --   3-  Full refresh on both S/O and S/D -- ATP is not available
83 
84         atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
85                                         'ATP_SUMMARY_SO',
86                                         'ATP_SUMMARY_SD');
87 	l_instance_id  number;
88        	i number;
89 	l_org_ids MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
90 	i integer;
91 	l_sql_stmt               	varchar2(3000);
92         l_sql_stmt_1		 	varchar2(3000);
93 	l_applsys_schema         	varchar2(10);
94         l_msc_schema             	VARCHAR2(30);
95         l_retval                	BOOLEAN;
96         dummy1                  	varchar2(10);
97         dummy2                  	varchar2(10);
98         l_count				number;
99 	l_sysdate_seq_num               NUMBER;
100 	l_default_atp_rule_id           NUMBER;
101 	l_calendar_code                 VARCHAR2(14);
102 	l_calendar_exception_set_id     NUMBER;
103 	l_default_demand_class          VARCHAR2(34);
104         l_organization_id		number;
105         l_inv_ctp			number;
106         l_partition_name 		varchar2(30);
107         l_table_name                varchar2(30);
108         l_ret_code                      number;
109         l_err_msg			varchar2(1000);
110         l_summary_flag                  number;
111         l_enable_summary_mode           varchar2(1);
112         l_sys_date		        date;
113         l_user_id                       number;
114 
115         l_org_code                      VARCHAR2(7);
116         l_sys_next_date                 date;
117         -- Bug 2516506
118         l_instance_code                 varchar2(3);
119         -- rajjain 12/20/2002
120         l_spid                          VARCHAR2(12);
121 
122 BEGIN
123         -- Bug 3304390 Disable Trace
124         -- Deleted Related code.
125 
126         l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
127         msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
128 
129         l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
130         msc_util.msc_log(' l_enable_summary_mode := ' || l_enable_summary_mode);
131         IF l_enable_summary_mode <> 'Y' THEN
132             msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
133             RETCODE := G_WARNING;
134             RETURN;
135         END IF;
136 
137         IF l_inv_ctp = 4 THEN
138             -- we are not doing ODS ATP so we wont  continue
139             msc_util.msc_log('Not Doing ODS ATP. Please check profile - INV: Capable to Promise. Will Exit ');
140             RETCODE := G_WARNING;
141             RETURN;
142         ELSIF l_inv_ctp <> 5 THEN
143 	    l_inv_ctp := 5;
144         END IF;
145 
146         -- Bug 2516506 - get instance_code as well
147         -- SELECT NVL(summary_flag, 1)
148         -- into   l_summary_flag
149         SELECT NVL(summary_flag, 1), instance_code
150         into   l_summary_flag, l_instance_code
151         FROM   msc_apps_instances
152         where  instance_id = p_instance_id;
153 
154         msc_util.msc_log('l_summary_flag := ' || l_summary_flag);
155         -- 2301524: Summary is not supported for sites using backlog workbench
156         IF l_summary_flag = 200 THEN
157             msc_util.msc_log('Site is Using backlog workbench');
158             msc_util.msc_log('Summary Approach is not supported for sites using  backlog workbench');
159             RETCODE := G_WARNING;
160             RETURN;
161         ELSIF l_summary_flag = 2 THEN
162            msc_util.msc_log('Full summary is in  progress for the same instance by other session');
163            RETCODE := G_ERROR;
164            RETURN;
165         ELSIF ((P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 2)) and (NVL(l_summary_flag, 1) <> 3) THEN
166            msc_util.msc_log('Tables have not been succefully summarized. Net Change/ Targeted summarization'
167                                 || '  can not be run without sucessfully running complete summarization ');
168            RETCODE := G_ERROR;
169            RETURN;
170         END IF;
171 
172         msc_util.msc_log('sr_instance_id := ' || P_INSTANCE_ID);
173         msc_util.msc_log('Collection _type := ' || P_COLLECT_TYPE);
174         RETCODE := G_SUCCESS;
175 	msc_util.msc_log('Begin Post Processing');
176 	l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
177 	SELECT  a.oracle_username
178       	INTO    l_msc_schema
179       	FROM    FND_ORACLE_USERID a,
180                 FND_PRODUCT_INSTALLATIONS b
181       	WHERE   a.oracle_id = b.oracle_id
182       	AND     b.application_id = 724;
183 
184         msc_util.msc_log('l_applsys_schema ;= ' || l_applsys_schema);
185         msc_util.msc_log('dummy1 := ' || dummy1);
186         msc_util.msc_log('dummy2 := ' || dummy2);
187         msc_util.msc_log('l_msc_schema := ' || l_msc_schema);
188 
189         --check whether the partitions exist in tables or not. In not then error out
190 
191         IF (P_COLLECT_TYPE = 3) THEN
192            --- for full collection, check if  partition exist or not
193            --  if partition doesn't exist for partial chnage then we wont make this far
194            FOR i in 1..atp_summ_tab.count LOOP
195               l_table_name := 'MSC_' || atp_summ_tab(i);
196               l_partition_name :=  atp_summ_tab(i)|| '__' || p_instance_id;
197               BEGIN
198                   SELECT count(*)
199                   INTO l_count
200 		  --bug 2495962: Change refrence from dba_xxx to all_xxx tables
201                   --FROM DBA_TAB_PARTITIONS
202                   FROM ALL_TAB_PARTITIONS
203                   WHERE TABLE_NAME = l_table_name
204                   AND   PARTITION_NAME = l_partition_name
205                   AND   table_owner = l_msc_schema;
206                   EXCEPTION
207                      WHEN OTHERS THEN
208                         msc_util.msc_log('Inside Exception');
209                         l_count := 0;
210               END;
211               IF  (l_count = 0) THEN
212                   -- Bug 2516506
213                   FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_INS_PARTITION_MISSING');
214                   FND_MESSAGE.SET_TOKEN('INSTANCE_CODE', l_instance_code);
215                   FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
216                   msc_util.msc_log(FND_MESSAGE.GET);
217                   RETCODE := G_ERROR;
218                   RETURN;
219               END IF;
220            END LOOP;
221         END IF;
222 
223        --- update the tbl_status so that user can't do ATP in full refresh mode
224        IF  (P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 3) THEN
225           BEGIN
226               UPDATE msc_apps_instances
227               set    so_tbl_status = 2,
228                      summary_flag = 2
229               where  instance_id = p_instance_id;
230 
231               -- commit the change
232              commit;
233           END;
234        END IF;
235 
236         l_sys_date := sysdate;
237         l_user_id  := FND_GLOBAL.USER_ID;
238         msc_util.msc_log('l_sys_date := ' || l_sys_date);
239         msc_util.msc_log('l_user_id := ' || l_user_id);
240 
241         /* rajjain 02/17/2003 GOP Performance Improvement - ODS Summary changes begin
242          * Now we do summarization for all the organizations in one go*/
243         IF  (p_collect_type = 1) OR (p_collect_type = 3) THEN
244                 msc_util.msc_log('Sales Order, should be full collection');
245 
246                 INSERT INTO MSC_TEMP_SUMM_SO (
247                             organization_id,
248                             inventory_item_id,
249                             demand_class,
250                             sd_date,
251                             sd_qty,
252                             plan_id,
253                             sr_instance_id,
254                             last_update_date,
255                             last_updated_by,
256 		            creation_date,
257                             created_by)
258                 (SELECT so.organization_id,
259                         so.inventory_item_id,
260                         so.demand_class,
261                         so.SD_DATE,
262                         sum(so.sd_qty),
263                         -1,
264                         p_instance_id,
265                         l_sys_date,
266                         l_user_id,
267                         l_sys_date,
268                         l_user_id
269                  FROM
270 	         (SELECT
271 	       	         I.organization_id,
272 	       	         I.inventory_item_id,
273 	                 Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1, NVL(D.DEMAND_CLASS,
274 	                    NVL(TP.default_demand_class,'@@@')), '@@@') demand_class,
275 	                 DECODE(D.RESERVATION_TYPE,2,C2.next_date, trunc(D.REQUIREMENT_DATE)) SD_DATE,
276 	                 (D.PRIMARY_UOM_QUANTITY-
277 	                    GREATEST(NVL(D.RESERVATION_QUANTITY,0),
278 	                    D.COMPLETED_QUANTITY)) sd_qty
279 	          FROM
280 	                 MSC_SYSTEM_ITEMS I,
281 	                 MSC_ATP_RULES R,
282 	                 MSC_SALES_ORDERS D,
283 	                 MSC_CALENDAR_DATES C,
284 	                 MSC_CALENDAR_DATES C2,
285 	                 MSC_TRADING_PARTNERS TP
286 	          WHERE   I.ATP_FLAG = 'Y'
287 	          AND     I.ORGANIZATION_ID = TP.SR_TP_ID
288 	          AND     I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
289 	          AND     I.PLAN_ID = -1
290 	          AND     I.BOM_ITEM_TYPE <> 5
291      	          AND     R.RULE_ID  = NVL(I.ATP_RULE_ID,  TP.default_atp_rule_id)
292 	          AND     R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
293 	          AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
294 	          AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
295 	          AND 	 D.ORGANIZATION_ID = I.ORGANIZATION_ID
296 	          AND     D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
297 	          AND     D.DEMAND_SOURCE_TYPE <>
298 	                               DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
299 	          AND     D.PRIMARY_UOM_QUANTITY >
300 	                           GREATEST(NVL(D.RESERVATION_QUANTITY,0),
301 	               	              D.COMPLETED_QUANTITY)
302 	          AND     (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
303 	                        (SELECT S.SUB_INVENTORY_CODE
304 	                         FROM   MSC_SUB_INVENTORIES S
305 	                         WHERE  S.ORGANIZATION_ID=D.ORGANIZATION_ID
306 	                         AND    S.PLAN_ID = I.PLAN_ID
307 	                         AND    S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
308 	                         AND    S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
309 	                       		            1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
310 	                         AND    S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
311 	                      		            2, 1, S.NETTING_TYPE)))
312 	    		         AND         (D.RESERVATION_TYPE = 2
313 	                 	        OR D.PARENT_DEMAND_ID IS NULL
314 	                 	        OR (D.RESERVATION_TYPE = 3 AND
315 	                     		        ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
316 	                      		        (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
317 	          AND     C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
318 	                         NULL, C.PRIOR_SEQ_NUM,
319 	          	        C2.next_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
320 	          AND     C.CALENDAR_CODE = TP.CALENDAR_CODE
321 	          AND     C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
322 	          AND     C.EXCEPTION_SET_ID = -1
323 	          AND     C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
324 	          AND     C2.CALENDAR_CODE = TP.calendar_code
325 	          AND     C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
326 	          AND     C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
327 	          AND     C2.CALENDAR_DATE = TRUNC(l_sys_date)
328 	          AND     TP.SR_INSTANCE_ID = p_instance_id
329 	          AND     TP.PARTNER_TYPE   = 3
330 			       	         ) SO
331                   GROUP BY so.inventory_item_id, so.organization_id, so.demand_class,
332                            so.sd_date, -1, p_instance_id, l_sys_date, l_user_id);
333 
334         END IF;
335         msc_util.msc_log('Load SD details in msc_atp_summary_sd table');
336 
337         IF (P_COLLECT_TYPE= 2 ) OR (P_COLLECT_TYPE= 3 ) THEN
338                 msc_util.msc_log('Load SD Details, ODS Case');
339 
340 		INSERT INTO MSC_TEMP_SUMM_SD (
341                             organization_id,
342                             inventory_item_id,
343                             demand_class,
344                             sd_date,
345                             sd_qty,
346                             plan_id,
347                             sr_instance_id,
348                             last_update_date,
349                             last_updated_by,
350 		            creation_date,
351                             created_by)
352                 (SELECT sd.organization_id,
353                         sd.inventory_item_id,
354                         sd.demand_class,
355                         sd.SD_DATE,
356                         sum(sd.sd_qty),
357                         -1,
358                         p_instance_id,
359                         l_sys_date,
360                         l_user_id,
361                         l_sys_date,
362                         l_user_id
363                  FROM
364 		       (SELECT  I.organization_id,
365 		                DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
366 		                       I.INVENTORY_ITEM_ID) inventory_item_id,
367 		                Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 , NVL(D.DEMAND_CLASS,
368 		                    NVL(TP.default_demand_class,'@@@')), '@@@') demand_class,
369 		                C.PRIOR_DATE SD_DATE, -- 2859130
370 		                -1* D.USING_REQUIREMENT_QUANTITY SD_QTY
371 		        FROM
372 		                MSC_SYSTEM_ITEMS I,
373 		                MSC_SYSTEM_ITEMS I2,
374 		                MSC_ATP_RULES R,
375 		                MSC_DEMANDS D,
376 		                MSC_CALENDAR_DATES C,
377 		                MSC_CALENDAR_DATES C2,
378 		                MSC_TRADING_PARTNERS TP
379 		        WHERE   I.ATP_FLAG = 'Y'
380 		        AND     I.ORGANIZATION_ID = TP.SR_TP_ID
381 		        AND     I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
382 		        AND     I.PLAN_ID = -1
383 		        AND     I.BOM_ITEM_TYPE <> 5
384 		        AND     I.PLAN_ID = I2.PLAN_ID
385 		        AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
386 		        AND     I2.ORGANIZATION_ID = I.ORGANIZATION_ID
387 		        AND     I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID,
388 		                                                I.INVENTORY_ITEM_ID)
389 		        AND     R.RULE_ID  = NVL(I.ATP_RULE_ID ,TP.default_atp_rule_id)
390 		        AND     R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
391 		        AND     D.PLAN_ID = I.PLAN_ID
392 		        AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
393 		        AND     D.INVENTORY_ITEM_ID =  I.INVENTORY_ITEM_ID
394 		        AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
395 		        AND     USING_REQUIREMENT_QUANTITY <> 0
396 		        AND     D.ORIGINATION_TYPE in (
397 		                   DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
398 		                   DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
399 		                   DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
400 		                   DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
401 		                   DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
402 		        AND     C.CALENDAR_CODE = TP.calendar_code
403 		        AND     C.EXCEPTION_SET_ID = -1
404 		        AND     C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
405 		        AND     C.CALENDAR_DATE BETWEEN TRUNC(D.USING_ASSEMBLY_DEMAND_DATE)
406 		                        AND TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
407 		                                   D.USING_ASSEMBLY_DEMAND_DATE))
408 		        AND     C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
409 		                   NULL, C.PRIOR_SEQ_NUM,
410 		                   C2.next_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
411 		        AND     C2.CALENDAR_CODE = TP.calendar_code
412 		        AND     C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
413 		        AND     C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
414 		        AND     C2.CALENDAR_DATE = TRUNC(l_sys_date)
415 		        AND     TP.SR_INSTANCE_ID = p_instance_id
416 		        AND     TP.PARTNER_TYPE   = 3
417 		   UNION ALL
418 		      SELECT
419 		              I.organization_id,
420 		              I.inventory_item_id,
421 		              Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
422 		                    NVL(DECODE(S.ORDER_TYPE, 5,
423 		                MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
424 		                S.DEMAND_CLASS), NVL(TP.default_demand_class, '@@@')), '@@@')
425 		                demand_class,
426 		              C.NEXT_DATE SD_DATE, -- 2859130 remove trunc
427 		              Decode(order_type, -- 2859130 remove trunc
428 		                 30, Decode(Sign(S.Daily_rate * (C.Calendar_date -
429 		                 TRUNC(S.FIRST_UNIT_START_DATE))- S.qty_completed),
430 		                -1,S.Daily_rate*(C.Calendar_date - TRUNC(S.First_Unit_Start_date)+1)
431 		                           - S.qty_completed, S.Daily_rate),
432 		                           NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) ) SD_QTY
433 		      FROM
434 		              MSC_SYSTEM_ITEMS I,
435 		              MSC_SYSTEM_ITEMS I2,
436 		              MSC_ATP_RULES R,
437 		              MSC_SUPPLIES S,
438 		              MSC_SUB_INVENTORIES MSI,
439 		              MSC_CALENDAR_DATES C,
440 		              MSC_CALENDAR_DATES C2,
441 		              MSC_TRADING_PARTNERS TP
442 		     WHERE   I.ATP_FLAG = 'Y'
443 		     AND     I.ORGANIZATION_ID = TP.SR_TP_ID
444 		     AND     I.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
445 		     AND     I.PLAN_ID = -1
446 		     AND     I.PLAN_ID = I2.PLAN_ID
447 		     AND     I.ORGANIZATION_ID = I2.ORGANIZATION_ID
448 		     AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
449 		     AND     NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) =
450 		                  I2.INVENTORY_ITEM_ID
451 		     AND     DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
452 		     AND     R.RULE_ID  = NVL(I.ATP_RULE_ID, TP.default_atp_rule_id)
453 		     AND     R.SR_INSTANCE_ID = I.SR_INSTANCE_ID
454 		     AND     S.PLAN_ID = I.PLAN_ID
455 		     AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
456 		     AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
457 		     AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
458                      -- 2859130 remove trunc
459 		     AND     Decode(S.order_type, 30, S.Daily_rate*
460 		                  (C.Calendar_date - TRUNC(S.First_Unit_Start_date) + 1) ,
461 		                  NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)) >
462 		                  Decode(S.order_type, 30, S.qty_completed,0)
463 		     AND     (S.ORDER_TYPE IN (
464 		                   DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
465 		                   DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
466 		                   DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
467 		                   DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
468 		                   DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
469 		                   DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1),
470 		                   DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
471 		                   DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
472 		                   DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
473 		                   DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
474 		                   DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
475 		                   DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1),
476 		                   DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
477 		                   DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
478 		               OR
479 		                   ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
480 		                   S.ORDER_TYPE = 5
481 		               AND exists (SELECT '1'
482 		                      FROM    MSC_DESIGNATORS
483 		                      WHERE   INVENTORY_ATP_FLAG = 1
484 		                      AND     DESIGNATOR_TYPE = 2
485 		                      AND     DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
486 		    AND      C.CALENDAR_CODE = TP.calendar_code
487 		    AND      C.EXCEPTION_SET_ID = TP.calendar_exception_set_id
488 		    AND      C.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
489 		    AND      C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,
490 		                       S.NEW_SCHEDULE_DATE))
491 		                   AND   TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE,
492 		                       NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
493 		    AND      DECODE(S.LAST_UNIT_COMPLETION_DATE,
494 		                    NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
495 		    AND      C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
496 		                  DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
497 		                  NULL, C.NEXT_SEQ_NUM,
498 		                  C2.next_seq_num - NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
499 		    AND      C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(SYSDATE),
500 		                                        28, TRUNC(SYSDATE),
501 		                             C.NEXT_DATE)   -- to_date removed to avoid GSCC error
502 		    AND     MSI.plan_id (+) =  -1
503 		    AND     MSI.organization_id (+) = S.ORGANIZATION_ID
504 		    AND     MSI.sr_instance_id (+) =  S.sr_instance_id
505 		    AND     MSI.sub_inventory_code (+) = S.subinventory_code
506 		    AND     NVL(MSI.inventory_atp_code,1) <> 2
507 		    AND     C2.CALENDAR_CODE = TP.calendar_code
508 		    AND     C2.EXCEPTION_SET_ID = TP.calendar_exception_set_id
509 		    AND     C2.SR_INSTANCE_ID = TP.SR_INSTANCE_ID
510 		    AND     C2.CALENDAR_DATE = TRUNC(l_sys_date)
511 		    AND     TP.SR_INSTANCE_ID = p_instance_id
512 		    AND     TP.PARTNER_TYPE   = 3
513 		   ) SD
514                  GROUP BY sd.inventory_item_id, sd.organization_id, sd.demand_class,
515                            sd.sd_date, -1, p_instance_id, l_sys_date, l_user_id);
516 
517         END IF;
518 	-- rajjain 02/17/2003 GOP Performance Improvement - ODS Summary changes end
519 
520 	---exchange  partition
521         IF  (P_COLLECT_TYPE = 1) OR (P_COLLECT_TYPE = 3)  THEN
522 	   msc_util.msc_log('Swap partition for Slaes Orders. Only for full collection');
523            ---- Create index on MSC_ATP_SUMMARY_SO
524            BEGIN
525               msc_util.msc_log('Create index on MSC_TEMP_SUMM_SO');
526               l_sql_stmt_1 := 'create UNIQUE index MSC_TEMP_SUMM_SO_N1 on MSC_TEMP_SUMM_SO ' ||
527                '
528                -- NOLOGGING
529               (sr_instance_id, organization_id, inventory_item_id, sd_date, demand_class)
530               storage(INITIAL 40K NEXT 2M PCTINCREASE 0)'; --tablespace ' || l_tbspace(i);
531               msc_util.msc_log('Before create index on MSC_atp_summary_so: ');
532               ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
533                		   APPLICATION_SHORT_NAME => 'MSC',
534                		   STATEMENT_TYPE => ad_ddl.create_index,
535                		   STATEMENT => l_sql_stmt_1,
536                		   OBJECT_NAME => 'MSC_TEMP_SUMM_SO');
537            END;
538            --analyze temp table
539            fnd_stats.gather_table_stats('MSC', 'MSC_TEMP_SUMM_SO', granularity => 'ALL');
540 
541            l_partition_name := 'ATP_SUMMARY_SO__' || to_char(p_instance_id);
542            msc_util.msc_log('Sales order partition name := ' || l_partition_name);
543            l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SO exchange partition ' || l_partition_name  ||
544            ' with table MSC_TEMP_SUMM_SO'||
545            ' including indexes without validation';
546 
547            BEGIN
548         	   msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SO: ');
549                    ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
550                    APPLICATION_SHORT_NAME => 'MSC',
551                    STATEMENT_TYPE => ad_ddl.alter_table,
552                    STATEMENT => l_sql_stmt,
553                    OBJECT_NAME => 'MSC_ATP_SUMMARY_SO');
554        	   END;
555 	END IF;
556 
557         IF (P_COLLECT_TYPE = 2) OR (P_COLLECT_TYPE = 3) THEN
558            ----swap partiton for supplies and demand part
559            msc_util.msc_log('swap partition for supply-demand');
560            BEGIN
561               l_sql_stmt_1 := 'create unique index MSC_TEMP_SUMM_SD_N1 on MSC_TEMP_SUMM_SD ' ||
562                '
563                -- NOLOGGING
564               (plan_id, sr_instance_id, organization_id,inventory_item_id,sd_date, demand_class)
565               storage(INITIAL 40K NEXT 2M PCTINCREASE 0)'; --tablespace ' || l_tbspace(i);
566               msc_util.msc_log('Before create index on MSC_atp_summary_sd: ');
567               ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
568                		   APPLICATION_SHORT_NAME => 'MSC',
569                		   STATEMENT_TYPE => ad_ddl.create_index,
570                		   STATEMENT => l_sql_stmt_1,
571                		   OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
572            END;
573            ---analyze supply demand table
574            fnd_stats.gather_table_stats('MSC', 'MSC_TEMP_SUMM_SD', granularity => 'ALL');
575 
576            l_partition_name := 'ATP_SUMMARY_SD__' || to_char(p_instance_id) ;
577 
578            msc_util.msc_log('Partition name for msc_atp_summary table sd part := ' || l_partition_name);
579 
580            l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD exchange partition ' || l_partition_name  ||
581            ' with table MSC_TEMP_SUMM_SD'||
582            ' including indexes without validation';
583 
584            BEGIN
585         	   msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_sd: ');
586                    ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
587                    APPLICATION_SHORT_NAME => 'MSC',
588                    STATEMENT_TYPE => ad_ddl.alter_table,
589                    STATEMENT => l_sql_stmt,
590                    OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
591        	   END;
592         END IF;
593 
594         ---- clean tables
595         MSC_POST_PRO.CLEAN_TABLES(l_applsys_schema);
596 
597 	--update the so_tbl_status to 1 so that user can do ATP
598         BEGIN
599            UPDATE msc_apps_instances
600            set    so_tbl_status = 1,
601                   summary_flag = 3
602            where  instance_id = p_instance_id;
603            --- commit the change
604           commit;
605         END;
606 
607 ERRBUF := null;
608 RETCODE := G_SUCCESS;
609 commit;
610 
611 EXCEPTION
612      WHEN OTHERS  THEN
613           msc_util.msc_log('Inside main exception');
614           msc_util.msc_log(sqlerrm);
615           ERRBUF := sqlerrm;
616           RETCODE := G_ERROR;
617           --- clean tables
618           MSC_POST_PRO.CLEAN_TABLES(l_applsys_schema);
619           ----update so_tbl_status
620           BEGIN
621             UPDATE msc_apps_instances
622             set    so_tbl_status = 1,
623                     summary_flag = 1
624             where  instance_id = p_instance_id;
625           END;
626           commit;
627 
628 
629 END LOAD_SUPPLY_DEMAND;
630 
631 -- 24x7
632 -- Function logic modified.
633 PROCEDURE LOAD_PLAN_SD ( ERRBUF                 OUT     NoCopy VARCHAR2,
634                          RETCODE                OUT     NoCopy NUMBER,
635                          p_plan_id              IN      NUMBER,
636                          p_calling_module       IN      NUMBER := 1) /* Bug 3478888 Added input parameter
637                                                                         to identify how ATP Post Plan Processing
638                                                                         has been launched */
639 IS
640 
641 share_partition   		VARCHAR2(1);
642 l_applsys_schema                varchar2(10);
643 l_msc_schema                    VARCHAR2(30);
644 l_retval                        BOOLEAN;
645 dummy1                          varchar2(10);
646 dummy2                          varchar2(10);
647 l_partition_name                varchar2(30);
648 l_table_name			varchar2(30);
649 l_ret_code			number;
650 l_err_msg			varchar2(1000);
651 l_inv_ctp                       number;
652 l_summary_flag			number;
653 l_plan_id                       number;
654 i                               number;
655 l_count				number;
656 l_sysdate                       date;
657 l_user_id                       number;
658 l_alloc_atp   			VARCHAR2(1);
659 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
660                                         'ATP_SUMMARY_SD',
661                                         'ATP_SUMMARY_RES',
662                                         'ATP_SUMMARY_SUP');
663 -- Bug 2516506
664 l_plan_name                     varchar2(10);
665 
666 -- 24x7
667 l_old_plan                      number;
668 l_plan_to_use                   number;
669 l_24_plan                       number;
670 
671 l_new_plan_id                   number;
672 l_new_cp_plan_id                number;
673 l_old_plan_id                   number;
674 l_old_cp_plan_id                number;
675 -- rajjain 12/20/2002
676 l_spid                          VARCHAR2(12);
677 
678 -- 2859130
679 l_optimized_plan                number;
680 l_old_optimized_plan            number;
681 
682 -- time_phased_atp
683 l_member_count                  number;
684 l_return_status                 varchar2(1);
685 l_alloc_type                    number;
686 l_demand_priority               varchar2(1);
687 l_time_phased_pf                number;
688 
689 -- summary enhancement
690 l_plan_start_date               date;
691 -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
692 l_plan_type						NUMBER := 0;
693 l_organization_id       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
694 l_sr_instance_id        MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
695 j                       pls_integer;
696 l_is_cmro               number := 0; --anurodh, bug 7209209
697 BEGIN
698     msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Calling Module: ' || p_calling_module);
699 
700     -- Bug 3304390 Disable Trace
701     -- Commented out
702     -- rajjain 12/20/2002 begin
703     -- IF G_TRACE = 'N' AND PG_DEBUG in ('T', 'C') THEN
704     --    SELECT spid
705     --    INTO   l_spid
706     --    FROM   v$process
707     --    WHERE  addr = (SELECT paddr FROM v$session
708     --                    WHERE audsid=userenv('SESSIONID'));
709     --    msc_util.msc_log('LOAD_PLAN_SD: ' || 'spid: ' || l_spid);
710         -- dbms_session.set_sql_trace(true);
711     --    G_TRACE := 'Y';
712     -- END IF;
713     -- rajjain 12/20/2002 end
714     -- End Bug 3304390 Disable Trace
715 
716     -- For summary enhancement - initiallizing retcode with success
717     RETCODE := G_SUCCESS;
718 
719     l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
720     msc_util.msc_log('LOAD_PLAN_SD: ' || 'inv_ctp := ' || l_inv_ctp);
721     IF l_inv_ctp <> 4 THEN
722         -- we are not doing PDS ATP so we wont  continue
723         msc_util.msc_log('LOAD_PLAN_SD: ' || 'Not Doing PDS ATP. Please check profile - INV: Capable to Promise". Will Exit ');
724         RETCODE := G_WARNING;
725         RETURN;
726     ELSE
727 
728         -- 24x7 Switch
729         msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Trying to see if this is a 24x7 run');
730         msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Plan ID : ' || p_plan_id);
731         BEGIN
732 
733             -- 2859130
734             select  newp.plan_id, NVL(newp.copy_plan_id, -1),
735                     DECODE(newp.plan_type, 4, 2,
736                         DECODE(daily_material_constraints, 1, 1,
737                             DECODE(daily_resource_constraints, 1, 1,
738                                 DECODE(weekly_material_constraints, 1, 1,
739                                     DECODE(weekly_resource_constraints, 1, 1,
740                                         DECODE(period_material_constraints, 1, 1,
741                                             DECODE(period_resource_constraints, 1, 1, 2)
742                                         )
743                                     )
744                                 )
745                             )
746                         )
747                     ),
748                     -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
749                     newp.plan_type
750             into    l_new_plan_id, l_new_cp_plan_id, l_optimized_plan, l_plan_type
751             from    msc_plans newp
752             where   newp.plan_id = p_plan_id;
753 
754         EXCEPTION
755             WHEN NO_DATA_FOUND THEN
756                 msc_util.msc_log('Unable to find plan data');
757                 RETCODE := G_ERROR;
758                 ERRBUF := sqlerrm;
759                 RETURN;
760         END;
761 
762         msc_util.msc_log ('LOAD_PLAN_SD: ' || 'Plan Type : ' || l_plan_type);
763         IF l_plan_type = 4 THEN
764            IF PG_DEBUG in ('Y', 'C') THEN
765            msc_util.msc_log('LOAD_PLAN_SD: Do not Launch process for IO Plan');
766            END IF;
767            RETCODE := G_SUCCESS;
768            RETURN;
769         END IF;
770 
771         -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD from atp_snapshot_hook
772 
773         select  organization_id, sr_instance_id
774         BULK COLLECT INTO l_organization_id, l_sr_instance_id
775         from msc_plan_organizations
776         WHERE plan_id=p_plan_id;
777 
778         --FORALL j IN l_organization_id.first.. l_organization_id.last
779         FOR j IN l_organization_id.first.. l_organization_id.last LOOP
780         UPDATE msc_system_items mst1
781         SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS
782                     FROM msc_system_items mst2
783                     WHERE mst2.sr_instance_id=mst1.sr_instance_id
784                     AND mst2.organization_id=mst1.organization_id
785                     AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
786                     AND mst2.plan_id=-1
787                      )
788         WHERE   plan_id=p_plan_id
789         AND     mst1.ORGANIZATION_ID = l_organization_id(j)
790         AND     mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
791         --populate replenish to order flag for option items as well.
792         AND     mst1.bom_item_type  in (1,2,4,5)
793         --bug 3713374: Missing brackets was making OR condition to be stand alone filtering criteria
794         AND     (mst1.atp_flag <> 'N' OR  mst1.atp_components_flag <> 'N');
795 
796            --5027568
797         msc_util.msc_log('LOAD_PLAN_SD: deleting reservation records from msc_demands'); --5027568
798 
799         Delete MSC_DEMANDS
800         where origination_type = -100
801         and plan_id = p_plan_id
802         and ORGANIZATION_ID = l_organization_id(j)
803         and sr_instance_id = l_sr_instance_id(j);
804 
805         msc_util.msc_log('LOAD_PLAN_SD: no of records deleted: '|| SQL%ROWCOUNT);
806          --5027568, to insert a record for hard reservation in msc_demands.
807 
808         msc_util.msc_log('LOAD_PLAN_SD: populating msc_demands with reservation records');
809 
810         INSERT INTO MSC_DEMANDS(
811                     DEMAND_ID,
812                     USING_REQUIREMENT_QUANTITY,
813                     RESERVED_QUANTITY,
814                     USING_ASSEMBLY_DEMAND_DATE,
815                     DEMAND_TYPE,
816                     DEMAND_SOURCE_TYPE,
817                     ORIGINATION_TYPE,
818                     USING_ASSEMBLY_ITEM_ID,
819                     PLAN_ID,
820                     ORGANIZATION_ID,
821                     INVENTORY_ITEM_ID,
822                     SALES_ORDER_LINE_ID,
823                     SR_INSTANCE_ID,
824                     LAST_UPDATE_DATE,
825                     LAST_UPDATED_BY,
826                     CREATION_DATE,
827                     CREATED_BY,
828                     DEMAND_CLASS,
829                     REFRESH_NUMBER,
830                     ORDER_NUMBER,
831                     APPLIED,
832                     STATUS,
833                     CUSTOMER_ID,
834                     SHIP_TO_SITE_ID,
835                     RECORD_SOURCE,
836                     ATP_SYNCHRONIZATION_FLAG,
837                     DMD_SATISFIED_DATE,
838                     DISPOSITION_ID,
839                     LINK_TO_LINE_ID,
840                     wip_supply_type,
841                     ORIGINAL_ITEM_ID )
842             (select
843                     msc_demands_s.nextval,
844                     RESERVED_QUANTITY,
845                     0, --putting 0 in reserved qty
846                     sysdate, --USING_ASSEMBLY_DEMAND_DATE,
847                     DEMAND_TYPE,
848                     DEMAND_SOURCE_TYPE,
849                     -100, -- putting orgination_type as -100 so that planning UI will not pick it up.
850                     USING_ASSEMBLY_ITEM_ID,
851                     PLAN_ID,
852                     ORGANIZATION_ID,
853                     INVENTORY_ITEM_ID,
854                     SALES_ORDER_LINE_ID,
855                     SR_INSTANCE_ID,
856                     LAST_UPDATE_DATE,
857                     LAST_UPDATED_BY,
858                     CREATION_DATE,
859                     CREATED_BY,
860                     DEMAND_CLASS,
861                     REFRESH_NUMBER,
862                     ORDER_NUMBER,
863                     APPLIED,
864                     STATUS,
865                     CUSTOMER_ID,
866                     SHIP_TO_SITE_ID,
867                     RECORD_SOURCE,
868                     ATP_SYNCHRONIZATION_FLAG,
869                     DMD_SATISFIED_DATE,
870                     DISPOSITION_ID,
871                     LINK_TO_LINE_ID,
872                     wip_supply_type,
873                     ORIGINAL_ITEM_ID
874                     from msc_demands
875                     where plan_id = p_plan_id
876                     and   reserved_quantity <> 0
877                     and   organization_id = l_organization_id(j)
878                     and   sr_instance_id  = l_sr_instance_id(j)
879                     and   origination_type in (30,6)
880                     );
881 
882          msc_util.msc_log('LOAD_PLAN_SD: no of records updated: '|| SQL%ROWCOUNT);
883          END LOOP;
884         --5027568
885 
886         l_plan_to_use := -1;
887         l_24_plan := 0;
888 
889         if l_new_cp_plan_id > 0 then
890             -- the plan that is passed in is the new copy.
891             -- this is what we need to process.
892             -- this will happen when we are called from planning
893             l_plan_to_use := p_plan_id ;
894             l_old_plan := l_new_cp_plan_id;
895             l_24_plan := 1;
896         else
897             -- the plan id we got does not look like a copy.
898             -- check to see if there is a plan with a copy plan_id
899             -- equal to this
900             BEGIN
901 
902                 -- 2859130
903                 select  plan_id,
904                         DECODE(plan_type, 4, 2,
905                             DECODE(daily_material_constraints, 1, 1,
906                                 DECODE(daily_resource_constraints, 1, 1,
907                                     DECODE(weekly_material_constraints, 1, 1,
908                                         DECODE(weekly_resource_constraints, 1, 1,
909                                             DECODE(period_material_constraints, 1, 1,
910                                                 DECODE(period_resource_constraints, 1, 1, 2)
911                                             )
912                                         )
913                                     )
914                                 )
915                             )
916                         )
917                 into    l_old_plan_id, l_old_optimized_plan
918                 from    msc_plans
919                 where   copy_plan_id = p_plan_id;
920             EXCEPTION
921                 when NO_DATA_FOUND then
922                     l_plan_to_use := p_plan_id;
923             END;
924 
925             if (NVL(l_old_plan_id, -1) > 0) then
926                 -- there is a copy plan for this plan
927                 -- we need to use this.
928                 -- this is the case when post_pro is launched
929                 -- as a separate concurrent proram
930                 l_plan_to_use := l_old_plan_id;
931                 l_old_plan := p_plan_id;
932                 l_24_plan := 1;
933                 l_optimized_plan := l_old_optimized_plan; -- 2859130
934                 msc_util.msc_log ('---- A Copy plan found ----');
935                 msc_util.msc_log ('  A copy of the plan for a 24x7 plan run was found');
936                 msc_util.msc_log ('  Switching to that plan ID for future processing');
937                 msc_util.msc_log ('  The plan ID that will be used : ' || l_plan_to_use);
938 
939             else
940                 l_plan_to_use := p_plan_id;
941             end if;
942         end if;
943         msc_util.msc_log ('After processing the plan ID');
944         msc_util.msc_log ('The following plan ID will be used for further post processing');
945         msc_util.msc_log ('Using plan  : ' || l_plan_to_use);
946 
947         --anurodh, bug 7209209 start
948         /* Find out if this is CMRO scenario */
949         FOR j IN l_organization_id.first.. l_organization_id.last LOOP
950           select count(*)
951           into l_is_cmro
952           from msc_sales_orders so
953           where demand_source_type = 100
954           and organization_id=l_organization_id(j)
955           and sr_instance_id = l_sr_instance_id(j);
956 
957           if(l_is_cmro > 0) then
958           	exit;
959           end if;
960         END LOOP;
961 
962         if(l_is_cmro > 0) then
963         	 msc_util.msc_log ('This is a CMRO scenario...');
964            FORALL j IN l_organization_id.first.. l_organization_id.last
965            update msc_demands dem
966            set demand_source_type = (select demand_source_type
967                                      from msc_sales_orders so
968                                      where so.sales_order_number = dem.order_number
969                                        and so.organization_id = dem.organization_id
970                                        and so.sr_instance_id = dem.sr_instance_id
971                                        and so.inventory_item_id = dem.inventory_item_id
972                                      )
973            where organization_id = l_organization_id(j)
974            and sr_instance_id = l_sr_instance_id(j)
975            and origination_type in (6,30)
976            and plan_id = l_plan_to_use;
977         end if;
978         --anurodh, bug 7209209 end
979 
980         -- Begin ATP4drp In case we are dealing with a DRP plan reset variables.
981         IF l_plan_type = 5 THEN
982            G_ALLOC_ATP := 'N';
983            G_CLASS_HRCHY := 2;
984            G_ALLOC_METHOD := 2;
985            -- Do not Call Populate_ATF_Dates for PF ATP.
986            IF PG_DEBUG in ('Y', 'C') THEN
987               msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
988               msc_util.msc_log('G_ALLOC_ATP    := ' || G_ALLOC_ATP);
989               msc_util.msc_log('LOAD_PLAN_SD: DRP Plan Populate ATF_Dates not called');
990               msc_util.msc_log('LOAD_PLAN_SD: G_ALLOC_ATP ' || G_ALLOC_ATP);
991               msc_util.msc_log('LOAD_PLAN_SD: DRP Plan Allocation not supported');
992               msc_util.msc_log('LOAD_PLAN_SD: DRP Plan, Hence Post Plan Pegging not called');
993               msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
994            END IF;
995         ELSE -- Carry out processing for non-DRP plan.
996            G_ALLOC_ATP := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
997            G_CLASS_HRCHY := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
998            G_ALLOC_METHOD := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
999 
1000            msc_util.msc_log('G_ALLOC_ATP    := ' || G_ALLOC_ATP);
1001            msc_util.msc_log('G_CLASS_HRCHY  := ' || G_CLASS_HRCHY);
1002            msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1003            -- time_phased_atp changes begin
1004            /* Populate ATF dates*/
1005            MSC_ATP_PF.Populate_ATF_Dates(l_plan_to_use, l_member_count, l_return_status);
1006 
1007            /* Print error in conc log file if return status is not success*/
1008            IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1009                msc_util.msc_log('Return status after call to Populate_ATF_Dates is ' || l_return_status);
1010                msc_util.msc_log(' ');
1011                msc_util.msc_log('******************************************************************');
1012                msc_util.msc_log('*                            WARNING                             *');
1013                msc_util.msc_log('*  Please note that the results of post plan processing may not  *');
1014                msc_util.msc_log('*  be accurate for product family/product family member items.   *');
1015                msc_util.msc_log('*  Please re-run ATP Post Plan Processing seperately to ensure   *');
1016                msc_util.msc_log('*  correct ATP results                                           *');
1017                msc_util.msc_log('******************************************************************');
1018                msc_util.msc_log(' ');
1019            END IF;
1020 
1021            /* Call pf_post_plan_proc procedure only if:
1022                o There are finite member items having ATF set up. This is to make sure
1023                  that the customers not using time phased ATP are not affected.
1024            */
1025            IF l_member_count > 0 THEN
1026                msc_util.msc_log('Found finite member items having ATF.');
1027 
1028                IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1029                    msc_util.msc_log('Calling pf_post_plan_proc for pre-allocation, supplies rollup and bucketing');
1030                    l_demand_priority := 'Y';
1031                ELSE
1032                    msc_util.msc_log('Calling pf_post_plan_proc for supplies rollup and bucketing');
1033                    l_demand_priority := 'N';
1034                END IF;
1035                msc_atp_pf.pf_post_plan_proc(ERRBUF, RETCODE, l_plan_to_use, l_demand_priority);
1036            -- time_phased_atp changes end
1037 
1038                -- Begin CTO ODR Simplified Pegging Generation
1039                msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1040 
1041                MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1042 
1043                msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1044                IF RETCODE = G_SUCCESS THEN
1045                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1046                ELSIF RETCODE = G_WARNING THEN
1047                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1048                ELSE
1049                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1050                    -- RETURN;
1051                END IF;
1052                -- End CTO ODR Simplified Pegging Generation
1053 
1054            -- for summary enhancement
1055            ELSIF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1056                -- we are doing Allocated ATP so we need to call post_plan_allocation
1057                msc_util.msc_log('Doing demand priority allocated ATP. Will call post_plan_allocation ');
1058 
1059                msc_post_pro.post_plan_allocation(ERRBUF, RETCODE, l_plan_to_use);
1060 
1061                IF RETCODE <> G_SUCCESS THEN
1062                    msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan allocation failed. Will exit');
1063                    RETURN;
1064                END IF;
1065                msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan allocation completed successfully');
1066 
1067                -- Begin CTO ODR Simplified Pegging Generation
1068                msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1069 
1070                MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1071 
1072                msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1073                IF RETCODE = G_SUCCESS THEN
1074                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1075                ELSIF RETCODE = G_WARNING THEN
1076                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1077                ELSE
1078                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1079                    -- RETURN;
1080                END IF;
1081                -- End CTO ODR Simplified Pegging Generation
1082 
1083                -- for summary enhancement - synchronization call moved to end
1084                -- 24x7 Hooks
1085                /*
1086                if (l_24_plan > 0) then
1087                    -- call 24x7 ATP Synchronize
1088                    msc_util.msc_log ('Calling 24x7 Synchronization');
1089                    MSC_ATP_24X7.Call_Synchronize (ERRBUF, RETCODE, l_old_plan);
1090                end if;
1091                RETURN;
1092                */
1093            ELSE -- Always carry out post_plan_pegging.
1094 
1095                -- Begin CTO ODR Simplified Pegging Generation
1096                msc_util.msc_log('Calling post_plan_pegging to generate ATP pegging ' );
1097 
1098                MSC_ATP_PEG.post_plan_pegging(ERRBUF, RETCODE, l_plan_to_use);
1099 
1100                msc_util.msc_log('After Call to Post_Plan_Pegging ' );
1101                IF RETCODE = G_SUCCESS THEN
1102                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed successfully');
1103                ELSIF RETCODE = G_WARNING THEN
1104                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging completed with WARNING');
1105                ELSE
1106                   msc_util.msc_log('LOAD_PLAN_SD: ' || 'Post plan Pegging failed. Will exit');
1107                    --RETURN;
1108                END IF;
1109            END IF;
1110         END IF;
1111         -- ATP4drp End
1112 
1113     END IF;
1114 
1115     IF ((NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N') = 'Y')
1116          AND (G_ALLOC_ATP = 'N'                                 -- After summary ehancement summary will be
1117               OR (G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1)     -- supported fot demand priority based
1118              )                                                  -- allocated ATP
1119         ) THEN
1120         msc_util.msc_log('begin Loading data for plan ' || l_plan_to_use);
1121 
1122         share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
1123         msc_util.msc_log('share_partition := ' || share_partition);
1124 
1125         -- for summary enhancement - backlog workbench will be supported with summary
1126         /*
1127         SELECT  NVL(SUMMARY_FLAG,1)
1128         into   l_summary_flag
1129         from   msc_apps_instances
1130         where  rownum = 1;
1131 
1132         IF NVL(l_summary_flag,1) = 200 THEN
1133             msc_util.msc_log('Summary Approach is not supported for sites using backlog workbench');
1134             RETCODE := G_WARNING;
1135             RETURN;
1136         END IF;
1137         */
1138 
1139         -- Bug 2516506 - select plan name also
1140         SELECT NVL(SUMMARY_FLAG,1), COMPILE_DESIGNATOR, trunc(plan_start_date)
1141         into   l_summary_flag, l_plan_name, l_plan_start_date
1142         from   msc_plans
1143         where  plan_id = l_plan_to_use;
1144 
1145         -- for summary enhancement
1146         IF NVL(l_summary_flag,1) NOT IN (G_SF_SUMMARY_NOT_RUN, G_SF_PREALLOC_COMPLETED, G_SF_ATPPEG_COMPLETED, G_SF_SUMMARY_COMPLETED) THEN
1147             msc_util.msc_log('LOAD_PLAN_SD: ' || 'Another session is running post-plan processing for this plan');
1148             RETCODE :=  G_ERROR;
1149             RETURN;
1150         END IF;
1151 
1152         l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
1153         SELECT  a.oracle_username
1154         INTO    l_msc_schema
1155         FROM    FND_ORACLE_USERID a,
1156                 FND_PRODUCT_INSTALLATIONS b
1157         WHERE   a.oracle_id = b.oracle_id
1158         AND     b.application_id = 724;
1159 
1160         FOR i in 1..atp_summ_tab.count LOOP
1161             l_table_name := 'MSC_' || atp_summ_tab(i);
1162             IF (share_partition = 'Y') THEN
1163                 l_plan_id := MAXVALUE;
1164             ELSE
1165                 l_plan_id := l_plan_to_use;
1166             END IF;
1167 
1168             l_partition_name :=  atp_summ_tab(i)|| '_' || l_plan_id;
1169             msc_util.msc_log('l_partition_name := ' || l_partition_name);
1170 
1171             BEGIN
1172                 SELECT  count(*)
1173                 INTO    l_count
1174                 --bug 2495962: Change refrence from dba_xxx to all_xxx tables
1175                 --FROM DBA_TAB_PARTITIONS
1176                 FROM    ALL_TAB_PARTITIONS
1177                 WHERE   TABLE_NAME = l_table_name
1178                 AND     PARTITION_NAME = l_partition_name
1179                 AND     table_owner = l_msc_schema;
1180             EXCEPTION
1181                 WHEN OTHERS THEN
1182                     msc_util.msc_log('Inside Exception');
1183                     l_count := 0;
1184             END;
1185             IF  (l_count = 0) THEN
1186                 -- Bug 2516506
1187                 FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_PLAN_PARTITION_MISSING');
1188                 FND_MESSAGE.SET_TOKEN('PLAN_NAME', l_plan_name);
1189                 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
1190                 msc_util.msc_log(FND_MESSAGE.GET);
1191                 RETCODE := G_ERROR;
1192                 RETURN;
1193             END IF;
1194         END LOOP;
1195 
1196         BEGIN
1197             update msc_plans
1198             set    summary_flag = G_SF_FULL_SUMMARY_RUNNING -- for summary enhancement: ATP is up hereafter
1199             where  plan_id = l_plan_to_use;
1200             commit;
1201         EXCEPTION
1202             WHEN OTHERS THEN
1203                 ERRBUF := sqlerrm;
1204                 RETCODE := G_ERROR;
1205                 RETURN;
1206         END;
1207 
1208 
1209         msc_util.msc_log('LOAD_PLAN_SD: ' || 'share_partition := ' || share_partition);
1210         l_sysdate := sysdate;
1211         l_user_id := FND_GLOBAL.USER_ID;
1212 
1213         BEGIN   -- Enclose summary specific operations within BEGIN-EXCEPTION-END block for summary enhancement
1214 
1215             IF share_partition='N' THEN
1216                 -- Need to truncate partitions in all tables in one go as it causes implicit commit - for summary enhancement
1217                 Truncate_Summ_Plan_Partition(l_plan_to_use, l_applsys_schema);
1218             END IF;
1219 
1220             -- s/d processing moved to new procedure with summary enhancement
1221             IF l_member_count > 0 THEN
1222                 -- PF setup exists
1223                 l_time_phased_pf := 1;
1224             ELSE
1225                 -- PF setup does not exist
1226                 l_time_phased_pf := 2;
1227             END IF;
1228             MSC_POST_PRO.LOAD_PLAN_SUMMARY_SD(l_plan_to_use,
1229                                         share_partition,
1230                                         l_optimized_plan,
1231                                         1,                -- p_full_refresh :         Full summation
1232                                         l_time_phased_pf, -- p_time_phased_pf :       Time phased pf setup exists
1233                                         l_plan_type,      -- ATP4drp Pass plan_type as a parameter
1234                                         null,             -- p_last_refresh_number :  Null for full summation
1235                                         null,             -- p_new_refresh_number :   Null for full summation
1236                                         l_sysdate);
1237             -- ATP4drp Call Resource summation only for non-DRP plan
1238             IF l_plan_type <> 5 THEN
1239                MSC_POST_PRO.LOAD_RESOURCES(l_plan_to_use,
1240                                            share_partition,
1241                                            l_applsys_schema,
1242                                            1,                  -- Full summation
1243                                            l_plan_start_date,
1244                                            l_sysdate);
1245             END IF;
1246             -- End ATP4drp
1247             MSC_POST_PRO.INSERT_SUPPLIER_DATA(l_plan_to_use,
1248                                               share_partition,
1249                                               l_applsys_schema,
1250                                               1,            -- Full summation
1251                                               l_sysdate);
1252 
1253             -- refresh number should be updated before gather stats as gathering stats causes implicit commit
1254             BEGIN
1255                 msc_util.msc_log ('LOAD_PLAN_SD: ' || 'updating summary flag and refresh number');
1256                 update  msc_plans
1257                 set     summary_flag = G_SF_SUMMARY_COMPLETED, -- For summary enhancement
1258                         latest_refresh_number = (SELECT apps_lrn
1259                                                  FROM   MSC_PLAN_REFRESHES
1260                                                  WHERE  plan_id = l_plan_to_use)
1261                 where   plan_id = l_plan_to_use;
1262             END;
1263 
1264             -- All stats should be gathered in one go as that also causes imlpicit commit - for summary enhancement
1265             Gather_Summ_Plan_Stats(l_plan_to_use, share_partition);
1266 
1267             RETCODE := G_SUCCESS;
1268             commit;
1269 
1270         EXCEPTION
1271             WHEN OTHERS THEN
1272                 ROLLBACK;
1273 
1274                 IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1275                     update  msc_plans
1276                     set     summary_flag = G_SF_PREALLOC_COMPLETED
1277                     where   plan_id = l_plan_to_use;
1278                 ELSE
1279                     update  msc_plans
1280                     set     summary_flag = G_SF_SUMMARY_NOT_RUN
1281                     where   plan_id = l_plan_to_use;
1282                 END IF;
1283                 commit;
1284         END;
1285     END IF; --IF NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N') = 'Y' THEN
1286 
1287     -- 24x7 Hooks
1288     if (l_24_plan > 0) then
1289         -- Bug 3478888 Reset ATP_SYNCHRONIZATION_FLAG only if ATP Post Plan Processing
1290         -- is launched from plan
1291         if p_calling_module = 2 then
1292                 -- Reset the ATP_SYNCHRONIZATION_FLAG to 0 for the original plan.
1293                 -- Moved this from MSCPLAPB.pls
1294                 msc_util.msc_debug('Update atp_synchronization_flag for 24x7 plan to support re-run after sync failure');
1295 
1296                 update  msc_demands
1297                 set     atp_synchronization_flag = 0 -- null
1298                 where  (plan_id, sr_instance_id, organization_id) IN
1299                        (select  mpo.plan_id, mpo.sr_instance_id, mpo.organization_id
1300                         from    msc_plan_organizations mpo
1301                         where   mpo.plan_id = l_old_plan)
1302                 and     origination_type in (6,30);
1303 
1304                 COMMIT;
1305         end if;
1306 
1307         -- call 24x7 ATP Synchronize
1308         msc_util.msc_log ('Calling 24x7 Synchronization');
1309         MSC_ATP_24X7.Call_Synchronize (ERRBUF, RETCODE, l_old_plan);
1310     end if;
1311 EXCEPTION
1312     WHEN OTHERS THEN
1313         -- For summary enhancement - No need to reset summary_flag here
1314         /*
1315         BEGIN
1316             update msc_plans
1317             set    summary_flag = 1
1318             where  plan_id = l_plan_to_use;
1319             commit;
1320         END;
1321         */
1322 
1323         msc_util.msc_log('Inside main exception');
1324         msc_util.msc_log(sqlerrm);
1325         ERRBUF := sqlerrm;
1326         RETCODE := G_ERROR;
1327 
1328         -- For summary enhancement - Need to rollback incomplete changes
1329         ROLLBACK;
1330 END LOAD_PLAN_SD;
1331 
1332 
1333 -- For summary enhancement - Entry point for Incremental PDS Summary
1334 PROCEDURE Load_Net_Plan(
1335         ERRBUF          OUT     NoCopy VARCHAR2,
1336         RETCODE         OUT     NoCopy NUMBER,
1337         p_plan_id       IN      NUMBER)
1338 IS
1339     l_spid                  VARCHAR2(12);
1340     l_inv_ctp               number;
1341     l_summary_flag          NUMBER;
1342     l_plan_completion_date  Date;
1343     l_enable_summary_mode   varchar2(1);
1344     l_time_phased           NUMBER;
1345     l_last_refresh_number   NUMBER;
1346     l_new_refresh_number    NUMBER;
1347     l_share_partition       VARCHAR2(1);
1348     l_plan_start_date       DATE;
1349     l_sysdate               DATE;
1350     -- ATP4drp define new plan_type variable.
1351     l_plan_type             NUMBER;
1352 BEGIN
1353     -- Bug 3304390 Disable Trace
1354     -- Deleted Related Code.
1355 
1356     RETCODE := G_SUCCESS;
1357     l_sysdate := sysdate;
1358 
1359     msc_util.msc_log ('Load_Net_Plan: ' || 'Plan ID : ' || p_plan_id);
1360 
1361     l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
1362     msc_util.msc_log('Load_Net_Plan: ' || 'inv_ctp := ' || l_inv_ctp);
1363     IF l_inv_ctp <> 4 THEN
1364         -- we are not doing PDS ATP so we wont  continue
1365         msc_util.msc_log('Load_Net_Plan: ' || 'Not Doing PDS ATP. Please check profile - INV: Capable to Promise". Will Exit ');
1366         RETCODE := G_WARNING;
1367         RETURN;
1368     END IF;
1369 
1370     l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
1371     msc_util.msc_log('Load_Net_Plan: ' || 'l_enable_summary_mode := ' || l_enable_summary_mode);
1372     IF l_enable_summary_mode = 'N' THEN
1373         -- summary is not enabled so we wont continue
1374         msc_util.msc_log('Load_Net_Plan: ' || 'Not Doing Summary ATP. Please check profile - MSC: Enable ATP Summary Mode. Will Exit ');
1375         RETCODE := G_WARNING;
1376         RETURN;
1377     END IF;
1378 
1379     BEGIN
1380         select  summary_flag,
1381                 plan_completion_date,
1382                 latest_refresh_number,
1383                 trunc(plan_start_date),
1384         -- ATP4drp obtain plan_type info.
1385                 plan_type
1386         into    l_summary_flag, l_plan_completion_date, l_last_refresh_number, l_plan_start_date, l_plan_type
1387         -- End ATP4drp
1388         from    msc_plans
1389         where   plan_id = p_plan_id;
1390     EXCEPTION
1391         WHEN NO_DATA_FOUND THEN
1392             msc_util.msc_log('Unable to find plan data');
1393             RETCODE := G_ERROR;
1394             ERRBUF := sqlerrm;
1395             RETURN;
1396     END;
1397 
1398     IF l_plan_completion_date IS NULL THEN
1399         msc_util.msc_log('Load_Net_Plan: ' || 'Either the plan is currently running or it ' ||
1400                          'did not complete successfully or it was never run. Will exit');
1401         RETCODE :=  G_WARNING;
1402         RETURN;
1403     END IF;
1404 
1405     --IF NVL(l_summary_flag,1) <> G_SF_SUMMARY_COMPLETED THEN 4754549 excluded 6 meaning 24X7 synch completed successfully.
1406     IF NVL(l_summary_flag,1) not in ( G_SF_SUMMARY_COMPLETED,G_SF_SYNC_SUCCESS)THEN
1407         msc_util.msc_log('Load_Net_Plan: ' || 'Full summary was not run. l_summary_flag is ' || l_summary_flag || '. Will Exit');
1408         RETCODE :=  G_ERROR;
1409         RETURN;
1410     END IF;
1411 
1412     -- Re-arranged code to keep variables initialization in one place.
1413     -- ATP4drp Re-set variables to disable Allocation and PF
1414     IF l_plan_type = 5 THEN
1415        l_time_phased := 2;
1416        G_ALLOC_ATP := 'N';
1417        G_CLASS_HRCHY := 2;
1418        G_ALLOC_METHOD := 2;
1419        IF PG_DEBUG in ('Y', 'C') THEN
1420             msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
1421             msc_sch_wb.atp_debug('Load_Net_Plan: ' || 'PF and Allocated ATP not applicable for DRP plans');
1422             msc_util.msc_log('G_ALLOC_ATP    := ' || G_ALLOC_ATP);
1423             msc_util.msc_log('G_CLASS_HRCHY  := ' || G_CLASS_HRCHY);
1424             msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1425        END IF;
1426     ELSE -- ATP4drp Execute rest for only for non-DRP plans
1427        G_ALLOC_ATP := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
1428        G_CLASS_HRCHY := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
1429        G_ALLOC_METHOD := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
1430 
1431        msc_util.msc_log('G_ALLOC_ATP    := ' || G_ALLOC_ATP);
1432        msc_util.msc_log('G_CLASS_HRCHY  := ' || G_CLASS_HRCHY);
1433        msc_util.msc_log('G_ALLOC_METHOD := ' || G_ALLOC_METHOD);
1434 
1435        IF G_ALLOC_ATP = 'Y' AND (G_CLASS_HRCHY <> 1 OR G_ALLOC_METHOD <> 1) THEN
1436            msc_util.msc_log('Load_Net_Plan: ' || 'Summary not supported for User-defined allocation. Will Exit ');
1437            RETCODE := G_WARNING;
1438            RETURN;
1439        END IF;
1440 
1441        -- Check if time phased pf setup exists
1442        IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
1443            -- does not matter for demand priority allocation as anyway we look at the alloc tables
1444            l_time_phased := NULL;
1445        ELSE
1446 
1447            BEGIN
1448                --bug3663487 start SQL_ID  9428030
1449                --  ATP4drp Removed commented code for fetch from msc_system_items.
1450                SELECT  1
1451                INTO    l_time_phased
1452                FROM    msc_system_items i ,msc_plan_organizations po
1453                WHERE   po.plan_id = p_plan_id
1454                AND     i.aggregate_time_fence_date IS NOT NULL
1455                AND     i.plan_id = po.plan_id
1456                AND     i.organization_id = po.organization_id
1457                AND     i.sr_instance_id  = po.sr_instance_id
1458                AND     rownum = 1;
1459             --bug3663487 end
1460            EXCEPTION
1461                WHEN NO_DATA_FOUND THEN
1462                    l_time_phased := 2;
1463            END;
1464 
1465        END IF;
1466 
1467     END IF;
1468     -- End ATP4drp
1469 
1470 
1471     BEGIN
1472         update msc_plans
1473         set    summary_flag = G_SF_NET_SUMMARY_RUNNING
1474         where  plan_id = p_plan_id;
1475         commit;
1476     EXCEPTION
1477         WHEN OTHERS THEN
1478             ERRBUF := sqlerrm;
1479             RETCODE := G_ERROR;
1480             RETURN;
1481     END;
1482 
1483     -- Obtain the new refresh number
1484     SELECT  max(refresh_number)
1485     INTO    l_new_refresh_number
1486     FROM   (SELECT  refresh_number
1487             FROM    msc_demands
1488             WHERE   plan_id = p_plan_id
1489 
1490             UNION ALL
1491 
1492             SELECT  refresh_number
1493             FROM    msc_supplies
1494             WHERE   plan_id = p_plan_id
1495 
1496             UNION ALL
1497 
1498             SELECT  refresh_number
1499             FROM    msc_resource_requirements
1500             WHERE   plan_id = p_plan_id
1501            );
1502 
1503     IF l_new_refresh_number IS NULL THEN
1504         -- No data to summarize
1505         msc_util.msc_log('Load_Net_Plan: ' || 'No data to summarize. Will Exit');
1506         RETCODE :=  G_WARNING;
1507         RETURN;
1508     END IF;
1509 
1510     IF l_new_refresh_number = l_last_refresh_number THEN
1511         -- No change since last summary
1512         msc_util.msc_log('Load_Net_Plan: ' || 'No change since last summary');
1513         msc_util.msc_log('Load_Net_Plan: ' || 'updating summary flag and refresh number');
1514         update  msc_plans
1515         set     summary_flag = G_SF_SUMMARY_COMPLETED,
1516                 latest_refresh_number = l_new_refresh_number
1517         where   plan_id = p_plan_id;
1518         RETCODE :=  G_SUCCESS;
1519         RETURN;
1520     END IF;
1521 
1522     MSC_POST_PRO.LOAD_PLAN_SUMMARY_SD(p_plan_id,
1523                                       null,     -- p_share_partition ->  Not required for
1524                                       null,     -- p_optimized_plan, ->  incremental summation
1525                                       2,        -- Incremental summation
1526                                       l_time_phased,
1527                                       l_plan_type,      -- ATP4drp Pass plan_type as a parameter
1528                                       l_last_refresh_number,
1529                                       l_new_refresh_number,
1530                                       l_sysdate);
1531 
1532     -- ATP4drp Call Resource summation only for non-DRP plan
1533     IF l_plan_type <> 5 THEN
1534        MSC_POST_PRO.LOAD_RESOURCES(p_plan_id,
1535                                    null,     -- p_share_partition ->  Not required for
1536                                    null,     -- p_optimized_plan, ->  incremental summation
1537                                    2,        -- Incremental summation
1538                                    l_plan_start_date,
1539                                    l_sysdate,
1540                                    l_last_refresh_number,
1541                                    l_new_refresh_number);
1542     END IF;
1543     -- End ATP4drp
1544 
1545     MSC_POST_PRO.INSERT_SUPPLIER_DATA(p_plan_id,
1546                                       null,     -- p_share_partition ->  Not required for
1547                                       null,     -- p_applsys_schema  ->  incremental summation
1548                                       2,        -- Incremental summation
1549                                       l_sysdate,
1550                                       l_last_refresh_number,
1551                                       l_new_refresh_number);
1552 
1553     BEGIN
1554         msc_util.msc_log ('Load_Net_Plan: ' || 'updating summary flag and refresh number');
1555         update  msc_plans
1556         set     summary_flag = G_SF_SUMMARY_COMPLETED, -- For summary enhancement
1557                 latest_refresh_number = l_new_refresh_number
1558         where   plan_id = p_plan_id;
1559     END;
1560 
1561     -- All stats should be gathered in one go as that also causes imlpicit commit - for summary enhancement
1562     l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
1563     msc_util.msc_log('Load_Net_Plan: ' || 'l_share_partition := ' || l_share_partition);
1564     Gather_Summ_Plan_Stats(p_plan_id, l_share_partition);
1565 
1566     RETCODE := G_SUCCESS;
1567     commit;
1568 
1569 
1570 EXCEPTION
1571     WHEN OTHERS THEN
1572         msc_util.msc_log('Load_Net_Plan: Inside main exception');
1573         msc_util.msc_log(sqlerrm);
1574         ERRBUF := sqlerrm;
1575         RETCODE := G_ERROR;
1576 
1577         -- For summary enhancement - Need to rollback incomplete changes
1578         ROLLBACK;
1579 
1580         update msc_plans
1581         set    summary_flag = G_SF_SUMMARY_COMPLETED
1582         where  plan_id = p_plan_id;
1583         commit;
1584 END Load_Net_Plan;
1585 
1586 
1587 PROCEDURE CLEAN_TABLES(p_applsys_schema IN  varchar2
1588                       )
1589 IS
1590 l_sql_stmt varchar2(300);
1591 BEGIN
1592            --- clean up the tables
1593            msc_util.msc_log('Inside clean_tables_procedure ');
1594            l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SO';
1595 
1596            BEGIN
1597                    msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SO');
1598                    ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1599                    APPLICATION_SHORT_NAME => 'MSC',
1600                    STATEMENT_TYPE => ad_ddl.truncate_table,
1601                    STATEMENT => l_sql_stmt,
1602                    OBJECT_NAME => 'MSC_TEMP_SUMM_SO');
1603            EXCEPTION
1604                    WHEN OTHERS THEN
1605                            msc_util.msc_log(sqlerrm);
1606                            msc_util.msc_log('Truncate table  MSC_TEMP_SUMM_SO failed');
1607            END;
1608            l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SD';
1609 
1610            BEGIN
1611                    msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SD');
1612                    ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1613                    APPLICATION_SHORT_NAME => 'MSC',
1614                    STATEMENT_TYPE => ad_ddl.truncate_table,
1615                    STATEMENT => l_sql_stmt,
1616                    OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
1617            EXCEPTION
1618                    WHEN OTHERS THEN
1619                            msc_util.msc_log(sqlerrm);
1620                            msc_util.msc_log('Truncate table  MSC_TEMP_SUMM_SD failed');
1621            END;
1622            l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SO_N1';
1623 
1624            BEGIN
1625                    msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SO_N1');
1626                    ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1627                    APPLICATION_SHORT_NAME => 'MSC',
1628                    STATEMENT_TYPE => ad_ddl.drop_index,
1629                    STATEMENT => l_sql_stmt,
1630                    OBJECT_NAME => 'MSC_TEMP_SUMM_SO_N1');
1631            EXCEPTION
1632                    WHEN OTHERS THEN
1633                            msc_util.msc_log(sqlerrm);
1634                            msc_util.msc_log('Drop Index  MSC_TEMP_SUMM_SO_N1 failed');
1635            END;
1636 
1637 	   l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SD_N1';
1638 
1639            BEGIN
1640                    msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SD_N1');
1641                    ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1642                    APPLICATION_SHORT_NAME => 'MSC',
1643                    STATEMENT_TYPE => ad_ddl.drop_index,
1644                    STATEMENT => l_sql_stmt,
1645                    OBJECT_NAME => 'MSC_TEMP_SUMM_SD_N1');
1646            EXCEPTION
1647                    WHEN OTHERS THEN
1648                            msc_util.msc_log(sqlerrm);
1649                            msc_util.msc_log('Drop index MSC_TEMP_SUMM_SD_N1  failed');
1650            END;
1651 
1652 END CLEAN_TABLES;
1653 
1654 PROCEDURE INSERT_SUPPLIER_DATA(p_plan_id         IN NUMBER,
1655                                p_share_partition IN varchar2,
1656                                p_applsys_schema  IN varchar2,
1657                                p_full_refresh    IN NUMBER, -- 1:Yes, 2:No
1658                                p_sys_date        IN DATE,          -- For summary enhancement
1659                                p_last_refresh_number    IN NUMBER, -- For summary enhancement
1660                                p_new_refresh_number     IN NUMBER) -- For summary enhancement
1661 AS
1662     l_partition_name varchar2(30);
1663     L_SQL_STMT varchar2(300);
1664     L_SQL_STMT_1 varchar2(300);
1665     l_sysdate    date;
1666     l_user_id    number;
1667 
1668 BEGIN
1669     l_sysdate := sysdate;
1670     l_user_id := FND_GLOBAL.USER_ID;
1671 
1672     ---profile option for including purchase order
1673     MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE := NVL(FND_PROFILE.VALUE('MSC_PO_DOCK_DATE_CALC_PREF'), 2);
1674 
1675     IF p_full_refresh = 1 THEN  -- Full refresh - for summary enhancement
1676 
1677         -- Data for share_partition='N' has already been deleted
1678         IF p_share_partition = 'Y' THEN
1679             msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Share partition ');
1680             --- first delete data from the table
1681             msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Delete Data from msc_atp_summary_sup');
1682             delete MSC_ATP_SUMMARY_SUP where plan_id = p_plan_id;
1683         END IF;
1684 
1685         msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Loading complete summary in MSC_ATP_SUMMARY_SUP');
1686         -- The actual SQL is moved to new procedure for summary enhancement
1687         LOAD_SUP_DATA_FULL(p_plan_id, p_sys_date);
1688         msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'After loading complete summary in MSC_ATP_SUMMARY_SUP');
1689 
1690         -- Code to gather stats was here. Removed for summary enhancement as stats are gathered right in the end.
1691 
1692 	ELSE
1693 
1694         msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'Loading net summary in MSC_ATP_SUMMARY_SUP');
1695         LOAD_SUP_DATA_NET(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
1696         msc_util.msc_log('INSERT_SUPPLIER_DATA: ' || 'After loading net summary in MSC_ATP_SUMMARY_SUP');
1697 
1698 
1699     END IF;
1700 
1701 END INSERT_SUPPLIER_DATA;
1702 
1703 
1704 FUNCTION get_tolerance_defined( p_plan_id IN NUMBER,
1705                                 p_instance_id IN NUMBER,
1706                                 p_organization_id IN NUMBER,
1707                                 p_inventory_item_id IN NUMBER,
1708                                 p_supplier_id IN NUMBER,
1709                                 p_supplier_site_id IN NUMBER)
1710 RETURN NUMBER
1711 IS
1712 l_count number;
1713 BEGIN
1714 
1715      SELECT count(*)
1716      INTO   l_count
1717      FROM   msc_supplier_flex_fences
1718      WHERE  plan_id = p_plan_id
1719      AND    sr_instance_id = p_instance_id
1720      AND    organization_id = p_organization_id
1721      AND    inventory_item_id = p_inventory_item_id
1722      AND    supplier_id = p_supplier_id
1723      AND    supplier_site_id = p_supplier_site_id;
1724      return l_count;
1725 EXCEPTION
1726      WHEN NO_DATA_FOUND THEN
1727             return 0;
1728 END get_tolerance_defined;
1729 
1730 
1731 PROCEDURE LOAD_RESOURCES (p_plan_id             IN NUMBER,
1732                           p_share_partition     IN varchar2,
1733                           p_applsys_schema      IN varchar2,
1734                           p_full_refresh        IN NUMBER,     -- 1:Yes, 2:No   -- for summary enhancement
1735                           p_plan_start_date     IN DATE,                        -- for summary enhancement
1736                           p_sys_date            IN DATE,                        -- for summary enhancement
1737                           p_last_refresh_number IN NUMBER DEFAULT NULL,         -- for summary enhancement
1738                           p_new_refresh_number  IN NUMBER DEFAULT NULL)         -- for summary enhancement
1739 AS
1740 l_optimized_plan number;
1741 l_constraint_plan number;
1742 l_use_bor number;
1743 l_count number;
1744 l_partition_name varchar2(30);
1745 L_SQL_STMT varchar2(300);
1746 L_SQL_STMT_1 varchar2(300);
1747 l_MSO_Batch_flag varchar2(1);
1748 l_use_batching number;
1749 l_sysdate  date;
1750 l_user_id  number;
1751 BEGIN
1752 
1753     l_MSO_Batch_flag := NVL(fnd_profile.value('MSO_BATCHABLE_FLAG'),'N');
1754     msc_util.msc_log('LOAD_RESOURCES: ' || 'mso batchable flag := ' || l_MSO_Batch_flag );
1755     Begin
1756         SELECT  decode(designator_type, 2, 1, 0),
1757                 DECODE(plans.plan_type, 4, 2,
1758                     DECODE(daily_material_constraints, 1, 1,
1759                         DECODE(daily_resource_constraints, 1, 1,
1760                             DECODE(weekly_material_constraints, 1, 1,
1761                                 DECODE(weekly_resource_constraints, 1, 1,
1762                                     DECODE(period_material_constraints, 1, 1,
1763                                         DECODE(period_resource_constraints, 1, 1, 2)
1764                                           )
1765                                       )
1766                                   )
1767                               )
1768                           )
1769                       ),
1770                 DECODE(l_MSO_Batch_Flag, 'Y', DECODE(plans.plan_type, 4, 0,2,0,  -- filter out MPS plans
1771                     DECODE(daily_material_constraints, 1, 1,
1772                         DECODE(daily_resource_constraints, 1, 1,
1773                             DECODE(weekly_material_constraints, 1, 1,
1774                                 DECODE(weekly_resource_constraints, 1, 1,
1775                                     DECODE(period_material_constraints, 1, 1,
1776                                         DECODE(period_resource_constraints, 1, 1, 0)
1777                                           )
1778                                       )
1779                                   )
1780                               )
1781                           )
1782                       ), 0)
1783         INTO    l_use_bor, l_optimized_plan, l_constraint_plan
1784         FROM    msc_designators desig,
1785                 msc_plans plans
1786         WHERE   plans.plan_id = p_plan_id
1787         AND     desig.designator = plans.compile_designator
1788         AND     desig.sr_instance_id = plans.sr_instance_id
1789         AND     desig.organization_id = plans.organization_id;
1790     EXCEPTION WHEN NO_DATA_FOUND THEN
1791             msc_util.msc_log('LOAD_RESOURCES: ' || 'In Exception : ' || sqlcode || ': ' || sqlerrm);
1792             l_use_bor := 0;
1793             l_optimized_plan := 2;
1794             l_constraint_plan := 0;
1795     END;
1796 
1797     msc_util.msc_log('LOAD_RESOURCES: ' || 'l_use_bor := ' || l_use_bor);
1798     msc_util.msc_log('LOAD_RESOURCES: ' || 'l_optimized_plan := ' || l_optimized_plan);
1799     msc_util.msc_log('LOAD_RESOURCES: ' || 'l_constraint_plan := ' || l_constraint_plan);
1800 
1801     IF (l_MSO_Batch_Flag = 'Y') and (l_use_bor = 0) and (l_constraint_plan = 1) THEN
1802         msc_util.msc_log('LOAD_RESOURCES: ' || 'Do Batching');
1803         l_use_batching := 1;
1804     ELSE
1805         msc_util.msc_log('LOAD_RESOURCES: ' || 'No Batching');
1806         l_use_batching := 0;
1807     END IF;
1808     l_sysdate := sysdate;
1809     l_user_id := FND_GLOBAL.USER_ID;
1810 
1811     IF p_full_refresh = 1 THEN  -- Full refresh - for summary enhancement
1812 
1813         -- Data for share_partition='N' has already been deleted
1814         IF p_share_partition = 'Y' THEN
1815             msc_util.msc_log('LOAD_RESOURCES: ' || 'Share partition ');
1816             --- first delete data from the table
1817             msc_util.msc_log('LOAD_RESOURCES: ' || 'Delete Data from MSC_ATP_SUMMARY_RES');
1818             DELETE MSC_ATP_SUMMARY_RES where plan_id = p_plan_id;
1819             msc_util.msc_log('LOAD_RESOURCES: ' || 'After deleting old resources info');
1820         END IF;
1821 
1822         -- The actual SQLs moved to private procedures for modularity : summary enhancement
1823         IF l_use_batching = 1 THEN
1824             msc_util.msc_log('LOAD_RESOURCES: ' || 'Doing Batching');
1825 
1826             --2859130
1827             IF nvl(l_optimized_plan, 2) <> 1 THEN
1828                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Unconstrained plan.');
1829                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1830 
1831                 load_res_full_unopt_batch(p_plan_id, p_plan_start_date, p_sys_date);
1832 
1833                 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1834             ELSE
1835              -- constrained plan
1836                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Constrained plan.');
1837                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1838 
1839                 load_res_full_opt_batch(p_plan_id, p_plan_start_date, p_sys_date);
1840 
1841                 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1842             END IF;
1843 
1844         ELSE --- if l_use_batching =1
1845             msc_util.msc_log('LOAD_RESOURCES: ' || 'Not doing Batching');
1846 
1847             --2859130
1848             IF nvl(l_optimized_plan, 2) <> 1 THEN
1849                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Unconstrained plan.');
1850                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1851 
1852                 load_res_full_unopt_nobatch(p_plan_id, p_plan_start_date, p_sys_date);
1853 
1854                 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1855             ELSE
1856                 -- 2859130 constrained plan
1857                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Constrained plan.');
1858                 msc_util.msc_log('LOAD_RESOURCES: ' || 'Insert data into res table');
1859 
1860                 load_res_full_opt_nobatch(p_plan_id, p_plan_start_date, p_sys_date);
1861 
1862                 msc_util.msc_log('LOAD_RESOURCES: ' || 'After inserting into MSC_ATP_SUMMARY_RES');
1863           END IF;
1864 
1865         END IF; --- if l_use_batching = 1
1866 
1867         -- Code to gather stats was here. Removed for summary enhancement as stats are gathered right in the end.
1868 
1869     ELSE -- Net refresh - for summary enhancement
1870         -- IF p_full_refresh = 1 THEN  -- Full refresh - for summary enhancement
1871 
1872         msc_util.msc_log('LOAD_RESOURCES: ' || 'Loading net summary in MSC_ATP_SUMMARY_RES');
1873         -- since at this point we need to bother only about ATP generated records we dont look for opt/unopt or batching
1874         load_res_data_net(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
1875         msc_util.msc_log('LOAD_RESOURCES: ' || 'After loading net summary in MSC_ATP_SUMMARY_RES');
1876 
1877     END IF;
1878 END LOAD_RESOURCES;
1879 
1880 
1881 Procedure Clean_Plan_Tables( p_applsys_schema IN  varchar2 )
1882 IS
1883 l_sql_stmt varchar2(100);
1884 BEGIN
1885 
1886     l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SD';
1887 
1888     BEGIN
1889         msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SD');
1890         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1891                    APPLICATION_SHORT_NAME => 'MSC',
1892                    STATEMENT_TYPE => ad_ddl.truncate_table,
1893                    STATEMENT => l_sql_stmt,
1894                    OBJECT_NAME => 'MSC_TEMP_SUMM_SD');
1895     EXCEPTION
1896         WHEN OTHERS THEN
1897              msc_util.msc_log(sqlerrm);
1898              msc_util.msc_log('Truncate table failed');
1899     END;
1900 
1901     l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SD_N1';
1902 
1903     BEGIN
1904         msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SD_N1');
1905 	ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1906 		   APPLICATION_SHORT_NAME => 'MSC',
1907 		   STATEMENT_TYPE => ad_ddl.drop_index,
1908 		   STATEMENT => l_sql_stmt,
1909 		   OBJECT_NAME => 'MSC_TEMP_SUMM_SD_N1');
1910      EXCEPTION
1911 	WHEN OTHERS THEN
1912 	     msc_util.msc_log(sqlerrm);
1913 	     msc_util.msc_log('Truncate table failed');
1914      END;
1915 
1916      l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_SUP';
1917 
1918      BEGIN
1919          msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_SUP');
1920          ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1921                    APPLICATION_SHORT_NAME => 'MSC',
1922                    STATEMENT_TYPE => ad_ddl.truncate_table,
1923                    STATEMENT => l_sql_stmt,
1924                    OBJECT_NAME => 'MSC_TEMP_SUMM_SUP');
1925      EXCEPTION
1926          WHEN OTHERS THEN
1927               msc_util.msc_log(sqlerrm);
1928               msc_util.msc_log('Truncate table  MSC_TEMP_SUMM_SUP failed');
1929      END;
1930 
1931      l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_SUP_N1';
1932 
1933      BEGIN
1934          msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SUP_N1');
1935          ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1936                    APPLICATION_SHORT_NAME => 'MSC',
1937                    STATEMENT_TYPE => ad_ddl.drop_index,
1938                    STATEMENT => l_sql_stmt,
1939                    OBJECT_NAME => 'MSC_TEMP_SUMM_SUP_N1');
1940      EXCEPTION
1941          WHEN OTHERS THEN
1942               msc_util.msc_log(sqlerrm);
1943               msc_util.msc_log('Drop Index MSC_TEMP_SUMM_SUP_N1  failed');
1944      END;
1945 
1946      l_sql_stmt := 'TRUNCATE TABLE MSC_TEMP_SUMM_RES';
1947 
1948      BEGIN
1949          msc_util.msc_log('Tuncate Table MSC_TEMP_SUMM_RES');
1950          ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1951                    APPLICATION_SHORT_NAME => 'MSC',
1952                    STATEMENT_TYPE => ad_ddl.truncate_table,
1953                    STATEMENT => l_sql_stmt,
1954                    OBJECT_NAME => 'MSC_TEMP_SUMM_RES');
1955      EXCEPTION
1956          WHEN OTHERS THEN
1957               msc_util.msc_log(sqlerrm);
1958               msc_util.msc_log('Truncate table  MSC_TEMP_SUMM_RES failed');
1959      END;
1960 
1961      l_sql_stmt := 'DROP INDEX MSC_TEMP_SUMM_RES_N1';
1962 
1963      BEGIN
1964          msc_util.msc_log('Drop Index MSC_TEMP_SUMM_RES_N1');
1965          ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
1966                    APPLICATION_SHORT_NAME => 'MSC',
1967                    STATEMENT_TYPE => ad_ddl.drop_index,
1968                    STATEMENT => l_sql_stmt,
1969                    OBJECT_NAME => 'MSC_TEMP_SUMM_RES_N1');
1970      EXCEPTION
1971          WHEN OTHERS THEN
1972               msc_util.msc_log(sqlerrm);
1973               msc_util.msc_log('Drop Index MSC_TEMP_SUMM_RES_N1  failed');
1974      END;
1975 END Clean_Plan_Tables;
1976 
1977 
1978 PROCEDURE LOAD_NET_SO (
1979                        ERRBUF          OUT     NoCopy VARCHAR2,
1980         	       RETCODE         OUT     NoCopy NUMBER,
1981                        P_INSTANCE_ID   IN      NUMBER
1982                        )
1983 IS
1984         TYPE number_arr IS TABLE OF NUMBER;
1985 	l_inv_ctp                   NUMBER;
1986         l_sd_date                   date;
1987         l_sd_qty                    NUMBER;
1988         l_refresh_number            NUMBER;
1989         l_organization_id           NUMBER;
1990         l_old_sd_date               DATE;
1991         l_old_sd_qty                NUMBER;
1992         l_demand_class              varchar2(30);
1993         l_inventory_item_id         number;
1994         l_instance_id               number;
1995         l_default_atp_rule_id       NUMBER;
1996         l_sysdate_seq_num           NUMBER;
1997         l_calendar_code             VARCHAR2(20);
1998         l_default_demand_class      VARCHAR2(10);
1999         l_calendar_exception_set_id NUMBER;
2000         l_summary_flag		    NUMBER;
2001 
2002         l_org_ids                       number_arr;
2003         l_enable_summary_mode      VARCHAR2(1);
2004         l_sysdate                  date;
2005         l_user_id                  number;
2006 
2007         l_org_code                 VARCHAR2(7);
2008         l_sys_next_date            date;
2009         -- rajjain 12/20/2002
2010         l_spid                          VARCHAR2(12);
2011         l_apps_lrn			NUMBER; --Bug3049003
2012         l_reserved_quantity             Number;
2013         l_reservation_date                 date;
2014         l_refresh_number1               number;
2015         l_count                         number :=0;
2016  -- new records cursor
2017 
2018 CURSOR NET_CHANGE_SO_NEW (l_refresh_number            number,
2019                           l_instance_id               number,
2020                           l_organization_id           NUMBER,
2021                           l_calendar_code             VARCHAR2,
2022                           l_calendar_exception_set_id NUMBER) IS
2023            SELECT  D.organization_id,
2024                    D.inventory_item_id,
2025                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2026                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2027                    ---bug 2287148: move reservations to  sysdate
2028                    DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.REQUIREMENT_DATE)) SD_DATE,
2029                    SUM ( (D.PRIMARY_UOM_QUANTITY -
2030                          GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2031                           D.COMPLETED_QUANTITY)) ) sd_qty
2032              FROM
2033                    MSC_SALES_ORDERS D,
2034                    MSC_ATP_RULES R,
2035                    MSC_SYSTEM_ITEMS I
2036             WHERE  D.SR_INSTANCE_ID = l_instance_id
2037               AND  I.REFRESH_NUMBER > l_refresh_number -- get all new flag items
2038               AND  I.ORGANIZATION_ID = l_organization_id
2039               AND  D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2040               AND  D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2041               AND  D.ORGANIZATION_ID = I.ORGANIZATION_ID
2042               AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2043               AND  R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2044               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2045               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2046               AND  D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2047                                       D.COMPLETED_QUANTITY)
2048               AND  I.NEW_ATP_FLAG = 'Y' -- New flag to indicate new ATPable item.
2049               AND  I.plan_id = -1
2050               AND  ((D.PARENT_DEMAND_ID IS NOT NULL) OR -- new sales order and
2051                      -- equivalently D.reservation_type = 1
2052                      -- the demand for which the sales_order has been pegged
2053                     (D.RESERVATION_TYPE = 2 AND D.DEMAND_SOURCE_LINE IS NOT NULL))
2054               AND  (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2055                       (SELECT S.SUB_INVENTORY_CODE
2056                          FROM MSC_SUB_INVENTORIES S
2057                         WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2058                           AND S.PLAN_ID = I.PLAN_ID
2059                           AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2060                           AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2061                                        1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2062                           AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2063                                                2, 1, S.NETTING_TYPE)))
2064               AND (D.RESERVATION_TYPE = 2
2065                    OR D.PARENT_DEMAND_ID IS NULL
2066                    OR (D.RESERVATION_TYPE = 3 AND
2067                        ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2068                        (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2069               AND  EXISTS
2070                       (SELECT 1
2071                          FROM msc_calendar_dates c
2072                         WHERE C.PRIOR_SEQ_NUM >=
2073                               DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2074                                NULL, C.PRIOR_SEQ_NUM,
2075                                MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM
2076                                    (D.ORGANIZATION_ID, P_INSTANCE_ID, l_sysdate)
2077                                 - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2078                           AND C.CALENDAR_CODE = l_CALENDAR_CODE
2079                           AND C.SR_INSTANCE_ID = p_instance_id
2080                           AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2081                           AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2082                       )
2083          GROUP BY  D.organization_id,
2084                    D.inventory_item_id,
2085                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2086                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2087                    -- rajjain 02/06/2003 Bug 2782882
2088                    DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.REQUIREMENT_DATE));
2089 
2090    -- reservation type cursor
2091 --bug 5357370,This cursor selects sales order which have unreserved
2092 
2093 CURSOR NET_CHANGE_UNRESRV(l_refresh_number              number,
2094                            l_instance_id               number,
2095                            l_organization_id           NUMBER
2096                            ) IS
2097             SELECT
2098                    D.organization_id,
2099                    D.inventory_item_id,
2100                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2101                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2102                    trunc(D.REQUIREMENT_DATE) SD_DATE,
2103                    sum(d.old_RESERVATION_QUANTITY) sd_qty
2104             FROM
2105                    MSC_SALES_ORDERS D,
2106                    MSC_ATP_RULES R,
2107                    MSC_SYSTEM_ITEMS I
2108             WHERE  D.SR_INSTANCE_ID = l_instance_id
2109               AND  D.REFRESH_NUMBER > l_refresh_number
2110               AND  I.ORGANIZATION_ID = l_organization_id
2111               AND  D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2112               AND  D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2113               AND  D.ORGANIZATION_ID = I.ORGANIZATION_ID
2114               AND  I.plan_id = -1
2115               AND  I.ATP_FLAG = 'Y'             -- Get ATP'able items which have
2116               AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2117               AND  R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2118               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2119               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2120               AND (D.RESERVATION_TYPE=1 and reservation_quantity=0 and old_reservation_quantity <>0)
2121               AND  D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2122                                       NVL(D.COMPLETED_QUANTITY,0))
2123               AND  (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2124                       (SELECT S.SUB_INVENTORY_CODE
2125                          FROM MSC_SUB_INVENTORIES S
2126                         WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2127                           AND S.PLAN_ID = I.PLAN_ID
2128                           AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2129                           AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2130                                        1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2131                           AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2132                                                2, 1, S.NETTING_TYPE)))
2133               AND  EXISTS
2134                       (SELECT 1
2135                          FROM msc_calendar_dates c
2136                         WHERE C.PRIOR_SEQ_NUM >=
2137                               DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2138                                NULL, C.PRIOR_SEQ_NUM,
2139                                MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2140                                P_INSTANCE_ID,
2141                                l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2142                           AND C.CALENDAR_CODE = l_CALENDAR_CODE
2143                           AND C.SR_INSTANCE_ID = p_instance_id
2144                           AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2145                           AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2146                       )
2147          GROUP BY  D.organization_id,
2148                    D.inventory_item_id,
2149                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2150                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2151                    trunc(D.REQUIREMENT_DATE);
2152 
2153 --bug 5357370,This cursor selects sales order which have been reserved
2154 --we need these to subtract the quantity from the original date when they were schedules and move to sysdate
2155 
2156 CURSOR NET_CHANGE_RESRV (l_refresh_number              number,
2157                            l_instance_id               number,
2158                            l_organization_id           NUMBER
2159                            ) IS
2160 SELECT
2161             D.organization_id,
2162             D.inventory_item_id,
2163             NVL(D.DEMAND_CLASS,'@@@') demand_class ,
2164             trunc(d.requirement_date) SD_DATE,
2165             sum(nvl(d.old_primary_uom_quantity, 0) - d.primary_uom_quantity) SD_QTY
2166                    -- QUESTION ? Does the above SUM actually result in a DELTA??
2167              FROM
2168                   msc_sales_orders d
2169              WHERE
2170              d.reservation_type =2
2171              and d.refresh_number > l_refresh_number
2172              and d.organization_id = l_organization_id
2173              and d.sr_instance_id =l_instance_id
2174              GROUP BY
2175              D.organization_id,
2176              D.inventory_item_id,
2177              NVL(D.DEMAND_CLASS,'@@@'),
2178              trunc(d.requirement_date);
2179 
2180 
2181 CURSOR NET_CHANGE_SO_RSRV (l_refresh_number            number,
2182                            l_instance_id               number,
2183                            l_organization_id           NUMBER,
2184                            l_calendar_code             VARCHAR2,
2185                            l_calendar_exception_set_id NUMBER) IS
2186            SELECT  D.organization_id,
2187                    D.inventory_item_id,
2188                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2189                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2190                    ---bug 2287148: move reservations to  sysdate
2191                    DECODE(D.RESERVATION_TYPE,2,l_sys_next_date, trunc(D.REQUIREMENT_DATE)) SD_DATE,
2192                    sum(d.primary_uom_quantity -nvl(d.old_primary_uom_quantity, 0)) sd_qty
2193                    --SUM ( (D.PRIMARY_UOM_QUANTITY -
2194                          --GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2195                             --NVL(D.COMPLETED_QUANTITY,0))) ) sd_qty
2196                    -- QUESTION ? Does the above SUM actually result in a DELTA??
2197              FROM
2198                    MSC_SALES_ORDERS D,
2199                    MSC_ATP_RULES R,
2200                    MSC_SYSTEM_ITEMS I
2201             WHERE  D.SR_INSTANCE_ID = l_instance_id
2202               AND  D.REFRESH_NUMBER > l_refresh_number
2203               AND  I.ORGANIZATION_ID = l_organization_id
2204               AND  D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2205               AND  D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2206               AND  D.ORGANIZATION_ID = I.ORGANIZATION_ID
2207               AND  I.plan_id = -1
2208               AND  I.ATP_FLAG = 'Y'             -- Get ATP'able items which have
2209               AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2210               AND  R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2211               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2212               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2213               AND  D.PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.RESERVATION_QUANTITY,0),
2214                                       NVL(D.COMPLETED_QUANTITY,0))
2215               --AND  D.DEMAND_SOURCE_LINE is NULL -- new inventory reservations.
2216               AND  D.RESERVATION_TYPE <> 1      -- Not a Sales Order item.
2217               AND  (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2218                       (SELECT S.SUB_INVENTORY_CODE
2219                          FROM MSC_SUB_INVENTORIES S
2220                         WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2221                           AND S.PLAN_ID = I.PLAN_ID
2222                           AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2223                           AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2224                                        1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2225                           AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2226                                                2, 1, S.NETTING_TYPE)))
2227               AND (D.RESERVATION_TYPE = 2
2228                    OR D.PARENT_DEMAND_ID IS NULL
2229                    OR (D.RESERVATION_TYPE = 3 AND
2230                        ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2231                        (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2232               AND  EXISTS
2233                       (SELECT 1
2234                          FROM msc_calendar_dates c
2235                         WHERE C.PRIOR_SEQ_NUM >=
2236                               DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2237                                NULL, C.PRIOR_SEQ_NUM,
2238                                MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2239                                P_INSTANCE_ID,
2240                                l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2241                           AND C.CALENDAR_CODE = l_CALENDAR_CODE
2242                           AND C.SR_INSTANCE_ID = p_instance_id
2243                           AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2244                           AND C.CALENDAR_DATE = TRUNC(D.REQUIREMENT_DATE)
2245                       )
2246          GROUP BY  D.organization_id,
2247                    D.inventory_item_id,
2248                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2249                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2250                    -- rajjain 02/06/2003 Bug 2782882
2251                    DECODE(D.RESERVATION_TYPE,2,l_sys_next_date, trunc(D.REQUIREMENT_DATE))
2252          UNION ALL
2253            SELECT  D.organization_id,
2254                    D.inventory_item_id,
2255                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2256                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') demand_class ,
2257                    ---bug 2287148: move reservations to  sysdate
2258                    -- bug 5357370: since reservation_type 1 is only selected when it is shipped,  we need to either use sysdate if we had reservation or use oldrequirement date if we did not have reservation
2259                    decode(NVL(D.old_reservation_quantity, 0), 0, trunc(nvl(D.old_requirement_date, D.requirement_date)), l_sys_next_date) SD_DATE,
2260                    -- DECODE(D.RESERVATION_TYPE,2,l_sys_next_date,trunc(D.old_REQUIREMENT_DATE)) SD_DATE,
2261                    --5125969 In cases of reservation type 1 and some complete qty
2262                     --we want to substract that from total qty
2263                    SUM(DECODE(D.RESERVATION_TYPE,1, -1*D.COMPLETED_QUANTITY,
2264                                                     -1*(NVL(D.old_PRIMARY_UOM_QUANTITY,0) -
2265                          GREATEST(NVL(D.old_RESERVATION_QUANTITY,0),
2266                             NVL(D.old_COMPLETED_QUANTITY,0))))) sd_qty
2267                    -- QUESTION ? Does the above SUM actually result in a DELTA??
2268                    -- ANSWER : We are subtratcting the sum of the old quantities.
2269              FROM
2270                    MSC_SALES_ORDERS D,
2271                    MSC_ATP_RULES R,
2272                    MSC_SYSTEM_ITEMS I
2273             WHERE  D.SR_INSTANCE_ID = l_instance_id
2274               AND  D.REFRESH_NUMBER > l_refresh_number
2275               AND  I.ORGANIZATION_ID = l_organization_id
2276               AND  D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2277               AND  D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2278               AND  D.ORGANIZATION_ID = I.ORGANIZATION_ID
2279               AND  I.plan_id = -1
2280               AND  I.ATP_FLAG = 'Y'             -- Get ATP'able items which have
2281               AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_DEFAULT_ATP_RULE_ID)
2282               AND  R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2283               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_SALES_ORDERS,2,2,-1)
2284               AND  D.DEMAND_SOURCE_TYPE <> DECODE(R.INCLUDE_INTERNAL_ORDERS,2,8,-1)
2285               --5125969 Also consider rows where completed_qty is not 0
2286               AND  (D.OLD_PRIMARY_UOM_QUANTITY > GREATEST(NVL(D.OLD_RESERVATION_QUANTITY,0),
2287                                       NVL(D.OLD_COMPLETED_QUANTITY,0))
2288                                       OR ((NVL(D.COMPLETED_QUANTITY,0) <> 0)AND D.OLD_PRIMARY_UOM_QUANTITY-NVL(D.OLD_COMPLETED_QUANTITY,0)>0))
2289              --5125969 Include reservation type 1 when complete qty is not 0
2290               AND  ((D.DEMAND_SOURCE_LINE is NULL -- new inventory reservations.
2291                     AND
2292                     D.RESERVATION_TYPE <> 1)      -- Not a Sales Order item.
2293                     OR (D.RESERVATION_TYPE = 1 AND NVL(D.COMPLETED_QUANTITY,0) <> 0))
2294 
2295               AND  (D.SUBINVENTORY IS NULL OR D.SUBINVENTORY IN
2296                       (SELECT S.SUB_INVENTORY_CODE
2297                          FROM MSC_SUB_INVENTORIES S
2298                         WHERE S.ORGANIZATION_ID=D.ORGANIZATION_ID
2299                           AND S.PLAN_ID = I.PLAN_ID
2300                           AND S.SR_INSTANCE_ID = D.SR_INSTANCE_ID
2301                           AND S.INVENTORY_ATP_CODE =DECODE(R.DEFAULT_ATP_SOURCES,
2302                                        1, 1, NULL, 1, S.INVENTORY_ATP_CODE)
2303                           AND S.NETTING_TYPE =DECODE(R.DEFAULT_ATP_SOURCES,
2304                                                2, 1, S.NETTING_TYPE)))
2305               AND (D.RESERVATION_TYPE = 2
2306                    OR D.PARENT_DEMAND_ID IS NULL
2307                    OR (D.RESERVATION_TYPE = 3 AND
2308                        ((R.INCLUDE_DISCRETE_WIP_RECEIPTS = 1) or
2309                        (R.INCLUDE_NONSTD_WIP_RECEIPTS = 1))))
2310               AND  EXISTS
2311                       (SELECT 1
2312                          FROM msc_calendar_dates c
2313                         WHERE C.PRIOR_SEQ_NUM >=
2314                               DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE,
2315                                NULL, C.PRIOR_SEQ_NUM,
2316                                MSC_ATP_FUNC.NEXT_WORK_DAY_SEQNUM(D.ORGANIZATION_ID,
2317                                P_INSTANCE_ID,
2318                                l_sysdate) - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2319                           AND C.CALENDAR_CODE = l_CALENDAR_CODE
2320                           AND C.SR_INSTANCE_ID = p_instance_id
2321                           AND C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2322                           AND C.CALENDAR_DATE = TRUNC(D.old_REQUIREMENT_DATE)
2323                       )
2324          GROUP BY  D.organization_id,
2325                    D.inventory_item_id,
2326                    Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2327                       NVL(D.DEMAND_CLASS,'@@@'), '@@@') ,
2328                    -- rajjain 02/06/2003 Bug 2782882
2329                    decode(NVL(D.old_reservation_quantity, 0), 0, trunc(nvl(D.old_requirement_date, D.requirement_date)), l_sys_next_date);
2330 
2331 
2332 BEGIN
2333   -- Bug 3304390 Disable Trace
2334   -- Deleted Related Code
2335 
2336   l_instance_id := p_instance_id;
2337   l_sysdate := sysdate;
2338   l_user_id := FND_GLOBAL.USER_ID;
2339   l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
2340   l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
2341 
2342   msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
2343   msc_util.msc_log(' l_enable_summary_mode := ' || l_enable_summary_mode);
2344 
2345   IF l_enable_summary_mode <> 'Y' THEN
2346        msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
2347        RETCODE := G_WARNING;
2348        RETURN;
2349   END IF;
2350 
2351   IF l_inv_ctp = 4 THEN
2352       -- we are not doing ODS ATP so we wont  continue
2353       msc_util.msc_log('Not Doing ODS ATP. Please check profile - INV: Capable to Promise. Will Exit ');
2354       RETCODE := G_WARNING;
2355       RETURN;
2356   ELSIF l_inv_ctp <> 5 THEN
2357       l_inv_ctp := 5;
2358   END IF;
2359 
2360   SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0),apps_lrn  ---LCID
2361   INTO   l_summary_flag,l_refresh_number,l_apps_lrn	---bug3049003
2362   from   msc_apps_instances
2363   where  instance_id = p_instance_id;
2364 
2365   IF NVL(l_summary_flag, 1) = 2 THEN
2366      msc_util.msc_log('Another session is running Complete summary for this instance');
2367      RETCODE := G_ERROR;
2368      RETURN;
2369   ELSIF (NVL(l_summary_flag, 1) = 1) THEN
2370      msc_util.msc_log('Partial summary of tables can be done only after complete summary has been run successfuly');
2371      RETCODE := G_ERROR;
2372      RETURN;
2373   END IF;
2374 
2375   msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2376 
2377 /*  SELECT  sr_tp_id
2378   BULK  COLLECT INTO l_org_ids
2379   FROM    msc_trading_partners
2380   WHERE    sr_instance_id = p_instance_id and partner_type = 3;*/
2381 
2382   SELECT  ORGANIZATION_ID                 ---bug3049003
2383   BULK  COLLECT INTO l_org_ids
2384   FROM    msc_instance_orgs
2385   WHERE   sr_instance_id = p_instance_id
2386   and     org_lrn=l_apps_lrn
2387   and     enabled_flag=1;
2388 
2389   msc_util.msc_log(' org count := ' || l_org_ids.count);
2390 
2391   -- Update summary record per organization
2392   FOR i in 1..l_org_ids.count LOOP
2393       l_organization_id := l_org_ids(i);
2394       msc_util.msc_log('processing org '|| i ||' := '||l_organization_id);
2395 
2396       MSC_ATP_PROC.get_org_default_info(p_instance_id,
2397                                         l_organization_id,
2398                                         l_default_atp_rule_id,
2399                                         l_calendar_code,
2400                                         l_calendar_exception_set_id,
2401                                         l_default_demand_class,
2402                                         l_org_code);
2403 
2404       msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
2405       msc_util.msc_log('l_calendar_exception_set_id := ' || l_calendar_exception_set_id);
2406       msc_util.msc_log('l_default_atp_rule_id := ' || l_default_atp_rule_id);
2407       msc_util.msc_log('l_default_demand_class := ' || l_default_demand_class);
2408       BEGIN
2409           SELECT  cal.next_date
2410           INTO    l_sys_next_date
2411           FROM    msc_calendar_dates  cal
2412           WHERE   cal.exception_set_id = l_calendar_exception_set_id
2413           AND     cal.calendar_code = l_calendar_code
2414           AND     cal.calendar_date = TRUNC(l_sysdate)
2415           AND     cal.sr_instance_id = p_instance_id ;
2416       EXCEPTION
2417           WHEN OTHERS THEN
2418                null;
2419       END;
2420 
2421       OPEN  NET_CHANGE_SO_NEW ( l_refresh_number   ,
2422                                  l_instance_id      ,
2423                                  l_organization_id  ,
2424                                  l_calendar_code    ,
2425                                  l_calendar_exception_set_id );
2426       msc_util.msc_log('after opening cursor NET_CHANGE_SO_NEW');
2427 
2428       LOOP
2429            FETCH NET_CHANGE_SO_NEW INTO
2430                   l_organization_id,
2431                   l_inventory_item_id,
2432                   l_demand_class,
2433                   l_sd_date,
2434                   l_sd_qty;
2435 
2436            EXIT WHEN NET_CHANGE_SO_NEW%NOTFOUND;
2437 
2438            msc_util.msc_log('l_organization_id := ' || l_organization_id);
2439            msc_util.msc_log('l_demand_class := ' || l_organization_id);
2440            msc_util.msc_log('l_sd_date := ' || l_sd_date);
2441            msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2442            msc_util.msc_log('l_old_sd_date := ' || l_old_sd_date);
2443            msc_util.msc_log('l_old_sd_qty := ' || l_old_sd_qty);
2444            msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2445 
2446            --- With 9i the entire set can be accomplished in one MERGE statement.
2447            --- Insert the new record
2448            BEGIN
2449               INSERT INTO MSC_ATP_SUMMARY_SO
2450                           (plan_id,
2451                           sr_instance_id,
2452                           organization_id,
2453                           inventory_item_id,
2454                           demand_class,
2455                           sd_date,
2456                           sd_qty,
2457                           last_update_date,
2458                           last_updated_by,
2459                           creation_date,
2460                           created_by)
2461                   VALUES (-1, p_instance_id, l_organization_id,
2462                            l_inventory_item_id, l_demand_class, trunc(l_sd_date),
2463                            l_sd_qty, l_sysdate, l_user_id ,
2464                            l_sysdate, l_user_id
2465                          );
2466               COMMIT;
2467            EXCEPTION
2468               -- If a record has already been inserted by another process
2469               WHEN DUP_VAL_ON_INDEX THEN
2470                 -- Update the record.
2471                 UPDATE MSC_ATP_SUMMARY_SO
2472                    SET sd_qty = sd_qty + l_sd_qty,   -- The value is now a DELTA
2473                        last_update_date = l_sysdate,
2474                        last_updated_by = l_user_id
2475                  WHERE plan_id = -1
2476                    AND sr_instance_id = p_instance_id
2477                    AND organization_id = l_organization_id
2478                    AND inventory_item_id = l_inventory_item_id
2479                    AND demand_class = l_demand_class
2480                    AND trunc(sd_date) = trunc(l_sd_date);
2481 
2482                 COMMIT;
2483            END;
2484 
2485       END LOOP; --- end of fetch loop
2486 
2487       CLOSE NET_CHANGE_SO_NEW;
2488       msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2489       msc_util.msc_log('l_instance_id := ' || l_instance_id);
2490       msc_util.msc_log('l_organization_id := ' || l_organization_id);
2491 
2492       ----bug 5357370,We will remove the unreserved quantity from sysdate and add the quantity to the schedule date
2493       OPEN NET_CHANGE_UNRESRV(l_refresh_number   ,
2494                              l_instance_id     ,
2495                              l_organization_id
2496                            ) ;
2497       msc_util.msc_log('after opening cursor NET_CHANGE_UNRESRV');
2498       msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2499       msc_util.msc_log('l_instance_id := ' || l_instance_id);
2500       msc_util.msc_log('l_organization_id := ' || l_organization_id);
2501 
2502       LOOP
2503           FETCH NET_CHANGE_UNRESRV INTO
2504                  l_organization_id,
2505                  l_inventory_item_id,
2506                  l_demand_class,
2507                  l_sd_date,
2508                  l_sd_qty;
2509 
2510           EXIT WHEN NET_CHANGE_UNRESRV%NOTFOUND;
2511 
2512           msc_util.msc_log('l_organization_id := ' || l_organization_id);
2513           msc_util.msc_log('l_demand_class := ' || l_demand_class);
2514           msc_util.msc_log('l_sd_date := ' || l_sd_date);
2515           msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2516           msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2517 
2518          UPDATE MSC_ATP_SUMMARY_SO
2519               SET sd_qty = sd_qty + l_sd_qty,   -- APPLY THE DELTA
2520                   last_update_date = l_sysdate,
2521                   last_updated_by = l_user_id
2522             WHERE plan_id = -1
2523               AND sr_instance_id = p_instance_id
2524               AND organization_id = l_organization_id
2525               AND inventory_item_id = l_inventory_item_id
2526               AND demand_class = l_demand_class
2527               AND trunc(sd_date) = trunc(l_sd_date);
2528          IF (SQL%NOTFOUND) THEN
2529            BEGIN
2530                     INSERT INTO MSC_ATP_SUMMARY_SO
2531                             (plan_id,
2532                              sr_instance_id,
2533                              organization_id,
2534                              inventory_item_id,
2535                              demand_class,
2536                              sd_date,
2537                              sd_qty,
2538                              last_update_date,
2539                              last_updated_by,
2540                              creation_date,
2541                              created_by)
2542                     VALUES ( -1,
2543                              p_instance_id,
2544                              l_organization_id,
2545                              l_inventory_item_id,
2546                              l_demand_class,
2547                              trunc(l_sd_date),
2548                              l_sd_qty,
2549                              l_sysdate,
2550                              l_user_id ,
2551                              l_sysdate,
2552                              l_user_id
2553                            );
2554                   EXCEPTION
2555 
2556                   -- If a record has already been inserted by another process
2557                   -- If insert fails then update.
2558                     WHEN DUP_VAL_ON_INDEX THEN
2559                       -- Update the record.
2560                       update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2561                       set sd_qty = (sd_qty + l_sd_qty),
2562                           last_update_date = l_sysdate,
2563                           last_updated_by = l_user_id
2564                       where inventory_item_id = l_inventory_item_id
2565                       and sr_instance_id = p_instance_id
2566                       and organization_id = l_organization_id
2567                       and sd_date = trunc(l_sd_date)
2568                       and demand_class = l_demand_class ;
2569 
2570            END;
2571          END IF;
2572 
2573          UPDATE MSC_ATP_SUMMARY_SO
2574               SET sd_qty = sd_qty - l_sd_qty,   -- APPLY THE DELTA
2575                   last_update_date = l_sysdate,
2576                   last_updated_by = l_user_id
2577             WHERE plan_id = -1
2578               AND sr_instance_id = p_instance_id
2579               AND organization_id = l_organization_id
2580               AND inventory_item_id = l_inventory_item_id
2581               AND demand_class = l_demand_class
2582               AND trunc(sd_date) = trunc(l_sys_next_date);
2583          IF (SQL%NOTFOUND) THEN
2584            BEGIN
2585                     INSERT INTO MSC_ATP_SUMMARY_SO
2586                             (plan_id,
2587                              sr_instance_id,
2588                              organization_id,
2589                              inventory_item_id,
2590                              demand_class,
2591                              sd_date,
2592                              sd_qty,
2593                              last_update_date,
2594                              last_updated_by,
2595                              creation_date,
2596                              created_by)
2597                     VALUES ( -1,
2598                              p_instance_id,
2599                              l_organization_id,
2600                              l_inventory_item_id,
2601                              l_demand_class,
2602                              trunc(l_sys_next_date),
2603                              - l_sd_qty,
2604                              l_sysdate,
2605                              l_user_id ,
2606                              l_sysdate,
2607                              l_user_id
2608                            );
2609                   EXCEPTION
2610 
2611                   -- If a record has already been inserted by another process
2612                   -- If insert fails then update.
2613                     WHEN DUP_VAL_ON_INDEX THEN
2614                       -- Update the record.
2615                       update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2616                       set sd_qty = (sd_qty - l_sd_qty),
2617                           last_update_date = l_sysdate,
2618                           last_updated_by = l_user_id
2619                       where inventory_item_id = l_inventory_item_id
2620                       and sr_instance_id = p_instance_id
2621                       and organization_id = l_organization_id
2622                       and sd_date = trunc(l_sys_next_date)
2623                       and demand_class = l_demand_class ;
2624 
2625            END;
2626          END IF;
2627          commit;
2628       END LOOP; --- end of fetch loop
2629 
2630       CLOSE NET_CHANGE_UNRESRV;
2631 
2632       ----bug 5357370,Remove the Reservation records from the date they were originally scheduled.
2633       OPEN NET_CHANGE_RESRV(l_refresh_number   ,
2634                              l_instance_id     ,
2635                              l_organization_id
2636                            ) ;
2637 
2638       msc_util.msc_log('after opening cursor NET_CHANGE_RESRV');
2639       msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
2640       msc_util.msc_log('l_instance_id := ' || l_instance_id);
2641       msc_util.msc_log('l_organization_id := ' || l_organization_id);
2642 
2643       LOOP
2644           FETCH NET_CHANGE_RESRV INTO
2645                  l_organization_id,
2646                  l_inventory_item_id,
2647                  l_demand_class,
2648                  l_sd_date,
2649                  l_sd_qty;
2650 
2651           EXIT WHEN NET_CHANGE_RESRV%NOTFOUND;
2652 
2653           msc_util.msc_log('l_organization_id := ' || l_organization_id);
2654           msc_util.msc_log('l_demand_class := ' || l_demand_class);
2655           msc_util.msc_log('l_sd_date := ' || l_sd_date);
2656           msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2657           msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2658 
2659          UPDATE MSC_ATP_SUMMARY_SO
2660               SET sd_qty = sd_qty + l_sd_qty,   -- APPLY THE DELTA
2661                   last_update_date = l_sysdate,
2662                   last_updated_by = l_user_id
2663             WHERE plan_id = -1
2664               AND sr_instance_id = p_instance_id
2665               AND organization_id = l_organization_id
2666               AND inventory_item_id = l_inventory_item_id
2667               AND demand_class = l_demand_class
2668               AND trunc(sd_date) = trunc(l_sd_date);
2669          IF (SQL%NOTFOUND) THEN
2670            BEGIN
2671                     INSERT INTO MSC_ATP_SUMMARY_SO
2672                             (plan_id,
2673                              sr_instance_id,
2674                              organization_id,
2675                              inventory_item_id,
2676                              demand_class,
2677                              sd_date,
2678                              sd_qty,
2679                              last_update_date,
2680                              last_updated_by,
2681                              creation_date,
2682                              created_by)
2683                     VALUES ( -1,
2684                              p_instance_id,
2685                              l_organization_id,
2686                              l_inventory_item_id,
2687                              l_demand_class,
2688                              trunc(l_sd_date),
2689                              l_sd_qty,
2690                              l_sysdate,
2691                              l_user_id ,
2692                              l_sysdate,
2693                              l_user_id
2694                            );
2695                   EXCEPTION
2696 
2697                   -- If a record has already been inserted by another process
2698                   -- If insert fails then update.
2699                     WHEN DUP_VAL_ON_INDEX THEN
2700                       -- Update the record.
2701                       update /*+ INDEX(msc_atp_summary_so MSC_ATP_SUMMARY_SO_U1) */ msc_atp_summary_so
2702                       set sd_qty = (sd_qty + l_sd_qty),
2703                           last_update_date = l_sysdate,
2704                           last_updated_by = l_user_id
2705                       where inventory_item_id = l_inventory_item_id
2706                       and sr_instance_id = p_instance_id
2707                       and organization_id = l_organization_id
2708                       and sd_date = trunc(l_sd_date)
2709                       and demand_class = l_demand_class ;
2710 
2711            END;
2712          END IF;
2713          commit;
2714       END LOOP; --- end of fetch loop
2715 
2716       CLOSE NET_CHANGE_RESRV;
2717 
2718       OPEN  NET_CHANGE_SO_RSRV ( l_refresh_number,
2719                                   l_instance_id,
2720                                   l_organization_id,
2721                                   l_calendar_code,
2722                                   l_calendar_exception_set_id );
2723       msc_util.msc_log('after opening cursor NET_CHANGE_SO_RSRV');
2724       msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
2725       msc_util.msc_log('l_calendar_exception_set_id := ' ||
2726                              TO_CHAR(l_calendar_exception_set_id));
2727 
2728 
2729       LOOP
2730           FETCH NET_CHANGE_SO_RSRV INTO
2731                  l_organization_id,
2732                  l_inventory_item_id,
2733                  l_demand_class,
2734                  l_sd_date,
2735                  l_sd_qty;
2736 
2737           EXIT WHEN NET_CHANGE_SO_RSRV%NOTFOUND;
2738 
2739           msc_util.msc_log('l_organization_id := ' || l_organization_id);
2740           msc_util.msc_log('l_demand_class := ' || l_demand_class);
2741           msc_util.msc_log('l_sd_date := ' || l_sd_date);
2742           msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
2743           msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
2744 
2745 
2746            --- With 9i the entire set can be accomplished in one MERGE statement.
2747            --- Try to update it first and then
2748 
2749            UPDATE MSC_ATP_SUMMARY_SO
2750               SET sd_qty = sd_qty + l_sd_qty,   -- APPLY THE DELTA
2751                   last_update_date = l_sysdate,
2752                   last_updated_by = l_user_id
2753             WHERE plan_id = -1
2754               AND sr_instance_id = p_instance_id
2755               AND organization_id = l_organization_id
2756               AND inventory_item_id = l_inventory_item_id
2757               AND demand_class = l_demand_class
2758               AND trunc(sd_date) = trunc(l_sd_date);
2759            --COMMIT; 5078448
2760 
2761 
2762              --- if not found insert it.
2763            IF (SQL%NOTFOUND) THEN
2764              --- Insert the new record
2765              BEGIN
2766                 INSERT INTO MSC_ATP_SUMMARY_SO
2767                             (plan_id,
2768                              sr_instance_id,
2769                              organization_id,
2770                              inventory_item_id,
2771                              demand_class,
2772                              sd_date,
2773                              sd_qty,
2774                              last_update_date,
2775                              last_updated_by,
2776                              creation_date,
2777                              created_by)
2778                     VALUES (-1, p_instance_id, l_organization_id,
2779                              l_inventory_item_id, l_demand_class, trunc(l_sd_date),
2780                              l_sd_qty, l_sysdate, l_user_id ,
2781                              l_sysdate, l_user_id
2782                            );
2783                 --COMMIT; 5078448
2784              EXCEPTION
2785                -- If a record has already been inserted by another process
2786                -- If insert fails then update.
2787                WHEN DUP_VAL_ON_INDEX THEN
2788                  -- Update the record.
2789                  UPDATE MSC_ATP_SUMMARY_SO
2790                     SET sd_qty = sd_qty + l_sd_qty,   -- The value is a DELTA
2791                         last_update_date = l_sysdate,
2792                         last_updated_by = l_user_id
2793                   WHERE plan_id = -1
2794                     AND sr_instance_id = p_instance_id
2795                     AND organization_id = l_organization_id
2796                     AND inventory_item_id = l_inventory_item_id
2797                     AND demand_class = l_demand_class
2798                     AND trunc(sd_date) = trunc(l_sd_date);
2799 
2800                 --COMMIT; 5078448
2801              END;
2802            END IF;
2803            COMMIT; --5078448
2804 
2805       END LOOP; --- end of fetch loop
2806 
2807       CLOSE NET_CHANGE_SO_RSRV;
2808 
2809    END LOOP;
2810 
2811    -- Take care of OUT parameters
2812    ERRBUF  := null;
2813    RETCODE := G_SUCCESS;
2814 
2815    EXCEPTION
2816       WHEN OTHERS THEN
2817           IF (NET_CHANGE_SO_RSRV%ISOPEN) THEN
2818              CLOSE NET_CHANGE_SO_RSRV;
2819           END IF;
2820           IF (NET_CHANGE_SO_NEW%ISOPEN) THEN
2821              CLOSE NET_CHANGE_SO_NEW;
2822           END IF;
2823           --- update summary flag in msc_apps_instances so that summary not available to use
2824           update msc_apps_instances
2825           set summary_flag = 1
2826           where instance_id = p_instance_id;
2827           msc_util.msc_log('An error  occured while running net change on Sales Orders');
2828           msc_util.msc_log('Complete refresh would need to be run to activate Summary ATP');
2829           msc_util.msc_log('Inside main exception');
2830           msc_util.msc_log(sqlerrm);
2831           ERRBUF := sqlerrm;
2832           RETCODE := G_ERROR;
2833 END LOAD_NET_SO;
2834 
2835 
2836 PROCEDURE LOAD_NET_SD (
2837                        ERRBUF          OUT     NoCopy VARCHAR2,
2838         	       RETCODE         OUT     NoCopy NUMBER,
2839                        P_INSTANCE_ID   IN      NUMBER
2840                        )
2841 IS
2842     TYPE number_arr IS TABLE OF NUMBER;
2843     l_organization_id               NUMBER;
2844     l_default_atp_rule_id           NUMBER;
2845     l_sysdate_seq_num               NUMBER;
2846     l_calendar_code                 VARCHAR2(20);
2847     l_default_demand_class          VARCHAR2(10);
2848     l_calendar_exception_set_id     NUMBER;
2849     l_org_ids                       number_arr;
2850     l_refresh_number                NUMBER;
2851     l_sd_date                       DATE;
2852     l_sd_qty                        NUMBER;
2853     l_inventory_item_id             NUMBER;
2854     l_demand_class                  varchar(30);
2855     l_inv_ctp                       number;
2856     l_summary_flag		    number;
2857     l_enable_summary_mode           varchar2(1);
2858     l_sysdate                       date;
2859     l_user_id                       number;
2860 
2861     l_org_code                      VARCHAR2(7);
2862 
2863     -- rajjain 12/20/2002
2864     l_spid                          VARCHAR2(12);
2865     l_apps_lrn			    NUMBER; --Bug3049003
2866 
2867 -- Cursor is defined such that the four way union actually returns a DELTA (SUPPLY - DEMAND)
2868 
2869 CURSOR c_net_supply_demand (l_refresh_number                NUMBER,
2870                             p_instance_id                   NUMBER,
2871                             l_organization_id               NUMBER,
2872                             l_default_atp_rule_id           NUMBER,
2873                             l_sysdate_seq_num               NUMBER,
2874                             l_calendar_code                 VARCHAR2,
2875                             l_default_demand_class          VARCHAR2,
2876                             l_calendar_exception_set_id     NUMBER
2877                            ) IS
2878    SELECT inventory_item_id, demand_class, SD_DATE, sum(sd_qty) SD_QTY
2879    FROM
2880    ((SELECT
2881            --- bug 2162571: Use Pf's id if doing PF based ATP
2882            DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
2883                                                     I.INVENTORY_ITEM_ID) inventory_item_id,
2884            Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,  NVL(D.DEMAND_CLASS,
2885                  NVL(l_default_demand_class,'@@@')), '@@@') demand_class,
2886            C.PRIOR_DATE SD_DATE,
2887            -1* D.USING_REQUIREMENT_QUANTITY SD_QTY
2888                      --2 SD_TYPE
2889      FROM  MSC_CALENDAR_DATES C,
2890            MSC_DEMANDS D,
2891            MSC_ATP_RULES R,
2892            MSC_SYSTEM_ITEMS I,
2893            MSC_SYSTEM_ITEMS I2
2894     WHERE  I.ATP_FLAG = 'Y'    --- I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
2895       AND  I.ORGANIZATION_ID = l_organization_id
2896       AND  I.SR_INSTANCE_ID = p_instance_id
2897       AND  I.PLAN_ID = -1
2898       --- bug 2162571
2899       AND     I.PLAN_ID = I2.PLAN_ID
2900       AND     I.ORGANIZATION_ID = I2.ORGANIZATION_ID
2901       AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
2902       AND     I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID)
2903       AND  D.REFRESH_NUMBER > l_refresh_number
2904       AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
2905       AND     R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2906       AND     D.PLAN_ID = I.PLAN_ID
2907       AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2908       AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2909       AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
2910                    -- 1243985
2911       AND     USING_REQUIREMENT_QUANTITY <> 0
2912       AND     D.ORIGINATION_TYPE in (
2913               DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
2914               DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
2915               DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
2916               DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
2917               DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
2918                                  -- Bug 1530311, forecast to be excluded
2919       AND     C.CALENDAR_CODE = l_calendar_code
2920       AND     C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2921       AND     C.SR_INSTANCE_ID = p_instance_id
2922                -- since we store repetitive schedule demand in different ways for
2923                -- ods (total quantity on start date) and pds  (daily quantity from
2924                -- start date to end date), we need to make sure we only
2925                -- select work day for pds's repetitive schedule demand.
2926       AND     C.CALENDAR_DATE BETWEEN TRUNC(D.USING_ASSEMBLY_DEMAND_DATE) AND
2927                          TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
2928                          D.USING_ASSEMBLY_DEMAND_DATE))
2929       AND     C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE ,
2930                         NULL, C.PRIOR_SEQ_NUM,
2931                         l_sysdate_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2932    )
2933    UNION ALL    -- with old demand information
2934    (SELECT
2935            --- bug 2162571
2936            --I.inventory_item_id,
2937            DECODE(I2.ATP_FLAG, 'Y', I2.INVENTORY_ITEM_ID,
2938                                                     I.INVENTORY_ITEM_ID) inventory_item_id,
2939            Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,  NVL(D.DEMAND_CLASS,
2940                  NVL(l_default_demand_class,'@@@')), '@@@') demand_class,
2941            C.PRIOR_DATE SD_DATE,
2942            NVL(D.OLD_USING_REQUIREMENT_QUANTITY,0) SD_QTY
2943                      --2 SD_TYPE
2944      FROM  MSC_CALENDAR_DATES C,
2945            MSC_DEMANDS D,
2946            MSC_ATP_RULES R,
2947            MSC_SYSTEM_ITEMS I,
2948            MSC_SYSTEM_ITEMS I2
2949     WHERE  I.ATP_FLAG = 'Y'    --- I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
2950       AND  I.ORGANIZATION_ID = l_organization_id
2951       AND  I.SR_INSTANCE_ID = p_instance_id
2952       AND  I.PLAN_ID = -1
2953       --- bug 2162571
2954       AND     I.PLAN_ID = I2.PLAN_ID
2955       AND     I.ORGANIZATION_ID = I2.ORGANIZATION_ID
2956       AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
2957       AND     I2.INVENTORY_ITEM_ID = NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID)
2958 
2959       AND  D.REFRESH_NUMBER > l_refresh_number
2960       AND  R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
2961       AND     R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
2962       AND     D.PLAN_ID = I.PLAN_ID
2963       AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
2964       AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
2965       AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
2966                    -- 1243985
2967       AND     NVL(D.OLD_USING_REQUIREMENT_QUANTITY,0) <> 0
2968       AND     D.ORIGINATION_TYPE in (
2969               DECODE(R.INCLUDE_DISCRETE_WIP_DEMAND, 1, 3, -1),
2970               DECODE(R.INCLUDE_FLOW_SCHEDULE_DEMAND, 1, 25, -1),
2971               DECODE(R.INCLUDE_USER_DEFINED_DEMAND, 1, 42, -1),
2972               DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 2, -1),
2973               DECODE(R.INCLUDE_REP_WIP_DEMAND, 1, 4, -1))
2974                                  -- Bug 1530311, forecast to be excluded
2975       AND     C.CALENDAR_CODE = l_calendar_code
2976       AND     C.EXCEPTION_SET_ID = l_calendar_exception_set_id
2977       AND     C.SR_INSTANCE_ID = p_instance_id
2978                -- since we store repetitive schedule demand in different ways for
2979                -- ods (total quantity on start date) and pds  (daily quantity from
2980                -- start date to end date), we need to make sure we only
2981                -- select work day for pds's repetitive schedule demand.
2982       AND     C.CALENDAR_DATE BETWEEN TRUNC(D.OLD_USING_ASSEMBLY_DEMAND_DATE) AND
2983                          TRUNC(NVL(D.OLD_ASSEMBLY_DEMAND_COMP_DATE,
2984                          D.OLD_USING_ASSEMBLY_DEMAND_DATE))
2985       AND     C.PRIOR_SEQ_NUM >= DECODE(R.PAST_DUE_DEMAND_CUTOFF_FENCE ,
2986                         NULL, C.PRIOR_SEQ_NUM,
2987                         l_sysdate_seq_num - NVL(R.PAST_DUE_DEMAND_CUTOFF_FENCE,0))
2988    )
2989    UNION ALL  -- new supplies information
2990    (SELECT /*+ ordered index(C,MSC_CALENDAR_DATES_U1) */I.inventory_item_id, -- 5098576/5199686
2991            Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
2992                    NVL(DECODE(S.ORDER_TYPE,
2993                    5, MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
2994                    S.DEMAND_CLASS), NVL(l_default_demand_class, '@@@')), '@@@'),
2995            C.NEXT_DATE SD_DATE,
2996            --- bug 1843471, 2619493
2997            Decode(order_type, -- 2859130 remove trunc
2998             30, Decode(Sign(S.Daily_rate * (C.Calendar_date -
2999                 TRUNC(S.FIRST_UNIT_START_DATE))- S.qty_completed),
3000                 -1,S.Daily_rate* (C.Calendar_date - TRUNC(S.First_Unit_Start_date) +1) -
3001                  S.qty_completed, S.Daily_rate),
3002                  NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) ) SD_QTY
3003            -- Changed the order of the tables for 5098576/5199686
3004      FROM    MSC_SYSTEM_ITEMS I,
3005              MSC_SYSTEM_ITEMS I2,
3006              MSC_SUPPLIES S,
3007              MSC_ATP_RULES R,
3008              MSC_SUB_INVENTORIES MSI,
3009              MSC_CALENDAR_DATES C
3010 
3011 /*   FROM    MSC_CALENDAR_DATES C,
3012            MSC_SUPPLIES S,
3013            MSC_ATP_RULES R,
3014            MSC_SYSTEM_ITEMS I,
3015            --- bug 2162571 add to another table to get info about product family
3016            MSC_SYSTEM_ITEMS I2,
3017            MSC_SUB_INVENTORIES MSI*/ -- commented for 5098576/5199686
3018    WHERE   I.ATP_FLAG = 'Y'   ---I.SR_INVENTORY_ITEM_ID = p_inventory_item_id
3019    AND     I.ORGANIZATION_ID = l_organization_id
3020    AND     I.SR_INSTANCE_ID = p_instance_id
3021    AND     I.PLAN_ID = -1
3022    AND     I.PLAN_ID = I2.PLAN_ID
3023    --- bug 2162571: add system items tables to itself to filter out supplies of
3024    --  product family members if we are doing PF based atp on the member
3025    -- the logic is:1. If it is a regular member then we consider supplies ond demand of that itme
3026    -- 2. If we do product family with config PF --> A then
3027    --              a. If atp flag on PF is yes then we consider supplies of PF and demand of A
3028    --              b. If atp flag on PF in 'N' then we consider supplies and demands of A
3029    AND     I.ORGANIZATION_ID = I2.ORGANIZATION_ID
3030    AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
3031    AND     NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) = I2.INVENTORY_ITEM_ID
3032    ---     in case of PF, if atp_flag on PF is yes then we want to filter out supplies of A
3033    --      For A, the following condition will be true only if ATP_FLAG on PF is 'N'
3034    ---     and therefore we will consider supplies of A. If atp_flag on PF is 'Y"
3035    --     then following condition will be false and we will omit supplies of A
3036    AND     DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
3037    AND  S.REFRESH_NUMBER > l_refresh_number
3038    AND     R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
3039    AND     R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
3040    AND     S.PLAN_ID = I.PLAN_ID
3041    AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
3042    AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
3043    AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
3044                    ---bug 1843471, 2619493
3045    AND     Decode(S.order_type, 30, S.Daily_rate* (C.Calendar_date -- 2859130 remove trunc
3046               - TRUNC(S.First_Unit_Start_date) + 1),
3047                 NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)) >
3048            Decode(S.order_type, 30, S.qty_completed,0)
3049    AND     (S.ORDER_TYPE IN (
3050                    DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
3051                    DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
3052                    DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
3053                    DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
3054                    DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
3055                    DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1) ,
3056                    DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
3057                    DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
3058                    DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
3059                    DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
3060                    DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
3061                    DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1) ,
3062                    DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
3063                    DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
3064             OR ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
3065                    S.ORDER_TYPE = 5
3066                  AND exists (SELECT '1'
3067                                FROM   MSC_DESIGNATORS
3068                               WHERE   INVENTORY_ATP_FLAG = 1
3069                                 AND   DESIGNATOR_TYPE = 2
3070                                 AND   DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
3071    AND   C.CALENDAR_CODE = l_calendar_code
3072    AND   C.EXCEPTION_SET_ID = l_calendar_exception_set_id
3073    AND   C.SR_INSTANCE_ID = p_instance_id
3074    AND   C.CALENDAR_DATE BETWEEN
3075               TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
3076            AND TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE,
3077                   NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
3078    AND   DECODE(S.LAST_UNIT_COMPLETION_DATE,
3079                     NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
3080    AND   C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
3081               DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
3082                 NULL, C.NEXT_SEQ_NUM, l_sysdate_seq_num -
3083                       NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
3084    AND   C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(l_sysdate),
3085                                          28, TRUNC(l_sysdate),
3086                                          C.NEXT_DATE)
3087                  --- filter out non-atpable sub-inventories
3088    AND     MSI.plan_id (+) =  -1
3089    AND     MSI.organization_id (+) = l_organization_id
3090    AND     MSI.sr_instance_id (+) =  p_instance_id
3091    AND     MSI.sub_inventory_code (+) = S.subinventory_code
3092    AND     NVL(MSI.inventory_atp_code,1) <> 2
3093                              -- filter out non-atpable subinventories
3094    )
3095    UNION ALL    -- with old supplies information
3096    (SELECT /*+ ordered index(C,MSC_CALENDAR_DATES_U1) */I.inventory_item_id, -- 5098576/5199686
3097            Decode(NVL(R.DEMAND_CLASS_ATP_FLAG,0),1 ,
3098                    NVL(DECODE(S.ORDER_TYPE,
3099                    5, MSC_ATP_FUNC.Get_MPS_Demand_Class(S.SCHEDULE_DESIGNATOR_ID),
3100                    S.DEMAND_CLASS), NVL(l_default_demand_class, '@@@')), '@@@'),
3101            C.NEXT_DATE SD_DATE,
3102            --- bug 1843471, 2619493
3103            -- 2859130 remove trunc on calendar_date
3104            -1 * Decode(order_type,
3105                30, Decode(Sign(NVL(S.OLD_Daily_rate,0) * (C.Calendar_date -
3106                       TRUNC(S.OLD_FIRST_UNIT_START_DATE))- NVL(S.OLD_qty_completed,0)),
3107                           -1,NVL(S.OLD_Daily_rate,0)* (C.Calendar_date -
3108                                               TRUNC(S.OLD_First_Unit_Start_date) +1) -
3109                           NVL(S.OLD_qty_completed,0), NVL(S.OLD_Daily_rate,0)),
3110              NVL( NVL(S.OLD_FIRM_QUANTITY,S.OLD_NEW_ORDER_QUANTITY),0) ) SD_QTY
3111 
3112       /*FROM    MSC_CALENDAR_DATES C,
3113            MSC_SUPPLIES S,
3114            MSC_ATP_RULES R,
3115            MSC_SYSTEM_ITEMS I,
3116            MSC_SYSTEM_ITEMS I2,
3117            MSC_SUB_INVENTORIES MSI*/
3118      -- Commented 5098576./5199686
3119      -- changed order of tables for 5098576/5199686
3120       FROM    MSC_SYSTEM_ITEMS I,
3121              MSC_SYSTEM_ITEMS I2,
3122              MSC_SUPPLIES S,
3123              MSC_ATP_RULES R,
3124              MSC_SUB_INVENTORIES MSI,
3125              MSC_CALENDAR_DATES C
3126 
3127    WHERE   I.ATP_FLAG = 'Y'
3128    AND     I.ORGANIZATION_ID = l_organization_id
3129    AND     I.SR_INSTANCE_ID = p_instance_id
3130    AND     I.PLAN_ID = -1
3131    AND     I.PLAN_ID = I2.PLAN_ID
3132    --- bug 2162571: add system items tables to itself to filter out supplies of
3133    --  product family members if we are doing PF based atp on the member
3134    -- the logic is:1. If it is a regular member then we consider supplies ond demand of that itme
3135    -- 2. If we do product family with config PF --> A then
3136    --              a. If atp flag on PF is yes then we consider supplies of PF and demand of A
3137    --              b. If atp flag on PF in 'N' then we consider supplies and demands of A
3138    AND     I.ORGANIZATION_ID = I2.ORGANIZATION_ID
3139    AND     I.SR_INSTANCE_ID = I2.SR_INSTANCE_ID
3140    AND     NVL(I.PRODUCT_FAMILY_ID, I.INVENTORY_ITEM_ID) = I2.INVENTORY_ITEM_ID
3141    ---     in case of PF, if atp_flag on PF is yes then we want to filter out supplies of A
3142    --      For A, the following condition will be true only if ATP_FLAG on PF is 'N'
3143    ---     and therefore we will consider supplies of A. If atp_flag on PF is 'Y"
3144    --     then following condition will be false and we will omit supplies of A
3145    AND     DECODE(I.PRODUCT_FAMILY_ID, NULL, 'N', I2.ATP_FLAG ) = 'N'
3146    AND     S.REFRESH_NUMBER > l_refresh_number
3147    AND     R.RULE_ID (+) = NVL(I.ATP_RULE_ID, l_default_atp_rule_id)
3148    AND     R.SR_INSTANCE_ID (+)= I.SR_INSTANCE_ID
3149    AND     S.PLAN_ID = I.PLAN_ID
3150    AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
3151    AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
3152    AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
3153                    ---bug 1843471, 2619493
3154            -- 2859130 remove trunc
3155    AND     Decode(S.order_type, 30, NVL(S.OLD_Daily_rate,0)* (C.Calendar_date
3156               - TRUNC(S.OLD_First_Unit_Start_date) + 1),
3157                 NVL(NVL(S.OLD_FIRM_QUANTITY,S.OLD_NEW_ORDER_QUANTITY),0) ) >
3158            Decode(S.order_type, 30, NVL(S.OLD_qty_completed,0),0)
3159    AND     (S.ORDER_TYPE IN (
3160                    DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 1, -1),
3161                    DECODE(R.INCLUDE_PURCHASE_ORDERS, 1, 8, -1), --1882898
3162                    DECODE(R.INCLUDE_DISCRETE_WIP_RECEIPTS, 1, 3, -1),
3163                    DECODE(R.INCLUDE_REP_WIP_RECEIPTS, 1, 30, -1),
3164                    DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 7, -1),
3165                    DECODE(R.INCLUDE_NONSTD_WIP_RECEIPTS, 1, 15, -1) ,
3166                    DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 11, -1),
3167                    DECODE(R.INCLUDE_INTERORG_TRANSFERS, 1, 12, -1),
3168                    DECODE(R.INCLUDE_ONHAND_AVAILABLE, 1, 18, -1),
3169                    DECODE(R.INCLUDE_INTERNAL_REQS, 1, 2, -1),
3170                    DECODE(R.INCLUDE_SUPPLIER_REQS, 1, 2, -1),
3171                    DECODE(R.INCLUDE_USER_DEFINED_SUPPLY, 1, 41, -1) ,
3172                    DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 27, -1),
3173                    DECODE(R.INCLUDE_FLOW_SCHEDULE_RECEIPTS, 1, 28, -1))
3174             OR ((R.INCLUDE_REP_MPS = 1 OR R.INCLUDE_DISCRETE_MPS = 1) AND
3175                    S.ORDER_TYPE = 5
3176                  AND exists (SELECT '1'
3177                                FROM   MSC_DESIGNATORS
3178                               WHERE   INVENTORY_ATP_FLAG = 1
3179                                 AND   DESIGNATOR_TYPE = 2
3180                                 AND   DESIGNATOR_ID = S.SCHEDULE_DESIGNATOR_ID)))
3181    AND   C.CALENDAR_CODE = l_calendar_code
3182    AND   C.EXCEPTION_SET_ID = l_calendar_exception_set_id
3183    AND   C.SR_INSTANCE_ID = p_instance_id
3184    AND   C.CALENDAR_DATE BETWEEN
3185               TRUNC(NVL(S.OLD_FIRM_DATE,S.OLD_NEW_SCHEDULE_DATE))
3186            AND TRUNC(NVL(S.OLD_LAST_UNIT_COMPLETION_DATE,
3187                   NVL(S.OLD_FIRM_DATE,S.OLD_NEW_SCHEDULE_DATE)))
3188    AND   DECODE(S.OLD_LAST_UNIT_COMPLETION_DATE,
3189                     NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
3190    AND   C.NEXT_SEQ_NUM >= DECODE(S.ORDER_TYPE, 18, C.NEXT_SEQ_NUM,
3191               DECODE(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,
3192                 NULL, C.NEXT_SEQ_NUM, l_sysdate_seq_num -
3193                       NVL(R.PAST_DUE_SUPPLY_CUTOFF_FENCE,0)))
3194    AND   C.NEXT_DATE >= DECODE(S.ORDER_TYPE, 27, TRUNC(l_sysdate),
3195                                          28, TRUNC(l_sysdate),
3196                                          C.NEXT_DATE)
3197                  --- filter out non-atpable sub-inventories
3198    AND     MSI.plan_id (+) =  -1
3199    AND     MSI.organization_id (+) = l_organization_id
3200    AND     MSI.sr_instance_id (+) =  p_instance_id
3201    AND     MSI.sub_inventory_code (+) = S.subinventory_code
3202    AND     NVL(MSI.inventory_atp_code,1) <> 2
3203                              -- filter out non-atpable subinventories
3204    )
3205   )
3206   GROUP BY inventory_item_id, demand_class, sd_date ;
3207 
3208 BEGIN
3209    -- Bug 3304390 Disable Trace
3210    -- Deleted Related Code.
3211 
3212    ---- select org ids for the instance as we are going to do the summary per organization
3213 
3214    l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
3215    l_sysdate := sysdate;
3216    l_user_id := FND_GLOBAL.USER_ID;
3217    l_enable_summary_mode := NVL(FND_PROFILE.value('MSC_ENABLE_ATP_SUMMARY'), 'N');
3218 
3219    msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
3220    msc_util.msc_log('l_enable_summary_mode := ' || l_enable_summary_mode);
3221 
3222    IF l_enable_summary_mode <> 'Y' THEN
3223        msc_util.msc_log('Summary Mode is not enabled. Please enable Summary mode to run this program');
3224        RETCODE := G_WARNING;
3225        RETURN;
3226    END IF;
3227 
3228    IF l_inv_ctp <> 5 THEN
3229        -- we are not doing ODS ATP so we wont  continue
3230        msc_util.msc_log('Not Doing ODS ATP. Will Exit ');
3231        RETCODE := G_WARNING;
3232        RETURN;
3233    END IF;
3234 
3235 /*   SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0) ---LCID
3236    INTO   l_summary_flag, l_refresh_number
3237    from   msc_apps_instances
3238    where  instance_id = p_instance_id;*/
3239 
3240   SELECT NVL(summary_flag, 1), NVL(summary_refresh_number,0),apps_lrn  ---LCID
3241   INTO   l_summary_flag,l_refresh_number,l_apps_lrn		---bug3049003
3242   from   msc_apps_instances
3243   where  instance_id = p_instance_id;
3244 
3245    msc_util.msc_log('l_refresh_number := ' || l_refresh_number);
3246 
3247    IF l_summary_flag = 2 THEN
3248        msc_util.msc_log('Another session is running full summary for this instance');
3249        RETCODE := G_ERROR;
3250        RETURN;
3251    ELSIF (NVL(l_summary_flag, 0) = 2 ) THEN
3252       msc_util.msc_log('Partial summary of tables can be done only after complete summary has been run successfuly');
3253       RETCODE := G_ERROR;
3254       RETURN;
3255    END IF;
3256 
3257    /*SELECT  sr_tp_id
3258      BULK  COLLECT INTO l_org_ids
3259      FROM  msc_trading_partners
3260     WHERE  sr_instance_id = p_instance_id and partner_type = 3;*/
3261 
3262 
3263   SELECT  ORGANIZATION_ID                 ---bug3049003
3264   BULK  COLLECT INTO l_org_ids
3265   FROM    msc_instance_orgs
3266   WHERE   sr_instance_id = p_instance_id
3267   and     org_lrn=l_apps_lrn
3268   and     enabled_flag=1;
3269 
3270    msc_util.msc_log(' org count := ' || l_org_ids.count);
3271 
3272    -- Update summary record per organization
3273    FOR i in 1..l_org_ids.count LOOP
3274        l_organization_id := l_org_ids(i);
3275        msc_util.msc_log('processing org '|| i ||' := '||l_organization_id);
3276 
3277        MSC_ATP_PROC.get_org_default_info ( p_instance_id,
3278                                            l_organization_id,
3279                                            l_default_atp_rule_id,
3280                                            l_calendar_code,
3281                                            l_calendar_exception_set_id,
3282                                            l_default_demand_class,
3283                                            l_org_code);
3284 
3285        msc_util.msc_log('l_calendar_code := ' || l_calendar_code);
3286        msc_util.msc_log('l_calendar_exception_set_id := ' || l_calendar_exception_set_id);
3287        msc_util.msc_log('l_default_atp_rule_id := ' || l_default_atp_rule_id);
3288        msc_util.msc_log('l_default_demand_class := ' || l_default_demand_class);
3289 
3290        BEGIN
3291             SELECT  cal.next_seq_num
3292               INTO  l_sysdate_seq_num
3293               FROM  msc_calendar_dates  cal
3294              WHERE  cal.exception_set_id = l_calendar_exception_set_id
3295                AND  cal.calendar_code = l_calendar_code
3296                AND  cal.calendar_date = TRUNC(l_sysdate)
3297                AND  cal.sr_instance_id = p_instance_id ;
3298        EXCEPTION
3299               WHEN OTHERS THEN
3300                    null;
3301        END;
3302 
3303        OPEN C_NET_SUPPLY_DEMAND (l_refresh_number,
3304                                  p_instance_id,
3305                                  l_organization_id,
3306                                  l_default_atp_rule_id,
3307                                  l_sysdate_seq_num,
3308                                  l_calendar_code,
3309                                  l_default_demand_class,
3310                                  l_calendar_exception_set_id);
3311 
3312        msc_util.msc_log('after opening cursor C_NET_SUPPLY_DEMAND');
3313 
3314        LOOP
3315           FETCH C_NET_SUPPLY_DEMAND INTO
3316                 l_inventory_item_id,
3317                 l_demand_class,
3318                 l_sd_date,
3319                 l_sd_qty;
3320 
3321           EXIT WHEN  C_NET_SUPPLY_DEMAND%NOTFOUND;
3322 
3323           msc_util.msc_log('l_demand_class := ' || l_demand_class);
3324           msc_util.msc_log('l_sd_date := ' || l_sd_date);
3325           msc_util.msc_log('l_sd_qty := ' || l_sd_qty);
3326           msc_util.msc_log('l_inventory_item_id := ' || l_inventory_item_id);
3327 
3328           --- With 9i the entire set can be accomplished in one MERGE statement.
3329           --- Try to update record first and then
3330           UPDATE  MSC_ATP_SUMMARY_SD
3331              SET  sd_qty = sd_qty + l_sd_qty,   -- APPLY THE DELTA
3332                   last_update_date = l_sysdate,
3333                   last_updated_by = l_user_id
3334            WHERE  plan_id = -1
3335              AND  sr_instance_id = p_instance_id
3336              AND  organization_id = l_organization_id
3337              AND  inventory_item_id = l_inventory_item_id
3338              AND  demand_class = l_demand_class
3339              AND  trunc(sd_date) = trunc(l_sd_date);
3340           --COMMIT; 5078448
3341 
3342               --- if not found insert it.
3343           IF (SQL%NOTFOUND) THEN
3344             --- Insert the new record
3345             BEGIN
3346               INSERT INTO MSC_ATP_SUMMARY_SD
3347                           (plan_id,
3348                            sr_instance_id,
3349                            organization_id,
3350                            inventory_item_id,
3351                            demand_class,
3352                            sd_date,
3353                            sd_qty,
3354                            last_update_date,
3355                            last_updated_by,
3356                            creation_date,
3357                            created_by)
3358                   VALUES (-1, p_instance_id, l_organization_id,
3359                            l_inventory_item_id, l_demand_class, trunc(l_sd_date),
3360                            l_sd_qty, l_sysdate, l_user_id ,
3361                            l_sysdate, l_user_id
3362                          );
3363               --COMMIT; 5078448
3364             EXCEPTION
3365               -- If a record has already been inserted by another process
3366               -- If insert fails then update.
3367                WHEN DUP_VAL_ON_INDEX THEN
3368                  -- Update the record.
3369                  UPDATE MSC_ATP_SUMMARY_SD
3370                     SET sd_qty = sd_qty + l_sd_qty,   -- The value is a DELTA
3371                         last_update_date = l_sysdate,
3372                         last_updated_by = l_user_id
3373                   WHERE plan_id = -1
3374                     AND sr_instance_id = p_instance_id
3375                     AND organization_id = l_organization_id
3376                     AND inventory_item_id = l_inventory_item_id
3377                     AND demand_class = l_demand_class
3378                     AND trunc(sd_date) = trunc(l_sd_date);
3379 
3380                 --COMMIT; 5078448
3381             END;
3382           END IF;
3383           COMMIT; --5078448
3384 
3385        END LOOP;
3386 
3387        CLOSE C_NET_SUPPLY_DEMAND;
3388 
3389    END LOOP;
3390 
3391    -- TAke care of OUT parameters
3392    ERRBUF  := null;
3393    RETCODE := G_SUCCESS;
3394 
3395    EXCEPTION
3396         WHEN OTHERS THEN
3397 
3398             IF (C_NET_SUPPLY_DEMAND%ISOPEN) THEN
3399                CLOSE C_NET_SUPPLY_DEMAND;
3400             END IF;
3401             --- update summary flag in msc_apps_instances so that summary not available to use
3402             update msc_apps_instances
3403             set summary_flag = 1
3404             where instance_id = p_instance_id;
3405             msc_util.msc_log('An error  occured while running net change on Sales Orders');
3406             msc_util.msc_log('Complete refresh would need to be run to activate Summary ATP');
3407 
3408             msc_util.msc_log('Inside main exception');
3409             msc_util.msc_log(sqlerrm);
3410             ERRBUF := sqlerrm;
3411             RETCODE := G_ERROR;
3412 
3413 END LOAD_NET_SD;
3414 
3415 
3416 PROCEDURE CREATE_PLAN_PARTITIONS( p_plan_id         IN   NUMBER,
3417                                  p_applsys_schema   IN   VARCHAR2,
3418                                  p_share_partition IN   VARCHAR2,
3419                                  p_owner	   IN   VARCHAR2,
3420                                  p_ret_code        OUT  NoCopy NUMBER,
3421                                  p_err_msg         OUT  NoCopy VARCHAR2)
3422 AS
3423 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3424                                         'ATP_SUMMARY_SD',
3425                                         'ATP_SUMMARY_RES',
3426                                         'ATP_SUMMARY_SUP');
3427 i                 NUMBER;
3428 l_partition_name  VARCHAR2(30);
3429 l_name  	  VARCHAR2(30);
3430 l_split_partition VARCHAR2(30);
3431 l_summary_flag    varchar2(30);
3432 l_plan_id         number;
3433 l_higher_plan     number;
3434 l_sql_stmt        varchar2(1000);
3435 l_table_name      varchar2(30);
3436 
3437 CURSOR C_PLAN IS
3438 SELECT	plan_id
3439 FROM	msc_plans
3440 WHERE	plan_id > p_plan_id
3441 AND	NVL(SUMMARY_FLAG, 0) <> 0
3442 ORDER BY plan_id;
3443 
3444 BEGIN
3445         msc_util.msc_log('p_plan_id := ' || p_plan_id);
3446         msc_util.msc_log('p_applsys_schema := ' || p_applsys_schema);
3447         msc_util.msc_log('p_share_partition := ' || p_share_partition);
3448         msc_util.msc_log('p_owner := ' || p_owner);
3449 
3450         p_ret_code := G_SUCCESS;
3451         p_err_msg  := null;
3452 
3453 	For i in 1..atp_summ_tab.COUNT LOOP
3454 
3455             IF p_share_partition = 'Y' then
3456                  l_partition_name := atp_summ_tab(i) || '_' || MAXVALUE;
3457                  l_plan_id := MAXVALUE;
3458             ELSE
3459                  l_partition_name := atp_summ_tab(i) || '_' || p_plan_id;
3460                  l_plan_id := p_plan_id;
3461             END IF;
3462             l_table_name := 'MSC_' || atp_summ_tab(i);
3463             msc_util.msc_log('table := ' || l_table_name);
3464             msc_util.msc_log('partition_name : '|| l_partition_name);
3465             BEGIN
3466                IF p_share_partition = 'Y' then
3467 		  BEGIN
3468 	             SELECT   partition_name
3469                      INTO     l_name
3470                      --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3471                      FROM     all_tab_partitions
3472                      WHERE    table_name = l_table_name
3473                      AND      table_owner = p_owner
3474                      AND      partition_name = l_partition_name;
3475 
3476                      msc_util.msc_log('found partition_name : '|| l_name);
3477 		  EXCEPTION
3478 		     WHEN no_data_found THEN
3479 			l_summary_flag := 0;
3480 			msc_util.msc_log('before create partition_name : '|| l_partition_name);
3481 		  END;
3482 	       ELSE
3483                   SELECT   NVL(summary_flag, 0)
3484                   INTO     l_summary_flag
3485                   FROM     msc_plans
3486                   WHERE    plan_id = p_plan_id;
3487 	       END IF;
3488 
3489                msc_util.msc_log('summary_flag for plan : '|| p_plan_id || ' : '|| l_summary_flag);
3490 
3491 	       IF l_summary_flag <> 0 THEN
3492                   msc_util.msc_log('found partition for plan_id : '|| p_plan_id);
3493            	  p_ret_code := G_SUCCESS;
3494            	  p_err_msg  := null;
3495 		  RETURN;
3496 	       ELSIF l_summary_flag = 0 THEN
3497                   msc_util.msc_log('l_plan_id:= ' || l_plan_id);
3498 
3499 		  OPEN C_PLAN;
3500 		  FETCH C_PLAN INTO l_higher_plan;
3501                   msc_util.msc_log('l_higher_plan : ' || l_higher_plan);
3502 
3503 		     IF C_PLAN%NOTFOUND THEN
3504                         l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3505                               || l_partition_name
3506                               || ' VALUES LESS THAN ('
3507                               || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3508                               || ')';
3509 		     ELSE 		-- IF C_PLAN%NOTFOUND THEN
3510 
3511 			l_split_partition := atp_summ_tab(i) || '_' || to_char(l_higher_plan);
3512 
3513                         l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3514                               || l_split_partition || ' AT ( -1, ' || to_char(l_plan_id) || ')'
3515                               || ' INTO ( PARTITION ' || l_partition_name || ','
3516                               || ' PARTITION ' || l_split_partition || ')';
3517 		     END IF; 	-- C_PLAN%NOTFOUND THEN
3518 
3519                      msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3520 		  CLOSE C_PLAN;
3521 
3522                   ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
3523                             APPLICATION_SHORT_NAME => 'MSC',
3524                             STATEMENT_TYPE => ad_ddl.alter_table,
3525                             STATEMENT => l_sql_stmt,
3526                             OBJECT_NAME => l_table_name);
3527                   msc_util.msc_log('Create Partition successful');
3528 	       END IF;		-- l_summary_flag <> 0 THEN
3529             EXCEPTION
3530                WHEN no_data_found THEN
3531                   msc_util.msc_log('Plan Not Found : ' || p_plan_id );
3532            	  p_ret_code := G_ERROR;
3533            	  p_err_msg  := sqlerrm;
3534 		  RETURN;
3535             END;
3536 
3537         END LOOP;
3538 
3539 EXCEPTION
3540         WHEN OTHERS THEN
3541            msc_util.msc_log('In exception of CREATE_PLAN_PARTITIONS');
3542            p_ret_code := G_ERROR;
3543            p_err_msg  := sqlerrm;
3544 END CREATE_PLAN_PARTITIONS;
3545 
3546 
3547 PROCEDURE CREATE_INST_PARTITIONS(p_instance_id     IN   NUMBER,
3548                                  p_applsys_schema  IN   VARCHAR2,
3549                                  p_owner	   IN   VARCHAR2,
3550                                  p_ret_code        OUT  NoCopy NUMBER,
3551                                  p_err_msg         OUT  NoCopy VARCHAR2)
3552 AS
3553 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3554                                         'ATP_SUMMARY_SD',
3555                                         'ATP_SUMMARY_SO');
3556 i                 NUMBER;
3557 l_partition_name  VARCHAR2(30);
3558 l_split_partition VARCHAR2(30);
3559 l_summary_flag    varchar2(30);
3560 l_higher_instance number;
3561 l_sql_stmt        varchar2(1000);
3562 l_table_name      varchar2(30);
3563 
3564 CURSOR C_INST IS
3565 SELECT	instance_id
3566 FROM	msc_apps_instances
3567 WHERE	instance_id > p_instance_id
3568 AND	NVL(summary_flag, 0) <> 0
3569 ORDER BY instance_id;
3570 
3571 BEGIN
3572         msc_util.msc_log('p_instance_id := ' || p_instance_id);
3573         msc_util.msc_log('p_applsys_schema := ' || p_applsys_schema);
3574         msc_util.msc_log('p_owner := ' || p_owner);
3575 
3576         p_ret_code := G_SUCCESS;
3577         p_err_msg  := null;
3578 
3579 	For i in 1..atp_summ_tab.COUNT LOOP
3580 
3581             l_partition_name := atp_summ_tab(i) || '__' || p_instance_id;
3582 
3583             l_table_name := 'MSC_' || atp_summ_tab(i);
3584             msc_util.msc_log('table := ' || l_table_name);
3585             msc_util.msc_log('partition_name : '|| l_partition_name);
3586             BEGIN
3587                SELECT  NVL(summary_flag, 0)
3588                INTO     l_summary_flag
3589                FROM     msc_apps_instances
3590                WHERE    instance_id = p_instance_id;
3591 
3592                msc_util.msc_log('summary_flag for instance : '|| p_instance_id || ' : '|| l_summary_flag);
3593 
3594 	       IF l_summary_flag <> 0 THEN
3595                   msc_util.msc_log('found partition for instance_id : '|| p_instance_id);
3596            	  p_ret_code := G_SUCCESS;
3597            	  p_err_msg  := null;
3598 		  RETURN;
3599 	       ELSIF l_summary_flag = 0 THEN
3600                   msc_util.msc_log('p_instance_id : ' || p_instance_id);
3601 
3602 		  OPEN C_INST;
3603 		  FETCH C_INST INTO l_higher_instance;
3604 
3605 		     IF C_INST%NOTFOUND THEN
3606                         l_split_partition := atp_summ_tab(i) || '_0';
3607 		     ELSE 		-- IF C_INST%NOTFOUND THEN
3608                         l_split_partition := atp_summ_tab(i) || '__' || l_higher_instance;
3609 		     END IF; 	-- C_INST%NOTFOUND THEN
3610 
3611 		  CLOSE C_INST;
3612 
3613                   IF l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3614                     l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3615                                 || l_split_partition || ' AT ( '
3616                                 || to_char(p_instance_id +1) || ')'
3617                                 || ' INTO ( PARTITION ' || l_partition_name || ','
3618                                 || ' PARTITION ' || l_split_partition || ')';
3619                   ELSIF l_table_name = 'MSC_ATP_SUMMARY_SD' THEN
3620                     l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3621                                 || l_split_partition || ' AT ( -1, '
3622                                 || to_char(p_instance_id +1) || ')'
3623                                 || ' INTO ( PARTITION ' || l_partition_name || ','
3624                                 || ' PARTITION ' ||l_split_partition || ')';
3625                   END IF;       -- l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3626                   msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3627                   ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
3628                             APPLICATION_SHORT_NAME => 'MSC',
3629                             STATEMENT_TYPE => ad_ddl.alter_table,
3630                             STATEMENT => l_sql_stmt,
3631                             OBJECT_NAME => l_table_name);
3632                   msc_util.msc_log('Create Partition successful');
3633 	       END IF;		-- l_summary_flag <> 0 THEN
3634             EXCEPTION
3635                WHEN no_data_found THEN
3636                   msc_util.msc_log('Instance Not Found : ' || p_instance_id );
3637            	  p_ret_code := G_ERROR;
3638            	  p_err_msg  := sqlerrm;
3639 		  RETURN;
3640             END;
3641 
3642         END LOOP;
3643 
3644 EXCEPTION
3645         WHEN OTHERS THEN
3646            msc_util.msc_log('In exception of CREATE_INST_PARTITIONS');
3647            p_ret_code := G_ERROR;
3648            p_err_msg  := sqlerrm;
3649 END CREATE_INST_PARTITIONS;
3650 
3651 
3652 
3653 PROCEDURE CREATE_PARTITIONS( ERRBUF             OUT    NoCopy VARCHAR2,
3654                              RETCODE           OUT    NoCopy NUMBER)
3655 AS
3656 
3657 atp_summ_tab MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
3658                                         'ATP_SUMMARY_SO',
3659                                         'ATP_SUMMARY_SD',
3660  				        'ATP_SUMMARY_RES',
3661                                         'ATP_SUMMARY_SUP',
3662 					'ALLOC_DEMANDS',
3663 					'ALLOC_SUPPLIES',
3664                                         -- CTO ODR Simplified Pegging
3665                                         'ATP_PEGGING');
3666 i                 NUMBER;
3667 j		  NUMBER;
3668 l_partition_name  VARCHAR2(30);
3669 l_split_partition VARCHAR2(30);
3670 l_summary_flag    varchar2(30);
3671 l_higher_instance number;
3672 l_sql_stmt        varchar2(1000);
3673 l_table_name      varchar2(30);
3674 INSTANCE_IDS      MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
3675 PLAN_IDS          MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
3676 l_applsys_schema                varchar2(10);
3677 l_msc_schema                    VARCHAR2(30);
3678 l_retval                        BOOLEAN;
3679 dummy1                          varchar2(10);
3680 dummy2                          varchar2(10);
3681 l_count			        number;
3682 l_share_partition		varchar2(1);
3683 l_plan_id			number;
3684 -- rajjain 12/20/2002
3685 l_spid                          VARCHAR2(12);
3686 
3687 
3688 BEGIN
3689         -- Bug 3304390 Disable Trace
3690         -- Deleted Related Code
3691 
3692         l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
3693         SELECT  a.oracle_username
3694         INTO    l_msc_schema
3695         FROM    FND_ORACLE_USERID a,
3696                 FND_PRODUCT_INSTALLATIONS b
3697         WHERE   a.oracle_id = b.oracle_id
3698         AND     b.application_id = 724;
3699 
3700 
3701         RETCODE := G_SUCCESS;
3702         ERRBUF  := null;
3703 
3704         BEGIN
3705            SELECT INSTANCE_ID
3706            BULK COLLECT INTO INSTANCE_IDS
3707            ---bug 2389523: use msc_ins_partitions instead of
3708            -- msc_apps_instances to look for existing instance partitions
3709            --FROM   MSC_APPS_INSTANCES
3710            FROM  MSC_INST_PARTITIONS
3711            ORDER BY INSTANCE_ID;
3712         END;
3713 
3714         --- create Instance partitions
3715 
3716         FOR j in 1..INSTANCE_IDS.COUNT LOOP
3717 
3718            msc_util.msc_log('j := ' || j);
3719 	   For i in 1..2 LOOP --- loop for only first two enteries of the atp_summ_tab array
3720 
3721                l_partition_name := atp_summ_tab(i) || '__' || INSTANCE_IDS(j);
3722                l_table_name := 'MSC_' || atp_summ_tab(i);
3723                l_split_partition := atp_summ_tab(i) || '_0';
3724                msc_util.msc_log('table := ' || l_table_name);
3725                msc_util.msc_log('partition_name : '|| l_partition_name);
3726                BEGIN
3727                      BEGIN
3728                          SELECT count(*)
3729                          INTO l_count
3730                          --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3731                          --FROM DBA_TAB_PARTITIONS
3732                          FROM ALL_TAB_PARTITIONS
3733                          WHERE TABLE_NAME = l_table_name
3734                          AND   PARTITION_NAME = l_partition_name
3735                          AND   table_owner = l_msc_schema;
3736                      EXCEPTION
3737                          WHEN OTHERS THEN
3738                              msc_util.msc_log('Inside Exception');
3739                              l_count := 1;
3740                      END;
3741                      msc_util.msc_log('l_count := ' || l_count);
3742                      IF l_count = 0 THEN
3743                         ---partition doesn't exist
3744 
3745 
3746                         IF l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3747                           l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3748                                       || l_split_partition || ' AT ( '
3749                                       || to_char(instance_ids(j) +1) || ')'
3750                                       || ' INTO ( PARTITION ' || l_partition_name || ','
3751                                       || ' PARTITION ' || l_split_partition || ')';
3752                         ELSIF l_table_name = 'MSC_ATP_SUMMARY_SD' THEN
3753                           l_sql_stmt := 'alter table ' || l_table_name || ' split partition '
3754                                       || l_split_partition || ' AT ( -1, '
3755                                       || to_char(instance_ids(j) +1) || ')'
3756                                       || ' INTO ( PARTITION ' || l_partition_name || ','
3757                                       || ' PARTITION ' ||l_split_partition || ')';
3758                         END IF;       -- l_table_name = 'MSC_ATP_SUMMARY_SO' THEN
3759                         msc_util.msc_log('l_sql_stmt := ' || l_sql_stmt);
3760                         ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3761                                   APPLICATION_SHORT_NAME => 'MSC',
3762                                   STATEMENT_TYPE => ad_ddl.alter_table,
3763                                   STATEMENT => l_sql_stmt,
3764                                   OBJECT_NAME => l_table_name);
3765                         msc_util.msc_log('Create Partition successful');
3766                      ELSE
3767                         msc_util.msc_log('Partition for instance ' || instance_ids(j) || ' already exists');
3768 	             END IF;
3769                END;
3770 
3771            END LOOP;
3772         END LOOP;
3773 
3774         l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
3775         msc_util.msc_log('l_share_partition := ' || l_share_partition);
3776 
3777         IF l_share_partition = 'Y' then
3778             msc_util.msc_log('Share partition is on');
3779             ---first we check if _999999 partition exists on MSC_SYSTEM_ITEMS or not.
3780             ---1) If it exists then the _999999 partition might or might not exist om
3781             --- the atp summary tables. In this case we check and create it if it doesn't exist
3782             ---2) If partition on msc_system_items doesn't exist then that means customer is running
3783             ---   create APS partition proram for the first time. So we let create_partition_pvt
3784             --- in MSCPRPRB.pls create the patitions
3785             l_table_name := 'MSC_SYSTEM_ITEMS';
3786             l_partition_name := 'SYSTEM_ITEMS'  || '_' || MAXVALUE;
3787 
3788             BEGIN
3789                select count(*)
3790                into   l_count
3791                --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3792                --from dba_tab_partitions
3793                from ALL_tab_partitions
3794                where table_name = l_table_name
3795                and   table_owner = l_msc_schema
3796                and    partition_name = l_partition_name;
3797             EXCEPTION
3798                WHEN OTHERS THEN
3799                   l_count := 1;
3800             END;
3801             msc_util.msc_log('Count of partition om msc_system_items := ' || l_count);
3802             IF l_count > 0 THEN --- patiton on msc_system items exist
3803 
3804 
3805 
3806 	       For i in 2..atp_summ_tab.COUNT LOOP
3807 
3808                    l_partition_name := atp_summ_tab(i) || '_' || MAXVALUE;
3809                    l_plan_id := MAXVALUE;
3810                    l_table_name := 'MSC_' || atp_summ_tab(i);
3811                    msc_util.msc_log('table := ' || l_table_name);
3812                    msc_util.msc_log('partition_name : '|| l_partition_name);
3813 
3814                    BEGIN
3815                       select count(*)
3816                       into   l_count
3817                       --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3818                       --from dba_tab_partitions
3819                       from all_tab_partitions
3820                       where table_name = l_table_name
3821                       and   table_owner = l_msc_schema
3822                       and    partition_name = l_partition_name;
3823                    EXCEPTION
3824                       WHEN OTHERS THEN
3825                          l_count := 1;
3826                    END;
3827                    IF (l_count = 0)  THEN
3828 
3829                         l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3830                                      || l_partition_name
3831                                      || ' VALUES LESS THAN ('
3832                                      || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3833                                      || ')';
3834                          ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3835                                 APPLICATION_SHORT_NAME => 'MSC',
3836                                 STATEMENT_TYPE => ad_ddl.alter_table,
3837                                 STATEMENT => l_sql_stmt,
3838                                 OBJECT_NAME => atp_summ_tab(i));
3839 
3840                          msc_util.msc_log('Create Partition successful');
3841                    ELSE
3842                          msc_util.msc_log('Plan partition for plan ' || l_plan_id || ' already exists');
3843                    END IF;		-- l_summary_flag <> 0 THEN
3844 
3845                END LOOP; --- For i in 2..atp_summ_tab.COUNT LOOP
3846             ELSE
3847                msc_util.msc_log(' No partition on msc_system_items exist.');
3848                msc_util.msc_log('Partitions will be created by the main program');
3849             END IF; -- if l_count > 0
3850 
3851         ELSE --- IF l_share_partition = 'Y' then
3852            --- create plan partitions
3853            --- select plan_ids
3854            BEGIN
3855               select plan_id
3856               bulk collect into   plan_ids
3857               --bug 2389523: use msc_plan_partitions instead of msc_plans
3858               --from   msc_plans
3859               from msc_plan_partitions
3860               order by plan_id;
3861 
3862            END;
3863 
3864            msc_util.msc_log('plan count := ' || plan_ids.count);
3865            FOR j in 1..plan_ids.count LOOP
3866               msc_util.msc_log('j := ' || j );
3867               msc_util.msc_log('plan_ids := ' || plan_ids(j));
3868 
3869 	      For i in 2..atp_summ_tab.COUNT LOOP
3870 
3871                   l_partition_name := atp_summ_tab(i) || '_' || ABS(plan_ids(j));
3872                   l_plan_id := plan_ids(j);
3873                   l_table_name := 'MSC_' || atp_summ_tab(i);
3874                   msc_util.msc_log('table := ' || l_table_name);
3875                   msc_util.msc_log('partition_name : '|| l_partition_name);
3876 
3877                   BEGIN
3878                      select count(*)
3879                      into   l_count
3880                      --bug 2495962: Change refrence from dba_xxx to all_xxx tables
3881                      --from dba_tab_partitions
3882                      from all_tab_partitions
3883                      where table_name = l_table_name
3884                      and   table_owner = l_msc_schema
3885                      and    partition_name = l_partition_name;
3886                   EXCEPTION
3887                      WHEN OTHERS THEN
3888                         l_count := 1;
3889                   END;
3890                   IF (l_count = 0)  AND (l_plan_id <> -1) THEN
3891 
3892                        l_sql_stmt := 'alter table ' || l_table_name || ' add partition '
3893                                     || l_partition_name
3894                                     || ' VALUES LESS THAN ('
3895                                     || to_char(l_plan_id) || ', ' ||to_char(MAXVALUE + 1)
3896                                     || ')';
3897                         ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
3898                                APPLICATION_SHORT_NAME => 'MSC',
3899                                STATEMENT_TYPE => ad_ddl.alter_table,
3900                                STATEMENT => l_sql_stmt,
3901                                OBJECT_NAME => atp_summ_tab(i));
3902 
3903                         msc_util.msc_log('Create Partition successful');
3904                   ELSE
3905                         msc_util.msc_log('Plan partition for plan ' || l_plan_id || ' already exists');
3906 	          END IF;		-- l_summary_flag <> 0 THEN
3907 
3908               END LOOP;
3909            END LOOP;
3910         END IF; -- IF l_share_partition = 'Y' then
3911         msc_util.msc_log('After Create Partitions');
3912 
3913 EXCEPTION
3914         WHEN OTHERS THEN
3915            msc_util.msc_log('In exception of CREATE_PARTITIONS');
3916            msc_util.msc_log('sqlerrm := ' || sqlerrm);
3917            RETCODE := G_ERROR;
3918            ERRBUF  := sqlerrm;
3919 END CREATE_PARTITIONS;
3920 
3921 PROCEDURE LAUNCH_CONC_PROG(ERRBUF          IN OUT     NoCopy VARCHAR2,
3922                            RETCODE         IN OUT     NoCopy NUMBER,
3923                            P_INSTANCE_ID   IN      NUMBER,
3924                            P_COLLECT_TYPE  IN      NUMBER,
3925                            REFRESH_SO      IN      NUMBER,
3926                            REFRESH_SD      IN      NUMBER)
3927 AS
3928 -- rajjain 12/20/2002
3929 l_spid                          VARCHAR2(12);
3930 
3931 BEGIN
3932         -- Bug 3304390 Disable Trace
3933         -- Deleted Related Code.
3934 
3935         IF P_COLLECT_TYPE = 1 THEN ---- full refresh
3936 
3937            IF REFRESH_SO = 1 THEN -- full refresh S/O and S/D
3938 
3939               MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 3);
3940 
3941            ELSE
3942 
3943               MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 2); --full S/D
3944               IF RETCODE <> G_SUCCESS THEN
3945                   RETURN;
3946               END IF;
3947               MSC_POST_PRO.LOAD_NET_SO(ERRBUF, RETCODE, P_INSTANCE_ID);           -- Net S/O
3948 
3949            END IF;
3950 
3951         ELSIF P_COLLECT_TYPE = 2 THEN   ---- Net change Refresh
3952 
3953               MSC_POST_PRO.LOAD_NET_SO(ERRBUF, RETCODE, P_INSTANCE_ID); -- Net SO
3954               IF RETCODE <> G_SUCCESS THEN
3955                   RETURN;
3956               END IF;
3957               MSC_POST_PRO.LOAD_NET_SD(ERRBUF, RETCODE, P_INSTANCE_ID); -- Net SD
3958 
3959         ELSIF P_COLLECT_TYPE = 3 THEN ---TARGETED
3960 
3961            IF REFRESH_SO = 1 AND REFRESH_SD = 1 THEN
3962 
3963               MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 3); -- full S/O, S/D
3964 
3965            ELSIF REFRESH_SO = 1 THEN
3966 
3967               MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 1); -- full S/O
3968 
3969            ELSIF REFRESH_SD = 1 THEN
3970 
3971               MSC_POST_PRO.LOAD_SUPPLY_DEMAND(ERRBUF, RETCODE, P_INSTANCE_ID, 2); -- full S/D
3972 
3973            END IF;
3974         END IF;
3975         IF RETCODE <> G_SUCCESS THEN
3976             RETURN;
3977         END IF;
3978         --- update the summary refresh number with refresh number
3979         --- Summary refresh number is used by net change/targeted refresh.
3980         --- Net Chnage/Targeted refresh is done only for those
3981         --- Sales orders or supply/demands where refresh number is greater than summary refresh number
3982         --- This is done this way to avoid summarizing in partial refresh if it is run erroneously after
3983         --- full refresh by user.
3984         UPDATE msc_apps_instances
3985         SET summary_refresh_number = LCID
3986         WHERE instance_id = p_instance_id;
3987 
3988         commit;                 --bug3049003
3989 
3990 END LAUNCH_CONC_PROG;
3991 
3992 
3993 -- 2/14/2002 ngoel, added this procedure for cleaning pre-allocating demands and supplies temp tables
3994 -- while using pegging from the plan in case allocation method profile is set to "Use Planning Output".
3995 
3996 -- 6/19/2002 ngoel, modified this procedure to drop dynamically created temp tables
3997 -- Added input parameters to drop newly added temp table MSC_ALLOC_TEMP_ as well for forecast at PF
3998 PROCEDURE clean_temp_tables(
3999 	p_applsys_schema 	IN  	varchar2,
4000 	p_plan_id		IN	NUMBER,
4001 	p_plan_id2              IN      NUMBER,
4002 	p_demand_priority       IN      VARCHAR2)
4003 IS
4004 l_sql_stmt              VARCHAR2(1000);
4005 BEGIN
4006         -- Drop newly added temp table for forecast at PF as well
4007         IF p_demand_priority = 'Y' THEN
4008                 l_sql_stmt := 'DROP TABLE MSC_ALLOC_TEMP_' || to_char(p_plan_id2);
4009 
4010                 BEGIN
4011                     msc_util.msc_log(l_sql_stmt);
4012                     ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4013                            APPLICATION_SHORT_NAME => 'MSC',
4014                            STATEMENT_TYPE => ad_ddl.drop_table,
4015                            STATEMENT => l_sql_stmt,
4016                            OBJECT_NAME => 'MSC_ALLOC_TEMP_' || to_char(p_plan_id2));
4017                 EXCEPTION
4018                     WHEN OTHERS THEN
4019                          msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4020                          msc_util.msc_log(l_sql_stmt || ' failed');
4021                 END;
4022         END IF;
4023 
4024         IF p_plan_id = p_plan_id2 THEN -- Means share plan partition is No
4025                 l_sql_stmt := 'DROP TABLE MSC_TEMP_ALLOC_DEM_' || to_char(p_plan_id);
4026 
4027                 BEGIN
4028                     msc_util.msc_log(l_sql_stmt);
4029                     ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4030                            APPLICATION_SHORT_NAME => 'MSC',
4031                            STATEMENT_TYPE => ad_ddl.drop_table,
4032                            STATEMENT => l_sql_stmt,
4033                            OBJECT_NAME => 'MSC_TEMP_ALLOC_DEM_' || to_char(p_plan_id));
4034                 EXCEPTION
4035                     WHEN OTHERS THEN
4036                          msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4037                          msc_util.msc_log(l_sql_stmt || ' failed');
4038                 END;
4039 
4040                 l_sql_stmt := 'DROP TABLE MSC_TEMP_ALLOC_SUP_' || to_char(p_plan_id);
4041 
4042                 BEGIN
4043                     msc_util.msc_log(l_sql_stmt);
4044                     ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
4045                            APPLICATION_SHORT_NAME => 'MSC',
4046                            STATEMENT_TYPE => ad_ddl.drop_table,
4047                            STATEMENT => l_sql_stmt,
4048                            OBJECT_NAME => 'MSC_TEMP_ALLOC_SUP_' || to_char(p_plan_id));
4049                 EXCEPTION
4050                     WHEN OTHERS THEN
4051                          msc_util.msc_log(sqlcode || ': ' || sqlerrm);
4052                          msc_util.msc_log(l_sql_stmt || ' failed');
4053                 END;
4054         END IF;
4055 END clean_temp_tables;
4056 
4057 
4058 -- 2/14/2002 ngoel, added this procedure for pre-allocating demands and supplies using
4059 -- pegging from the plan in case allocation method profile is set to "Demand Priority".
4060 
4061 -- 6/19/2002 ngoel, modified to use dynamically created temp tables instead of pre-seeded temp tables
4062 -- in case profile "MSC: Share Plan Partition" is "No". This was needed to enable multiple plan support.
4063 
4064 PROCEDURE post_plan_allocation(
4065 	ERRBUF          OUT     NoCopy VARCHAR2,
4066 	RETCODE         OUT     NoCopy NUMBER,
4067 	p_plan_id       IN 	NUMBER)
4068 IS
4069 
4070 G_ERROR				NUMBER := 1;
4071 G_SUCCESS			NUMBER := 0;
4072 MAXVALUE               CONSTANT NUMBER := 999999;
4073 
4074 l_retval                        BOOLEAN;
4075 l_sysdate                       DATE;
4076 i                               NUMBER;
4077 l_alloc_method                  NUMBER;
4078 l_class_hrchy                   NUMBER;
4079 l_count				NUMBER;
4080 l_inv_ctp                       NUMBER;
4081 l_plan_id                       NUMBER;
4082 l_ret_code			NUMBER;
4083 l_summary_flag			NUMBER;
4084 l_user_id                       NUMBER;
4085 dummy1                          VARCHAR2(10);
4086 dummy2                          VARCHAR2(10);
4087 l_alloc_atp                     VARCHAR2(1);
4088 l_applsys_schema                VARCHAR2(10);
4089 l_err_msg			VARCHAR2(1000);
4090 l_ind_tbspace                   VARCHAR2(30);
4091 l_insert_stmt                   VARCHAR2(8000); -- ssurendr: increased the string length
4092 l_msc_schema                    VARCHAR2(30);
4093 l_other_dc                      VARCHAR2(30) := '-1';
4094 l_partition_name                VARCHAR2(30);
4095 l_share_partition   		VARCHAR2(1);
4096 l_sql_stmt                      VARCHAR2(300);
4097 l_sql_stmt_1                    VARCHAR2(8000);
4098 l_table_name			VARCHAR2(30);
4099 l_tbspace                       VARCHAR2(30);
4100 l_temp_table			VARCHAR2(30);
4101 atp_summ_tab 			MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr(
4102 								'ALLOC_DEMANDS',
4103 								'ALLOC_SUPPLIES');
4104 -- Bug 2516506
4105 l_plan_name                     varchar2(10);
4106 
4107 -- 2566795
4108 cur_handler			NUMBER;
4109 rows_processed			NUMBER;
4110 l_hash_size			NUMBER := -1;
4111 l_sort_size			NUMBER := -1;
4112 l_parallel_degree		NUMBER := 1;
4113 
4114 -- project atp
4115 l_excess_supply_by_dc           varchar2(1);
4116 
4117 BEGIN
4118     msc_util.msc_log('Begin procedure post_plan_allocation');
4119 
4120     l_inv_ctp := FND_PROFILE.value('INV_CTP');
4121     msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
4122 
4123     IF l_inv_ctp <> 4 THEN
4124        -- we are not doing PDS ATP so we wont  continue
4125        msc_util.msc_log('Not Doing PDS ATP. Will Exit ');
4126        RETCODE := G_ERROR;
4127        RETURN;
4128     END IF;
4129 
4130     l_alloc_atp := NVL(FND_PROFILE.value('MSC_ALLOCATED_ATP'),'N');
4131     msc_util.msc_log('l_alloc_atp := ' || l_alloc_atp);
4132 
4133     IF l_alloc_atp <> 'Y' THEN
4134        -- we are not doing Allocated ATP so we wont  continue
4135        msc_util.msc_log('Not Doing Allocated ATP. Will Exit ');
4136        RETCODE := G_ERROR;
4137        RETURN;
4138     END IF;
4139 
4140     l_class_hrchy := NVL(FND_PROFILE.VALUE('MSC_CLASS_HIERARCHY'), 2);
4141     msc_util.msc_log('l_class_hrchy := ' || l_class_hrchy);
4142 
4143     IF l_class_hrchy <> 1 THEN
4144        -- we are not doing Demand Class based AATP so we wont  continue
4145        msc_util.msc_log('Not Doing Demand Class based AATP. Will Exit ');
4146        RETCODE := G_ERROR;
4147        RETURN;
4148     END IF;
4149 
4150     l_alloc_method := NVL(FND_PROFILE.VALUE('MSC_ALLOCATION_METHOD'), 2);
4151     msc_util.msc_log('l_alloc_method := ' || l_alloc_method);
4152 
4153     IF l_alloc_method <> 1 THEN
4154        -- we are not doing Demand Class based AATP using pegging from planning so we wont  continue
4155        msc_util.msc_log('Not Doing Demand Class based AATP using pegging from planning. Will Exit ');
4156        RETCODE := G_ERROR;
4157        RETURN;
4158     END IF;
4159 
4160     -- rajjain project atp changes 07/24/2003 begin
4161     l_excess_supply_by_dc := NVL(FND_PROFILE.VALUE('MSC_EXCESS_SUPPLY_BY_DC'), 'N');
4162     msc_util.msc_log('l_excess_supply_by_dc := ' || l_excess_supply_by_dc);
4163 
4164     BEGIN
4165         msc_util.msc_log('Calling custom procedure MSC_ATP_CUSTOM.Custom_Pre_Allocation...');
4166         MSC_ATP_CUSTOM.Custom_Pre_Allocation(p_plan_id);
4167         msc_util.msc_log('End MSC_ATP_CUSTOM.Custom_Pre_Allocation.');
4168     EXCEPTION
4169         WHEN OTHERS THEN
4170 	    msc_util.msc_log('Error in custom procedure call');
4171 	    msc_util.msc_log('Error Code: '|| sqlerrm);
4172     END;
4173     -- rajjain project atp changes 07/24/2003 end
4174 
4175     msc_util.msc_log('begin Loading pre-allocation demand/supply data for plan: ' || p_plan_id);
4176     RETCODE := G_SUCCESS;
4177 
4178     l_share_partition := fnd_profile.value('MSC_SHARE_PARTITIONS');
4179 
4180     msc_util.msc_log('l_share_partition := ' || l_share_partition);
4181 
4182     -- Bug 2516506 - select plan name also
4183     -- SELECT NVL(summary_flag,1)
4184     -- INTO   l_summary_flag
4185     SELECT NVL(summary_flag,1), compile_designator
4186     INTO   l_summary_flag, l_plan_name
4187     FROM   msc_plans
4188     WHERE  plan_id = p_plan_id;
4189 
4190     IF NVL(l_summary_flag,1) = 2 THEN
4191        msc_util.msc_log('Another session is running post-plan allocation program for this plan');
4192        RETCODE :=  G_ERROR;
4193        RETURN;
4194     END IF;
4195 
4196     l_retval := FND_INSTALLATION.GET_APP_INFO('FND', dummy1, dummy2, l_applsys_schema);
4197     SELECT  a.oracle_username,
4198 	    sysdate,
4199 	    FND_GLOBAL.USER_ID
4200     INTO    l_msc_schema,
4201 	    l_sysdate,
4202 	    l_user_id
4203     FROM    fnd_oracle_userid a,
4204             fnd_product_installations b
4205     WHERE   a.oracle_id = b.oracle_id
4206     AND     b.application_id = 724;
4207 
4208     FOR i in 1..atp_summ_tab.count LOOP
4209 
4210         l_table_name := 'MSC_' || atp_summ_tab(i);
4211 
4212         IF (l_share_partition = 'Y') THEN
4213            l_plan_id := MAXVALUE;
4214         ELSE
4215            l_plan_id := p_plan_id;
4216         END IF;
4217 
4218         l_partition_name :=  atp_summ_tab(i)|| '_' || l_plan_id;
4219         msc_util.msc_log('l_partition_name := ' || l_partition_name);
4220 
4221         BEGIN
4222             SELECT count(*)
4223             INTO   l_count
4224             --bug 2495962: Change refrence from dba_xxx to all_xxx tables
4225             --FROM   dba_tab_partitions
4226             FROM   all_tab_partitions
4227             WHERE  table_name = l_table_name
4228             AND    partition_name = l_partition_name
4229             AND    table_owner = l_msc_schema;
4230         EXCEPTION
4231             WHEN OTHERS THEN
4232                  msc_util.msc_log('Inside Exception');
4233                  l_count := 0;
4234         END;
4235 
4236         IF (l_count = 0) THEN
4237            -- Bug 2516506
4238            FND_MESSAGE.SET_NAME('MSC', 'MSC_ATP_PLAN_PARTITION_MISSING');
4239            FND_MESSAGE.SET_TOKEN('PLAN_NAME', l_plan_name);
4240            FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'MSC_' || atp_summ_tab(i));
4241            msc_util.msc_log(FND_MESSAGE.GET);
4242            RETCODE := G_ERROR;
4243            RETURN;
4244         END IF;
4245     END LOOP;
4246 
4247     BEGIN
4248         update msc_plans
4249         set    summary_flag = 2
4250         where  plan_id = p_plan_id;
4251         commit;
4252     EXCEPTION
4253         WHEN OTHERS THEN
4254              ERRBUF := sqlerrm;
4255              RETCODE := G_ERROR;
4256              RETURN;
4257     END;
4258 
4259         msc_util.msc_log('l_share_partition := ' || l_share_partition);
4260 
4261 	-- performance bug 2566795. dsting: forward port from 1157
4262 
4263 	BEGIN
4264 	    SELECT	NVL(pre_alloc_hash_size, -1),
4265 			NVL(pre_alloc_sort_size, -1),
4266 			NVL(pre_alloc_parallel_degree, 1)
4267 	    INTO	l_hash_size,
4268 			l_sort_size,
4269 			l_parallel_degree
4270 	    FROM	msc_atp_parameters
4271 	    WHERE	rownum = 1;
4272 	EXCEPTION
4273 	    WHEN others THEN
4274 		 msc_util.msc_log('Error getting performance param: ' || sqlcode || ': ' || sqlerrm);
4275 		 l_hash_size := -1;
4276 		 l_sort_size := -1;
4277 		 l_parallel_degree := 1;
4278 	END;
4279 
4280 	msc_util.msc_log('Hash: ' || l_hash_size || ' Sort: ' || l_sort_size || ' Parallel: ' || l_parallel_degree);
4281 
4282 	IF NVL(l_hash_size, -1) <> -1 THEN
4283 	   l_sql_stmt_1 := 'alter session set hash_area_size = ' || to_char(l_hash_size);
4284 	   msc_util.msc_log('l_sql_stmt : ' || l_sql_stmt_1);
4285 	   execute immediate l_sql_stmt_1;
4286 	END IF;
4287 
4288 	IF NVL(l_sort_size, -1) <> -1 THEN
4289 	   l_sql_stmt_1 := 'alter session set sort_area_size = ' || to_char(l_sort_size);
4290 	   msc_util.msc_log('l_sql_stmt : ' || l_sql_stmt_1);
4291 	   execute immediate l_sql_stmt_1;
4292 	END IF;
4293 
4294         IF l_share_partition = 'Y' THEN
4295 
4296            msc_util.msc_log('Inside shared partition');
4297 
4298            -- first delete the existing data from tables
4299            msc_util.msc_log('before deleteing data from the table');
4300 
4301            DELETE MSC_ALLOC_DEMANDS where plan_id = p_plan_id;
4302            msc_util.msc_log('After deleting data from MSC_ALLOC_DEMANDS table');
4303 
4304            DELETE MSC_ALLOC_SUPPLIES where plan_id = p_plan_id;
4305            msc_util.msc_log('After deleting data from MSC_ALLOC_SUPPLIES table');
4306 
4307            /* --------------------------------------------------------------- */
4308 	   -- 2566795
4309 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4310            -- to move demand on non-working day to prior working day.
4311 
4312            l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4313 			plan_id,
4314 			inventory_item_id,
4315 			organization_id,
4316 			sr_instance_id,
4317 			demand_class,
4318 			demand_date,
4319 			allocated_quantity,
4320 			parent_demand_id,
4321 			origination_type,
4322 			order_number,
4323 			sales_order_line_id,
4324 			demand_source_type, --cmro
4325 			created_by,
4326 			creation_date,
4327 			last_updated_by,
4328 			last_update_date,
4329 			demand_quantity, -- ssurendr 25-NOV-2002: added for alloc w/b
4330 			request_date,--bug3263368
4331 			--bug3684383 added as in Insert_SD_Into_Details_Temp we need these columns populated
4332 			-- to show partner name and location.
4333 			customer_id,
4334                         ship_to_site_id)
4335 		( -- Bug 3370201
4336 		SELECT  -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4337 		        -- causing performance issues which in turn causes ORA-01555: snapshot too old
4338 		        --/*+ use_hash(mv) parallel(mv,' || to_char(l_parallel_degree) || ')
4339 			--	full(peg1.d1) full(peg1.d2) full(peg1.peg1) full(peg1.peg2) full(mv) */
4340                         --        -- 2859130 full(peg1.cal)
4341 			peg1.plan_id,
4342 			peg1.inventory_item_id,
4343 			peg1.organization_id,
4344 			peg1.sr_instance_id,
4345 			NVL(mv.demand_class, :def_num),
4346 			peg1.demand_date,
4347 			SUM(peg1.allocated_quantity) - MIN(peg1.reserved_quantity), --5027568
4348 			peg1.demand_id,
4349 			peg1.origination_type,
4350 			peg1.order_number,
4351 			peg1.sales_order_line_id,
4352 			peg1.demand_source_type, --cmro
4353 			:l_user_id,
4354 			:l_sysdate,
4355 			:l_user_id,
4356 			:l_sysdate,
4357 			MIN(peg1.demand_quantity), -- ssurendr 25-NOV-2002: added for alloc w/b
4358 			peg1.request_date, --bug3263368
4359 			--bug3684383
4360 			peg1.customer_id,
4361 			peg1.ship_to_site_id
4362 			-- min is used to select distinct values as demand_quantity would be
4363 			-- repeating for the same demand_id
4364 		FROM
4365                         -- use inline view so that view parallel hint could be used.
4366 			-- msc_demand_pegging_v peg1,
4367                         -- 2859130 (SELECT /*+ ordered use_hash(d2 peg2 peg1 d1 tp cal)
4368                         (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4369 		                -- causing performance issues which in turn causes ORA-01555: snapshot too old
4370 		                --/*+ ordered use_hash(d2 peg2 peg1 tp)
4371 				--	parallel(d2,' || to_char(l_parallel_degree) || ')
4372 				--	parallel(d1,' || to_char(l_parallel_degree) || ')
4373 				--	parallel(peg2,' || to_char(l_parallel_degree) || ')
4374 				--	parallel(peg1,' || to_char(l_parallel_degree) || ')*/
4375                                         -- time_phased_atp
4376                                         -- parallel(tp,'  || to_char(l_parallel_degree) || ')
4377 
4378                                         -- 2859130
4379                                         -- parallel(cal,' || to_char(l_parallel_degree) || ')
4380 				peg2.plan_id,
4381 				peg2.inventory_item_id,
4382 				peg2.organization_id,
4383 				peg2.sr_instance_id,
4384 				-- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4385 				NVL(d1.demand_class, :def_num) demand_class,
4386 				trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4387 					     2, NVL(d2.PLANNED_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE),
4388 					        NVL(d2.SCHEDULE_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE))) demand_date,----plan by request date, promise date or schedule date
4389 				-- cal.prior_date demand_date, -- 2859130
4390 				-- cal.calendar_date demand_date,
4391 				peg2.allocated_quantity,
4392 				DECODE( d2.origination_type, 30, NVL(d2.reserved_quantity, 0), 0) reserved_quantity, --5027568
4393 				d2.demand_id,
4394 				d2.origination_type,
4395 				--d2.order_number,
4396 				-- rajjain 04/25/2003 Bug 2771075
4397                                 -- For Planned Order Demands We will populate disposition_id
4398                                 -- in order_number column
4399 				decode(d2.origination_type, 1, to_char(d2.disposition_id), d2.order_number) order_number,
4400 				d2.sales_order_line_id,
4401 				d2.demand_source_type, --cmro
4402 			        decode(d2.origination_type, 4, d2.daily_demand_rate,
4403 			           d2.using_requirement_quantity) demand_quantity , -- rajjain 02/06/2003 Bug 2782882
4404 			        decode(d2.order_date_type_code,2,d2.request_date,
4405 			           d2.request_ship_date)request_date, --bug3263368
4406 				--peg2.demand_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
4407 				--bug3684383
4408 				d2.customer_id,
4409                                 d2.ship_to_site_id
4410                         FROM	msc_demands d2,
4411 				msc_full_pegging peg2,
4412 				msc_full_pegging peg1 ,
4413 				msc_demands d1
4414 				-- time_phased_atp
4415 				-- msc_trading_partners tp
4416                                 -- 2859130
4417 				-- msc_calendar_dates cal
4418                         WHERE	peg2.plan_id = peg1.plan_id
4419                         AND	peg2.end_pegging_id = peg1.pegging_id
4420                         AND	peg2.sr_instance_id = peg1.sr_instance_id
4421                         AND	d1.plan_id = peg1.plan_id
4422                         AND	d1.demand_id = peg1.demand_id
4423                         AND	d1.sr_instance_id = peg1.sr_instance_id
4424                         AND	d2.plan_id = peg2.plan_id
4425                         AND	d2.demand_id = peg2.demand_id
4426                         AND	d2.sr_instance_id = peg2.sr_instance_id
4427                         AND	d2.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)
4428 			-- time_phased_atp
4429 			-- AND	tp.sr_tp_id = peg2.organization_id
4430 			-- AND	tp.partner_type = 3 -- bug2646304
4431 			-- AND	tp.sr_instance_id = peg2.sr_instance_id
4432                         -- 2859130
4433 			-- AND	tp.sr_instance_id = cal.sr_instance_id
4434 			-- AND	tp.calendar_code = cal.calendar_code
4435 			-- AND	tp.calendar_exception_set_id = cal.exception_set_id
4436 			-- AND	TRUNC(d2.using_assembly_demand_date) = cal.calendar_date
4437                         ) peg1,
4438 			msc_item_hierarchy_mv mv
4439 		WHERE   peg1.plan_id = :p_plan_id
4440 		AND     peg1.inventory_item_id = mv.inventory_item_id(+)
4441 		AND     peg1.organization_id = mv.organization_id (+)
4442 		AND     peg1.sr_instance_id = mv.sr_instance_id (+)
4443 		AND     peg1.demand_date >=  mv.effective_date (+)
4444 		AND     peg1.demand_date <=  mv.disable_date (+)
4445 		AND	peg1.demand_class = mv.demand_class (+)
4446 		AND     mv.level_id (+) = -1
4447 		GROUP BY
4448 			peg1.plan_id,
4449 			peg1.inventory_item_id,
4450 			peg1.organization_id,
4451 			peg1.sr_instance_id,
4452 			NVL(mv.demand_class, :def_num),
4453 			peg1.demand_date,
4454 			peg1.demand_id,
4455 			peg1.origination_type,
4456 			peg1.order_number,
4457 			peg1.sales_order_line_id,
4458 			peg1.demand_source_type,--cmro
4459 			:l_user_id,
4460 			:l_sysdate,
4461 			:l_user_id,
4462 			:l_sysdate,
4463 			peg1.request_date,
4464 			--bug3684383
4465 			peg1.customer_id,
4466 			peg1.ship_to_site_id)';
4467 
4468 	   -- performance bug 2566795
4469            -- parallel hint can't be used with union all. Use two queries instead
4470 
4471 		-- UNION ALL
4472            msc_util.msc_log('After Generating the sql');
4473 
4474            -- Obtain cursor handler for sql_stmt
4475            cur_handler := DBMS_SQL.OPEN_CURSOR;
4476 
4477            DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4478            msc_util.msc_log('After parsing the sql');
4479 
4480            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4481            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4482            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4483            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4484            msc_util.msc_log('after binding the variables');
4485 
4486            -- Execute the cursor
4487            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4488            msc_util.msc_log('After executing the cursor');
4489 
4490            msc_util.msc_log('rows processed: ' || rows_processed);
4491            msc_util.msc_log('After inserting in msc_alloc_demands part 1');
4492 
4493 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4494 	   -- to move demand on non-working day to prior working day.
4495 
4496            /* time_phased_atp - project atp forward port
4497             * If the profile is set to 'Yes' then:
4498             *    o If the supply pegged to the demand has a demand class existing on allocation rule then
4499             *      allocate the demand to that demand class.
4500             *    o If the supply pegged to the demand has a demand class not present on allocation rule then
4501             *      allocate the demand to 'OTHER'.
4502             *    o If the supply pegged to the demand does not have a demand class present, allocate the demand
4503             *      to 'OTHER'.
4504             * Else: Allocate the demand to 'OTHER'*/
4505            IF l_excess_supply_by_dc = 'Y' THEN
4506                    l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4507                                 plan_id,
4508                                 inventory_item_id,
4509                                 organization_id,
4510                                 sr_instance_id,
4511                                 demand_class,
4512                                 demand_date,
4513                                 allocated_quantity,
4514                                 parent_demand_id,
4515                                 origination_type,
4516                                 order_number,
4517                                 sales_order_line_id,
4518                                 demand_source_type, --cmro
4519                                 created_by,
4520                                 creation_date,
4521                                 last_updated_by,
4522                                 last_update_date,
4523                                 demand_quantity,
4524                                 request_date)--bug3263368
4525                 	(
4526                         SELECT	--5053818
4527                                 pegging_v.plan_id plan_id,
4528                                 pegging_v.inventory_item_id,
4529                                 pegging_v.organization_id,
4530                                 pegging_v.sr_instance_id,
4531                                 NVL(mv.demand_class, :def_num) demand_class,
4532                                 pegging_v.demand_date,
4533                                 SUM(pegging_v.allocated_quantity),
4534                                 pegging_v.demand_id,
4535                                 pegging_v.origination_type,
4536                                 pegging_v.order_number,
4537                                 pegging_v.sales_order_line_id,
4538                                 pegging_v.demand_source_type,--cmro
4539                                 :l_user_id,
4540                                 :l_sysdate,
4541                                 :l_user_id,
4542                                 :l_sysdate,
4543                                 MIN(pegging_v.demand_quantity),
4544                                 pegging_v.request_date --bug3263368
4545                         FROM
4546                                 (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4547 		                        -- causing performance issues which in turn causes ORA-01555: snapshot too old
4548 		                        --/*+ ordered use_hash(peg2 peg1 d s)
4549                         		--	parallel(peg2,' || to_char(l_parallel_degree) || ')
4550                         		--	parallel(peg1,' || to_char(l_parallel_degree) || ')
4551                         		--	parallel(d,' || to_char(l_parallel_degree) || ')
4552                                         --      parallel(s,' || to_char(l_parallel_degree) || ')
4553                         		--	full(peg2) full(peg1) full(d) full(s) */
4554                                         peg1.plan_id plan_id,
4555                         	        peg1.inventory_item_id,
4556                         	        peg1.organization_id,
4557                         	        peg1.sr_instance_id,
4558                         	        NVL(s.demand_class, :def_num) demand_class,
4559                         	        -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4560                                         trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4561                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4562                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))) demand_date,--plan by request date, promise date or schedule date
4563                         		peg1.allocated_quantity,
4564                                         d.demand_id,
4565                         		d.origination_type,
4566                         		decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number) order_number,
4567                         		d.sales_order_line_id,
4568                         		d.demand_source_type, --cmro
4569                         		decode(d.origination_type, 4, d.daily_demand_rate,
4570                         		           d.using_requirement_quantity) demand_quantity ,
4571                         		decode(d.order_date_type_code,2,d.request_date,
4572                         		           d.request_ship_date)request_date --bug3263368
4573                         	FROM    msc_full_pegging peg2,
4574                         	        msc_full_pegging peg1,
4575                         		msc_demands d,
4576                                         msc_supplies s
4577                         	WHERE   peg1.plan_id = :p_plan_id
4578                         	AND     peg2.plan_id = peg1.plan_id
4579                         	AND     peg2.pegging_id = peg1.end_pegging_id
4580                         	AND     peg2.demand_id IN (-1, -2)
4581                         	AND     d.demand_id = peg1.demand_id
4582                         	AND     peg1.plan_id = d.plan_id
4583                         	AND     d.sr_instance_id = peg1.sr_instance_id
4584                         	AND     peg1.sr_instance_id=s.sr_instance_id
4585                         	AND     peg1.plan_id = s.plan_id
4586                         	AND     peg1.transaction_id = s.transaction_id
4587                         	AND	d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)) pegging_v,
4588                                 msc_item_hierarchy_mv mv
4589                         WHERE	pegging_v.inventory_item_id = mv.inventory_item_id(+)
4590                         AND     pegging_v.organization_id = mv.organization_id (+)
4591                         AND     pegging_v.sr_instance_id = mv.sr_instance_id (+)
4592                         AND     pegging_v.demand_date >=  mv.effective_date (+)
4593                         AND     pegging_v.demand_date <=  mv.disable_date (+)
4594                         AND	pegging_v.demand_class = mv.demand_class (+)
4595                         AND     mv.level_id (+) = -1
4596                 	GROUP BY
4597                                 pegging_v.plan_id,
4598                                 pegging_v.inventory_item_id,
4599                                 pegging_v.organization_id,
4600                                 pegging_v.sr_instance_id,
4601                                 NVL(mv.demand_class, :def_num),
4602                                 pegging_v.demand_date,
4603                                 pegging_v.demand_id,
4604                                 pegging_v.origination_type,
4605                                 pegging_v.order_number,
4606                                 pegging_v.sales_order_line_id,
4607                                 pegging_v.demand_source_type,--cmro
4608                                 :l_user_id,
4609                                 :l_sysdate,
4610                                 :l_user_id,
4611                                 :l_sysdate,
4612                                 pegging_v.request_date)';
4613            ELSE
4614                    l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_DEMANDS(
4615                                 plan_id,
4616                                 inventory_item_id,
4617                                 organization_id,
4618                                 sr_instance_id,
4619                                 demand_class,
4620                                 demand_date,
4621                                 allocated_quantity,
4622                                 parent_demand_id,
4623                                 origination_type,
4624                                 order_number,
4625                                 sales_order_line_id,
4626                                 demand_source_type, --cmro
4627                                 created_by,
4628                                 creation_date,
4629                                 last_updated_by,
4630                                 last_update_date,
4631                                 demand_quantity,  -- ssurendr 25-NOV-2002: added for alloc w/b
4632                                 request_date)--bug3263368
4633         		 (SELECT -- Bug 3416241 changes begin Removed all hints to avoid full table scan
4634 		                 -- causing performance issues which in turn causes ORA-01555: snapshot too old
4635 		                 --/*+ ordered use_hash(peg2 peg1 d)
4636         			--	parallel(peg2,' || to_char(l_parallel_degree) || ')
4637         			--	parallel(peg1,' || to_char(l_parallel_degree) || ')
4638         			--	parallel(d,' || to_char(l_parallel_degree) || ')
4639         			--	full(peg2) full(peg1) full(d) */
4640                                         -- time_phased_atp
4641                                         -- parallel(tp,' || to_char(l_parallel_degree) || ')
4642                                         -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4643                                         -- full(cal)
4644                                 peg1.plan_id plan_id,
4645         		        peg1.inventory_item_id,
4646         		        peg1.organization_id,
4647         		        peg1.sr_instance_id,
4648         		        :def_num demand_class,
4649                                 -- cal.prior_date, -- 2859130
4650                                 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4651         			trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4652                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4653                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
4654         			SUM(peg1.allocated_quantity),
4655                                 d.demand_id,
4656         			d.origination_type,
4657         			--d.order_number,
4658         			-- rajjain 04/25/2003 Bug 2771075
4659                                 -- For Planned Order Demands We will populate disposition_id
4660                                 -- in order_number column
4661         			decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
4662         			d.sales_order_line_id,
4663         			d.demand_source_type, --cmro
4664                                 :l_user_id,
4665                                 :l_sysdate,
4666                                 :l_user_id,
4667                                 :l_sysdate,
4668         			MIN(decode(d.origination_type, 4, d.daily_demand_rate,
4669         			           d.using_requirement_quantity)), -- rajjain 02/06/2003 Bug 2782882
4670         			--MIN(peg1.demand_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
4671         			-- min is used to select distinct values as demand_quantity would be
4672         			-- repeating for the same demand_id
4673         			--decode(d.order_date_type_code,2,d2.request_date,
4674         			decode(d.order_date_type_code,2,d.request_date, -- Bug 3370201
4675         			            d.request_ship_date)request_date --bug3263368
4676         		FROM    msc_full_pegging peg2,
4677         		        msc_full_pegging peg1,
4678         			msc_demands d
4679                                 -- time_phased_atp msc_trading_partners tp
4680                                 -- 2859130 msc_calendar_dates cal
4681         		WHERE   peg1.plan_id = :p_plan_id
4682         		AND     peg2.plan_id = peg1.plan_id
4683         		AND     peg2.pegging_id = peg1.end_pegging_id
4684         		AND     peg2.demand_id IN (-1, -2)
4685         		AND     d.demand_id = peg1.demand_id
4686         		AND     peg1.plan_id = d.plan_id
4687         		AND     d.sr_instance_id = peg1.sr_instance_id
4688         		AND	d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)
4689                         --AND     tp.sr_tp_id = peg1.organization_id
4690         		--AND	tp.partner_type = 3 -- bug2646304
4691                         --AND     tp.sr_instance_id = peg1.sr_instance_id
4692                         --AND     tp.sr_instance_id = cal.sr_instance_id
4693                         --AND     tp.calendar_code = cal.calendar_code
4694                         --AND     tp.calendar_exception_set_id = cal.exception_set_id
4695                         --AND     TRUNC(d.using_assembly_demand_date) = cal.calendar_date
4696         		GROUP BY
4697         			peg1.plan_id,
4698         		        peg1.inventory_item_id,
4699         		        peg1.organization_id,
4700         		        peg1.sr_instance_id,
4701         		        :def_num,
4702         		        -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
4703                                 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
4704                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
4705                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
4706                                 -- 2859130 cal.prior_date,
4707         			d.demand_id,
4708                                 d.origination_type,
4709                                 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
4710                                 d.sales_order_line_id,
4711                                 d.demand_source_type,--cmro
4712                                 :l_user_id,
4713                                 :l_sysdate,
4714                                 :l_user_id,
4715                                 :l_sysdate,
4716                                 --decode(d.order_date_type_code,2,d2.request_date,
4717                                 decode(d.order_date_type_code,2,d.request_date, -- Bug 3370201
4718         			            d.request_ship_date) --bug3263368
4719         		)';
4720            END IF;
4721            -- time_phased_atp - project atp forward port
4722 
4723            msc_util.msc_log('After Generating the sql');
4724 
4725            -- Parse cursor handler for sql_stmt: Don't open as its already opened
4726 
4727            DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4728            msc_util.msc_log('After parsing the sql');
4729 
4730            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4731            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4732            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4733            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4734            msc_util.msc_log('after binding the variables');
4735 
4736            -- Execute the cursor
4737            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4738            msc_util.msc_log('After executing the cursor');
4739 
4740            msc_util.msc_log('rows processed: ' || rows_processed);
4741            msc_util.msc_log('after inserting item data into MSC_ALLOC_DEMANDS tables');
4742 
4743 	   /* ------------------------------------------------------------------ */
4744 
4745 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4746            -- to move demand on non-working day to prior working day.
4747 
4748            l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4749 			plan_id,
4750 			inventory_item_id,
4751 			organization_id,
4752 			sr_instance_id,
4753 			demand_class,
4754 			supply_date,
4755 			allocated_quantity,
4756 			parent_transaction_id,
4757 			order_type,
4758 			order_number,
4759 			schedule_designator_id,
4760 			created_by,
4761 			creation_date,
4762 			last_updated_by,
4763 			last_update_date,
4764 			supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
4765 		(
4766 		SELECT	/*+  use_hash(peg1 mv) parallel(mv,' || to_char(l_parallel_degree) || ')  */
4767 			peg1.plan_id plan_id,
4768 			peg1.inventory_item_id,
4769 			peg1.organization_id,
4770 			peg1.sr_instance_id,
4771 			NVL(mv.demand_class, :def_num) demand_class,
4772 			peg1.supply_date,
4773 			SUM(peg1.allocated_quantity),
4774                         peg1.transaction_id,
4775 			peg1.order_type,
4776 			peg1.order_number,
4777 			peg1.schedule_designator_id,
4778                         :l_user_id,
4779                         :l_sysdate,
4780                         :l_user_id,
4781                         :l_sysdate,
4782 			MIN(peg1.supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
4783 			-- min is used to select distinct values as supply_quantity would be
4784 			-- repeating for the same transaction_id
4785 		FROM    -- msc_supply_pegging_v peg1,
4786 			(SELECT --5053818
4787                                         -- time_phased_atp
4788                                         -- parallel(tp,' || to_char(l_parallel_degree) || ')
4789                                         -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4790 				peg2.plan_id,
4791 				peg2.inventory_item_id,
4792 				peg2.organization_id,
4793 				peg2.sr_instance_id,
4794 				NVL (d.demand_class, :def_num) demand_class,
4795 				trunc(s.new_schedule_date) supply_date,
4796 				-- cal.next_date supply_date,  --2859130
4797 				peg2.allocated_quantity,
4798 				peg2.transaction_id,
4799 				s.order_type,
4800 				s.order_number,
4801 				s.schedule_designator_id ,
4802 				nvl(s.firm_quantity,s.new_order_quantity) supply_quantity -- rajjain 02/06/2003 Bug 2782882
4803 				--peg2.supply_quantity  -- ssurendr 25-NOV-2002: added for alloc w/b
4804 			FROM	msc_supplies s,
4805 				msc_full_pegging peg2,
4806 				msc_full_pegging peg1,
4807 				msc_demands d
4808                                 -- time_phased_atp msc_trading_partners tp
4809                                 -- 2859130 msc_calendar_dates cal
4810 			WHERE	peg2.plan_id = peg1.plan_id
4811 			  AND	peg2.end_pegging_id = peg1.pegging_id
4812 			  AND	d.plan_id = peg1.plan_id
4813 			  AND	d.demand_id = peg1.demand_id
4814 			  AND	d.sr_instance_id = peg1.sr_instance_id
4815 			  AND	d.inventory_item_id = peg1.inventory_item_id
4816 			  AND	s.plan_id = peg2.plan_id
4817 			  AND	s.transaction_id = peg2.transaction_id
4818 			  AND	s.sr_instance_id = peg2.sr_instance_id
4819                           -- time_phased_atp
4820                           -- AND   tp.sr_tp_id = peg2.organization_id
4821 			  -- AND	tp.partner_type = 3 -- bug2646304
4822                           -- AND   tp.sr_instance_id = peg2.sr_instance_id
4823                           -- 2859130 AND   tp.sr_instance_id = cal.sr_instance_id
4824                           --AND   tp.calendar_code = cal.calendar_code
4825                           --AND   tp.calendar_exception_set_id = cal.exception_set_id
4826                           --AND   TRUNC(s.new_schedule_date) = cal.calendar_date
4827                         ) peg1,
4828 			msc_item_hierarchy_mv mv
4829 		WHERE	peg1.plan_id = :p_plan_id
4830 		AND     peg1.inventory_item_id = mv.inventory_item_id(+)
4831 		AND     peg1.organization_id = mv.organization_id (+)
4832 		AND     peg1.sr_instance_id = mv.sr_instance_id (+)
4833 		AND     peg1.supply_date >=  mv.effective_date (+)
4834 		AND     peg1.supply_date <=  mv.disable_date (+)
4835 		AND	peg1.demand_class = mv.demand_class (+)
4836 		AND     mv.level_id (+) = -1
4837 		GROUP BY
4838 			peg1.plan_id,
4839 			peg1.inventory_item_id,
4840 			peg1.organization_id,
4841 			peg1.sr_instance_id,
4842 			NVL(mv.demand_class, :def_num),
4843 			peg1.supply_date,
4844                         peg1.transaction_id,
4845 			peg1.order_type,
4846 			peg1.order_number,
4847 			peg1.schedule_designator_id,
4848                         :l_user_id,
4849                         :l_sysdate,
4850                         :l_user_id,
4851                         :l_sysdate)';
4852 
4853            msc_util.msc_log('After Generating first supplies sql');
4854 
4855            -- Parse cursor handler for sql_stmt: Don't open as its already opened
4856 
4857            DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
4858            msc_util.msc_log('After parsing first supplies sql');
4859 
4860            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
4861            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
4862            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
4863            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
4864            msc_util.msc_log('after binding the variables');
4865 
4866            -- Execute the cursor
4867            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
4868            msc_util.msc_log('After executing first supplies cursor');
4869 
4870            msc_util.msc_log('rows processed: ' || rows_processed);
4871 
4872            msc_util.msc_log('After inserting in msc_alloc_supplies part 1');
4873 
4874            -- parallel hint can't be used with union all. Use two query instead
4875 
4876 	   --UNION ALL
4877 
4878 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
4879            -- to move demand on non-working day to prior working day.
4880 
4881            /* time_phased_atp - project atp forward port
4882             * If the profile is set to 'Yes' then:
4883             *    o If supply has a demand class existing on allocation rule then
4884             *      allocate the supply to that demand class.
4885             *    o If supply has a demand class not present on allocation rule then
4886             *      allocate the supply to 'OTHER'.
4887             *    o If supply does not have a demand class present, allocate the supply
4888             *      to 'OTHER'.
4889             * Else: Allocate the supply to 'OTHER'*/
4890            IF l_excess_supply_by_dc = 'Y' THEN
4891                    l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4892                                 plan_id,
4893                                 inventory_item_id,
4894                                 organization_id,
4895                                 sr_instance_id,
4896                                 demand_class,
4897                                 supply_date,
4898                                 allocated_quantity,
4899                                 parent_transaction_id,
4900                                 order_type,
4901                                 order_number,
4902                                 schedule_designator_id,
4903                                 created_by,
4904                                 creation_date,
4905                                 last_updated_by,
4906                                 last_update_date,
4907                                 supply_quantity)
4908         		(
4909         	        SELECT	--5053818
4910                                 pegging_v.plan_id plan_id,
4911                                 pegging_v.inventory_item_id,
4912                                 pegging_v.organization_id,
4913                                 pegging_v.sr_instance_id,
4914                                 NVL(mv.demand_class, :def_num) demand_class,
4915                                 pegging_v.supply_date,
4916                                 SUM(pegging_v.allocated_quantity),
4917                                 pegging_v.transaction_id,
4918                                 pegging_v.order_type,
4919                                 pegging_v.order_number,
4920                                 pegging_v.schedule_designator_id,
4921                                 :l_user_id,
4922                                 :l_sysdate,
4923                                 :l_user_id,
4924                                 :l_sysdate,
4925                                 MIN(pegging_v.supply_quantity)
4926                         FROM
4927                                 (SELECT  --5053818
4928                                         peg1.plan_id plan_id,
4929                                         peg1.inventory_item_id,
4930                                         peg1.organization_id,
4931                                         peg1.sr_instance_id,
4932                                         NVL(s.demand_class, :def_num) demand_class,
4933                                         TRUNC(s.new_schedule_date) supply_date,
4934                                         peg1.allocated_quantity,
4935                                         peg1.transaction_id,
4936                                         s.order_type,
4937                                         s.order_number,
4938                                         s.schedule_designator_id,
4939                                         nvl(s.firm_quantity,s.new_order_quantity) supply_quantity
4940                                 FROM    msc_full_pegging peg2,
4941                                         msc_full_pegging peg1,
4942                                 	msc_supplies s
4943                                 WHERE   peg1.plan_id = :p_plan_id
4944                                 AND     peg2.plan_id = peg1.plan_id
4945                                 AND     peg2.pegging_id = peg1.end_pegging_id
4946                                 AND     peg2.demand_id IN (-1, -2)
4947                                 AND     s.plan_id = peg1.plan_id
4948                                 AND     s.transaction_id = peg1.transaction_id
4949                                 AND     s.sr_instance_id = peg1.sr_instance_id) pegging_v,
4950                                 msc_item_hierarchy_mv mv
4951                         WHERE	pegging_v.inventory_item_id = mv.inventory_item_id(+)
4952                         AND     pegging_v.organization_id = mv.organization_id (+)
4953                         AND     pegging_v.sr_instance_id = mv.sr_instance_id (+)
4954                         AND     pegging_v.supply_date >=  mv.effective_date (+)
4955                         AND     pegging_v.supply_date <=  mv.disable_date (+)
4956                         AND	pegging_v.demand_class = mv.demand_class (+)
4957                         AND     mv.level_id (+) = -1
4958         		GROUP BY
4959                                 pegging_v.plan_id,
4960                                 pegging_v.inventory_item_id,
4961                                 pegging_v.organization_id,
4962                                 pegging_v.sr_instance_id,
4963                                 NVL(mv.demand_class, :def_num),
4964                                 pegging_v.supply_date,
4965                                 pegging_v.transaction_id,
4966                                 pegging_v.order_type,
4967                                 pegging_v.order_number,
4968                                 pegging_v.schedule_designator_id,
4969                                 :l_user_id,
4970                                 :l_sysdate,
4971                                 :l_user_id,
4972                                 :l_sysdate)';
4973 
4974            ELSE
4975                    l_sql_stmt_1 := 'INSERT INTO MSC_ALLOC_SUPPLIES(
4976                                 plan_id,
4977                                 inventory_item_id,
4978                                 organization_id,
4979                                 sr_instance_id,
4980                                 demand_class,
4981                                 supply_date,
4982                                 allocated_quantity,
4983                                 parent_transaction_id,
4984                                 order_type,
4985                                 order_number,
4986                                 schedule_designator_id,
4987                                 created_by,
4988                                 creation_date,
4989                                 last_updated_by,
4990                                 last_update_date,
4991                                 supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
4992         		(
4993         		SELECT  --5053818
4994                                         -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
4995                                         -- 2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
4996         			peg1.plan_id plan_id,
4997         		        peg1.inventory_item_id,
4998         		        peg1.organization_id,
4999         		        peg1.sr_instance_id,
5000         		        :def_num demand_class,
5001         			trunc(s.new_schedule_date),
5002         			-- cal.next_date, --2859130
5003         			-- cal.calendar_date,
5004         			SUM(peg1.allocated_quantity),
5005                                 peg1.transaction_id,
5006         			s.order_type,
5007         			s.order_number,
5008         			s.schedule_designator_id,
5009                                 :l_user_id,
5010                                 :l_sysdate,
5011                                 :l_user_id,
5012                                 :l_sysdate,
5013         			MIN(nvl(s.firm_quantity,s.new_order_quantity)) -- rajjain 02/06/2003 Bug 2782882
5014         			--MIN(peg1.supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
5015         			-- min is used to select distinct values as supply_quantity would be
5016         			-- repeating for the same transaction_id
5017         		FROM    msc_full_pegging peg2,
5018         		        msc_full_pegging peg1,
5019         			msc_supplies s
5020                                 -- time_phased_atp msc_trading_partners tp
5021                                 -- 2859130 msc_calendar_dates cal
5022         		WHERE   peg1.plan_id = :p_plan_id
5023         		AND     peg2.plan_id = peg1.plan_id
5024         		AND     peg2.pegging_id = peg1.end_pegging_id
5025         		AND     peg2.demand_id IN (-1, -2)
5026         		AND     s.plan_id = peg1.plan_id
5027         		AND     s.transaction_id = peg1.transaction_id
5028         		AND     s.sr_instance_id = peg1.sr_instance_id
5029                         -- time_phased_atp
5030                         -- AND     tp.sr_tp_id = peg1.organization_id
5031         		-- AND	tp.partner_type = 3 -- bug2646304
5032                         -- AND     tp.sr_instance_id = peg1.sr_instance_id
5033                         -- 2859130 AND     tp.sr_instance_id = cal.sr_instance_id
5034                         -- AND     tp.calendar_code = cal.calendar_code
5035                         -- AND     tp.calendar_exception_set_id = cal.exception_set_id
5036                         -- AND     TRUNC(s.new_schedule_date) = cal.calendar_date
5037         		GROUP BY
5038         			peg1.plan_id,
5039         		        peg1.inventory_item_id,
5040         		        peg1.organization_id,
5041         		        peg1.sr_instance_id,
5042         		        :def_num,
5043         			trunc(s.new_schedule_date),
5044         			-- 2859130 cal.next_date,
5045                                 peg1.transaction_id,
5046         			s.order_type,
5047         			s.order_number,
5048         			s.schedule_designator_id,
5049                                 :l_user_id,
5050                                 :l_sysdate,
5051                                 :l_user_id,
5052                                 :l_sysdate)';
5053            END IF;
5054            -- time_phased_atp - project atp forward port
5055 
5056            msc_util.msc_log('After Generating second supplies sql');
5057 
5058            -- Parse cursor handler for sql_stmt: Don't open as its already opened
5059 
5060            DBMS_SQL.PARSE(cur_handler, l_sql_stmt_1, DBMS_SQL.NATIVE);
5061            msc_util.msc_log('After parsing second supplies sql');
5062 
5063            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5064            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5065            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5066            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5067            msc_util.msc_log('after binding the variables');
5068 
5069            -- Execute the cursor
5070            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5071            msc_util.msc_log('After executing second supplies cursor');
5072 
5073            msc_util.msc_log('rows processed: ' || rows_processed);
5074            msc_util.msc_log('After inserting in msc_alloc_supplies part 2');
5075 
5076            msc_util.msc_log('after inserting item data into MSC_ALLOC_SUPPLIES tables');
5077 
5078            msc_util.msc_log('Analyze Plan partition for MSC_ALLOC_DEMANDS');
5079            fnd_stats.gather_table_stats(ownname=>'MSC',tabname=>'MSC_ALLOC_DEMANDS',
5080                                    partname=>'ALLOC_DEMANDS_999999',
5081                                    granularity=>'PARTITION',
5082                                    percent =>10);
5083 
5084            msc_util.msc_log('Analyze Plan partition for MSC_ALLOC_SUPPLIES');
5085            fnd_stats.gather_table_stats(ownname=>'MSC',tabname=>'MSC_ALLOC_SUPPLIES',
5086                                    partname=>'ALLOC_SUPPLIES_999999',
5087                                    granularity=>'PARTITION',
5088                                    percent =>10);
5089         ELSE
5090 	   -- IF l_share_partition = 'Y' THEN
5091            msc_util.msc_log('not a shared plan partition, insert data into temp tables');
5092 
5093            l_temp_table := 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id);
5094 
5095            msc_util.msc_log('temp table : ' || l_temp_table);
5096 
5097            SELECT  t.tablespace_name, NVL(i.def_tablespace_name, t.tablespace_name)
5098 	   INTO    l_tbspace, l_ind_tbspace
5099            --bug 2495962: Change refrence from dba_xxx to all_xxx tables
5100            --FROM    dba_tab_partitions t,
5101            --       dba_part_indexes i
5102            FROM    all_tab_partitions t,
5103                    all_part_indexes i
5104            WHERE   t.table_owner = l_msc_schema
5105            AND     t.table_name = 'MSC_ALLOC_DEMANDS'
5106 	   AND     t.partition_name = 'ALLOC_DEMANDS_' || to_char(l_plan_id)
5107            AND     i.owner (+) = t.table_owner
5108            AND     i.table_name (+) = t.table_name
5109            AND     rownum = 1;
5110 
5111            msc_util.msc_log('tb space : ' || l_tbspace);
5112            msc_util.msc_log('ind tbspace : ' || l_ind_tbspace);
5113 
5114            --bug 6113544
5115          l_insert_stmt := 'CREATE TABLE ' || l_temp_table
5116            || ' TABLESPACE ' || l_tbspace
5117            || ' PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)'
5118            || ' as select * from MSC_ALLOC_DEMANDS where 1=2 ';
5119 
5120 			/*
5121            l_insert_stmt := 'CREATE TABLE ' || l_temp_table || '(
5122 				 PLAN_ID                    NUMBER           NOT NULL,
5123 				 INVENTORY_ITEM_ID          NUMBER           NOT NULL,
5124 				 ORGANIZATION_ID            NUMBER           NOT NULL,
5125 				 SR_INSTANCE_ID             NUMBER           NOT NULL,
5126 				 DEMAND_CLASS               VARCHAR2(30)     ,   --bug3272444
5127 				 DEMAND_DATE                DATE             NOT NULL,
5128 				 PARENT_DEMAND_ID           NUMBER           NOT NULL,
5129 				 ALLOCATED_QUANTITY         NUMBER           NOT NULL,
5130 				 ORIGINATION_TYPE           NUMBER           NOT NULL,
5131 				 ORDER_NUMBER               VARCHAR2(62),
5132 				 SALES_ORDER_LINE_ID        NUMBER,
5133 				 OLD_DEMAND_DATE            DATE,
5134 				 OLD_ALLOCATED_QUANTITY     NUMBER,
5135 				 CREATED_BY                 NUMBER           NOT NULL,
5136 				 CREATION_DATE              DATE             NOT NULL,
5137 				 LAST_UPDATED_BY            NUMBER           NOT NULL,
5138 				 LAST_UPDATE_DATE           DATE             NOT NULL,
5139 				 DEMAND_QUANTITY            NUMBER,   -- ssurendr 25-NOV-2002: added for alloc w/b
5140 				 PF_DISPLAY_FLAG            NUMBER,   -- For time_phased_atp
5141 				 ORIGINAL_ITEM_ID           NUMBER,   -- For time_phased_atp
5142 				 ORIGINAL_ORIGINATION_TYPE  NUMBER,   -- For time_phased_atp
5143 				 ORIGINAL_DEMAND_DATE       DATE,     -- For time_phased_atp
5144 		                 SOURCE_ORGANIZATION_ID     NUMBER,   -- For time_phased_atp --bug3272444
5145                                  USING_ASSEMBLY_ITEM_ID     NUMBER,   -- For time_phased_atp --bug3272444
5146                                  CUSTOMER_ID                NUMBER,   -- For time_phased_atp
5147                                  SHIP_TO_SITE_ID            NUMBER,   -- For time_phased_atp
5148                                  REFRESH_NUMBER             NUMBER,   --bug3272444
5149                                  OLD_REFRESH_NUMBER         NUMBER,   --bug3272444
5150                                  DEMAND_SOURCE_TYPE         NUMBER,   --cmro
5151                                  REQUEST_DATE               DATE)     --bug3263368
5152 			    TABLESPACE ' || l_tbspace || '
5153                             -- NOLOGGING
5154                             PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)';
5155 			*/
5156            msc_util.msc_log('before creating table : ' || l_temp_table);
5157            BEGIN
5158               ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5159                    APPLICATION_SHORT_NAME => 'MSC',
5160                    STATEMENT_TYPE => ad_ddl.create_table,
5161                    STATEMENT => l_insert_stmt,
5162                    OBJECT_NAME => l_temp_table);
5163               msc_util.msc_log('after creating table : ' || l_temp_table);
5164 
5165            EXCEPTION
5166               WHEN others THEN
5167                  msc_util.msc_log(sqlcode || ': ' || sqlerrm);
5168                  msc_util.msc_log('Exception of create table : ' || l_temp_table);
5169 
5170                  ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5171                         APPLICATION_SHORT_NAME => 'MSC',
5172                         STATEMENT_TYPE => ad_ddl.drop_table,
5173                         STATEMENT =>  'DROP TABLE ' || l_temp_table,
5174                         OBJECT_NAME => l_temp_table);
5175 
5176                  msc_util.msc_log('After Drop table : ' ||l_temp_table);
5177                  msc_util.msc_log('Before exception create table : ' ||l_temp_table);
5178 
5179                  ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5180                         APPLICATION_SHORT_NAME => 'MSC',
5181                         STATEMENT_TYPE => ad_ddl.create_table,
5182                         STATEMENT => l_insert_stmt,
5183                         OBJECT_NAME => l_temp_table);
5184                  msc_util.msc_log('After exception create table : ' ||l_temp_table);
5185            END;
5186 
5187 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5188            -- to move demand on non-working day to prior working day.
5189 
5190            -- cannot use append with other hints
5191            --l_insert_stmt := 'INSERT /*+ APPEND */ INTO ' || l_temp_table || '(
5192            l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5193                         plan_id,
5194                         inventory_item_id,
5195                         organization_id,
5196                         sr_instance_id,
5197                         demand_class,
5198                         demand_date,
5199                         allocated_quantity,
5200                         parent_demand_id,
5201                         origination_type,
5202                         order_number,
5203                         sales_order_line_id,
5204                         demand_source_type,--cmro
5205                         created_by,
5206                         creation_date,
5207                         last_updated_by,
5208                         last_update_date,
5209                         demand_quantity,  -- ssurendr 25-NOV-2002: added for alloc w/b
5210                         request_date,-- Bug 3370201
5211                         --bug3684383
5212                         customer_id,
5213                         ship_to_site_id)
5214                 (
5215 		SELECT	--5053818
5216 				-- full(peg1.tp)
5217                                 -- full(peg1.cal)
5218                         peg1.plan_id,
5219 			peg1.inventory_item_id,
5220 			peg1.organization_id,
5221 			peg1.sr_instance_id,
5222 			NVL(mv.demand_class, :def_num) demand_class,
5223 			peg1.demand_date,
5224 			(SUM(peg1.allocated_quantity)- MIN(peg1.reserved_quantity)) allocated_quantity, --5027568
5225 			peg1.demand_id,
5226 			peg1.origination_type,
5227 			peg1.order_number,
5228 			peg1.sales_order_line_id,
5229 			peg1.demand_source_type,--cmro
5230 			:l_user_id created_by,
5231 			:l_sysdate creation_date,
5232 			:l_user_id last_updated_by,
5233 			:l_sysdate last_update_date,
5234 			MIN(peg1.demand_quantity) demand_quantity,  -- ssurendr 25-NOV-2002: added for alloc w/b
5235 			-- min is used to select distinct values as demand_quantity would be
5236 			-- repeating for the same demand_id
5237 			peg1.request_date, -- Bug 3370201
5238                         --bug3684383
5239 			peg1.customer_id,
5240 			peg1.ship_to_site_id
5241 		FROM
5242                         -- use inline view so that view parallel hint could be used.
5243 			-- msc_demand_pegging_v peg1,
5244                         (SELECT --5053818
5245                                         -- parallel(tp,' || to_char(l_parallel_degree) || ')
5246                                         -- parallel(cal,' || to_char(l_parallel_degree) || ')
5247                         	peg2.plan_id,
5248 				peg2.inventory_item_id,
5249 				peg2.organization_id,
5250 				peg2.sr_instance_id,
5251 				NVL(d1.demand_class, :def_num) demand_class,
5252 				-- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5253 				trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5254                                              2, NVL(d2.PLANNED_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE),
5255                                                 NVL(d2.SCHEDULE_SHIP_DATE,d2.USING_ASSEMBLY_DEMAND_DATE))) demand_date, --plan by request date, promise date or schedule date
5256 				-- cal.prior_date demand_date,
5257 				-- cal.calendar_date demand_date, -- 2859130
5258 				peg2.allocated_quantity,
5259 				DECODE( d2.origination_type, 30, NVL(d2.reserved_quantity, 0), 0) reserved_quantity, --5027568
5260 				d2.demand_id,
5261 				d2.origination_type,
5262 				--d2.order_number,
5263 				-- rajjain 04/25/2003 Bug 2771075
5264                                 -- For Planned Order Demands We will populate disposition_id
5265                                 -- in order_number column
5266 				decode(d2.origination_type, 1, to_char(d2.disposition_id), d2.order_number) order_number,
5267 				d2.sales_order_line_id,
5268 				d2.demand_source_type,--cmro
5269 			        decode(d2.origination_type, 4, d2.daily_demand_rate,
5270 			           d2.using_requirement_quantity) demand_quantity, -- rajjain 02/06/2003 Bug 2782882
5271 				--peg2.demand_quantity -- ssurendr 25-NOV-2002: added for alloc w/b
5272 			        decode(d2.order_date_type_code,2,d2.request_date,
5273 			           d2.request_ship_date) request_date, -- Bug 3370201
5274                                 --bug3684383
5275 				d2.customer_id,
5276                                 d2.ship_to_site_id
5277                         FROM	msc_demands d2,
5278 				msc_full_pegging peg2,
5279 				msc_full_pegging peg1,
5280 				msc_demands d1
5281 				-- time_phased_atp msc_trading_partners tp
5282 				-- 2859130 msc_calendar_dates cal
5283                         WHERE	peg2.plan_id = peg1.plan_id
5284                         AND	peg2.end_pegging_id = peg1.pegging_id
5285                         AND	peg2.sr_instance_id = peg1.sr_instance_id
5286                         AND	d1.plan_id = peg1.plan_id
5287                         AND	d1.demand_id = peg1.demand_id
5288                         AND	d1.sr_instance_id = peg1.sr_instance_id
5289                         AND	d2.plan_id = peg2.plan_id
5290                         AND	d2.demand_id = peg2.demand_id
5291                         AND	d2.sr_instance_id = peg2.sr_instance_id
5292                         AND	d2.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)
5293 			-- time_phased_atp
5294 			-- AND	tp.sr_tp_id = peg2.organization_id
5295 			-- AND	tp.partner_type = 3 -- bug2646304
5296 			-- AND	tp.sr_instance_id = peg2.sr_instance_id
5297 			-- 2859130
5298                         -- AND	tp.sr_instance_id = cal.sr_instance_id
5299 			--AND	tp.calendar_code = cal.calendar_code
5300 			--AND	tp.calendar_exception_set_id = cal.exception_set_id
5301 			--AND	TRUNC(d2.using_assembly_demand_date) = cal.calendar_date
5302                         ) peg1,
5303 			msc_item_hierarchy_mv mv
5304 		WHERE   peg1.plan_id = :p_plan_id
5305 		AND     peg1.inventory_item_id = mv.inventory_item_id(+)
5306 		AND     peg1.organization_id = mv.organization_id (+)
5307 		AND     peg1.sr_instance_id = mv.sr_instance_id (+)
5308 		AND     peg1.demand_date >=  mv.effective_date (+)
5309 		AND     peg1.demand_date <=  mv.disable_date (+)
5310 		AND	peg1.demand_class = mv.demand_class (+)
5311 		AND     mv.level_id (+) = -1
5312 		GROUP BY
5313 			peg1.plan_id,
5314 			peg1.inventory_item_id,
5315 			peg1.organization_id,
5316 			peg1.sr_instance_id,
5317 			NVL(mv.demand_class, :def_num),
5318 			peg1.demand_date,
5319 			peg1.demand_id,
5320 			peg1.origination_type,
5321 			peg1.order_number,
5322 			peg1.sales_order_line_id,
5323 			peg1.demand_source_type,--cmro
5324 			:l_user_id,
5325 			:l_sysdate,
5326 			:l_user_id,
5327 			:l_sysdate,
5328 			peg1.request_date, -- Bug 3370201
5329                         --bug3684383
5330 			peg1.customer_id,
5331 			peg1.ship_to_site_id)';
5332 
5333            msc_util.msc_log('After Generating the sql');
5334 
5335            -- Obtain cursor handler for sql_stmt
5336            cur_handler := DBMS_SQL.OPEN_CURSOR;
5337 
5338            DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5339            msc_util.msc_log('After parsing the sql');
5340 
5341            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5342            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5343            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5344            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5345 
5346            msc_util.msc_log('after binding the variables');
5347 
5348            -- Execute the cursor
5349            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5350            msc_util.msc_log('After executing the cursor');
5351 
5352            -- parallel hint can't be used with union all. Use two query instead */
5353 
5354            -- UNION ALL
5355 
5356 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5357            -- to move demand on non-working day to prior working day.
5358 
5359            /* time_phased_atp - project atp forward port
5360             * If the profile is set to 'Yes' then:
5361             *    o If the supply pegged to the demand has a demand class existing on allocation rule then
5362             *      allocate the demand to that demand class.
5363             *    o If the supply pegged to the demand has a demand class not present on allocation rule then
5364             *      allocate the demand to 'OTHER'.
5365             *    o If the supply pegged to the demand does not have a demand class present, allocate the supply
5366             *      to 'OTHER'.
5367             * Else: Allocate the demand to 'OTHER'*/
5368            IF l_excess_supply_by_dc = 'Y' THEN
5369                    l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5370                                 plan_id,
5371                                 inventory_item_id,
5372                                 organization_id,
5373                                 sr_instance_id,
5374                                 demand_class,
5375                                 demand_date,
5376                                 allocated_quantity,
5377                                 parent_demand_id,
5378                                 origination_type,
5379                                 order_number,
5380                                 sales_order_line_id,
5381                                 demand_source_type,--cmro
5382                                 created_by,
5383                                 creation_date,
5384                                 last_updated_by,
5385                                 last_update_date,
5386                                 demand_quantity,
5387                                 request_date) -- Bug 3370201
5388                 	(
5389                         SELECT	--5053818
5390                                 pegging_v.plan_id plan_id,
5391                                 pegging_v.inventory_item_id,
5392                                 pegging_v.organization_id,
5393                                 pegging_v.sr_instance_id,
5394                                 NVL(mv.demand_class, :def_num) demand_class,
5395                                 pegging_v.demand_date,
5396                                 SUM(pegging_v.allocated_quantity),
5397                                 pegging_v.demand_id,
5398                                 pegging_v.origination_type,
5399                                 pegging_v.order_number,
5400                                 pegging_v.sales_order_line_id,
5401                                 pegging_v.demand_source_type,--cmro
5402                                 :l_user_id,
5403                                 :l_sysdate,
5404                                 :l_user_id,
5405                                 :l_sysdate,
5406                                 MIN(pegging_v.demand_quantity),
5407                                 pegging_v.request_date -- Bug 3370201
5408                         FROM
5409                                 (SELECT --5053818
5410                                         peg1.plan_id plan_id,
5411                         	        peg1.inventory_item_id,
5412                         	        peg1.organization_id,
5413                         	        peg1.sr_instance_id,
5414                         	        NVL(s.demand_class, :def_num) demand_class,
5415                         	        -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5416                                         trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5417                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5418                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))) demand_date,--plan by request date, promise date or schedule date
5419                         		peg1.allocated_quantity,
5420                                         d.demand_id,
5421                         		d.origination_type,
5422                         		decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number) order_number,
5423                         		d.sales_order_line_id,
5424                         		d.demand_source_type,--cmro
5425                         		decode(d.origination_type, 4, d.daily_demand_rate,
5426                         		           d.using_requirement_quantity) demand_quantity,
5427         			        decode(d.order_date_type_code,2,d.request_date,
5428         			           d.request_ship_date) request_date -- Bug 3370201
5429                         	FROM    msc_full_pegging peg2,
5430                         	        msc_full_pegging peg1,
5431                         		msc_demands d,
5432                                         msc_supplies s
5433                         	WHERE   peg1.plan_id = :p_plan_id
5434                         	AND     peg2.plan_id = peg1.plan_id
5435                         	AND     peg2.pegging_id = peg1.end_pegging_id
5436                         	AND     peg2.demand_id IN (-1, -2)
5437                         	AND     d.demand_id = peg1.demand_id
5438                         	AND     peg1.plan_id = d.plan_id
5439                         	AND     d.sr_instance_id = peg1.sr_instance_id
5440                         	AND     peg1.sr_instance_id=s.sr_instance_id
5441                         	AND     peg1.plan_id = s.plan_id
5442                         	AND     peg1.transaction_id = s.transaction_id
5443                         	AND	d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)) pegging_v,
5444                                 msc_item_hierarchy_mv mv
5445                         WHERE	pegging_v.inventory_item_id = mv.inventory_item_id(+)
5446                         AND     pegging_v.organization_id = mv.organization_id (+)
5447                         AND     pegging_v.sr_instance_id = mv.sr_instance_id (+)
5448                         AND     pegging_v.demand_date >=  mv.effective_date (+)
5449                         AND     pegging_v.demand_date <=  mv.disable_date (+)
5450                         AND	pegging_v.demand_class = mv.demand_class (+)
5451                         AND     mv.level_id (+) = -1
5452                 	GROUP BY
5453                                 pegging_v.plan_id,
5454                                 pegging_v.inventory_item_id,
5455                                 pegging_v.organization_id,
5456                                 pegging_v.sr_instance_id,
5457                                 NVL(mv.demand_class, :def_num),
5458                                 pegging_v.demand_date,
5459                                 pegging_v.demand_id,
5460                                 pegging_v.origination_type,
5461                                 pegging_v.order_number,
5462                                 pegging_v.sales_order_line_id,
5463                                 pegging_v.demand_source_type,--cmro
5464                                 :l_user_id,
5465                                 :l_sysdate,
5466                                 :l_user_id,
5467                                 :l_sysdate,
5468                                 pegging_v.request_date)'; -- Bug 3370201
5469            ELSE
5470                    -- cannot use append with other hints
5471                    --l_insert_stmt := 'INSERT /*+ APPEND */ INTO ' || l_temp_table || '(
5472                    l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5473                                 plan_id,
5474                                 inventory_item_id,
5475                                 organization_id,
5476                                 sr_instance_id,
5477                                 demand_class,
5478                                 demand_date,
5479                                 allocated_quantity,
5480                                 parent_demand_id,
5481                                 origination_type,
5482                                 order_number,
5483                                 sales_order_line_id,
5484                                 demand_source_type,--cmro
5485                                 created_by,
5486                                 creation_date,
5487                                 last_updated_by,
5488                                 last_update_date,
5489                                 demand_quantity,  -- ssurendr 25-NOV-2002: added for alloc w/b
5490                                 request_date) -- Bug 3370201
5491                         (SELECT  --5053818
5492                                         -- time_phased_atp
5493                                         -- parallel(tp,' || to_char(l_parallel_degree) || ')
5494                                         -- 2859130 full(cal)
5495                                         --parallel(cal,' || to_char(l_parallel_degree) || ')
5496                                 peg1.plan_id plan_id,
5497                                 peg1.inventory_item_id,
5498                                 peg1.organization_id,
5499                                 peg1.sr_instance_id,
5500                                 :def_num demand_class,
5501                                 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5502                                 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5503                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5504                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date -- 2859130
5505                                 -- cal.prior_date,
5506                                 SUM(peg1.allocated_quantity),
5507                                 d.demand_id,
5508                                 d.origination_type,
5509         			--d.order_number,
5510         			-- rajjain 04/25/2003 Bug 2771075
5511                                 -- For Planned Order Demands We will populate disposition_id
5512                                 -- in order_number column
5513         			decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
5514                                 d.sales_order_line_id,
5515                                 d.demand_source_type,--cmro
5516                                 :l_user_id,
5517                                 :l_sysdate,
5518                                 :l_user_id,
5519                                 :l_sysdate,
5520         			MIN(decode(d.origination_type, 4, d.daily_demand_rate,
5521         			           d.using_requirement_quantity)), -- rajjain 02/06/2003 Bug 2782882
5522         			--MIN(peg1.demand_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
5523         			-- min is used to select distinct values as demand_quantity would be
5524         			-- repeating for the same demand_id
5525 			        decode(d.order_date_type_code,2,d.request_date,
5526 			           d.request_ship_date) request_date -- Bug 3370201
5527                         FROM    msc_full_pegging peg2,
5528                                 msc_full_pegging peg1,
5529                                 msc_demands d
5530                                 -- time_phased_atp msc_trading_partners tp
5531                                 -- 2859130 msc_calendar_dates cal
5532                         WHERE   peg1.plan_id = :p_plan_id
5533                         AND     peg2.plan_id = peg1.plan_id
5534                         AND     peg2.pegging_id = peg1.end_pegging_id
5535                         AND     peg2.demand_id IN (-1, -2)
5536                         AND     d.demand_id = peg1.demand_id
5537                         AND     peg1.plan_id = d.plan_id
5538                         AND     d.sr_instance_id = peg1.sr_instance_id
5539                         AND     d.origination_type NOT IN (5,7,8,9,11,15,22,28,29,31)
5540                         -- time_phased_atp
5541                         --AND     tp.sr_tp_id = peg1.organization_id
5542         		--AND	tp.partner_type = 3 -- bug2646304
5543                         --AND     tp.sr_instance_id = peg1.sr_instance_id
5544                         -- 2859130 AND     tp.sr_instance_id = cal.sr_instance_id
5545                         --AND     tp.calendar_code = cal.calendar_code
5546                         --AND     tp.calendar_exception_set_id = cal.exception_set_id
5547                         --AND     TRUNC(d.using_assembly_demand_date) = cal.calendar_date
5548                         GROUP BY
5549                                 peg1.plan_id,
5550                                 peg1.inventory_item_id,
5551                                 peg1.organization_id,
5552                                 peg1.sr_instance_id,
5553                                 :def_num,
5554                                 -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
5555                                 trunc(DECODE('||MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF||',
5556                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
5557                                                 NVL(d.SCHEDULE_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),--plan by request date, promise date or schedule date
5558                                 --cal.prior_date,
5559                                 d.demand_id,
5560                                 d.origination_type,
5561                                 decode(d.origination_type, 1, to_char(d.disposition_id), d.order_number),
5562                                 d.sales_order_line_id,
5563                                 d.demand_source_type,--cmro
5564                                 :l_user_id,
5565                                 :l_sysdate,
5566                                 :l_user_id,
5567                                 :l_sysdate,
5568 			        decode(d.order_date_type_code,2,d.request_date,
5569 			           d.request_ship_date) -- Bug 3370201
5570         		)';
5571            END IF;
5572            -- time_phased_atp - project atp forward port
5573 
5574            msc_util.msc_log('After Generating the sql');
5575 
5576            -- Parse cursor handler for sql_stmt: Don't open as its already opened
5577 
5578            DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5579            msc_util.msc_log('After parsing the sql');
5580 
5581            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5582            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5583            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5584            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5585            msc_util.msc_log('after binding the variables');
5586 
5587            -- Execute the cursor
5588            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5589            msc_util.msc_log('After executing the cursor');
5590 
5591            msc_util.msc_log('after inserting item data into MSC_TEMP_ALLOC_DEMANDS table');
5592 
5593            commit;
5594 
5595            msc_util.msc_log('before creating indexes on temp demand table');
5596            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N1 ON ' || l_temp_table || '
5597                            --NOLOGGING
5598                            (plan_id, inventory_item_id, organization_id, sr_instance_id, demand_class, demand_date)
5599                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5600 
5601            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N1');
5602 
5603            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5604                            APPLICATION_SHORT_NAME => 'MSC',
5605                            STATEMENT_TYPE => ad_ddl.create_index,
5606                            STATEMENT => l_sql_stmt_1,
5607                            OBJECT_NAME => l_temp_table);
5608 
5609            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N1');
5610 
5611            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N2 ON ' || l_temp_table || '
5612                            -- NOLOGGING
5613                            --Bug 3629191
5614                            (plan_id,
5615                            sales_order_line_id)
5616                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5617 
5618            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N2');
5619 
5620            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5621                            APPLICATION_SHORT_NAME => 'MSC',
5622                            STATEMENT_TYPE => ad_ddl.create_index,
5623                            STATEMENT => l_sql_stmt_1,
5624                            OBJECT_NAME => l_temp_table);
5625 
5626            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N2');
5627 
5628            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N3 ON ' || l_temp_table || '
5629                            -- NOLOGGING
5630                            --Bug 3629191
5631                            (plan_id,
5632                            parent_demand_id)
5633                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
5634 
5635            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N3');
5636 
5637            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5638                            APPLICATION_SHORT_NAME => 'MSC',
5639                            STATEMENT_TYPE => ad_ddl.create_index,
5640                            STATEMENT => l_sql_stmt_1,
5641                            OBJECT_NAME => l_temp_table);
5642 
5643            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N3');
5644            msc_util.msc_log('Done creating indexes on temp demand table');
5645 
5646 
5647            l_temp_table := 'MSC_TEMP_ALLOC_SUP_' || to_char(l_plan_id);
5648 
5649            SELECT  t.tablespace_name, NVL(i.def_tablespace_name, t.tablespace_name)
5650            INTO    l_tbspace, l_ind_tbspace
5651            --bug 2495962: Change refrence from dba_xxx to all_xxx tables
5652            --FROM    dba_tab_partitions t,
5653            --        dba_part_indexes i
5654            FROM    all_tab_partitions t,
5655                    all_part_indexes i
5656            WHERE   t.table_owner = l_msc_schema
5657            AND     t.table_name = 'MSC_ALLOC_SUPPLIES'
5658            AND     t.partition_name = 'ALLOC_SUPPLIES_' || to_char(l_plan_id)
5659            AND     i.owner (+) = t.table_owner
5660            AND     i.table_name (+) = t.table_name
5661            AND     rownum = 1;
5662 
5663            msc_util.msc_log('tb space : ' || l_tbspace);
5664            msc_util.msc_log('ind tbspace : ' || l_ind_tbspace);
5665 
5666            --bug 6113544
5667            l_insert_stmt := 'CREATE TABLE ' || l_temp_table
5668            || ' TABLESPACE ' || l_tbspace
5669            || ' PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)'
5670            || ' as select * from msc_alloc_supplies where 1=2 ';
5671 
5672         /*
5673            l_insert_stmt := 'CREATE TABLE ' || l_temp_table || '(
5674                                  PLAN_ID                    NUMBER           NOT NULL,
5675                                  INVENTORY_ITEM_ID          NUMBER           NOT NULL,
5676                                  ORGANIZATION_ID            NUMBER           NOT NULL,
5677                                  SR_INSTANCE_ID             NUMBER           NOT NULL,
5678                                  DEMAND_CLASS               VARCHAR2(30)      ,  --bug3272444
5679                                  SUPPLY_DATE                DATE             NOT NULL,
5680                                  PARENT_TRANSACTION_ID      NUMBER           NOT NULL,
5681                                  ALLOCATED_QUANTITY         NUMBER           NOT NULL,
5682                                  ORDER_TYPE                 NUMBER           NOT NULL,
5683                                  ORDER_NUMBER               VARCHAR2(240),
5684 				 SCHEDULE_DESIGNATOR_ID	    NUMBER,
5685                                  SALES_ORDER_LINE_ID        NUMBER,
5686                                  OLD_SUPPLY_DATE            DATE,
5687                                  OLD_ALLOCATED_QUANTITY     NUMBER,
5688 				 STEALING_FLAG		    NUMBER,
5689                                  CREATED_BY                 NUMBER           NOT NULL,
5690                                  CREATION_DATE              DATE             NOT NULL,
5691                                  LAST_UPDATED_BY            NUMBER           NOT NULL,
5692                                  LAST_UPDATE_DATE           DATE             NOT NULL,
5693                                  FROM_DEMAND_CLASS          VARCHAR2(80),  -- ssurendr 25-NOV-2002: added for alloc w/b
5694                                  SUPPLY_QUANTITY            NUMBER,        -- ssurendr 25-NOV-2002: added for alloc w/b
5695                                  ORIGINAL_ORDER_TYPE        NUMBER,        -- For time_phased_atp --bug3272444
5696                                  ORIGINAL_ITEM_ID           NUMBER,        -- For time_phased_atp --bug3272444
5697                                  CUSTOMER_ID                NUMBER,        -- For time_phased_atp
5698                                  SHIP_TO_SITE_ID            NUMBER,
5699                                  REFRESH_NUMBER             NUMBER,
5700                                  OLD_REFRESH_NUMBER         NUMBER,        --bug3272444
5701                                  ATO_MODEL_LINE_ID          NUMBER,
5702                                --ATO_MODEL_LINE_ID          NUMBER)        -- For time_phased_atp commented as part of cmro
5703                                  DEMAND_SOURCE_TYPE         NUMBER)        --cmro
5704                             TABLESPACE ' || l_tbspace || '
5705                             -- NOLOGGING
5706                             PCTFREE 0 STORAGE(INITIAL 40K NEXT 5M PCTINCREASE 0)';
5707         */
5708 
5709            msc_util.msc_log('before creating table : ' || l_temp_table);
5710            BEGIN
5711               ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5712                    APPLICATION_SHORT_NAME => 'MSC',
5713                    STATEMENT_TYPE => ad_ddl.create_table,
5714                    STATEMENT => l_insert_stmt,
5715                    OBJECT_NAME => l_temp_table);
5716               msc_util.msc_log('after creating table : ' || l_temp_table);
5717 
5718            EXCEPTION
5719               WHEN others THEN
5720                  msc_util.msc_log(sqlcode || ': ' || sqlerrm);
5721                  msc_util.msc_log('Exception of create table : ' || l_temp_table);
5722 
5723                  ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5724                         APPLICATION_SHORT_NAME => 'MSC',
5725                         STATEMENT_TYPE => ad_ddl.drop_table,
5726                         STATEMENT =>  'DROP TABLE ' || l_temp_table,
5727                         OBJECT_NAME => l_temp_table);
5728 
5729                  msc_util.msc_log('After Drop table : ' ||l_temp_table);
5730                  msc_util.msc_log('Before exception create table : ' ||l_temp_table);
5731 
5732                  ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
5733                         APPLICATION_SHORT_NAME => 'MSC',
5734                         STATEMENT_TYPE => ad_ddl.create_table,
5735                         STATEMENT => l_insert_stmt,
5736                         OBJECT_NAME => l_temp_table);
5737                  msc_util.msc_log('After exception create table : ' ||l_temp_table);
5738            END;
5739 
5740 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5741 	   -- to move demand on non-working day to prior working day.
5742 
5743            -- cannot use append with other hints
5744            --l_insert_stmt := 'INSERT INTO /*+ APPEND */ ' || l_temp_table || '(
5745            l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5746                         plan_id,
5747                         inventory_item_id,
5748                         organization_id,
5749                         sr_instance_id,
5750                         demand_class,
5751                         supply_date,
5752                         allocated_quantity,
5753                         parent_transaction_id,
5754                         order_type,
5755                         order_number,
5756                         schedule_designator_id,
5757                         created_by,
5758                         creation_date,
5759                         last_updated_by,
5760                         last_update_date,
5761                         supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
5762                 (
5763 		SELECT	--5053818
5764 			peg1.plan_id plan_id,
5765 			peg1.inventory_item_id,
5766 			peg1.organization_id,
5767 			peg1.sr_instance_id,
5768 			NVL(mv.demand_class, :def_num) demand_class,
5769 			peg1.supply_date,
5770 			SUM(peg1.allocated_quantity) allocated_quantity,
5771                         peg1.transaction_id,
5772 			peg1.order_type,
5773 			peg1.order_number,
5774 			peg1.schedule_designator_id,
5775                         :l_user_id created_by,
5776                         :l_sysdate creation_date,
5777                         :l_user_id last_updated_by,
5778                         :l_sysdate last_update_date,
5779 			MIN(peg1.supply_quantity) supply_quantity  -- ssurendr 25-NOV-2002: added for alloc w/b
5780 			-- min is used to select distinct values as supply_quantity would be
5781 			-- repeating for the same transaction_id
5782 		FROM    -- msc_supply_pegging_v peg1,
5783 			(SELECT --5053818
5784                                         -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
5785                                         -- parallel(cal,' || to_char(l_parallel_degree) || ')
5786 				peg2.plan_id,
5787 				peg2.inventory_item_id,
5788 				peg2.organization_id,
5789 				peg2.sr_instance_id,
5790 				NVL (d.demand_class, :def_num) demand_class,
5791 				trunc(s.new_schedule_date) supply_date,
5792 				-- cal.next_date supply_date,
5793 				-- cal.calendar_date supply_date, -- 2859130
5794 				peg2.allocated_quantity,
5795 				peg2.transaction_id,
5796 				s.order_type,
5797 				s.order_number,
5798 				s.schedule_designator_id,
5799 				nvl(s.firm_quantity,s.new_order_quantity) supply_quantity -- rajjain 02/06/2003 Bug 2782882
5800 				--peg2.supply_quantity  -- ssurendr 25-NOV-2002: added for alloc w/b
5801 			FROM	msc_supplies s,
5802 				msc_full_pegging peg2,
5803 				msc_full_pegging peg1,
5804 				msc_demands d
5805                                 -- time_phased_atp msc_trading_partners tp
5806                                 -- 2859130 msc_calendar_dates cal
5807 			WHERE	peg2.plan_id = peg1.plan_id
5808 			  AND	peg2.end_pegging_id = peg1.pegging_id
5809 			  AND	d.plan_id = peg1.plan_id
5810 			  AND	d.demand_id = peg1.demand_id
5811 			  AND	d.sr_instance_id = peg1.sr_instance_id
5812 			  AND	d.inventory_item_id = peg1.inventory_item_id
5813 			  AND	s.plan_id = peg2.plan_id
5814 			  AND	s.transaction_id = peg2.transaction_id
5815 			  AND	s.sr_instance_id = peg2.sr_instance_id
5816                           -- time_phased_atp
5817                           --AND   tp.sr_tp_id = peg2.organization_id
5818 			  --AND	tp.partner_type = 3 -- bug2646304
5819                           --AND   tp.sr_instance_id = peg2.sr_instance_id
5820                           -- 2859130 AND   tp.sr_instance_id = cal.sr_instance_id
5821                           --AND   tp.calendar_code = cal.calendar_code
5822                           --AND   tp.calendar_exception_set_id = cal.exception_set_id
5823                           --AND   TRUNC(s.new_schedule_date) = cal.calendar_date
5824                         ) peg1,
5825 			msc_item_hierarchy_mv mv
5826 		WHERE   peg1.plan_id = :p_plan_id
5827 		AND     peg1.inventory_item_id = mv.inventory_item_id(+)
5828 		AND     peg1.organization_id = mv.organization_id (+)
5829 		AND     peg1.sr_instance_id = mv.sr_instance_id (+)
5830 		AND     peg1.supply_date >=  mv.effective_date (+)
5831 		AND     peg1.supply_date <=  mv.disable_date (+)
5832 		AND	peg1.demand_class = mv.demand_class (+)
5833 		AND     mv.level_id (+) = -1
5834 		GROUP BY
5835 			peg1.plan_id,
5836 			peg1.inventory_item_id,
5837 			peg1.organization_id,
5838 			peg1.sr_instance_id,
5839 			NVL(mv.demand_class, :def_num),
5840 			peg1.supply_date,
5841                         peg1.transaction_id,
5842 			peg1.order_type,
5843 			peg1.order_number,
5844 			peg1.schedule_designator_id,
5845                         :l_user_id,
5846                         :l_sysdate,
5847                         :l_user_id,
5848                         :l_sysdate)';
5849 
5850            msc_util.msc_log('After Generating first supplies sql');
5851 
5852            -- Parse cursor handler for sql_stmt: Don't open as its already opened
5853 
5854            DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
5855            msc_util.msc_log('After parsing first supplies sql');
5856 
5857            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
5858            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
5859            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
5860            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
5861            msc_util.msc_log('after binding the variables');
5862 
5863            -- Execute the cursor
5864            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
5865            msc_util.msc_log('After executing first supplies cursor');
5866 
5867            msc_util.msc_log('After inserting in msc_alloc_supplies part 1');
5868 
5869            -- parallel hint can't be used with union all. Use two query instead */
5870 
5871 	   -- UNION ALL
5872 
5873 	   -- 2623646 Modified to join with msc_trading_partners/ msc_calendar_dates
5874 	   -- to move demand on non-working day to prior working day.
5875 
5876            /* time_phased_atp - project atp forward port
5877             * If the profile is set to 'Yes' then:
5878             *    o If supply has a demand class existing on allocation rule then
5879             *      allocate the supply to that demand class.
5880             *    o If supply has a demand class not present on allocation rule then
5881             *      allocate the supply to 'OTHER'.
5882             *    o If supply does not have a demand class present, allocate the supply
5883             *      to 'OTHER'.
5884             * Else: Allocate the supply to 'OTHER'*/
5885            IF l_excess_supply_by_dc = 'Y' THEN
5886                    l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5887                                 plan_id,
5888                                 inventory_item_id,
5889                                 organization_id,
5890                                 sr_instance_id,
5891                                 demand_class,
5892                                 supply_date,
5893                                 allocated_quantity,
5894                                 parent_transaction_id,
5895                                 order_type,
5896                                 order_number,
5897                                 schedule_designator_id,
5898                                 created_by,
5899                                 creation_date,
5900                                 last_updated_by,
5901                                 last_update_date,
5902                                 supply_quantity)
5903         		(
5904         	        SELECT	--5053818
5905                                 pegging_v.plan_id plan_id,
5906                                 pegging_v.inventory_item_id,
5907                                 pegging_v.organization_id,
5908                                 pegging_v.sr_instance_id,
5909                                 NVL(mv.demand_class, :def_num) demand_class,
5910                                 pegging_v.supply_date,
5911                                 SUM(pegging_v.allocated_quantity),
5912                                 pegging_v.transaction_id,
5913                                 pegging_v.order_type,
5914                                 pegging_v.order_number,
5915                                 pegging_v.schedule_designator_id,
5916                                 :l_user_id,
5917                                 :l_sysdate,
5918                                 :l_user_id,
5919                                 :l_sysdate,
5920                                 MIN(pegging_v.supply_quantity)
5921                         FROM
5922                                 (SELECT  --5053818
5923                                         peg1.plan_id plan_id,
5924                                         peg1.inventory_item_id,
5925                                         peg1.organization_id,
5926                                         peg1.sr_instance_id,
5927                                         NVL(s.demand_class, :def_num) demand_class,
5928                                         trunc(s.new_schedule_date) supply_date,
5929                                         peg1.allocated_quantity,
5930                                         peg1.transaction_id,
5931                                         s.order_type,
5932                                         s.order_number,
5933                                         s.schedule_designator_id,
5934                                         nvl(s.firm_quantity,s.new_order_quantity) supply_quantity
5935                                 FROM    msc_full_pegging peg2,
5936                                         msc_full_pegging peg1,
5937                                 	msc_supplies s
5938                                 WHERE   peg1.plan_id = :p_plan_id
5939                                 AND     peg2.plan_id = peg1.plan_id
5940                                 AND     peg2.pegging_id = peg1.end_pegging_id
5941                                 AND     peg2.demand_id IN (-1, -2)
5942                                 AND     s.plan_id = peg1.plan_id
5943                                 AND     s.transaction_id = peg1.transaction_id
5944                                 AND     s.sr_instance_id = peg1.sr_instance_id) pegging_v,
5945                                 msc_item_hierarchy_mv mv
5946                         WHERE	pegging_v.inventory_item_id = mv.inventory_item_id(+)
5947                         AND     pegging_v.organization_id = mv.organization_id (+)
5948                         AND     pegging_v.sr_instance_id = mv.sr_instance_id (+)
5949                         AND     pegging_v.supply_date >=  mv.effective_date (+)
5950                         AND     pegging_v.supply_date <=  mv.disable_date (+)
5951                         AND	pegging_v.demand_class = mv.demand_class (+)
5952                         AND     mv.level_id (+) = -1
5953         		GROUP BY
5954                                 pegging_v.plan_id,
5955                                 pegging_v.inventory_item_id,
5956                                 pegging_v.organization_id,
5957                                 pegging_v.sr_instance_id,
5958                                 NVL(mv.demand_class, :def_num),
5959                                 pegging_v.supply_date,
5960                                 pegging_v.transaction_id,
5961                                 pegging_v.order_type,
5962                                 pegging_v.order_number,
5963                                 pegging_v.schedule_designator_id,
5964                                 :l_user_id,
5965                                 :l_sysdate,
5966                                 :l_user_id,
5967                                 :l_sysdate)';
5968 
5969            ELSE
5970                    -- cannot use append with other hints
5971                    --l_insert_stmt := 'INSERT INTO /*+ APPEND */ ' || l_temp_table || '(
5972                    l_insert_stmt := 'INSERT INTO ' || l_temp_table || '(
5973                                 plan_id,
5974                                 inventory_item_id,
5975                                 organization_id,
5976                                 sr_instance_id,
5977                                 demand_class,
5978                                 supply_date,
5979                                 allocated_quantity,
5980                                 parent_transaction_id,
5981                                 order_type,
5982                                 order_number,
5983                                 schedule_designator_id,
5984                                 created_by,
5985                                 creation_date,
5986                                 last_updated_by,
5987                                 last_update_date,
5988                                 supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
5989                         (
5990         		SELECT  --5053818
5991                                         -- time_phased_atp parallel(tp,' || to_char(l_parallel_degree) || ')
5992                                         --2859130 parallel(cal,' || to_char(l_parallel_degree) || ')
5993                                 peg1.plan_id plan_id,
5994         		        peg1.inventory_item_id,
5995         		        peg1.organization_id,
5996         		        peg1.sr_instance_id,
5997         		        :def_num demand_class,
5998         			trunc(s.new_schedule_date),
5999         			-- cal.next_date,
6000                                 --cal.calendar_date, -- 2859130
6001         			SUM(peg1.allocated_quantity),
6002                                 peg1.transaction_id,
6003         			s.order_type,
6004         			s.order_number,
6005         			s.schedule_designator_id,
6006                                 :l_user_id,
6007                                 :l_sysdate,
6008                                 :l_user_id,
6009                                 :l_sysdate,
6010         			MIN(nvl(s.firm_quantity,s.new_order_quantity))  -- rajjain 02/06/2003 Bug 2782882
6011         			--MIN(peg1.supply_quantity)  -- ssurendr 25-NOV-2002: added for alloc w/b
6012         			-- min is used to select distinct values as supply_quantity would be
6013         			-- repeating for the same transaction_id
6014         		FROM    msc_full_pegging peg2,
6015         		        msc_full_pegging peg1,
6016         			msc_supplies s
6017                                 -- msc_trading_partners tp
6018                                 -- msc_calendar_dates cal
6019         		WHERE   peg1.plan_id = :p_plan_id
6020         		AND     peg2.plan_id = peg1.plan_id
6021         		AND     peg2.pegging_id = peg1.end_pegging_id
6022         		AND     peg2.demand_id IN (-1, -2)
6023         		AND     s.plan_id = peg1.plan_id
6024         		AND     s.transaction_id = peg1.transaction_id
6025         		AND     s.sr_instance_id = peg1.sr_instance_id
6026                         -- time_phased_atp
6027                         --AND     tp.sr_tp_id = peg1.organization_id
6028         		--AND	tp.partner_type = 3 -- bug2646304
6029                         --AND     tp.sr_instance_id = peg1.sr_instance_id
6030                         -- 2859130 AND     tp.sr_instance_id = cal.sr_instance_id
6031                         --AND     tp.calendar_code = cal.calendar_code
6032                         --AND     tp.calendar_exception_set_id = cal.exception_set_id
6033                         --AND     TRUNC(s.new_schedule_date) = cal.calendar_date
6034         		GROUP BY
6035         			peg1.plan_id,
6036         		        peg1.inventory_item_id,
6037         		        peg1.organization_id,
6038         		        peg1.sr_instance_id,
6039         		        :def_num,
6040         			trunc(s.new_schedule_date),
6041         			-- cal.next_date, -- 2859130
6042                                 peg1.transaction_id,
6043         			s.order_type,
6044         			s.order_number,
6045         			s.schedule_designator_id,
6046                                 :l_user_id,
6047                                 :l_sysdate,
6048                                 :l_user_id,
6049                                 :l_sysdate)';
6050            END IF;
6051            -- time_phased_atp - project atp forward port
6052 
6053            msc_util.msc_log('After Generating second supplies sql');
6054 
6055            -- Parse cursor handler for sql_stmt: Don't open as its already opened
6056 
6057            DBMS_SQL.PARSE(cur_handler, l_insert_stmt, DBMS_SQL.NATIVE);
6058            msc_util.msc_log('After parsing second supplies sql');
6059 
6060            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_user_id', l_user_id);
6061            DBMS_SQL.BIND_VARIABLE(cur_handler, ':l_sysdate', l_sysdate);
6062            DBMS_SQL.BIND_VARIABLE(cur_handler, ':p_plan_id', p_plan_id);
6063            DBMS_SQL.BIND_VARIABLE(cur_handler, ':def_num', '-1');
6064            msc_util.msc_log('after binding the variables');
6065 
6066            -- Execute the cursor
6067            rows_processed := DBMS_SQL.EXECUTE(cur_handler);
6068            msc_util.msc_log('After executing second supplies cursor');
6069 
6070            msc_util.msc_log('After inserting in msc_alloc_supplies part 2');
6071            commit;
6072 
6073            msc_util.msc_log('before creating indexes on temp supply table');
6074            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N1 ON ' || l_temp_table || '
6075                            -- NOLOGGING
6076                            (plan_id, inventory_item_id, organization_id, sr_instance_id, demand_class, supply_date)
6077                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6078 
6079            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N1');
6080 
6081            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6082                            APPLICATION_SHORT_NAME => 'MSC',
6083                            STATEMENT_TYPE => ad_ddl.create_index,
6084                            STATEMENT => l_sql_stmt_1,
6085                            OBJECT_NAME => l_temp_table);
6086 
6087            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N1');
6088 
6089            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N2 ON ' || l_temp_table || '
6090                            -- NOLOGGING
6091                            --Bug 3629191
6092                            (plan_id,
6093                            parent_transaction_id)
6094                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6095 
6096            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N2');
6097 
6098            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6099                            APPLICATION_SHORT_NAME => 'MSC',
6100                            STATEMENT_TYPE => ad_ddl.create_index,
6101                            STATEMENT => l_sql_stmt_1,
6102                            OBJECT_NAME => l_temp_table);
6103 
6104            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N2');
6105 
6106            -- 2623646
6107            l_sql_stmt_1 := 'CREATE INDEX ' || l_temp_table || '_N3 ON ' || l_temp_table || '
6108                            -- NOLOGGING
6109                            --Bug 3629191
6110                            (plan_id,
6111                            sales_order_line_id)
6112                            STORAGE(INITIAL 40K NEXT 2M PCTINCREASE 0) tablespace ' || l_ind_tbspace;
6113 
6114            msc_util.msc_log('Before index : ' || l_temp_table || '.' || l_temp_table || '_N3');
6115 
6116            ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6117                            APPLICATION_SHORT_NAME => 'MSC',
6118                            STATEMENT_TYPE => ad_ddl.create_index,
6119                            STATEMENT => l_sql_stmt_1,
6120                            OBJECT_NAME => l_temp_table);
6121 
6122            msc_util.msc_log('After index : ' || l_temp_table || '.' || l_temp_table || '_N3');
6123 
6124            msc_util.msc_log('Gather Table Stats for Allocated S/D Tables');
6125 
6126            fnd_stats.gather_table_stats('MSC', 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id), granularity => 'ALL');
6127            fnd_stats.gather_table_stats('MSC', 'MSC_TEMP_ALLOC_SUP_' || to_char(l_plan_id), granularity => 'ALL');
6128 
6129            msc_util.msc_log('swap partition for demands');
6130            l_partition_name := 'ALLOC_DEMANDS_' || to_char(l_plan_id);
6131 
6132            msc_util.msc_log('Partition name for msc_alloc_demands table : ' || l_partition_name);
6133 
6134            -- swap partiton for supplies and demand part
6135 
6136            l_sql_stmt := 'ALTER TABLE msc_alloc_demands EXCHANGE PARTITION ' || l_partition_name  ||
6137            ' with table MSC_TEMP_ALLOC_DEM_'|| to_char(l_plan_id) ||
6138            ' including indexes without validation';
6139 
6140            BEGIN
6141         	   msc_util.msc_log('Before alter table msc_alloc_demands');
6142                    ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6143                    APPLICATION_SHORT_NAME => 'MSC',
6144                    STATEMENT_TYPE => ad_ddl.alter_table,
6145                    STATEMENT => l_sql_stmt,
6146                    OBJECT_NAME => 'MSC_ALLOC_DEMANDS');
6147        	   END;
6148 
6149            msc_util.msc_log('swap partition for supplies');
6150            l_partition_name := 'ALLOC_SUPPLIES_' || to_char(l_plan_id);
6151 
6152            msc_util.msc_log('Partition name for msc_alloc_supplies table : ' || l_partition_name);
6153 
6154            l_sql_stmt := 'ALTER TABLE msc_alloc_supplies EXCHANGE PARTITION ' || l_partition_name  ||
6155            ' with table MSC_TEMP_ALLOC_SUP_'|| to_char(l_plan_id) ||
6156            ' including indexes without validation';
6157 
6158            BEGIN
6159         	   msc_util.msc_log('Before alter table msc_alloc_supplies');
6160                    ad_ddl.do_ddl(APPLSYS_SCHEMA => l_applsys_schema,
6161                    APPLICATION_SHORT_NAME => 'MSC',
6162                    STATEMENT_TYPE => ad_ddl.alter_table,
6163                    STATEMENT => l_sql_stmt,
6164                    OBJECT_NAME => 'MSC_ALLOC_SUPPLIES');
6165        	   END;
6166 
6167 	   msc_util.msc_log('Call procedure clean_temp_tables');
6168 
6169 	   -- clean temp tables after exchanging partitions
6170 	   clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6171 
6172 	   msc_util.msc_log('After procedure clean_temp_tables');
6173 
6174 	END IF; -- IF l_share_partition = 'Y'
6175 
6176 	--5027568
6177 	--insert reservation_records to msc_alloc_demands.
6178 	msc_util.msc_log('inserting reservation rows in msc_alloc_demands');
6179 	INSERT INTO MSC_ALLOC_DEMANDS(
6180 			plan_id,
6181 			inventory_item_id,
6182 			organization_id,
6183 			sr_instance_id,
6184 			demand_class,
6185 			demand_date,
6186 			allocated_quantity,
6187 			parent_demand_id,
6188 			origination_type,
6189 			order_number,
6190 			sales_order_line_id,
6191 			created_by,
6192 			creation_date,
6193 			last_updated_by,
6194 			last_update_date,
6195 			demand_quantity
6196                         )
6197         (SELECT
6198             plan_id,
6199             USING_ASSEMBLY_ITEM_ID,
6200             ORGANIZATION_ID,
6201             SR_INSTANCE_ID,
6202             NVL(DEMAND_CLASS, -1),
6203             TRUNC(SYSDATE),
6204             RESERVED_QUANTITY,
6205             msc_demands_s.nextval,
6206             -100,
6207             ORDER_NUMBER,
6208             SALES_ORDER_LINE_ID,
6209             CREATED_BY,
6210             CREATION_DATE,
6211             LAST_UPDATED_BY,
6212             LAST_UPDATE_DATE,
6213             using_requirement_quantity
6214             from msc_demands
6215             where plan_id = p_plan_id
6216             and origination_type in (30,6)
6217             and RESERVED_QUANTITY <> 0
6218             );
6219 	msc_util.msc_log('inserted reservation rows in msc_alloc_demands :' || SQL%ROWCOUNT);
6220 
6221         BEGIN
6222             update msc_plans
6223             set    summary_flag = 3
6224             where  plan_id = p_plan_id;
6225         END;
6226 
6227 	RETCODE := G_SUCCESS;
6228 	commit;
6229 
6230 	msc_util.msc_log('End procedure post_plan_allocation');
6231 
6232 EXCEPTION
6233        WHEN OTHERS THEN
6234             msc_util.msc_log('Inside main exception of post_plan_allocation');
6235             msc_util.msc_log(sqlerrm);
6236             ERRBUF := sqlerrm;
6237 
6238             BEGIN
6239                update msc_plans
6240                set    summary_flag = 1
6241                where  plan_id = p_plan_id;
6242                commit;
6243             END;
6244 
6245             RETCODE := G_ERROR;
6246             IF (l_share_partition = 'Y') THEN
6247                ROLLBACK;
6248             ELSE
6249 	       msc_util.msc_log('Call procedure clean_temp_tables in exception');
6250 
6251 	       -- clean temp tables after exchanging partitions
6252 	       IF l_plan_id IS NOT NULL THEN
6253 	          clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6254 	       END IF;
6255 
6256 	       msc_util.msc_log('After procedure clean_temp_tables in exception');
6257             END IF;
6258 END post_plan_allocation;
6259 
6260 -- ngoel 5/7/2002, added new API to be called from planning process to launch concurrent program
6261 -- for post-plan process for summary/ pre-allocation process.
6262 
6263 procedure atp_post_plan_proc(
6264         p_plan_id               IN      NUMBER,
6265         p_alloc_mode            IN      NUMBER := 0,
6266         p_summary_mode          IN      NUMBER := 0,
6267         x_retcode		OUT	NoCopy NUMBER,
6268         x_errbuf		OUT	NoCopy VARCHAR2
6269 )
6270 IS
6271 l_count                         NUMBER;
6272 l_inv_ctp                       NUMBER;
6273 l_alloc_atp                     VARCHAR2(1);
6274 l_class_hrchy                   NUMBER;
6275 l_alloc_method                  NUMBER;
6276 l_enable_summary_mode           VARCHAR2(1);
6277 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6278 --l_submit_request                VARCHAR2(1) := 'N';
6279 l_request_id			NUMBER;
6280 
6281 -- 24x7 ATP
6282 l_copy_plan_id                  NUMBER;
6283 
6284 BEGIN
6285     msc_util.msc_log('Begin procedure atp_post_plan_proc');
6286     msc_util.msc_log('plan : ' || p_plan_id);
6287     msc_util.msc_log('Allocation Mode : ' || p_alloc_mode);
6288     msc_util.msc_log('Summary Mode : ' || p_summary_mode);
6289 
6290     x_retcode := G_SUCCESS;
6291 
6292     l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
6293 
6294     msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
6295 
6296     /* time_phased_atp changes begin
6297        Always call atp post plan processing conc prog if PDS
6298     IF l_enable_summary_mode = 'Y' AND l_inv_ctp = 4 AND l_alloc_atp = 'N' THEN
6299        l_submit_request := 'Y';
6300     ELSIF l_inv_ctp = 4 AND l_alloc_atp = 'Y' AND l_class_hrchy = 1 AND l_alloc_method = 1 THEN
6301        l_submit_request := 'Y';
6302     END IF;
6303 
6304     -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6305     IF l_inv_ctp = 4 THEN
6306        l_submit_request := 'Y';
6307     END IF;*/
6308     -- time_phased_atp changes end
6309 
6310     ---bug 3274373
6311     IF l_inv_ctp = 4 THEN
6312 
6313 	   -- Bug 3491498, check if plan is ATPable. Moved up to check it prior to refresh MSC_ATP_PLAN_SN
6314        SELECT count(*)
6315        INTO   l_count
6316        FROM   msc_plans plans,
6317               msc_designators desig
6318        WHERE  desig.inventory_atp_flag = 1
6319        AND    plans.plan_id = p_plan_id
6320        AND    plans.compile_designator = desig.designator
6321        AND    plans.sr_instance_id = desig.sr_instance_id
6322        AND    plans.organization_id = desig.organization_id
6323        AND    plans.plan_completion_date is not null
6324        AND    plans.data_completion_date is not null
6325        -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6326        AND    plans.plan_type <> 4;
6327 
6328        msc_util.msc_log('Count	 for plan : ' || l_count);
6329 
6330        IF l_count > 0 THEN
6331           msc_util.msc_log('Before refreshing MSC_ATP_PLAN_SN');
6332           l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6333                                         'MSC',
6334                                         'MSCREFMV',
6335                                         NULL,   -- description
6336                                         NULL,   -- start time
6337                                         FALSE,  -- sub request
6338                                         'MSC_ATP_PLAN_SN',
6339                                         724);
6340           msc_util.msc_log('Request id for refreshing snapshot := ' || l_request_id);
6341           msc_util.msc_log('After refreshing MSC_ATP_PLAN_SN');
6342        END IF; 	--IF l_count = 0 THEN
6343     END IF;
6344 
6345     -- Bug 3491498, moved prior to call to refresh MSC_ATP_PLAN_SN
6346 /*
6347     SELECT count(*)
6348     INTO   l_count
6349     FROM   msc_plans plans,
6350            msc_designators desig
6351     WHERE  desig.inventory_atp_flag = 1
6352     AND    plans.plan_id = p_plan_id
6353     AND    plans.compile_designator = desig.designator
6354     AND    plans.sr_instance_id = desig.sr_instance_id
6355     AND    plans.organization_id = desig.organization_id
6356     AND    plans.plan_completion_date is not null
6357     AND    plans.data_completion_date is not null;
6358 
6359     msc_util.msc_log('Count for plan : ' || l_count);
6360     msc_util.msc_log('l_submit_request : ' || l_submit_request);
6361 */
6362 
6363     -- 24x7 ATP
6364     BEGIN
6365         select  nvl (copy_plan_id, -1)
6366         into    l_copy_plan_id
6367         from    msc_plans
6368         where   plan_id = p_plan_id
6369         -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6370         AND     plan_type <> 4;
6371     EXCEPTION
6372         when others then
6373             l_copy_plan_id := -1;
6374     END;
6375 
6376     if (l_copy_plan_id > 0) then
6377         -- plan copy exists . force the execution of other things.
6378         l_count := 1;
6379         msc_util.msc_log ('Plan determined to be a 24x7 plan');
6380     end if;
6381 
6382     IF l_count = 0 THEN
6383        UPDATE msc_plans
6384        SET    summary_flag = 1
6385        WHERE  plan_id = p_plan_id;
6386 
6387 	   COMMIT;
6388        RETURN;
6389     END IF;
6390 
6391     BEGIN
6392 	msc_util.msc_log('before launching concurrent program');
6393         -- Bug 3292949
6394         UPDATE msc_plans
6395         SET    summary_flag = 1
6396         WHERE  plan_id = p_plan_id;
6397         msc_util.msc_log('Reset summary flag back to default:1 before conc prg launch');
6398          -- End Bug 3292949
6399         l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6400 					'MSC',
6401 					'MSC_ATP_PDS_SUMM',
6402 					NULL,   -- description
6403 					NULL,   -- start time
6404 					FALSE,  -- sub request
6405 					p_plan_id,
6406 					2); -- Bug 3478888 Pass calling module as 2 as
6407 					    -- ATP Post Plan Processing is called from planning
6408 
6409 	UPDATE msc_plans       /* for 24x7 ATP */
6410         SET     request_id = l_request_id
6411         WHERE   plan_id = p_plan_id;
6412 
6413 	COMMIT;
6414 
6415 	msc_util.msc_log('Request ID :' || l_request_id);
6416 
6417     EXCEPTION
6418         WHEN OTHERS THEN
6419              msc_util.msc_log ('Conc. program error : ' || sqlcode || ':' || sqlerrm);
6420 	     x_retcode := G_ERROR;
6421 	     x_errbuf := sqlerrm;
6422     END;
6423 END atp_post_plan_proc;
6424 
6425 /*
6426  * dsting 7/24/2002
6427  *
6428  * Deletes entries from mrp_atp_schedule_temp and mrp_atp_details_temp
6429  * older than p_hours old
6430  *
6431  */
6432 PROCEDURE ATP_Purge_MRP_Temp(
6433   ERRBUF		OUT	NoCopy VARCHAR2,
6434   RETCODE		OUT	NoCopy NUMBER,
6435   p_hours		IN	NUMBER
6436 )
6437 IS
6438 l_retain_date		DATE;
6439 -- rajjain 12/20/2002
6440 l_spid                          VARCHAR2(12);
6441 l_mrp_schema             	VARCHAR2(30); --bug3545959
6442 l_msc_schema             	VARCHAR2(30); --bug3940999
6443 BEGIN
6444 
6445         -- Bug 3304390 Disable Trace
6446         -- Deleted Related Code.
6447 
6448 	RETCODE := G_SUCCESS;
6449 
6450 	msc_util.msc_log('********** MRP_ATP_Purge_Temp **********');
6451 	msc_util.msc_log('p_hours: '      || p_hours );
6452 
6453 	IF NVL(p_hours,0) > 0 THEN
6454 
6455 		l_retain_date := sysdate - p_hours/24;
6456 
6457 		msc_util.msc_log('Delete records older than l_retain_date ' ||
6458 					   to_char(l_retain_date, 'DD:MM:YYYY hh24:mi:ss'));
6459 		msc_util.msc_log('Now sysdate: ' ||
6460 					   to_char(sysdate, 'DD:MM:YYYY hh24:mi:ss'));
6461 
6462 
6463 		DELETE FROM mrp_atp_schedule_temp
6464 		WHERE last_update_date < l_retain_date;
6465 
6466 		msc_util.msc_log('Records Deleted from mrp_atp_schedule_temp : ' ||
6467 					  SQL%ROWCOUNT);
6468 
6469                 --3670695: issue commit so that rollback segment is freed
6470                 commit;
6471 
6472 		DELETE FROM mrp_atp_details_temp
6473 		WHERE last_update_date < l_retain_date;
6474 
6475 		msc_util.msc_log('Records Deleted from mrp_atp_details_temp : ' ||
6476 					  SQL%ROWCOUNT);
6477                 --bug3940999
6478                 DELETE FROM msc_atp_src_profile_temp
6479 		WHERE last_update_date < l_retain_date;
6480 
6481 		msc_util.msc_log('Records Deleted from msc_atp_src_profile_temp : ' ||
6482 					  SQL%ROWCOUNT);
6483 
6484 	ELSE
6485 		msc_util.msc_log('completely purging temp tables');
6486                 --bug3545959 start
6487 	        SELECT  a.oracle_username
6488       	        INTO    l_mrp_schema
6489       	        FROM    FND_ORACLE_USERID a,
6490                         FND_PRODUCT_INSTALLATIONS b
6491       	        WHERE   a.oracle_id = b.oracle_id
6492       	        AND     b.application_id = 704;
6493 
6494       	        msc_util.msc_log('l_mrp_schema: '      || l_mrp_schema );
6495       	        --bug3545959 end
6496 		EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_schedule_temp';
6497 		EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_details_temp';
6498 
6499 		--bug3940999
6500 		SELECT  a.oracle_username
6501       	        INTO    l_msc_schema
6502       	        FROM    FND_ORACLE_USERID a,
6503                         FND_PRODUCT_INSTALLATIONS b
6504       	        WHERE   a.oracle_id = b.oracle_id
6505       	        AND     b.application_id = 724;
6506 
6507       	        msc_util.msc_log('l_msc_schema: '      || l_msc_schema );
6508 
6509       	        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_msc_schema ||'.msc_atp_src_profile_temp';
6510 
6511 	END IF;
6512 
6513 	commit;
6514 EXCEPTION
6515     WHEN others THEN
6516          msc_util.msc_log('Error while purging temp tables : ' ||
6517 						sqlcode || ' : ' || sqlerrm);
6518          rollback;
6519 END ATP_Purge_MRP_Temp;
6520 
6521 
6522 -- New procedure for summary enhancement
6523 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id               IN NUMBER,
6524                                 p_share_partition       IN varchar2,
6525                                 p_optimized_plan        IN NUMBER,  -- 1:Yes, 2:No
6526                                 p_full_refresh          IN NUMBER,  -- 1:Yes, 2:No
6527                                 p_time_phased_pf        IN NUMBER,  -- 1:Yes, 2:No
6528                                 p_plan_type             IN NUMBER,  -- ATP4drp
6529                                 p_last_refresh_number   IN NUMBER,
6530                                 p_new_refresh_number    IN NUMBER,
6531                                 p_sys_date              IN DATE)
6532 IS
6533     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
6534     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
6535     l_supplier_id_tab           MRP_ATP_PUB.number_arr;
6536     l_supplier_site_id_tab      MRP_ATP_PUB.number_arr;
6537     l_sd_date_tab               MRP_ATP_PUB.date_arr;
6538     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
6539     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6540     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6541     l_ins_supplier_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6542     l_ins_supplier_site_id_tab  MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6543     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
6544     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6545 
6546     -- ATPR4drp
6547     l_plan_type                 NUMBER;
6548 BEGIN
6549     msc_util.msc_log('************ LOAD_PLAN_SUMMARY_SD begin *************');
6550     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_plan_id         - ' || p_plan_id);
6551     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_share_partition - ' || p_share_partition);
6552     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_optimized_plan  - ' || p_optimized_plan);
6553     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_full_refresh    - ' || p_full_refresh);
6554 
6555     -- ATP4drp changes begin
6556     -- print plan_type
6557 
6558     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Plan Type p_plan_type -> ' || p_plan_type);
6559     msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6560 
6561     -- END ATP4drp
6562 
6563 
6564     IF p_full_refresh = 1 THEN
6565         msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside full summation');
6566 
6567         -- first delete existing data. p_share_partition = 'N' data has already been deleted
6568         IF p_share_partition = 'Y' THEN
6569 
6570             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside shared part_partition');
6571             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'before deleteing data from the table');
6572 
6573             DELETE MSC_ATP_SUMMARY_SD where plan_id = p_plan_id;
6574             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After deleting data from the table');
6575 
6576         END IF; --- IF share_partition = 'Y'
6577 
6578         -- Now insert new data
6579         IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6580             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6581             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6582 
6583             load_sd_full_alloc(p_plan_id, p_sys_date);
6584 
6585             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6586         ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6587             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unallocated ATP');
6588             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6589 
6590             IF nvl(p_optimized_plan, 2) <> 1 THEN
6591                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unconstrained plan');
6592                 IF p_time_phased_pf = 1 THEN
6593                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6594                     load_sd_full_unalloc_unopt_pf(p_plan_id, p_sys_date);
6595                 ELSE
6596                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6597                     load_sd_full_unalloc_unopt(p_plan_id, p_sys_date);
6598                 END IF;
6599             ELSE
6600                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Constrained plan');
6601                 IF p_time_phased_pf = 1 THEN
6602                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6603                     load_sd_full_unalloc_opt_pf(p_plan_id, p_sys_date);
6604                 ELSE
6605                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6606                     -- ATP4drp Call DRP specific summary
6607                     IF (p_plan_type = 5) THEN
6608                        msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call FULL Summary for DRP plan.');
6609                        msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6610                        MSC_ATP_DRP.load_sd_full_drp(p_plan_id, p_sys_date);
6611                     ELSE -- Call rest summary
6612                        load_sd_full_unalloc_opt(p_plan_id, p_sys_date);
6613                     END IF;
6614                     -- End ATP4drp
6615                 END IF;
6616             END IF;
6617 
6618             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6619         END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6620 
6621 	ELSE --- IF p_full_refresh = 1 THEN
6622         msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside incremental summation');
6623 
6624         IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6625             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6626             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6627 
6628             load_sd_net_alloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6629 
6630             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6631         ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6632             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside unallocated ATP');
6633             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6634 
6635             -- ATP4drp Call DRP specific summary
6636             IF (p_plan_type = 5) THEN
6637                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call NET Summary for DRP plan.');
6638                 MSC_ATP_DRP.load_sd_net_drp(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6639             ELSE -- Call rest summary
6640                 load_sd_net_unalloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_time_phased_pf, p_sys_date);
6641             END IF;
6642             -- ATP4drp
6643 
6644             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6645         END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6646 
6647 	END IF; --- IF p_full_refresh = 1 THEN
6648 
6649 END LOAD_PLAN_SUMMARY_SD;
6650 
6651 -- summary enhancement : private procedure for full summation of supply/demand
6652 --                       for unconstrained plans for unallocated cases if no time
6653 --                       phased PF ATP setup exist for the plan
6654 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id  IN NUMBER,
6655                                      p_sys_date IN DATE)
6656 IS
6657     l_user_id NUMBER;
6658 BEGIN
6659 
6660     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT Begin ********');
6661 
6662     l_user_id := FND_GLOBAL.USER_ID;
6663 
6664     INSERT INTO MSC_ATP_SUMMARY_SD (
6665             plan_id,
6666             sr_instance_id,
6667             organization_id,
6668             inventory_item_id,
6669             demand_class,
6670             sd_date,
6671             sd_qty,
6672             last_update_date,
6673             last_updated_by,
6674             creation_date,
6675             created_by)
6676    (SELECT  plan_id,
6677             sr_instance_id,
6678             organization_id,
6679             inventory_item_id,
6680             demand_class,
6681             SD_DATE,
6682             sum(sd_qty),
6683             last_update_date,
6684             last_updated_by,
6685             creation_date,
6686             created_by
6687             --Bug 6046524 added index hint for performance improvement.
6688     from   (SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6689                     I.plan_id plan_id,
6690                     I.sr_instance_id,
6691                     I.organization_id,
6692                     I.inventory_item_id,
6693                     '@@@' demand_class,
6694                     -- TRUNC(C.PRIOR_DATE) SD_DATE,
6695                     C.CALENDAR_DATE SD_DATE, -- 2859130
6696                     -1* DECODE(D.ORIGINATION_TYPE,
6697                                4, D.DAILY_DEMAND_RATE,
6698                                   D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6699                     p_sys_date last_update_date,
6700                     l_user_id last_updated_by,
6701                     p_sys_date creation_date,
6702                     l_user_id created_by
6703             FROM    MSC_SYSTEM_ITEMS I,
6704                     MSC_TRADING_PARTNERS P,
6705                     MSC_DEMANDS D,
6706                     MSC_CALENDAR_DATES C
6707             WHERE   I.ATP_FLAG = 'Y'
6708             AND     I.PLAN_ID = p_plan_id
6709             AND     D.PLAN_ID = I.PLAN_ID
6710             AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6711             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6712             AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
6713                     -- 1243985
6714             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
6715                     -- Bug 1530311, forecast to be excluded
6716             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6717             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6718             AND     C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6719                     -- since we store repetitive schedule demand in different ways for
6720                     -- ods (total quantity on start date) and pds  (daily quantity from
6721                     -- start date to end date), we need to make sure we only select work day
6722                     -- for pds's repetitive schedule demand.
6723                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6724             AND     C.CALENDAR_DATE
6725                         BETWEEN
6726                         TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6727                                      2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6728                                         NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6729                         AND
6730                         TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6731                                   DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6732                                      2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6733                                         NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6734             AND     ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6735                     (D.ORIGINATION_TYPE  <> 4))
6736             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6737             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6738             AND     P.PARTNER_TYPE    = 3
6739             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6740 
6741             UNION ALL
6742 
6743     --Bug 6046524 added index hint for performance improvement.
6744             SELECT  /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6745                     I.plan_id plan_id,
6746                     I.sr_instance_id,
6747                     I.organization_id,
6748                     I.inventory_item_id,
6749                     '@@@' demand_class,
6750                     -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6751                     C.CALENDAR_DATE SD_DATE,
6752                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
6753                     p_sys_date last_update_date,
6754                     l_user_id last_updated_by,
6755                     p_sys_date creation_date,
6756                     l_user_id created_by
6757             FROM    MSC_SYSTEM_ITEMS I,
6758                     MSC_TRADING_PARTNERS P,
6759                     MSC_SUPPLIES S,
6760                     MSC_CALENDAR_DATES C
6761             WHERE   I.ATP_FLAG = 'Y'
6762             AND     I.PLAN_ID = p_plan_id
6763             AND     S.PLAN_ID = I.PLAN_ID
6764             AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6765             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6766             AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
6767                     -- Exclude Cancelled Supplies 2460645
6768             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6769             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6770             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6771             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6772             AND     C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6773             AND     C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6774             AND     TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6775             AND     DECODE(S.LAST_UNIT_COMPLETION_DATE,
6776                            NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6777             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6778             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6779             AND     P.PARTNER_TYPE    = 3
6780             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6781            )
6782     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6783             last_update_date, last_updated_by, creation_date, created_by );
6784 
6785     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6786     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT End ********');
6787 
6788 END LOAD_SD_FULL_UNALLOC_UNOPT;
6789 
6790 
6791 -- summary enhancement : private procedure for full summation of supply/demand
6792 --                       for unconstrained plans for unallocated cases if time
6793 --                       phased PF ATP setup exists for the plan
6794 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id  IN NUMBER,
6795                                         p_sys_date IN DATE)
6796 IS
6797     l_user_id NUMBER;
6798 BEGIN
6799 
6800     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF Begin ********');
6801 
6802     l_user_id := FND_GLOBAL.USER_ID;
6803 
6804     INSERT INTO MSC_ATP_SUMMARY_SD (
6805             plan_id,
6806             sr_instance_id,
6807             organization_id,
6808             inventory_item_id,
6809             demand_class,
6810             sd_date,
6811             sd_qty,
6812             last_update_date,
6813             last_updated_by,
6814             creation_date,
6815             created_by)
6816    (SELECT  plan_id,
6817             sr_instance_id,
6818             organization_id,
6819             inventory_item_id,
6820             demand_class,
6821             SD_DATE,
6822             sum(sd_qty),
6823             last_update_date,
6824             last_updated_by,
6825             creation_date,
6826             created_by
6827     from   (SELECT /*+ ORDERED */
6828                     I.plan_id plan_id,
6829                     I.sr_instance_id,
6830                     I.organization_id,
6831                     I.inventory_item_id,
6832                     '@@@' demand_class,
6833                     -- TRUNC(C.PRIOR_DATE) SD_DATE,
6834                     C.CALENDAR_DATE SD_DATE, -- 2859130
6835                     -1* DECODE(D.ORIGINATION_TYPE,
6836                                4, D.DAILY_DEMAND_RATE,
6837                                   D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6838                     p_sys_date last_update_date,
6839                     l_user_id last_updated_by,
6840                     p_sys_date creation_date,
6841                     l_user_id created_by
6842             FROM    MSC_SYSTEM_ITEMS I,
6843                     MSC_TRADING_PARTNERS P,
6844                     MSC_DEMANDS D,
6845                     MSC_CALENDAR_DATES C
6846             WHERE   I.ATP_FLAG = 'Y'
6847             AND     I.PLAN_ID = p_plan_id
6848             AND     D.PLAN_ID = I.PLAN_ID
6849             AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6850             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6851             AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
6852                     -- 1243985
6853             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
6854                     -- Bug 1530311, forecast to be excluded
6855             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6856             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6857             AND     C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6858                     -- since we store repetitive schedule demand in different ways for
6859                     -- ods (total quantity on start date) and pds  (daily quantity from
6860                     -- start date to end date), we need to make sure we only select work day
6861                     -- for pds's repetitive schedule demand.
6862                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6863             AND     C.CALENDAR_DATE
6864                         BETWEEN TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6865                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6866                                                 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6867                         AND     TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6868                                           DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6869                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6870                                                 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6871             AND     ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6872                     (D.ORIGINATION_TYPE  <> 4))
6873             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6874             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6875             AND     P.PARTNER_TYPE    = 3
6876             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6877             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6878 
6879             UNION ALL
6880 
6881             SELECT  /*+ ORDERED */
6882                     I.plan_id plan_id,
6883                     I.sr_instance_id,
6884                     I.organization_id,
6885                     I.inventory_item_id,
6886                     '@@@' demand_class,
6887                     -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6888                     C.CALENDAR_DATE SD_DATE,
6889                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
6890                     p_sys_date last_update_date,
6891                     l_user_id last_updated_by,
6892                     p_sys_date creation_date,
6893                     l_user_id created_by
6894             FROM    MSC_SYSTEM_ITEMS I,
6895                     MSC_TRADING_PARTNERS P,
6896                     MSC_SUPPLIES S,
6897                     MSC_CALENDAR_DATES C
6898             WHERE   I.ATP_FLAG = 'Y'
6899             AND     I.PLAN_ID = p_plan_id
6900             AND     S.PLAN_ID = I.PLAN_ID
6901             AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6902             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6903             AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
6904                     -- Exclude Cancelled Supplies 2460645
6905             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6906             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6907             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6908             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6909             AND     C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6910             AND     C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6911             AND     TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6912             AND     DECODE(S.LAST_UNIT_COMPLETION_DATE,
6913                            NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6914             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6915             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6916             AND     P.PARTNER_TYPE    = 3
6917             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6918             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6919 
6920             UNION ALL
6921 
6922             SELECT  /*+ ORDERED */
6923                     AD.plan_id,
6924                     AD.sr_instance_id,
6925                     AD.organization_id,
6926                     AD.inventory_item_id,
6927                     '@@@' demand_class,
6928                     TRUNC(AD.demand_date) SD_DATE,
6929                     -1 * AD.allocated_quantity SD_QTY,
6930                     p_sys_date last_update_date,
6931                     l_user_id last_updated_by,
6932                     p_sys_date creation_date,
6933                     l_user_id created_by
6934             FROM    MSC_ALLOC_DEMANDS AD
6935             WHERE   AD.PLAN_ID = p_plan_id
6936             AND     AD.allocated_quantity <> 0
6937             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
6938 
6939             UNION ALL
6940 
6941             SELECT  /*+ ORDERED */
6942                     SA.plan_id,
6943                     SA.sr_instance_id,
6944                     SA.organization_id,
6945                     SA.inventory_item_id,
6946                     '@@@' demand_class,
6947                     TRUNC(SA.supply_date) SD_DATE,
6948                     SA.allocated_quantity SD_QTY,
6949                     p_sys_date last_update_date,
6950                     l_user_id last_updated_by,
6951                     p_sys_date creation_date,
6952                     l_user_id created_by
6953             FROM    MSC_ALLOC_SUPPLIES SA
6954             WHERE   SA.PLAN_ID = p_plan_id
6955             AND     SA.allocated_quantity <> 0
6956             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
6957            )
6958     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6959             last_update_date, last_updated_by, creation_date, created_by );
6960 
6961     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6962     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF End ********');
6963 
6964 END LOAD_SD_FULL_UNALLOC_UNOPT_PF;
6965 
6966 
6967 -- summary enhancement : private procedure for full summation of supply/demand
6968 --                       for constrained plans for unallocated cases if no time
6969 --                       phased PF ATP setup exist for the plan
6970 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id  IN NUMBER,
6971                                    p_sys_date IN DATE)
6972 IS
6973     l_user_id NUMBER;
6974 BEGIN
6975 
6976     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT Begin ********');
6977 
6978     l_user_id := FND_GLOBAL.USER_ID;
6979 
6980     INSERT INTO MSC_ATP_SUMMARY_SD (
6981             plan_id,
6982             sr_instance_id,
6983             organization_id,
6984             inventory_item_id,
6985             demand_class,
6986             sd_date,
6987             sd_qty,
6988             last_update_date,
6989             last_updated_by,
6990             creation_date,
6991             created_by)
6992    (SELECT  plan_id,
6993             sr_instance_id,
6994             organization_id,
6995             inventory_item_id,
6996             demand_class,
6997             SD_DATE,
6998             sum(sd_qty),
6999             last_update_date,
7000             last_updated_by,
7001             creation_date,
7002             created_by
7003     from   (SELECT  /*+ ORDERED */
7004                     I.plan_id plan_id,
7005                     I.sr_instance_id,
7006                     I.organization_id,
7007                     I.inventory_item_id,
7008                     '@@@' demand_class,
7009                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7010                     TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7011                                  2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7012                                     NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7013                                     --plan by request date, promise date or schedule date -- 2859130
7014                     -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7015                     p_sys_date last_update_date,
7016                     l_user_id last_updated_by,
7017                     p_sys_date creation_date,
7018                     l_user_id created_by
7019             FROM    MSC_SYSTEM_ITEMS I,
7020                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7021                                                 -- Not required as calendar has been removed
7022                     MSC_DEMANDS D
7023             WHERE   I.ATP_FLAG          = 'Y'
7024             AND     I.PLAN_ID           = p_plan_id
7025             AND     D.PLAN_ID           = I.PLAN_ID
7026             AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7027             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7028             AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7029             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7030             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7031             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7032             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7033             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7034 
7035             UNION ALL
7036 
7037             SELECT  /*+ ORDERED */
7038                     I.plan_id plan_id,
7039                     I.sr_instance_id,
7040                     I.organization_id,
7041                     I.inventory_item_id,
7042                     '@@@' demand_class,
7043                     TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7044                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
7045                     p_sys_date last_update_date,
7046                     l_user_id last_updated_by,
7047                     p_sys_date creation_date,
7048                     l_user_id created_by
7049             FROM    MSC_SYSTEM_ITEMS I,
7050                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7051                                                 -- Not required as calendar has been removed
7052                     MSC_SUPPLIES S
7053             WHERE   I.ATP_FLAG          = 'Y'
7054             AND     I.PLAN_ID           = p_plan_id
7055             AND     S.PLAN_ID           = I.PLAN_ID
7056             AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7057             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7058             AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7059             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7060             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7061             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7062             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7063             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7064             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7065            )
7066     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7067              last_update_date, last_updated_by, creation_date, created_by );
7068 
7069     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7070     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT End ********');
7071 
7072 END LOAD_SD_FULL_UNALLOC_OPT;
7073 
7074 
7075 -- summary enhancement : private procedure for full summation of supply/demand
7076 --                       for constrained plans for unallocated cases if time
7077 --                       phased PF ATP setup exists for the plan
7078 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id  IN NUMBER,
7079                                       p_sys_date IN DATE)
7080 IS
7081     l_user_id NUMBER;
7082 BEGIN
7083 
7084     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF Begin ********');
7085 
7086     l_user_id := FND_GLOBAL.USER_ID;
7087 
7088     INSERT INTO MSC_ATP_SUMMARY_SD (
7089             plan_id,
7090             sr_instance_id,
7091             organization_id,
7092             inventory_item_id,
7093             demand_class,
7094             sd_date,
7095             sd_qty,
7096             last_update_date,
7097             last_updated_by,
7098             creation_date,
7099             created_by)
7100    (SELECT  plan_id,
7101             sr_instance_id,
7102             organization_id,
7103             inventory_item_id,
7104             demand_class,
7105             SD_DATE,
7106             sum(sd_qty),
7107             last_update_date,
7108             last_updated_by,
7109             creation_date,
7110             created_by
7111     from   (SELECT  /*+ ORDERED */
7112                     I.plan_id plan_id,
7113                     I.sr_instance_id,
7114                     I.organization_id,
7115                     I.inventory_item_id,
7116                     '@@@' demand_class,
7117                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7118                     TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7119                                  2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7120                                     NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7121                                     --plan by request date, promise date or schedule date -- 2859130
7122                     -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7123                     p_sys_date last_update_date,
7124                     l_user_id last_updated_by,
7125                     p_sys_date creation_date,
7126                     l_user_id created_by
7127             FROM    MSC_SYSTEM_ITEMS I,
7128                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7129                                                 -- Not required as calendar has been removed
7130                     MSC_DEMANDS D
7131             WHERE   I.ATP_FLAG          = 'Y'
7132             AND     I.PLAN_ID           = p_plan_id
7133             AND     D.PLAN_ID           = I.PLAN_ID
7134             AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7135             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7136             AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7137             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7138             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7139             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7140             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7141             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7142             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7143 
7144             UNION ALL
7145 
7146             SELECT  /*+ ORDERED */
7147                     I.plan_id plan_id,
7148                     I.sr_instance_id,
7149                     I.organization_id,
7150                     I.inventory_item_id,
7151                     '@@@' demand_class,
7152                     TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7153                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
7154                     p_sys_date last_update_date,
7155                     l_user_id last_updated_by,
7156                     p_sys_date creation_date,
7157                     l_user_id created_by
7158             FROM    MSC_SYSTEM_ITEMS I,
7159                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7160                                                 -- Not required as calendar has been removed
7161                     MSC_SUPPLIES S
7162             WHERE   I.ATP_FLAG          = 'Y'
7163             AND     I.PLAN_ID           = p_plan_id
7164             AND     S.PLAN_ID           = I.PLAN_ID
7165             AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7166             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7167             AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7168             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7169             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7170             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7171             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7172             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7173             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7174             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7175 
7176             UNION ALL
7177 
7178             SELECT  /*+ ORDERED */
7179                     AD.plan_id,
7180                     AD.sr_instance_id,
7181                     AD.organization_id,
7182                     AD.inventory_item_id,
7183                     '@@@' demand_class,
7184                     TRUNC(AD.demand_date) SD_DATE,
7185                     -1 * AD.allocated_quantity SD_QTY,
7186                     p_sys_date last_update_date,
7187                     l_user_id last_updated_by,
7188                     p_sys_date creation_date,
7189                     l_user_id created_by
7190             FROM    MSC_ALLOC_DEMANDS AD
7191             WHERE   AD.PLAN_ID = p_plan_id
7192             AND     AD.allocated_quantity <> 0
7193             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7194 
7195             UNION ALL
7196 
7197             SELECT  /*+ ORDERED */
7198                     SA.plan_id,
7199                     SA.sr_instance_id,
7200                     SA.organization_id,
7201                     SA.inventory_item_id,
7202                     '@@@' demand_class,
7203                     TRUNC(SA.supply_date) SD_DATE,
7204                     SA.allocated_quantity SD_QTY,
7205                     p_sys_date last_update_date,
7206                     l_user_id last_updated_by,
7207                     p_sys_date creation_date,
7208                     l_user_id created_by
7209             FROM    MSC_ALLOC_SUPPLIES SA
7210             WHERE   SA.PLAN_ID = p_plan_id
7211             AND     SA.allocated_quantity <> 0
7212             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7213            )
7214     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7215              last_update_date, last_updated_by, creation_date, created_by );
7216 
7217     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7218     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF End ********');
7219 
7220 END LOAD_SD_FULL_UNALLOC_OPT_PF;
7221 
7222 
7223 -- summary enhancement : private procedure for full summation of supply/demand
7224 --                       for allocated cases. separate procedures for PF/non-PF
7225 --                       cases are not required because we always select from
7226 --                       alloc tables. separate procedures for opt/unopt not required
7227 --                       because data in alloc tables is populated using pegging and
7228 --                       pegging for repetitive schedules would not have been generated
7229 --                       on non-working days.
7230 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id  IN NUMBER,
7231                              p_sys_date IN DATE)
7232 IS
7233     l_user_id  number;
7234 BEGIN
7235 
7236     msc_util.msc_log('******** LOAD_SD_FULL_ALLOC Begin ********');
7237 
7238     l_user_id := FND_GLOBAL.USER_ID;
7239 
7240     INSERT INTO MSC_ATP_SUMMARY_SD (
7241             plan_id,
7242             sr_instance_id,
7243             organization_id,
7244             inventory_item_id,
7245             demand_class,
7246             sd_date,
7247             sd_qty,
7248             last_update_date,
7249             last_updated_by,
7250             creation_date,
7251             created_by)
7252    (SELECT  plan_id,
7253             sr_instance_id,
7254             organization_id,
7255             inventory_item_id,
7256             demand_class,
7257             SD_DATE,
7258             sum(sd_qty),
7259             last_update_date,
7260             last_updated_by,
7261             creation_date,
7262             created_by
7263     from   (SELECT  /*+ ORDERED */
7264                     AD.plan_id,
7265                     AD.sr_instance_id,
7266                     AD.organization_id,
7267                     AD.inventory_item_id,
7268                     AD.demand_class,
7269                     TRUNC(AD.demand_date) SD_DATE,
7270                     -1 * AD.allocated_quantity SD_QTY,
7271                     p_sys_date last_update_date,
7272                     l_user_id last_updated_by,
7273                     p_sys_date creation_date,
7274                     l_user_id created_by
7275             FROM    MSC_ALLOC_DEMANDS AD
7276             WHERE   AD.PLAN_ID = p_plan_id
7277             AND     AD.allocated_quantity <> 0
7278             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7279 
7280             UNION ALL
7281 
7282             SELECT  /*+ ORDERED */
7283                     SA.plan_id,
7284                     SA.sr_instance_id,
7285                     SA.organization_id,
7286                     SA.inventory_item_id,
7287                     SA.demand_class,
7288                     TRUNC(SA.supply_date) SD_DATE,
7289                     SA.allocated_quantity SD_QTY,
7290                     p_sys_date last_update_date,
7291                     l_user_id last_updated_by,
7292                     p_sys_date creation_date,
7293                     l_user_id created_by
7294             FROM    MSC_ALLOC_SUPPLIES SA
7295             WHERE   SA.PLAN_ID = p_plan_id
7296             AND     SA.allocated_quantity <> 0
7297             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7298            )
7299     GROUP BY plan_id, inventory_item_id, organization_id, sr_instance_id,demand_class, sd_date,
7300             last_update_date, last_updated_by, creation_date, created_by
7301     HAVING sum(SD_QTY) <> 0);
7302 
7303     msc_util.msc_log('LOAD_SD_FULL_ALLOC: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7304     msc_util.msc_log('******** LOAD_SD_FULL_ALLOC End ********');
7305 
7306 END LOAD_SD_FULL_ALLOC;
7307 
7308 
7309 -- summary enhancement : private procedure for net summation of supply/demand
7310 --                       for unallocated cases. separate procedures for opt/unopt not required
7311 --                       because we bother only about ATP generated records.
7312 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id             IN NUMBER,
7313                               p_last_refresh_number IN NUMBER,
7314                               p_new_refresh_number  IN NUMBER,
7315                               p_time_phased_pf      IN NUMBER, -- 1:Yes, 2:No
7316                               p_sys_date            IN DATE)
7317 IS
7318     l_user_id   number;
7319     j           pls_integer;
7320     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7321     l_organization_id_tab       MRP_ATP_PUB.number_arr;
7322     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7323     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7324     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7325     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7326     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7327     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7328     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7329     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7330 
7331     CURSOR c_net_sd (p_plan_id             IN NUMBER,
7332                      p_last_refresh_number IN NUMBER,
7333                      p_new_refresh_number  IN NUMBER)
7334     IS
7335         SELECT  sr_instance_id,
7336                 organization_id,
7337                 inventory_item_id,
7338                 SD_DATE,
7339                 sum(sd_qty)
7340                 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7341                 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7342         from   (SELECT  I.sr_instance_id,
7343                         I.organization_id,
7344                         I.inventory_item_id,
7345                         TRUNC(DECODE(D.RECORD_SOURCE,
7346                                      2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7347                                         DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7348                                                2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7349                                                   NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7350                                                   --plan by request date, promise date or schedule date
7351                         decode(D.USING_REQUIREMENT_QUANTITY,            -- Consider unscheduled orders as dummy supplies
7352                                0, D.OLD_DEMAND_QUANTITY,                -- For summary enhancement
7353                                   -1 * D.USING_REQUIREMENT_QUANTITY)  SD_QTY
7354                 FROM    MSC_SYSTEM_ITEMS I,
7355                         MSC_DEMANDS D
7356                 WHERE   I.ATP_FLAG          = 'Y'
7357                 AND     I.PLAN_ID           = p_plan_id
7358                 AND     D.PLAN_ID           = I.PLAN_ID
7359                 AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7360                 AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7361                 AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7362                 AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7363                 AND     D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7364 
7365                 UNION ALL
7366 
7367                 SELECT  I.sr_instance_id,
7368                         I.organization_id,
7369                         I.inventory_item_id,
7370                         TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7371                         NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY
7372                 FROM    MSC_SYSTEM_ITEMS I,
7373                         MSC_SUPPLIES S
7374                 WHERE   I.ATP_FLAG          = 'Y'
7375                 AND     I.PLAN_ID           = p_plan_id
7376                 AND     S.PLAN_ID           = I.PLAN_ID
7377                 AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7378                 AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7379                 AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7380                 AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2          -- These two conditions
7381                 AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0  -- may not be required
7382                 AND     S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7383                )
7384         GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7385 
7386 
7387     CURSOR c_net_sd_pf (p_plan_id             IN NUMBER,
7388                         p_last_refresh_number IN NUMBER,
7389                         p_new_refresh_number  IN NUMBER)
7390     IS
7391         SELECT  sr_instance_id,
7392                 organization_id,
7393                 inventory_item_id,
7394                 SD_DATE,
7395                 sum(sd_qty)
7396                 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7397                 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7398         from   (SELECT  I.sr_instance_id,
7399                         I.organization_id,
7400                         I.inventory_item_id,
7401                         TRUNC(DECODE(D.RECORD_SOURCE,
7402                                      2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7403                                         DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7404                                                2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7405                                                   NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7406                                                   --plan by request date, promise date or schedule date
7407                         decode(D.USING_REQUIREMENT_QUANTITY,            -- Consider unscheduled orders as dummy supplies
7408                                0, D.OLD_DEMAND_QUANTITY,                -- For summary enhancement
7409                                   -1 * D.USING_REQUIREMENT_QUANTITY)  SD_QTY
7410                 FROM    MSC_SYSTEM_ITEMS I,
7411                         MSC_DEMANDS D
7412                 WHERE   I.ATP_FLAG          = 'Y'
7413                 AND     I.PLAN_ID           = p_plan_id
7414                 AND     D.PLAN_ID           = I.PLAN_ID
7415                 AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7416                 AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7417                 AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7418                 AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31)
7419                 AND     D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7420                 AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7421 
7422                 UNION ALL
7423 
7424                 SELECT  I.sr_instance_id,
7425                         I.organization_id,
7426                         I.inventory_item_id,
7427                         TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7428                         NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY
7429                 FROM    MSC_SYSTEM_ITEMS I,
7430                         MSC_SUPPLIES S
7431                 WHERE   I.ATP_FLAG          = 'Y'
7432                 AND     I.PLAN_ID           = p_plan_id
7433                 AND     S.PLAN_ID           = I.PLAN_ID
7434                 AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7435                 AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7436                 AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7437                 AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2          -- These two conditions
7438                 AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0  -- may not be required
7439                 AND     S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7440                 AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7441 
7442                 UNION ALL
7443 
7444                 SELECT  AD.sr_instance_id,
7445                         AD.organization_id,
7446                         AD.inventory_item_id,
7447                         TRUNC(AD.demand_date) SD_DATE,
7448                         decode(AD.allocated_quantity,
7449                                0, AD.old_allocated_quantity,
7450                                   -1 * AD.allocated_quantity) SD_QTY
7451                 FROM    MSC_ALLOC_DEMANDS AD
7452                 WHERE   AD.PLAN_ID = p_plan_id
7453                 AND     AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7454 
7455                 UNION ALL
7456 
7457                 SELECT  SA.sr_instance_id,
7458                         SA.organization_id,
7459                         SA.inventory_item_id,
7460                         TRUNC(SA.supply_date) SD_DATE,
7461                         SA.allocated_quantity SD_QTY
7462                 FROM    MSC_ALLOC_SUPPLIES SA
7463                 WHERE   SA.PLAN_ID = p_plan_id
7464                 AND     SA.allocated_quantity <> 0
7465                 AND     SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7466                )
7467         GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7468 
7469 BEGIN
7470 
7471     msc_util.msc_log('******** LOAD_SD_NET_UNALLOC Begin ********');
7472     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_last_refresh_number - ' || p_last_refresh_number);
7473     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_new_refresh_number -  ' || p_new_refresh_number);
7474     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_time_phased_pf -      ' || p_time_phased_pf);
7475 
7476     l_user_id := FND_GLOBAL.USER_ID;
7477 
7478     IF p_time_phased_pf = 2 THEN
7479         OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7480         FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7481                                          l_organization_id_tab,
7482                                          l_inventory_item_id_tab,
7483                                          l_sd_date_tab,
7484                                          l_sd_quantity_tab;
7485         CLOSE c_net_sd;
7486     ELSE
7487         OPEN c_net_sd_pf(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7488         FETCH c_net_sd_pf BULK COLLECT INTO l_sr_instance_id_tab,
7489                                             l_organization_id_tab,
7490                                             l_inventory_item_id_tab,
7491                                             l_sd_date_tab,
7492                                             l_sd_quantity_tab;
7493         CLOSE c_net_sd_pf;
7494     END IF;
7495 
7496     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7497 
7498         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7499 
7500         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7501         UPDATE MSC_ATP_SUMMARY_SD
7502         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
7503                last_update_date  = p_sys_date,
7504                last_updated_by   = l_user_id
7505         WHERE  plan_id           = p_plan_id
7506         AND    sr_instance_id    = l_sr_instance_id_tab(j)
7507         AND    inventory_item_id = l_inventory_item_id_tab(j)
7508         AND    organization_id   = l_organization_id_tab(j)
7509         AND    sd_date           = l_sd_date_tab(j);
7510 
7511         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL UPDATE');
7512 
7513         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7514             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7515                 l_ins_sr_instance_id_tab.EXTEND;
7516                 l_ins_organization_id_tab.EXTEND;
7517                 l_ins_inventory_item_id_tab.EXTEND;
7518                 l_ins_sd_date_tab.EXTEND;
7519                 l_ins_sd_quantity_tab.EXTEND;
7520 
7521                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
7522                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
7523                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
7524                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
7525                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
7526             END IF;
7527         END LOOP;
7528 
7529         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7530 
7531             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7532 
7533             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7534             INSERT  INTO MSC_ATP_SUMMARY_SD (
7535                     plan_id,
7536                     sr_instance_id,
7537                     organization_id,
7538                     inventory_item_id,
7539                     demand_class,
7540                     sd_date,
7541                     sd_qty,
7542                     last_update_date,
7543                     last_updated_by,
7544                     creation_date,
7545                     created_by)
7546             VALUES (p_plan_id,
7547                     l_ins_sr_instance_id_tab(j),
7548                     l_ins_organization_id_tab(j),
7549                     l_ins_inventory_item_id_tab(j),
7550                     '@@@',
7551                     l_ins_sd_date_tab(j),
7552                     l_ins_sd_quantity_tab(j),
7553                     p_sys_date,
7554                     l_user_id,
7555                     p_sys_date,
7556                     l_user_id);
7557 
7558             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL INSERT');
7559 
7560         ELSE
7561             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records to be inserted');
7562         END IF;
7563     ELSE
7564         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records fetched in the net cursor');
7565     END IF;
7566 
7567     msc_util.msc_log('******** LOAD_SD_NET_UNALLOC End ********');
7568 
7569 END LOAD_SD_NET_UNALLOC;
7570 
7571 
7572 -- summary enhancement : private procedure for net summation of supply/demand
7573 --                       for allocated cases.
7574 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id             IN NUMBER,
7575                             p_last_refresh_number IN NUMBER,
7576                             p_new_refresh_number  IN NUMBER,
7577                             p_sys_date            IN DATE)
7578 IS
7579     l_user_id   number;
7580     j           pls_integer;
7581     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7582     l_organization_id_tab       MRP_ATP_PUB.number_arr;
7583     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7584     l_demand_class_tab          MRP_ATP_PUB.char30_arr;
7585     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7586     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7587 
7588     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7589     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7590     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7591     l_ins_demand_class_tab      MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr();
7592     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7593     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7594 
7595     CURSOR c_net_sd (p_plan_id             IN NUMBER,
7596                      p_last_refresh_number IN NUMBER,
7597                      p_new_refresh_number  IN NUMBER)
7598     IS
7599         SELECT  sr_instance_id,
7600                 organization_id,
7601                 inventory_item_id,
7602                 demand_class,
7603                 SD_DATE,
7604                 sum(sd_qty)
7605         from   (SELECT  AD.sr_instance_id,
7606                         AD.organization_id,
7607                         AD.inventory_item_id,
7608                         AD.demand_class,
7609                         TRUNC(AD.demand_date) SD_DATE,
7610                         decode(AD.allocated_quantity,
7611                                0, AD.old_allocated_quantity,
7612                                   -1 * AD.allocated_quantity) SD_QTY
7613                 FROM    MSC_ALLOC_DEMANDS AD
7614                 WHERE   AD.PLAN_ID = p_plan_id
7615                 AND     AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7616 
7617                 UNION ALL
7618 
7619                 SELECT  SA.sr_instance_id,
7620                         SA.organization_id,
7621                         SA.inventory_item_id,
7622                         SA.demand_class,
7623                         TRUNC(SA.supply_date) SD_DATE,
7624                         decode(SA.ALLOCATED_QUANTITY,           -- Consider deleted stealing records as dummy demands
7625                                0, -1 * OLD_ALLOCATED_QUANTITY,  -- For summary enhancement
7626                                   SA.ALLOCATED_QUANTITY) SD_QTY
7627                 FROM    MSC_ALLOC_SUPPLIES SA
7628                 WHERE   SA.PLAN_ID = p_plan_id
7629                 AND     SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7630                )
7631         GROUP BY inventory_item_id, organization_id, sr_instance_id, demand_class, sd_date;
7632 
7633 BEGIN
7634 
7635     msc_util.msc_log('******** LOAD_SD_NET_ALLOC Begin ********');
7636 
7637     l_user_id := FND_GLOBAL.USER_ID;
7638 
7639     OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7640     FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7641                                      l_organization_id_tab,
7642                                      l_inventory_item_id_tab,
7643                                      l_demand_class_tab,
7644                                      l_sd_date_tab,
7645                                      l_sd_quantity_tab;
7646     CLOSE c_net_sd;
7647 
7648     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7649 
7650         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7651 
7652         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7653         UPDATE MSC_ATP_SUMMARY_SD
7654         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
7655                last_update_date  = p_sys_date,
7656                last_updated_by   = l_user_id
7657         WHERE  plan_id           = p_plan_id
7658         AND    sr_instance_id    = l_sr_instance_id_tab(j)
7659         AND    inventory_item_id = l_inventory_item_id_tab(j)
7660         AND    organization_id   = l_organization_id_tab(j)
7661         AND    sd_date           = l_sd_date_tab(j)
7662         AND    demand_class      = l_demand_class_tab(j);
7663 
7664         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL UPDATE');
7665 
7666         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7667             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7668                 l_ins_sr_instance_id_tab.EXTEND;
7669                 l_ins_organization_id_tab.EXTEND;
7670                 l_ins_inventory_item_id_tab.EXTEND;
7671                 l_ins_demand_class_tab.EXTEND;
7672                 l_ins_sd_date_tab.EXTEND;
7673                 l_ins_sd_quantity_tab.EXTEND;
7674 
7675                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
7676                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
7677                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
7678                 l_ins_demand_class_tab(l_ins_demand_class_tab.COUNT)            := l_demand_class_tab(j);
7679                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
7680                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
7681             END IF;
7682         END LOOP;
7683 
7684         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7685 
7686             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7687 
7688             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7689             INSERT  INTO MSC_ATP_SUMMARY_SD (
7690                     plan_id,
7691                     sr_instance_id,
7692                     organization_id,
7693                     inventory_item_id,
7694                     demand_class,
7695                     sd_date,
7696                     sd_qty,
7697                     last_update_date,
7698                     last_updated_by,
7699                     creation_date,
7700                     created_by)
7701             VALUES (p_plan_id,
7702                     l_ins_sr_instance_id_tab(j),
7703                     l_ins_organization_id_tab(j),
7704                     l_ins_inventory_item_id_tab(j),
7705                     l_ins_demand_class_tab(j),
7706                     l_ins_sd_date_tab(j),
7707                     l_ins_sd_quantity_tab(j),
7708                     p_sys_date,
7709                     l_user_id,
7710                     p_sys_date,
7711                     l_user_id);
7712 
7713             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL INSERT');
7714 
7715         ELSE
7716             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records to be inserted');
7717         END IF;
7718     ELSE
7719         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records fetched in the net cursor');
7720     END IF;
7721 
7722     msc_util.msc_log('******** LOAD_SD_NET_ALLOC End ********');
7723 
7724 END LOAD_SD_NET_ALLOC;
7725 
7726 
7727 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id  IN NUMBER,
7728                              p_sys_date IN DATE)
7729 IS
7730     l_plan_start_date date;
7731     l_instance_id number;
7732     l_cutoff_date date;
7733     l_org_id number;
7734     -- l_default_atp_rule_id number;            -- Bug 3912422
7735     l_calendar_code  VARCHAR2(14);
7736     l_calendar_exception_set_id  NUMBER := -1;  -- Bug 3912422 - Initiallize to -1
7737     -- l_default_demand_class VARCHAR2(34);     -- Bug 3912422
7738     l_user_id  number;
7739     -- l_org_code     VARCHAR2(7);              -- Bug 3912422
7740 BEGIN
7741 
7742     msc_util.msc_log('******** LOAD_SUP_DATA_FULL Begin ********');
7743 
7744     SELECT  trunc(p.plan_start_date),
7745             p.sr_instance_id,
7746             p.organization_id,
7747             trunc(p.cutoff_date),
7748             tp.calendar_code
7749     INTO    l_plan_start_date,
7750             l_instance_id,
7751             l_org_id,
7752             l_cutoff_date,
7753             l_calendar_code
7754     FROM    msc_plans p,
7755             msc_trading_partners tp
7756     WHERE   p.plan_id           = p_plan_id
7757     AND     p.organization_id   = tp.sr_tp_id
7758     AND     p.sr_instance_id    = tp.sr_instance_id
7759     AND     tp.partner_type     = 3;
7760 
7761     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_plan_start_date = ' || l_plan_start_date);
7762     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_instance_id =     ' || l_instance_id);
7763     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_org_id =          ' || l_org_id);
7764     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_calendar_code =   ' || l_calendar_code);
7765 
7766     l_user_id := FND_GLOBAL.USER_ID;
7767 
7768     INSERT INTO MSC_ATP_SUMMARY_SUP(
7769                 plan_id,
7770                 sr_instance_id,
7771                 inventory_item_id,
7772                 supplier_id,
7773                 supplier_site_id,
7774                 sd_date,
7775                 sd_qty,
7776                 demand_class,
7777                 last_update_date,
7778                 last_updated_by,
7779                 creation_date,
7780                 created_by)
7781     (SELECT plan_id, sr_instance_id, inventory_item_id, supplier_id, supplier_site_id, sd_date, sum(sd_qty),
7782     demand_class, last_update_date, last_updated_by, creation_date, created_by
7783     FROM (
7784             SELECT  SV.plan_id plan_id,
7785                     SV.sr_instance_id,
7786                     SV.inventory_item_id inventory_item_id,
7787                     SV.supplier_id supplier_id,
7788                     SV.supplier_site_id supplier_site_id,
7789                     c.calendar_date sd_date, -- 2859130 remove trunc
7790                     SV.capacity sd_qty,
7791                     null demand_class,
7792                     p_sys_date last_update_date,
7793                     l_user_id last_updated_by,
7794                     p_sys_date creation_date,
7795                     l_user_id created_by
7796             FROM    msc_calendar_dates c,
7797                    (SELECT  /*+ LEADING (I) */
7798                             I.plan_id plan_id,
7799                             I.sr_instance_id,
7800                             I.inventory_item_id inventory_item_id,
7801                             S.supplier_id supplier_id,
7802                             S.supplier_site_id supplier_site_id,
7803                             S.capacity,
7804                             trunc(S.from_date) from_date,
7805                             trunc(S.to_date) to_date,
7806                             mis.delivery_calendar_code,
7807                             mis.supplier_lead_time_date
7808                     FROM    msc_system_items I,
7809                             msc_supplier_capacities s,
7810                             msc_item_suppliers mis                      -- Bug 3912422 - Move to the inner query
7811                     WHERE   I.plan_id = p_plan_id
7812                     AND     I.atp_components_flag in ('Y', 'C')
7813                     AND     s.inventory_item_id = I.inventory_item_id
7814                     AND     s.sr_instance_id = I.sr_instance_id
7815                     AND     s.plan_id = I.plan_id
7816                     AND     s.organization_id = i.organization_id       --\
7817                     AND     s.inventory_item_id = mis.inventory_item_id --|
7818                     AND     s.sr_instance_id = mis.sr_instance_id       --> Bug 3912422
7819                     AND     s.plan_id = mis.plan_id                     --|
7820                     AND     s.organization_id = mis.organization_id     --/
7821                     AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7822                     --AND     (I.inventory_item_id, S.supplier_id, nvl(S.supplier_site_id,-1)) NOT IN
7823                              -- Bug 3912422
7824                             (SELECT 'x'        -- summary is not supported with flex flences : summary enhancement
7825                              FROM   msc_supplier_flex_fences msff
7826                              WHERE  plan_id = p_plan_id
7827                              AND msff.inventory_item_id = s.inventory_item_id --\
7828                              AND msff.supplier_id = s.supplier_id             -- } Bug 3912422
7829                              AND msff.supplier_site_id = s.supplier_site_id   --/
7830                              AND rownum = 1)
7831                     group by I.plan_id,
7832                             I.inventory_item_id,
7833                             I.sr_instance_id,
7834                             s.supplier_id,
7835                             s.supplier_site_id,
7836                             s.capacity,
7837                             trunc(s.from_date),
7838                             trunc(s.to_date),
7839                             mis.delivery_calendar_code,
7840                             mis.supplier_lead_time_date) SV
7841                     -- msc_item_suppliers mis                           -- Bug 3912422 - Move to the inner query
7842             WHERE   /* SV.inventory_item_id        = mis.inventory_item_id
7843             AND     SV.supplier_id              = mis.supplier_id
7844             AND     nvl(SV.supplier_site_id,-1) = nvl(mis.supplier_site_id, -1)
7845             AND     SV.sr_instance_id           = mis.sr_instance_id
7846             AND     c.calendar_code             = nvl(mis.delivery_calendar_code, l_calendar_code)
7847             AND*/     c.calendar_code             = nvl(SV.delivery_calendar_code, l_calendar_code)
7848             AND     c.calendar_date BETWEEN trunc(SV.from_date)
7849                                     AND NVL(SV.to_date,l_cutoff_date)
7850             -- AND     (c.seq_num IS NOT NULL OR mis.delivery_calendar_code IS NULL) -- Bug 3912422
7851             AND     (c.seq_num IS NOT NULL OR SV.delivery_calendar_code IS NULL) -- NULL means FOC
7852             AND     c.exception_set_id          = l_calendar_exception_set_id
7853             AND     c.sr_instance_id            = l_instance_id
7854             -- AND     c.calendar_date             >= mis.supplier_lead_time_date -- Bug 3912422
7855             AND     c.calendar_date             > SV.supplier_lead_time_date
7856                     -- Bug 3912422 - We should start looking from the day after supplier_lead_time_date
7857                     -- to accomodate for planning's additional "-1". If SMC is found in ASL then this
7858                     -- would mean one day offset as per ASL. If it is FOC then it would mean starting
7859                     -- from the next day.
7860 
7861             UNION ALL
7862             -- Net out planned orders, purchase orders and purchase requisitions /
7863             -- bug 1303196
7864 
7865             SELECT  /*+ LEADING (I) */
7866                     I.plan_id,
7867                     I.sr_instance_id,
7868                     I.inventory_item_id,
7869                     P.supplier_id,
7870                     P.supplier_site_id,
7871                     DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7872                     (NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty,
7873                     null demand_class,
7874                     p_sys_date last_update_date,
7875                     l_user_id last_updated_by,
7876                     p_sys_date creation_date,
7877                     l_user_id created_by
7878             FROM    msc_supplies p,
7879             --      msc_trading_partners tp,
7880             --      msc_calendar_dates c,
7881             --      msc_calendar_dates c1,
7882                     msc_trading_partner_sites tps,
7883                     msc_system_items I
7884             WHERE   I.plan_id = p_plan_id
7885             AND     I.atp_components_flag in ( 'Y', 'C')
7886             AND     (p.order_type IN (5, 2)
7887                     OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7888                         AND p.order_type = 1 AND p.promised_date IS NULL))
7889             AND     p.plan_id = I.plan_id
7890             AND     p.sr_instance_id = I.sr_instance_id
7891             AND     p.inventory_item_id = I.inventory_item_id
7892             AND     p.organization_id = I.organization_id
7893             AND     p.sr_instance_id  = I.sr_instance_id
7894             AND     NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7895             AND     p.supplier_id is not null
7896             AND     p.supplier_id = tps.partner_id (+)
7897             AND     p.supplier_site_id = tps.partner_site_id (+)
7898             AND NOT EXISTS  --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7899             --AND     (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7900                      -- Bug 3912422
7901                     (SELECT 'x'     -- summary is not supported with flex flences : summary enhancement
7902                      FROM   msc_supplier_flex_fences msff
7903                      WHERE  plan_id = p_plan_id
7904                      AND msff.inventory_item_id = p.inventory_item_id  --\
7905                      AND msff.supplier_id = p.supplier_id              -- } Bug 3912422
7906                      AND msff.supplier_site_id = p.supplier_site_id    --/
7907                      AND rownum = 1)
7908     /*      AND     tp.sr_tp_id = p.organization_id
7909             AND     tp.sr_instance_id = p.sr_instance_id
7910             AND     tp.partner_type = 3
7911             AND     c.calendar_date = trunc(p.new_schedule_date) -- 1529756
7912             AND     c.calendar_code = tp.calendar_code
7913             AND     c.exception_set_id = tp.calendar_exception_set_id
7914             AND     c.sr_instance_id = tp.sr_instance_id
7915             AND     c1.seq_num = c.prior_seq_num-
7916                                  nvl(I.postprocessing_lead_time, 0)
7917             AND     c1.calendar_code = c.calendar_code
7918             AND     c1.exception_set_id = c.exception_set_id
7919             AND     c1.sr_instance_id = c.sr_instance_id*/
7920             AND     p.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation  - summary enhancement
7921         )
7922     group by plan_id,inventory_item_id, supplier_id, supplier_site_id, sr_instance_id,
7923              sd_date, demand_class, last_update_date, last_updated_by, creation_date, created_by
7924     );
7925 
7926     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7927     msc_util.msc_log('******** LOAD_SUP_DATA_FULL End ********');
7928 
7929 END LOAD_SUP_DATA_FULL;
7930 
7931 
7932 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id                   IN NUMBER,
7933                             p_last_refresh_number       IN NUMBER,
7934                             p_new_refresh_number        IN NUMBER,
7935                             p_sys_date                  IN DATE)
7936 IS
7937     l_user_id                   number;
7938     j                           pls_integer;
7939     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7940     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7941     l_supplier_id_tab           MRP_ATP_PUB.number_arr;
7942     l_supplier_site_id_tab      MRP_ATP_PUB.number_arr;
7943     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7944     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7945 
7946     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7947     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7948     l_ins_supplier_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7949     l_ins_supplier_site_id_tab  MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7950     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7951     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7952 
7953     CURSOR c_net_sup (p_plan_id             IN NUMBER, -- Cursor does not require msc_supplier_capacities because
7954                       p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
7955                       p_new_refresh_number  IN NUMBER)
7956     IS
7957         SELECT  I.sr_instance_id,
7958                 I.inventory_item_id,
7959                 P.supplier_id,
7960                 P.supplier_site_id,
7961                 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7962                 sum(NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty
7963         FROM    msc_supplies p,
7964         --      msc_trading_partners tp,
7965         --      msc_calendar_dates c,
7966         --      msc_calendar_dates c1,
7967                 msc_trading_partner_sites tps,
7968                 msc_system_items I
7969         WHERE   I.plan_id = p_plan_id
7970         AND     I.atp_components_flag in ( 'Y', 'C')
7971         AND     (p.order_type IN (5, 2)
7972                 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7973                     AND p.order_type = 1 AND p.promised_date IS NULL))
7974         AND     p.plan_id = I.plan_id
7975         AND     p.sr_instance_id = I.sr_instance_id
7976         AND     p.inventory_item_id = I.inventory_item_id
7977         AND     p.organization_id = I.organization_id
7978         AND     p.sr_instance_id  = I.sr_instance_id
7979         AND     NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7980         AND     p.supplier_id is not null
7981         AND     p.supplier_id = tps.partner_id (+)
7982         AND     p.supplier_site_id = tps.partner_site_id (+)
7983         AND NOT EXISTS -- Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7984         --AND     (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7985                 -- Bug 3912422
7986                 (SELECT 'x'      -- summary is not supported with flex flences : summary enhancement
7987                  FROM   msc_supplier_flex_fences msff
7988                  WHERE  plan_id = p_plan_id
7989                  AND msff.inventory_item_id = p.inventory_item_id  --\
7990                  AND msff.supplier_id = p.supplier_id              -- } Bug 3912422
7991                  AND msff.supplier_site_id = p.supplier_site_id    --/
7992                  AND rownum = 1)
7993     /*  AND     tp.sr_tp_id = p.organization_id
7994         AND     tp.sr_instance_id = p.sr_instance_id
7995         AND     tp.partner_type = 3
7996         AND     c.calendar_date = trunc(p.new_schedule_date)
7997         AND     c.calendar_code = tp.calendar_code
7998         AND     c.exception_set_id = tp.calendar_exception_set_id
7999         AND     c.sr_instance_id = tp.sr_instance_id
8000         AND     c1.seq_num = c.prior_seq_num-
8001                              nvl(I.postprocessing_lead_time, 0)
8002         AND     c1.calendar_code = c.calendar_code
8003         AND     c1.exception_set_id = c.exception_set_id
8004         AND     c1.sr_instance_id = c.sr_instance_id  */
8005         AND     p.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8006         GROUP BY I.inventory_item_id, P.supplier_id, P.supplier_site_id, I.sr_instance_id,
8007                 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date);
8008 
8009 
8010 BEGIN
8011 
8012     msc_util.msc_log('******** LOAD_SUP_DATA_NET Begin ********');
8013 
8014     l_user_id := FND_GLOBAL.USER_ID;
8015 
8016     OPEN c_net_sup(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8017     FETCH c_net_sup BULK COLLECT INTO l_sr_instance_id_tab,
8018                                     l_inventory_item_id_tab,
8019                                     l_supplier_id_tab,
8020                                     l_supplier_site_id_tab,
8021                                     l_sd_date_tab,
8022                                     l_sd_quantity_tab;
8023     CLOSE c_net_sup;
8024 
8025     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
8026 
8027         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
8028 
8029         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
8030         UPDATE MSC_ATP_SUMMARY_SUP
8031         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
8032                last_update_date  = p_sys_date,
8033                last_updated_by   = l_user_id
8034         WHERE  plan_id           = p_plan_id
8035         AND    sr_instance_id    = l_sr_instance_id_tab(j)
8036         AND    inventory_item_id = l_inventory_item_id_tab(j)
8037         AND    supplier_id       = l_supplier_id_tab(j)
8038         AND    supplier_site_id  = l_supplier_site_id_tab(j)
8039         AND    sd_date           = l_sd_date_tab(j);
8040 
8041         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL UPDATE');
8042 
8043         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
8044             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8045                 l_ins_sr_instance_id_tab.EXTEND;
8046                 l_ins_inventory_item_id_tab.EXTEND;
8047                 l_ins_supplier_id_tab.EXTEND;
8048                 l_ins_supplier_site_id_tab.EXTEND;
8049                 l_ins_sd_date_tab.EXTEND;
8050                 l_ins_sd_quantity_tab.EXTEND;
8051 
8052                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
8053                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
8054                 l_ins_supplier_id_tab(l_ins_supplier_id_tab.COUNT)              := l_supplier_id_tab(j);
8055                 l_ins_supplier_site_id_tab(l_ins_supplier_site_id_tab.COUNT)    := l_supplier_site_id_tab(j);
8056                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
8057                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
8058             END IF;
8059         END LOOP;
8060 
8061         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
8062 
8063             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
8064 
8065             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
8066             INSERT  INTO MSC_ATP_SUMMARY_SUP (
8067                     plan_id,
8068                     sr_instance_id,
8069                     inventory_item_id,
8070                     supplier_id,
8071                     supplier_site_id,
8072                     sd_date,
8073                     sd_qty,
8074                     demand_class,
8075                     last_update_date,
8076                     last_updated_by,
8077                     creation_date,
8078                     created_by)
8079             VALUES (p_plan_id,
8080                     l_ins_sr_instance_id_tab(j),
8081                     l_ins_inventory_item_id_tab(j),
8082                     l_ins_supplier_id_tab(j),
8083                     l_ins_supplier_site_id_tab(j),
8084                     l_ins_sd_date_tab(j),
8085                     l_ins_sd_quantity_tab(j),
8086                     NULL,
8087                     p_sys_date,
8088                     l_user_id,
8089                     p_sys_date,
8090                     l_user_id);
8091 
8092             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL INSERT');
8093 
8094         ELSE
8095             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records to be inserted');
8096         END IF;
8097     ELSE
8098         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records fetched in the net cursor');
8099     END IF;
8100 
8101     msc_util.msc_log('******** LOAD_SUP_DATA_NET End ********');
8102 
8103 END LOAD_SUP_DATA_NET;
8104 
8105 
8106 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id           IN NUMBER,
8107                                     p_plan_start_date   IN DATE,
8108                                     p_sys_date          IN DATE)
8109 IS
8110     l_user_id   number;
8111 BEGIN
8112 
8113     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH Begin ********');
8114 
8115     l_user_id := FND_GLOBAL.USER_ID;
8116 
8117     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8118     INSERT INTO MSC_ATP_SUMMARY_RES(
8119             plan_id,
8120             department_id,
8121             resource_id,
8122             organization_id,
8123             sr_instance_id,
8124             sd_date,
8125             sd_qty,
8126             last_update_date,
8127             last_updated_by,
8128             creation_date,
8129             created_by)
8130     (SELECT plan_id,
8131             department_id,
8132             resource_id,
8133             organization_id,
8134             sr_instance_id,
8135             SD_DATE,
8136             SUM(SD_QTY),
8137             last_update_date,
8138             last_updated_by,
8139             creation_date,
8140             created_by
8141     FROM
8142            (SELECT  RES_VIEW.plan_id plan_id,
8143                     RES_VIEW.department_id department_id,
8144                     RES_VIEW.resource_id resource_id,
8145                     RES_VIEW.organization_id organization_id,
8146                     RES_VIEW.sr_instance_id sr_instance_id,
8147                     trunc(RES_VIEW.SD_DATE) SD_DATE,
8148                     RES_VIEW.SD_QTY
8149                         * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8150                     p_sys_date last_update_date,
8151                     l_user_id last_updated_by,
8152                     p_sys_date creation_date,
8153                     l_user_id created_by
8154             FROM    MSC_UOM_CONVERSIONS MUC,
8155                    (SELECT  -- hint for better performance.
8156                             /*+  ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8157                             DR.PLAN_ID plan_id,
8158                             NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8159                             DR.RESOURCE_ID resource_id,
8160                             DR.organization_id organization_id,
8161                             DR.SR_INSTANCE_ID sr_instance_id,
8162                             C.CALENDAR_DATE SD_DATE,
8163                             -- Bug 3321897, 2943979 For Line Based Resources,
8164                             -- Resource_ID is not NULL but -1
8165                             -1 * DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8166                                     DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8167                                         REQ.DAILY_RESOURCE_HOURS)) *
8168                                  DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8169                                     (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8170                                         NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1)  SD_QTY,
8171                             NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8172                             DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8173                     FROM    MSC_DEPARTMENT_RESOURCES DR,
8174                             MSC_TRADING_PARTNERS P,
8175                             MSC_RESOURCE_REQUIREMENTS REQ,
8176                             MSC_SYSTEM_ITEMS I,
8177                             MSC_SUPPLIES S,
8178                             ----  re-ordered tables for performance
8179                             MSC_CALENDAR_DATES C
8180                     WHERE   DR.PLAN_ID = REQ.PLAN_ID
8181                     AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8182                     AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8183                     AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8184                     AND     DR.organization_id = REQ.ORGANIZATION_ID
8185                     AND     REQ.PLAN_ID = p_plan_id
8186                     AND     NVL(REQ.PARENT_ID, 2) = 2
8187                     AND     I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8188                     AND     I.PLAN_ID = S.PLAN_ID
8189                     AND     I.ORGANIZATION_ID = S.ORGANIZATION_ID
8190                     AND     I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8191                     AND     I.inventory_item_id = REQ.assembly_item_id    ----\
8192                     AND     ((I.bom_item_type <> 1                          --|
8193                               and I.bom_item_type <> 2                      --|- summary enhancement change for CTO ODR
8194                               AND I.atp_flag <> 'N')                        --|
8195                              OR (REQ.record_source = 2))                  ----/
8196                     AND     S.TRANSACTION_ID = REQ.SUPPLY_ID
8197                     AND     S.PLAN_ID = REQ.PLAN_ID
8198                     AND     S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8199                     AND     S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8200                     AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8201                     AND     P.SR_TP_ID = DR.ORGANIZATION_ID
8202                     AND     P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8203                     AND     P.PARTNER_TYPE = 3
8204                     AND     C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8205                     AND     C.CALENDAR_CODE = P.CALENDAR_CODE
8206                     AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8207                     AND     C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8208                                                     TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8209                     AND     C.SEQ_NUM IS NOT NULL
8210                     AND     C.CALENDAR_DATE >= p_plan_start_date  -- summary enhancement - made consistent
8211                     AND     REQ.REFRESH_NUMBER IS NULL)RES_VIEW   -- consider only planning records in full summation - summary enhancement
8212             WHERE   RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8213             AND     RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8214             AND     MUC.INVENTORY_ITEM_ID (+)= 0
8215 
8216             UNION ALL
8217 
8218             SELECT  MNRA.plan_id plan_id,
8219                     MNRA.department_id,
8220                     MNRA.resource_id,
8221                     MNRA.organization_id,
8222                     MNRA.sr_instance_id,
8223                     trunc(MNRA.SHIFT_DATE) SD_DATE,
8224                     MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8225                         MNRA.to_time,to_time + 24*3600,
8226                         MNRA.to_time) - MNRA.from_time)/3600)
8227                             * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8228                             DR.MAX_CAPACITY *  NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8229                     p_sys_date last_update_date,
8230                     l_user_id last_updated_by,
8231                     p_sys_date creation_date,
8232                     l_user_id created_by
8233             FROM    MSC_NET_RESOURCE_AVAIL MNRA,
8234                     MSC_DEPARTMENT_RESOURCES DR,
8235                     MSC_UOM_CONVERSIONS MUC         -- noted in summary enhancement : inconsistent with MSCRATPB
8236             WHERE   MNRA.PLAN_ID = p_plan_id
8237             AND     NVL(MNRA.PARENT_ID, -2) <> -1
8238             AND     DR.PLAN_ID = MNRA.PLAN_ID
8239             AND     DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8240             AND     DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8241             AND     DR.RESOURCE_ID = MNRA.RESOURCE_ID
8242             AND     DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8243             AND     DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8244             AND     DR.SR_INSTANCE_ID =  MUC.SR_INSTANCE_ID (+)
8245             AND     MUC.INVENTORY_ITEM_ID (+) = 0
8246                     --- un commented the following row. This is done so that less number of rows are selected
8247             AND     SHIFT_DATE >= p_plan_start_date  -- summary enhancement - made consistent
8248             ) group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8249             last_update_date,last_updated_by, creation_date, created_by
8250     );
8251 
8252     msc_util.msc_log('LOAD_RES_FULL_UNOPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8253     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH End ********');
8254 
8255 END LOAD_RES_FULL_UNOPT_BATCH;
8256 
8257 
8258 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id           IN NUMBER,
8259                                   p_plan_start_date   IN DATE,
8260                                   p_sys_date          IN DATE)
8261 IS
8262     l_user_id   number;
8263 BEGIN
8264 
8265     msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH Begin ********');
8266 
8267     l_user_id := FND_GLOBAL.USER_ID;
8268 
8269     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8270     INSERT INTO MSC_ATP_SUMMARY_RES(
8271             plan_id,
8272             department_id,
8273             resource_id,
8274             organization_id,
8275             sr_instance_id,
8276             sd_date,
8277             sd_qty,
8278             last_update_date,
8279             last_updated_by,
8280             creation_date,
8281             created_by)
8282     (SELECT plan_id,
8283             department_id,
8284             resource_id,
8285             organization_id,
8286             sr_instance_id,
8287             SD_DATE,
8288             SUM(SD_QTY),
8289             last_update_date,
8290             last_updated_by,
8291             creation_date,
8292             created_by
8293     FROM
8294             (SELECT RES_VIEW.plan_id plan_id,
8295                     RES_VIEW.department_id department_id,
8296                     RES_VIEW.resource_id resource_id,
8297                     RES_VIEW.organization_id organization_id,
8298                     RES_VIEW.sr_instance_id sr_instance_id,
8299                     trunc(RES_VIEW.SD_DATE) SD_DATE,
8300                     RES_VIEW.SD_QTY
8301                     * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8302                     p_sys_date last_update_date,
8303                     l_user_id last_updated_by,
8304                     p_sys_date creation_date,
8305                     l_user_id created_by
8306             FROM    MSC_UOM_CONVERSIONS MUC,
8307                     (SELECT -- hint for better performance.
8308                             /*+  ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8309                             DR.PLAN_ID plan_id,
8310                             NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8311                             DR.RESOURCE_ID resource_id,
8312                             DR.organization_id organization_id,
8313                             DR.SR_INSTANCE_ID sr_instance_id,
8314                             TRUNC(REQ.START_DATE) SD_DATE,
8315                             -- Bug 3321897, 2943979 For Line Based Resources,
8316                             -- Resource_ID is not NULL but -1
8317                             -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8318                             REQ.RESOURCE_HOURS) * -- 2859130         -- noted in summary enhancement : inconsistent with MSCRATPB
8319                             -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8320                             -- REQ.DAILY_RESOURCE_HOURS)) *
8321                             DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8322                                 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8323                                     NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1)  SD_QTY,
8324                             NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8325                             DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8326                     FROM    MSC_DEPARTMENT_RESOURCES DR,
8327                             MSC_RESOURCE_REQUIREMENTS REQ,
8328                             MSC_SYSTEM_ITEMS I,
8329                             MSC_SUPPLIES S
8330                             ----  re-ordered tables for performance
8331                     WHERE   DR.PLAN_ID = REQ.PLAN_ID
8332                     AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8333                     AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8334                     AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8335                     AND     DR.organization_id = REQ.ORGANIZATION_ID
8336                     AND     REQ.PLAN_ID = p_plan_id
8337                     AND     NVL(REQ.PARENT_ID, 1) = 1
8338                     AND     I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8339                     AND     I.PLAN_ID = S.PLAN_ID
8340                     AND     I.ORGANIZATION_ID = S.ORGANIZATION_ID
8341                     AND     I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8342                     AND     S.TRANSACTION_ID = REQ.SUPPLY_ID
8343                     AND     S.PLAN_ID = REQ.PLAN_ID
8344                     AND     S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8345                     AND     S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8346                     AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8347                     AND     I.inventory_item_id = REQ.assembly_item_id    ----\
8348                     AND     ((I.bom_item_type <> 1                          --|
8349                               and I.bom_item_type <> 2                      --|- summary enhancement change for CTO ODR
8350                               AND I.atp_flag <> 'N')                        --|
8351                              OR (REQ.record_source = 2))                  ----/
8352                     AND     REQ.START_DATE >= p_plan_start_date     -- summary enhancement - made consistent
8353                     AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8354                     )RES_VIEW
8355             WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8356             AND   RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8357             AND   MUC.INVENTORY_ITEM_ID (+)= 0
8358 
8359             UNION ALL
8360 
8361             SELECT  MNRA.plan_id plan_id,
8362                     MNRA.department_id,
8363                     MNRA.resource_id,
8364                     MNRA.organization_id,
8365                     MNRA.sr_instance_id,
8366                     trunc(MNRA.SHIFT_DATE) SD_DATE,
8367                     MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8368                         MNRA.to_time,to_time + 24*3600,
8369                         MNRA.to_time) - MNRA.from_time)/3600)
8370                             * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8371                               DR.MAX_CAPACITY *  NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8372                     p_sys_date last_update_date,
8373                     l_user_id last_updated_by,
8374                     p_sys_date creation_date,
8375                     l_user_id created_by
8376             FROM    MSC_NET_RESOURCE_AVAIL MNRA,
8377                     MSC_DEPARTMENT_RESOURCES DR,
8378                     MSC_UOM_CONVERSIONS MUC             -- noted in summary enhancement : inconsistent with MSCRATPB
8379             WHERE   MNRA.PLAN_ID = p_plan_id
8380             AND     NVL(MNRA.PARENT_ID, -2) <> -1
8381             AND     DR.PLAN_ID = MNRA.PLAN_ID
8382             AND     DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8383             AND     DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8384             AND     DR.RESOURCE_ID = MNRA.RESOURCE_ID
8385             AND     DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8386             AND     DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8387             AND     DR.SR_INSTANCE_ID =  MUC.SR_INSTANCE_ID (+)
8388             AND     MUC.INVENTORY_ITEM_ID (+) = 0
8389                     --- un commented the following row. This is done so that less number of rows are selected
8390             AND     SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8391             )
8392     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8393             last_update_date,last_updated_by, creation_date, created_by
8394     );
8395 
8396     msc_util.msc_log('LOAD_RES_FULL_OPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8397     msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH End ********');
8398 
8399 END LOAD_RES_FULL_OPT_BATCH;
8400 
8401 
8402 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id           IN NUMBER,
8403                                       p_plan_start_date   IN DATE,
8404                                       p_sys_date          IN DATE)
8405 IS
8406     l_user_id   number;
8407 BEGIN
8408 
8409     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH Begin ********');
8410 
8411     l_user_id := FND_GLOBAL.USER_ID;
8412 
8413     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8414     INSERT INTO MSC_ATP_SUMMARY_RES(
8415             plan_id,
8416             department_id,
8417             resource_id,
8418             organization_id,
8419             sr_instance_id,
8420             sd_date,
8421             sd_qty,
8422             last_update_date,
8423             last_updated_by,
8424             creation_date,
8425             created_by)
8426     (SELECT plan_id,
8427             department_id,
8428             resource_id,
8429             organization_id,
8430             sr_instance_id,
8431             SD_DATE,
8432             SUM(SD_QTY),
8433             last_update_date,
8434             last_updated_by,
8435             creation_date,
8436             created_by
8437     FROM
8438         (
8439             SELECT  /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8440                     DR.PLAN_ID plan_id,
8441                     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8442                     DR.RESOURCE_ID resource_id,
8443                     DR.organization_id organization_id,
8444                     DR.SR_INSTANCE_ID sr_instance_id,
8445                     C.CALENDAR_DATE SD_DATE, -- 2859130 remove trunc
8446                     -- Bug 3321897, 2943979 For Line Based Resources,
8447                     -- Resource_ID is not NULL but -1
8448                     -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8449                         DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8450                             REQ.DAILY_RESOURCE_HOURS))  SD_QTY,
8451                     p_sys_date last_update_date,
8452                     l_user_id last_updated_by,
8453                     p_sys_date creation_date,
8454                     l_user_id created_by
8455             FROM    MSC_DEPARTMENT_RESOURCES DR,
8456                     MSC_TRADING_PARTNERS P,
8457                     MSC_RESOURCE_REQUIREMENTS REQ,
8458                     MSC_SYSTEM_ITEMS I,                 -- summary enhancement change for CTO ODR
8459                     MSC_CALENDAR_DATES C
8460                     ----  re-ordered tables for performance
8461             WHERE   DR.PLAN_ID = REQ.PLAN_ID
8462             AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID    -- summary enhancement - made consistent
8463             AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8464             AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8465             AND     DR.organization_id = REQ.ORGANIZATION_ID
8466             AND     REQ.PLAN_ID = p_plan_id
8467             AND     NVL(REQ.PARENT_ID, 2) = 2
8468             AND     P.SR_TP_ID = DR.ORGANIZATION_ID
8469             AND     P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8470             AND     P.PARTNER_TYPE = 3
8471             AND     C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8472             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
8473             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8474             AND     C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8475                     TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8476             AND     C.SEQ_NUM IS NOT NULL
8477             AND     C.CALENDAR_DATE >= p_plan_start_date
8478             AND     I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id         ----\
8479             AND     I.PLAN_ID = REQ.PLAN_ID                         --|
8480             AND     I.ORGANIZATION_ID = REQ.ORGANIZATION_ID         --|
8481             AND     I.inventory_item_id = REQ.assembly_item_id      --|\ summary enhancement
8482             AND     ((I.bom_item_type <> 1                          --|/ change for CTO ODR
8483                       and I.bom_item_type <> 2                      --|
8484                       AND I.atp_flag <> 'N')                        --|
8485                      OR (REQ.record_source = 2))                  ----/
8486             AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8487 
8488             UNION ALL
8489 
8490             SELECT  plan_id plan_id,
8491                     department_id,
8492                     resource_id,
8493                     organization_id,
8494                     sr_instance_id,
8495                     trunc(SHIFT_DATE) SD_DATE,
8496                     CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8497                         to_time,to_time + 24*3600,
8498                         to_time) - from_time)/3600) SD_QTY,
8499                     p_sys_date last_update_date,
8500                     l_user_id last_updated_by,
8501                     p_sys_date creation_date,
8502                     l_user_id created_by
8503             FROM    MSC_NET_RESOURCE_AVAIL
8504             WHERE   PLAN_ID = p_plan_id
8505             AND     NVL(PARENT_ID, -2) <> -1
8506                     -- uncommented following line so that less number of rows are selected
8507             AND     SHIFT_DATE >= p_plan_start_date     -- summary enhancement - made consistent
8508         )
8509     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8510             last_update_date,last_updated_by, creation_date, created_by
8511     );
8512 
8513     msc_util.msc_log('LOAD_RES_FULL_UNOPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8514     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH End ********');
8515 
8516 END LOAD_RES_FULL_UNOPT_NOBATCH;
8517 
8518 
8519 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id           IN NUMBER,
8520                                     p_plan_start_date   IN DATE,
8521                                     p_sys_date          IN DATE)
8522 IS
8523     l_user_id   number;
8524 BEGIN
8525 
8526     msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH Begin ********');
8527 
8528     l_user_id := FND_GLOBAL.USER_ID;
8529 
8530     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8531     INSERT INTO MSC_ATP_SUMMARY_RES(
8532             plan_id,
8533             department_id,
8534             resource_id,
8535             organization_id,
8536             sr_instance_id,
8537             sd_date,
8538             sd_qty,
8539             last_update_date,
8540             last_updated_by,
8541             creation_date,
8542             created_by)
8543     (SELECT plan_id,
8544             department_id,
8545             resource_id,
8546             organization_id,
8547             sr_instance_id,
8548             SD_DATE,
8549             SUM(SD_QTY),
8550             last_update_date,
8551             last_updated_by,
8552             creation_date,
8553             created_by
8554     FROM
8555         (
8556             SELECT  /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8557                     DR.PLAN_ID plan_id,
8558                     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8559                     DR.RESOURCE_ID resource_id,
8560                     DR.organization_id organization_id,
8561                     DR.SR_INSTANCE_ID sr_instance_id,
8562                     TRUNC(REQ.START_DATE) SD_DATE,
8563                     -- Bug 3321897, 2943979 For Line Based Resources,
8564                     -- Resource_ID is not NULL but -1
8565                     -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8566                         REQ.RESOURCE_HOURS) SD_QTY, --2859130
8567                     -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,   -- noted in summary enhancement : inconsistent with MSCRATPB
8568                         -- REQ.DAILY_RESOURCE_HOURS))  SD_QTY,
8569                     p_sys_date last_update_date,
8570                     l_user_id last_updated_by,
8571                     p_sys_date creation_date,
8572                     l_user_id created_by
8573             FROM    MSC_DEPARTMENT_RESOURCES DR,
8574                     MSC_RESOURCE_REQUIREMENTS REQ,
8575                     MSC_SYSTEM_ITEMS I                  -- summary enhancement change for CTO ODR
8576             WHERE   DR.PLAN_ID = REQ.PLAN_ID
8577             AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID    -- summary enhancement: made consistent
8578             AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8579             AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8580             AND     DR.organization_id = REQ.ORGANIZATION_ID
8581             AND     REQ.PLAN_ID = p_plan_id
8582             AND     NVL(REQ.PARENT_ID, 1) = 1
8583             AND     I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id         ----\
8584             AND     I.PLAN_ID = REQ.PLAN_ID                         --|
8585             AND     I.ORGANIZATION_ID = REQ.ORGANIZATION_ID         --|
8586             AND     I.inventory_item_id = REQ.assembly_item_id      --|\ summary enhancement
8587             AND     ((I.bom_item_type <> 1                          --|/ change for CTO ODR
8588                       and I.bom_item_type <> 2                      --|
8589                       AND I.atp_flag <> 'N')                        --|
8590                      OR (REQ.record_source = 2))                  ----/
8591             AND     REQ.START_DATE >= p_plan_start_date                                     -- summary enhancement: made consistent
8592             AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8593 
8594             UNION ALL
8595 
8596             SELECT  plan_id plan_id,
8597                     department_id,
8598                     resource_id,
8599                     organization_id,
8600                     sr_instance_id,
8601                     trunc(SHIFT_DATE) SD_DATE,
8602                     CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8603                         to_time,to_time + 24*3600,
8604                         to_time) - from_time)/3600) SD_QTY,
8605                     p_sys_date last_update_date,
8606                     l_user_id last_updated_by,
8607                     p_sys_date creation_date,
8608                     l_user_id created_by
8609             FROM    MSC_NET_RESOURCE_AVAIL
8610             WHERE   PLAN_ID = p_plan_id
8611             AND     NVL(PARENT_ID, -2) <> -1
8612             AND     SHIFT_DATE >= p_plan_start_date         -- summary enhancement: made consistent
8613         )
8614     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8615             last_update_date,last_updated_by, creation_date, created_by
8616     );
8617 
8618     msc_util.msc_log('LOAD_RES_FULL_OPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8619     msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH End ********');
8620 
8621 END LOAD_RES_FULL_OPT_NOBATCH;
8622 
8623 
8624 PROCEDURE LOAD_RES_DATA_NET(p_plan_id                   IN NUMBER,
8625                             p_last_refresh_number       IN NUMBER,
8626                             p_new_refresh_number        IN NUMBER,
8627                             p_sys_date                  IN DATE)
8628 IS
8629     l_user_id   number;
8630     j           pls_integer;
8631     l_department_id_tab         MRP_ATP_PUB.number_arr;
8632     l_resource_id_tab           MRP_ATP_PUB.number_arr;
8633     l_organization_id_tab       MRP_ATP_PUB.number_arr;
8634     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
8635     l_sd_date_tab               MRP_ATP_PUB.date_arr;
8636     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
8637 
8638     l_ins_department_id_tab     MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8639     l_ins_resource_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8640     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8641     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8642     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
8643     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8644 
8645     CURSOR c_net_res (p_plan_id             IN NUMBER, -- Cursor does not require msc_net_resource_avail because
8646                       p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
8647                       p_new_refresh_number  IN NUMBER)
8648     IS
8649         SELECT  NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8650                 DR.RESOURCE_ID resource_id,
8651                 DR.organization_id organization_id,
8652                 DR.SR_INSTANCE_ID sr_instance_id,
8653                 -- Bug 3348095
8654                 -- Only ATP created records, so use end_date
8655                 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE)) SD_DATE,
8656                 -- TRUNC(REQ.START_DATE) SD_DATE,
8657                 -- End Bug 3348095
8658                 SUM((-1) * REQ.RESOURCE_HOURS) SD_QTY -- ATP always populates resource_hours
8659         FROM    MSC_DEPARTMENT_RESOURCES DR,
8660                 MSC_RESOURCE_REQUIREMENTS REQ
8661         WHERE   DR.PLAN_ID = p_plan_id
8662         AND     REQ.PLAN_ID = DR.PLAN_ID
8663         AND     REQ.SR_INSTANCE_ID = DR.sr_instance_id
8664         AND     REQ.RESOURCE_ID = DR.resource_id
8665         AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) = DR.DEPARTMENT_ID
8666         AND     REQ.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8667         GROUP BY DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID, DR.RESOURCE_ID, DR.organization_id, DR.SR_INSTANCE_ID, TRUNC(NVL(REQ.END_DATE, REQ.START_DATE));
8668                   -- Bug 3348095  Only ATP created records, so use end_date.
8669 
8670 BEGIN
8671 
8672     msc_util.msc_log('******** LOAD_RES_DATA_NET Begin ********');
8673 
8674     l_user_id := FND_GLOBAL.USER_ID;
8675 
8676     OPEN c_net_res(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8677     FETCH c_net_res BULK COLLECT INTO l_department_id_tab,
8678                                       l_resource_id_tab,
8679                                       l_organization_id_tab,
8680                                       l_sr_instance_id_tab,
8681                                       l_sd_date_tab,
8682                                       l_sd_quantity_tab;
8683     CLOSE c_net_res;
8684 
8685     IF l_resource_id_tab IS NOT NULL AND l_resource_id_tab.COUNT > 0 THEN
8686 
8687         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_resource_id_tab.COUNT := ' || l_resource_id_tab.COUNT);
8688 
8689         forall j IN l_resource_id_tab.first.. l_resource_id_tab.last
8690         UPDATE MSC_ATP_SUMMARY_RES
8691         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
8692                last_update_date  = p_sys_date,
8693                last_updated_by   = l_user_id
8694         WHERE  plan_id           = p_plan_id
8695         AND    sr_instance_id    = l_sr_instance_id_tab(j)
8696         AND    organization_id   = l_organization_id_tab(j)
8697         AND    resource_id       = l_resource_id_tab(j)
8698         AND    department_id     = l_department_id_tab(j)
8699         AND    sd_date           = l_sd_date_tab(j);
8700 
8701         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL UPDATE');
8702 
8703         FOR j IN l_resource_id_tab.first.. l_resource_id_tab.last LOOP
8704             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8705                 l_ins_department_id_tab.EXTEND;
8706                 l_ins_resource_id_tab.EXTEND;
8707                 l_ins_organization_id_tab.EXTEND;
8708                 l_ins_sr_instance_id_tab.EXTEND;
8709                 l_ins_sd_date_tab.EXTEND;
8710                 l_ins_sd_quantity_tab.EXTEND;
8711 
8712                 l_ins_department_id_tab(l_ins_department_id_tab.COUNT)          := l_department_id_tab(j);
8713                 l_ins_resource_id_tab(l_ins_resource_id_tab.COUNT)              := l_resource_id_tab(j);
8714                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
8715                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
8716                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
8717                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
8718             END IF;
8719         END LOOP;
8720 
8721         IF l_ins_resource_id_tab IS NOT NULL AND l_ins_resource_id_tab.COUNT > 0 THEN
8722 
8723             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_ins_resource_id_tab.COUNT := ' || l_ins_resource_id_tab.COUNT);
8724 
8725             forall  j IN l_ins_resource_id_tab.first.. l_ins_resource_id_tab.last
8726             INSERT  INTO MSC_ATP_SUMMARY_RES (
8727                     plan_id,
8728                     department_id,
8729                     resource_id,
8730                     organization_id,
8731                     sr_instance_id,
8732                     sd_date,
8733                     sd_qty,
8734                     last_update_date,
8735                     last_updated_by,
8736                     creation_date,
8737                     created_by)
8738             VALUES (p_plan_id,
8739                     l_ins_department_id_tab(j),
8740                     l_ins_resource_id_tab(j),
8741                     l_ins_organization_id_tab(j),
8742                     l_ins_sr_instance_id_tab(j),
8743                     l_ins_sd_date_tab(j),
8744                     l_ins_sd_quantity_tab(j),
8745                     p_sys_date,
8746                     l_user_id,
8747                     p_sys_date,
8748                     l_user_id);
8749 
8750             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL INSERT');
8751 
8752         ELSE
8753             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records to be inserted');
8754         END IF;
8755     ELSE
8756         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records fetched in the net cursor');
8757     END IF;
8758 
8759     msc_util.msc_log('******** LOAD_RES_DATA_NET End ********');
8760 
8761 END LOAD_RES_DATA_NET;
8762 
8763 
8764 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id IN NUMBER,
8765                                        p_applsys_schema IN Varchar2)
8766 IS
8767     l_partition_name            varchar2(30);
8768     l_sql_stmt                  varchar2(300);
8769 BEGIN
8770     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_plan_id  - ' || p_plan_id);
8771     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_applsys_schema  - ' || p_applsys_schema);
8772 
8773 ------------------------------------------------
8774 
8775     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sd');
8776     l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8777     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8778     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD TRUNCATE PARTITION ' ||
8779                     l_partition_name  || ' DROP STORAGE';
8780 
8781     BEGIN
8782         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SD');
8783         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8784                       APPLICATION_SHORT_NAME => 'MSC',
8785                       STATEMENT_TYPE => ad_ddl.alter_table,
8786                       STATEMENT => l_sql_stmt,
8787                       OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
8788     END;
8789     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating SD partition');
8790 
8791 ------------------------------------------------
8792 
8793     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sup');
8794     l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8795     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8796     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SUP TRUNCATE PARTITION ' ||
8797                     l_partition_name  || ' DROP STORAGE';
8798 
8799     BEGIN
8800         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SUP');
8801         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8802                       APPLICATION_SHORT_NAME => 'MSC',
8803                       STATEMENT_TYPE => ad_ddl.alter_table,
8804                       STATEMENT => l_sql_stmt,
8805                       OBJECT_NAME => 'MSC_ATP_SUMMARY_SUP');
8806     END;
8807     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating sup partition');
8808 
8809 ------------------------------------------------
8810 
8811     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for res');
8812     l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8813     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8814     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_RES TRUNCATE PARTITION ' ||
8815                     l_partition_name  || ' DROP STORAGE';
8816 
8817     BEGIN
8818         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_RES');
8819         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8820                       APPLICATION_SHORT_NAME => 'MSC',
8821                       STATEMENT_TYPE => ad_ddl.alter_table,
8822                       STATEMENT => l_sql_stmt,
8823                       OBJECT_NAME => 'MSC_ATP_SUMMARY_RES');
8824     END;
8825     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating res partition');
8826 
8827 ------------------------------------------------
8828 
8829 END Truncate_Summ_Plan_Partition;
8830 
8831 
8832 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id              IN NUMBER,
8833                                  p_share_partition      IN varchar2)
8834 IS
8835     l_partition_name            varchar2(30);
8836 BEGIN
8837 
8838 ------------------------------------------------
8839     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for S/D Tables');
8840     IF p_share_partition = 'Y' THEN
8841         l_partition_name := 'ATP_SUMMARY_SD_999999';
8842     ELSE
8843         l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8844     END IF;
8845 
8846     fnd_stats.gather_table_stats(ownname=>'MSC',
8847                                  tabname=>'MSC_ATP_SUMMARY_SD',
8848                                  partname=>l_partition_name,
8849                                  granularity=>'PARTITION',
8850                                  percent =>10);
8851     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for S/D tables');
8852 ------------------------------------------------
8853     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Sup Tables');
8854     IF p_share_partition = 'Y' THEN
8855         l_partition_name := 'ATP_SUMMARY_SUP_999999';
8856     ELSE
8857         l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8858     END IF;
8859 
8860     fnd_stats.gather_table_stats(ownname=>'MSC',
8861                                  tabname=>'MSC_ATP_SUMMARY_SUP',
8862                                  partname=>l_partition_name,
8863                                  granularity=>'PARTITION',
8864                                  percent =>10);
8865     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Sup tables');
8866 ------------------------------------------------
8867     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Res Tables');
8868     IF p_share_partition = 'Y' THEN
8869         l_partition_name := 'ATP_SUMMARY_RES_999999';
8870     ELSE
8871         l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8872     END IF;
8873 
8874     fnd_stats.gather_table_stats(ownname=>'MSC',
8875                                  tabname=>'MSC_ATP_SUMMARY_RES',
8876                                  partname=>l_partition_name,
8877                                  granularity=>'PARTITION',
8878                                  percent =>10);
8879     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Res tables');
8880 ------------------------------------------------
8881 
8882 
8883 END Gather_Summ_Plan_Stats;
8884 
8885 --*************************************************************---
8886 --New Procedure added for collection enhancement --bug3049003
8887 --*************************************************************--
8888 PROCEDURE atp_snapshot_hook(
8889 	                      p_plan_id       IN 	NUMBER
8890                          )
8891 
8892 IS
8893 --bug3663487 start SQL_ID  9425117
8894 -- IO Perf:3693983: Don't Launch ATP Post snapshot Processes for IO Plans
8895 l_count                 NUMBER := 0;
8896 --bug3663487 end
8897 Begin
8898 
8899         msc_util.msc_log('Begin procedure atp_snapshot_hook');
8900 
8901         SELECT count(*)
8902         INTO   l_count
8903         FROM   msc_plans plans,
8904                msc_designators desig
8905         WHERE  plans.plan_id = p_plan_id
8906         AND    plans.plan_type <> 4
8907         AND    plans.compile_designator = desig.designator
8908         AND    plans.sr_instance_id = desig.sr_instance_id
8909         AND    plans.organization_id = desig.organization_id
8910         AND    (desig.inventory_atp_flag = 1
8911                 OR plans.copy_plan_id IS NOT NULL);
8912 
8913         msc_util.msc_log('atp_snapshot_hook: l_count: '|| nvl(l_count,0));
8914 
8915         IF ( NVL(l_count,0) > 0) THEN
8916         msc_util.msc_log('atp_snapshot_hook: Updating msc_plan_organizations..');
8917         UPDATE msc_plan_organizations mpo
8918         SET so_lrn =(SELECT so_lrn
8919                     FROM msc_instance_orgs mio
8920                     WHERE mio.sr_instance_id=mpo.sr_instance_id
8921                     AND mio.organization_id=mpo.organization_id
8922                      )
8923         WHERE plan_id=p_plan_id;
8924         --RETURNING organization_id, sr_instance_id
8925         --BULK COLLECT INTO l_organization_id, l_sr_instance_id;
8926         msc_util.msc_log('atp_snapshot_hook: No. of Rows updated: '|| SQL%ROWCOUNT );
8927         END IF;
8928 
8929         --bug3663487 start
8930         /*
8931         UPDATE msc_system_items mst1
8932         SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG
8933                     FROM msc_system_items mst2
8934                     WHERE mst2.sr_instance_id=mst1.sr_instance_id
8935                     AND mst2.organization_id=mst1.organization_id
8936                     AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8937                     AND mst2.plan_id=-1
8938                      )
8939         WHERE plan_id=p_plan_id;
8940         */
8941         -- ATP_RULE_ID and DEMAND_TIME_FENCE_DAYS is also flushed as we are using it in populate_atf_date
8942         -- to make its performance better.
8943         -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD
8944         /*
8945         FORALL j IN l_organization_id.first.. l_organization_id.last
8946         UPDATE msc_system_items mst1
8947         SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG,ATP_RULE_ID,DEMAND_TIME_FENCE_DAYS
8948                     FROM msc_system_items mst2
8949                     WHERE mst2.sr_instance_id=mst1.sr_instance_id
8950                     AND mst2.organization_id=mst1.organization_id
8951                     AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8952                     AND mst2.plan_id=-1
8953                      )
8954         WHERE plan_id=p_plan_id
8955         AND     mst1.ORGANIZATION_ID = l_organization_id(j)
8956         AND     mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
8957         AND     mst1.bom_item_type  in (1,4,5)
8958         AND     mst1.atp_flag <> 'N'
8959         OR      mst1.atp_components_flag <> 'N';
8960         */
8961         --bug3663487 end
8962 
8963         commit;
8964 
8965 EXCEPTION
8966 	WHEN others THEN
8967 	     msc_util.msc_log('Error in atp_snapshot_hook: ' || SQLCODE || '-' || SQLERRM);
8968 END atp_snapshot_hook;
8969 
8970 -- NGOEL 1/15/2004, API to delete CTO BOM and OSS data from ATP temp tables for standalone and post 24x7 plan run plan purging
8971 -- This API will be called by "Purge Plan" conc program.
8972 
8973 Procedure Delete_CTO_BOM_OSS(
8974           p_plan_id			IN		NUMBER)
8975 IS
8976 BEGIN
8977     msc_util.msc_log('Begin Delete_CTO_BOM_OSS for plan_id: ' || p_plan_id);
8978     msc_util.msc_log('Before Delete data for CTO BOM');
8979 
8980     DELETE msc_cto_bom
8981 	WHERE  nvl(plan_id, p_plan_id) = p_plan_id;
8982 
8983     msc_util.msc_log('After Delete data for CTO BOM: ' || SQL%ROWCOUNT);
8984 
8985     msc_util.msc_log('Before Delete data for CTO OSS');
8986 
8987     DELETE msc_cto_sources
8988 	WHERE  nvl(plan_id, p_plan_id) = p_plan_id;
8989 
8990     msc_util.msc_log('After Delete data for CTO OSS: ' || SQL%ROWCOUNT);
8991 
8992 	commit;
8993 
8994     msc_util.msc_log('End Delete_CTO_BOM_OSS');
8995 EXCEPTION
8996 	WHEN others THEN
8997 		 msc_util.msc_log('Exception in Delete_CTO_BOM_OSS :' || SQLCODE || '-' || SQLERRM);
8998 END Delete_CTO_BOM_OSS;
8999 
9000 END MSC_POST_PRO;