DBA Data[Home] [Help]

PACKAGE BODY: APPS.MSC_POST_PRO

Source


1 PACKAGE BODY MSC_POST_PRO
2 -- $Header: MSCPOSTB.pls 120.22 2011/10/13 09:19:37 vjuluri 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(l_msc_schema, '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(l_msc_schema, '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; --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         --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 distinct 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         --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,70)
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,70)) 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,70)
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=>l_msc_schema,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=>l_msc_schema,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,70)
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,70)) 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,70)
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(l_msc_schema, 'MSC_TEMP_ALLOC_DEM_' || to_char(l_plan_id), granularity => 'ALL');
6127            fnd_stats.gather_table_stats(l_msc_schema, '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             DECODE(DEMAND_CLASS, NULL, '-1', MSC_AATP_FUNC.Get_Hierarchy_Demand_Class(
6203                                                   NULL,
6204                                                   NULL,
6205                                                   USING_ASSEMBLY_ITEM_ID,
6206                                                   ORGANIZATION_ID,
6207                                                   SR_INSTANCE_ID,
6208                                                   TRUNC(SYSDATE),
6209                                                   NULL,
6210                                                   DEMAND_CLASS)), --bug 13064033
6211             TRUNC(SYSDATE),
6212             using_requirement_quantity,
6213             demand_id,
6214             origination_type,
6215             ORDER_NUMBER,
6216             SALES_ORDER_LINE_ID,
6217             CREATED_BY,
6218             CREATION_DATE,
6219             LAST_UPDATED_BY,
6220             LAST_UPDATE_DATE,
6221             using_requirement_quantity
6222             from msc_demands
6223             where plan_id = p_plan_id
6224             and origination_type = -100
6225             and using_requirement_quantity <> 0
6226             );
6227 	msc_util.msc_log('inserted reservation rows in msc_alloc_demands :' || SQL%ROWCOUNT);
6228 
6229         BEGIN
6230             update msc_plans
6231             set    summary_flag = 3
6232             where  plan_id = p_plan_id;
6233         END;
6234 
6235 	RETCODE := G_SUCCESS;
6236 	commit;
6237 
6238 	msc_util.msc_log('End procedure post_plan_allocation');
6239 
6240 EXCEPTION
6241        WHEN OTHERS THEN
6242             msc_util.msc_log('Inside main exception of post_plan_allocation');
6243             msc_util.msc_log(sqlerrm);
6244             ERRBUF := sqlerrm;
6245 
6246             BEGIN
6247                update msc_plans
6248                set    summary_flag = 1
6249                where  plan_id = p_plan_id;
6250                commit;
6251             END;
6252 
6253             RETCODE := G_ERROR;
6254             IF (l_share_partition = 'Y') THEN
6255                ROLLBACK;
6256             ELSE
6257 	       msc_util.msc_log('Call procedure clean_temp_tables in exception');
6258 
6259 	       -- clean temp tables after exchanging partitions
6260 	       IF l_plan_id IS NOT NULL THEN
6261 	          clean_temp_tables(l_applsys_schema, l_plan_id, p_plan_id, NULL);
6262 	       END IF;
6263 
6264 	       msc_util.msc_log('After procedure clean_temp_tables in exception');
6265             END IF;
6266 END post_plan_allocation;
6267 
6268 -- ngoel 5/7/2002, added new API to be called from planning process to launch concurrent program
6269 -- for post-plan process for summary/ pre-allocation process.
6270 
6271 procedure atp_post_plan_proc(
6272         p_plan_id               IN      NUMBER,
6273         p_alloc_mode            IN      NUMBER := 0,
6274         p_summary_mode          IN      NUMBER := 0,
6275         x_retcode		OUT	NoCopy NUMBER,
6276         x_errbuf		OUT	NoCopy VARCHAR2
6277 )
6278 IS
6279 l_count                         NUMBER:=0; -- bug 10173431
6280 l_count1                        NUMBER:=0; -- bug 10173431
6281 l_inv_ctp                       NUMBER;
6282 l_alloc_atp                     VARCHAR2(1);
6283 l_class_hrchy                   NUMBER;
6284 l_alloc_method                  NUMBER;
6285 l_enable_summary_mode           VARCHAR2(1);
6286 -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6287 --l_submit_request                VARCHAR2(1) := 'N';
6288 l_request_id			NUMBER;
6289 
6290 -- 24x7 ATP
6291 l_copy_plan_id                  NUMBER;
6292 
6293 BEGIN
6294     msc_util.msc_log('Begin procedure atp_post_plan_proc');
6295     msc_util.msc_log('plan : ' || p_plan_id);
6296     msc_util.msc_log('Allocation Mode : ' || p_alloc_mode);
6297     msc_util.msc_log('Summary Mode : ' || p_summary_mode);
6298 
6299     x_retcode := G_SUCCESS;
6300 
6301     l_inv_ctp := NVL(FND_PROFILE.value('INV_CTP'), 5);
6302 
6303     msc_util.msc_log('inv_ctp := ' || l_inv_ctp);
6304 
6305     /* time_phased_atp changes begin
6306        Always call atp post plan processing conc prog if PDS
6307     IF l_enable_summary_mode = 'Y' AND l_inv_ctp = 4 AND l_alloc_atp = 'N' THEN
6308        l_submit_request := 'Y';
6309     ELSIF l_inv_ctp = 4 AND l_alloc_atp = 'Y' AND l_class_hrchy = 1 AND l_alloc_method = 1 THEN
6310        l_submit_request := 'Y';
6311     END IF;
6312 
6313     -- Bug 3491498, this variable is not being used anymore after timephased ATP changes
6314     IF l_inv_ctp = 4 THEN
6315        l_submit_request := 'Y';
6316     END IF;*/
6317     -- time_phased_atp changes end
6318 
6319     ---bug 3274373
6320     IF l_inv_ctp = 4 THEN
6321 
6322 	   -- Bug 3491498, check if plan is ATPable. Moved up to check it prior to refresh MSC_ATP_PLAN_SN
6323        SELECT count(*)
6324        INTO   l_count
6325        FROM   msc_plans plans,
6326               msc_designators desig
6327        WHERE  desig.inventory_atp_flag = 1
6328        AND    plans.plan_id = p_plan_id
6329        AND    plans.compile_designator = desig.designator
6330        AND    plans.sr_instance_id = desig.sr_instance_id
6331        AND    plans.organization_id = desig.organization_id
6332        AND    plans.plan_completion_date is not null
6333        AND    plans.data_completion_date is not null
6334        -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6335        AND    plans.plan_type <> 4;
6336 
6337        msc_util.msc_log('Count	 for plan : ' || l_count);
6338 
6339        IF l_count > 0 THEN
6340           msc_util.msc_log('Before refreshing MSC_ATP_PLAN_SN');
6341           l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6342                                         'MSC',
6343                                         'MSCREFMV',
6344                                         NULL,   -- description
6345                                         NULL,   -- start time
6346                                         FALSE,  -- sub request
6347                                         'MSC_ATP_PLAN_SN',
6348                                         724);
6349           msc_util.msc_log('Request id for refreshing snapshot := ' || l_request_id);
6350           msc_util.msc_log('After refreshing MSC_ATP_PLAN_SN');
6351        END IF; 	--IF l_count = 0 THEN
6352     END IF;
6353 
6354     -- Bug 3491498, moved prior to call to refresh MSC_ATP_PLAN_SN
6355 /*
6356     SELECT count(*)
6357     INTO   l_count
6358     FROM   msc_plans plans,
6359            msc_designators desig
6360     WHERE  desig.inventory_atp_flag = 1
6361     AND    plans.plan_id = p_plan_id
6362     AND    plans.compile_designator = desig.designator
6363     AND    plans.sr_instance_id = desig.sr_instance_id
6364     AND    plans.organization_id = desig.organization_id
6365     AND    plans.plan_completion_date is not null
6366     AND    plans.data_completion_date is not null;
6367 
6368     msc_util.msc_log('Count for plan : ' || l_count);
6369     msc_util.msc_log('l_submit_request : ' || l_submit_request);
6370 */
6371 
6372     -- 24x7 ATP
6373     BEGIN
6374         select  nvl (copy_plan_id, -1)
6375         into    l_copy_plan_id
6376         from    msc_plans
6377         where   plan_id = p_plan_id
6378         -- IO Perf:3693983: Don't Launch ATP Post Plan Processes for IO Plans
6379         AND     plan_type <> 4;
6380     EXCEPTION
6381         when others then
6382             l_copy_plan_id := -1;
6383     END;
6384 
6385     msc_util.msc_log ('l_copy_plan_id = '||l_copy_plan_id);
6386 	-- bug 10173431
6387     IF l_copy_plan_id > 0 THEN
6388 
6389     SELECT count(*)
6390        INTO   l_count1
6391        FROM   msc_plans plans,
6392               msc_designators desig
6393        WHERE  desig.inventory_atp_flag = 1
6394        AND    plans.plan_id = l_copy_plan_id
6395        AND    plans.compile_designator = desig.designator
6396        AND    plans.sr_instance_id = desig.sr_instance_id
6397        AND    plans.organization_id = desig.organization_id
6398        AND    plans.plan_completion_date is not null
6399        AND    plans.data_completion_date is not null
6400        AND    plans.plan_type <> 4;
6401 
6402     END IF;
6403 
6404 	msc_util.msc_log ('Count for l_count1 = '||l_count1);
6405     if (l_copy_plan_id > 0 and l_count1 > 0) then
6406         -- plan copy exists . force the execution of other things.
6407         l_count := 1;
6408         msc_util.msc_log ('Plan determined to be a 24x7 plan');
6409     end if;
6410 
6411     IF l_count = 0 THEN
6412        UPDATE msc_plans
6413        SET    summary_flag = 1
6414        WHERE  plan_id = p_plan_id;
6415 
6416 	   COMMIT;
6417        RETURN;
6418     END IF;
6419 
6420     BEGIN
6421 	msc_util.msc_log('before launching concurrent program');
6422         -- Bug 3292949
6423         UPDATE msc_plans
6424         SET    summary_flag = 1
6425         WHERE  plan_id = p_plan_id;
6426         msc_util.msc_log('Reset summary flag back to default:1 before conc prg launch');
6427          -- End Bug 3292949
6428         l_request_id := FND_REQUEST.SUBMIT_REQUEST(
6429 					'MSC',
6430 					'MSC_ATP_PDS_SUMM',
6431 					NULL,   -- description
6432 					NULL,   -- start time
6433 					FALSE,  -- sub request
6434 					p_plan_id,
6435 					2); -- Bug 3478888 Pass calling module as 2 as
6436 					    -- ATP Post Plan Processing is called from planning
6437 
6438 	UPDATE msc_plans       /* for 24x7 ATP */
6439         SET     request_id = l_request_id
6440         WHERE   plan_id = p_plan_id;
6441 
6442 	COMMIT;
6443 
6444 	msc_util.msc_log('Request ID :' || l_request_id);
6445 
6446     EXCEPTION
6447         WHEN OTHERS THEN
6448              msc_util.msc_log ('Conc. program error : ' || sqlcode || ':' || sqlerrm);
6449 	     x_retcode := G_ERROR;
6450 	     x_errbuf := sqlerrm;
6451     END;
6452 END atp_post_plan_proc;
6453 
6454 /*
6455  * dsting 7/24/2002
6456  *
6457  * Deletes entries from mrp_atp_schedule_temp and mrp_atp_details_temp
6458  * older than p_hours old
6459  *
6460  */
6461 PROCEDURE ATP_Purge_MRP_Temp(
6462   ERRBUF		OUT	NoCopy VARCHAR2,
6463   RETCODE		OUT	NoCopy NUMBER,
6464   p_hours		IN	NUMBER
6465 )
6466 IS
6467 l_retain_date		DATE;
6468 -- rajjain 12/20/2002
6469 l_spid                          VARCHAR2(12);
6470 l_mrp_schema             	VARCHAR2(30); --bug3545959
6471 l_msc_schema             	VARCHAR2(30); --bug3940999
6472 BEGIN
6473 
6474         -- Bug 3304390 Disable Trace
6475         -- Deleted Related Code.
6476 
6477 	RETCODE := G_SUCCESS;
6478 
6479 	msc_util.msc_log('********** MRP_ATP_Purge_Temp **********');
6480 	msc_util.msc_log('p_hours: '      || p_hours );
6481 
6482 	IF NVL(p_hours,0) > 0 THEN
6483 
6484 		l_retain_date := sysdate - p_hours/24;
6485 
6486 		msc_util.msc_log('Delete records older than l_retain_date ' ||
6487 					   to_char(l_retain_date, 'DD:MM:YYYY hh24:mi:ss'));
6488 		msc_util.msc_log('Now sysdate: ' ||
6489 					   to_char(sysdate, 'DD:MM:YYYY hh24:mi:ss'));
6490 
6491 
6492 		DELETE FROM mrp_atp_schedule_temp
6493 		WHERE last_update_date < l_retain_date;
6494 
6495 		msc_util.msc_log('Records Deleted from mrp_atp_schedule_temp : ' ||
6496 					  SQL%ROWCOUNT);
6497 
6498                 --3670695: issue commit so that rollback segment is freed
6499                 commit;
6500 
6501 		DELETE FROM mrp_atp_details_temp
6502 		WHERE last_update_date < l_retain_date;
6503 
6504 		msc_util.msc_log('Records Deleted from mrp_atp_details_temp : ' ||
6505 					  SQL%ROWCOUNT);
6506                 --bug3940999
6507                 DELETE FROM msc_atp_src_profile_temp
6508 		WHERE last_update_date < l_retain_date;
6509 
6510 		msc_util.msc_log('Records Deleted from msc_atp_src_profile_temp : ' ||
6511 					  SQL%ROWCOUNT);
6512 
6513 	ELSE
6514 		msc_util.msc_log('completely purging temp tables');
6515                 --bug3545959 start
6516 	        SELECT  a.oracle_username
6517       	        INTO    l_mrp_schema
6518       	        FROM    FND_ORACLE_USERID a,
6519                         FND_PRODUCT_INSTALLATIONS b
6520       	        WHERE   a.oracle_id = b.oracle_id
6521       	        AND     b.application_id = 704;
6522 
6523       	        msc_util.msc_log('l_mrp_schema: '      || l_mrp_schema );
6524       	        --bug3545959 end
6525 		EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_schedule_temp';
6526 		EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_mrp_schema ||'.mrp_atp_details_temp';
6527 
6528 		--bug3940999
6529 		SELECT  a.oracle_username
6530       	        INTO    l_msc_schema
6531       	        FROM    FND_ORACLE_USERID a,
6532                         FND_PRODUCT_INSTALLATIONS b
6533       	        WHERE   a.oracle_id = b.oracle_id
6534       	        AND     b.application_id = 724;
6535 
6536       	        msc_util.msc_log('l_msc_schema: '      || l_msc_schema );
6537 
6538       	        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_msc_schema ||'.msc_atp_src_profile_temp';
6539 
6540 	END IF;
6541 
6542 	commit;
6543 EXCEPTION
6544     WHEN others THEN
6545          msc_util.msc_log('Error while purging temp tables : ' ||
6546 						sqlcode || ' : ' || sqlerrm);
6547          rollback;
6548 END ATP_Purge_MRP_Temp;
6549 
6550 
6551 -- New procedure for summary enhancement
6552 PROCEDURE LOAD_PLAN_SUMMARY_SD (p_plan_id               IN NUMBER,
6553                                 p_share_partition       IN varchar2,
6554                                 p_optimized_plan        IN NUMBER,  -- 1:Yes, 2:No
6555                                 p_full_refresh          IN NUMBER,  -- 1:Yes, 2:No
6556                                 p_time_phased_pf        IN NUMBER,  -- 1:Yes, 2:No
6557                                 p_plan_type             IN NUMBER,  -- ATP4drp
6558                                 p_last_refresh_number   IN NUMBER,
6559                                 p_new_refresh_number    IN NUMBER,
6560                                 p_sys_date              IN DATE)
6561 IS
6562     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
6563     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
6564     l_supplier_id_tab           MRP_ATP_PUB.number_arr;
6565     l_supplier_site_id_tab      MRP_ATP_PUB.number_arr;
6566     l_sd_date_tab               MRP_ATP_PUB.date_arr;
6567     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
6568     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6569     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6570     l_ins_supplier_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6571     l_ins_supplier_site_id_tab  MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6572     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
6573     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
6574 
6575     -- ATPR4drp
6576     l_plan_type                 NUMBER;
6577 BEGIN
6578     msc_util.msc_log('************ LOAD_PLAN_SUMMARY_SD begin *************');
6579     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_plan_id         - ' || p_plan_id);
6580     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_share_partition - ' || p_share_partition);
6581     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_optimized_plan  - ' || p_optimized_plan);
6582     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'p_full_refresh    - ' || p_full_refresh);
6583 
6584     -- ATP4drp changes begin
6585     -- print plan_type
6586 
6587     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Plan Type p_plan_type -> ' || p_plan_type);
6588     msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6589 
6590     -- END ATP4drp
6591 
6592 
6593     IF p_full_refresh = 1 THEN
6594         msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside full summation');
6595 
6596         -- first delete existing data. p_share_partition = 'N' data has already been deleted
6597         IF p_share_partition = 'Y' THEN
6598 
6599             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside shared part_partition');
6600             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'before deleteing data from the table');
6601 
6602             DELETE MSC_ATP_SUMMARY_SD where plan_id = p_plan_id;
6603             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After deleting data from the table');
6604 
6605         END IF; --- IF share_partition = 'Y'
6606 
6607         -- Now insert new data
6608         IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6609             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6610             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6611 
6612             load_sd_full_alloc(p_plan_id, p_sys_date);
6613 
6614             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6615         ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6616             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unallocated ATP');
6617             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6618 
6619             IF nvl(p_optimized_plan, 2) <> 1 THEN
6620                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Unconstrained plan');
6621                 IF p_time_phased_pf = 1 THEN
6622                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6623                     load_sd_full_unalloc_unopt_pf(p_plan_id, p_sys_date);
6624                 ELSE
6625                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6626                     load_sd_full_unalloc_unopt(p_plan_id, p_sys_date);
6627                 END IF;
6628             ELSE
6629                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Constrained plan');
6630                 IF p_time_phased_pf = 1 THEN
6631                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup exists.');
6632                     load_sd_full_unalloc_opt_pf(p_plan_id, p_sys_date);
6633                 ELSE
6634                     msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Time phased pf setup does not exist.');
6635                     -- ATP4drp Call DRP specific summary
6636                     IF (p_plan_type = 5) THEN
6637                        msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call FULL Summary for DRP plan.');
6638                        msc_sch_wb.atp_debug('----- ATP4drp Specific Debug Messages -----');
6639                        MSC_ATP_DRP.load_sd_full_drp(p_plan_id, p_sys_date);
6640                     ELSE -- Call rest summary
6641                        load_sd_full_unalloc_opt(p_plan_id, p_sys_date);
6642                     END IF;
6643                     -- End ATP4drp
6644                 END IF;
6645             END IF;
6646 
6647             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6648         END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6649 
6650 	ELSE --- IF p_full_refresh = 1 THEN
6651         msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside incremental summation');
6652 
6653         IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6654             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside demand priority allocated ATP');
6655             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6656 
6657             load_sd_net_alloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6658 
6659             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6660         ELSE -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6661             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Inside unallocated ATP');
6662             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Insert data into sd table');
6663 
6664             -- ATP4drp Call DRP specific summary
6665             IF (p_plan_type = 5) THEN
6666                 msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'Call NET Summary for DRP plan.');
6667                 MSC_ATP_DRP.load_sd_net_drp(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_sys_date);
6668             ELSE -- Call rest summary
6669                 load_sd_net_unalloc(p_plan_id, p_last_refresh_number, p_new_refresh_number, p_time_phased_pf, p_sys_date);
6670             END IF;
6671             -- ATP4drp
6672 
6673             msc_util.msc_log('LOAD_PLAN_SUMMARY_SD: ' || 'After inserting into MSC_ATP_SUMMARY_SD');
6674         END IF; -- IF G_ALLOC_ATP = 'Y' AND G_CLASS_HRCHY = 1 AND G_ALLOC_METHOD = 1 THEN
6675 
6676 	END IF; --- IF p_full_refresh = 1 THEN
6677 
6678 END LOAD_PLAN_SUMMARY_SD;
6679 
6680 -- summary enhancement : private procedure for full summation of supply/demand
6681 --                       for unconstrained plans for unallocated cases if no time
6682 --                       phased PF ATP setup exist for the plan
6683 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT(p_plan_id  IN NUMBER,
6684                                      p_sys_date IN DATE)
6685 IS
6686     l_user_id NUMBER;
6687 BEGIN
6688 
6689     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT Begin ********');
6690 
6691     l_user_id := FND_GLOBAL.USER_ID;
6692 
6693     INSERT INTO MSC_ATP_SUMMARY_SD (
6694             plan_id,
6695             sr_instance_id,
6696             organization_id,
6697             inventory_item_id,
6698             demand_class,
6699             sd_date,
6700             sd_qty,
6701             last_update_date,
6702             last_updated_by,
6703             creation_date,
6704             created_by)
6705    (SELECT  plan_id,
6706             sr_instance_id,
6707             organization_id,
6708             inventory_item_id,
6709             demand_class,
6710             SD_DATE,
6711             sum(sd_qty),
6712             last_update_date,
6713             last_updated_by,
6714             creation_date,
6715             created_by
6716             --Bug 6046524 added index hint for performance improvement.
6717     from   (SELECT /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6718                     I.plan_id plan_id,
6719                     I.sr_instance_id,
6720                     I.organization_id,
6721                     I.inventory_item_id,
6722                     '@@@' demand_class,
6723                     -- TRUNC(C.PRIOR_DATE) SD_DATE,
6724                     C.CALENDAR_DATE SD_DATE, -- 2859130
6725                     -1* DECODE(D.ORIGINATION_TYPE,
6726                                4, D.DAILY_DEMAND_RATE,
6727                                   D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6728                     p_sys_date last_update_date,
6729                     l_user_id last_updated_by,
6730                     p_sys_date creation_date,
6731                     l_user_id created_by
6732             FROM    MSC_SYSTEM_ITEMS I,
6733                     MSC_TRADING_PARTNERS P,
6734                     MSC_DEMANDS D,
6735                     MSC_CALENDAR_DATES C
6736             WHERE   I.ATP_FLAG = 'Y'
6737             AND     I.PLAN_ID = p_plan_id
6738             AND     D.PLAN_ID = I.PLAN_ID
6739             AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6740             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6741             AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
6742                     -- 1243985
6743             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
6744                     -- Bug 1530311, forecast to be excluded
6745             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6746             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6747             AND     C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6748                     -- since we store repetitive schedule demand in different ways for
6749                     -- ods (total quantity on start date) and pds  (daily quantity from
6750                     -- start date to end date), we need to make sure we only select work day
6751                     -- for pds's repetitive schedule demand.
6752                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6753             AND     C.CALENDAR_DATE
6754                         BETWEEN
6755                         TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6756                                      2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6757                                         NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6758                         AND
6759                         TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6760                                   DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6761                                      2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6762                                         NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6763             AND     ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6764                     (D.ORIGINATION_TYPE  <> 4))
6765             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6766             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6767             AND     P.PARTNER_TYPE    = 3
6768             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6769 
6770             UNION ALL
6771 
6772     --Bug 6046524 added index hint for performance improvement.
6773             SELECT  /*+ ORDERED index(C,MSC_CALENDAR_DATES_U1)*/
6774                     I.plan_id plan_id,
6775                     I.sr_instance_id,
6776                     I.organization_id,
6777                     I.inventory_item_id,
6778                     '@@@' demand_class,
6779                     -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6780                     C.CALENDAR_DATE SD_DATE,
6781                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
6782                     p_sys_date last_update_date,
6783                     l_user_id last_updated_by,
6784                     p_sys_date creation_date,
6785                     l_user_id created_by
6786             FROM    MSC_SYSTEM_ITEMS I,
6787                     MSC_TRADING_PARTNERS P,
6788                     MSC_SUPPLIES S,
6789                     MSC_CALENDAR_DATES C
6790             WHERE   I.ATP_FLAG = 'Y'
6791             AND     I.PLAN_ID = p_plan_id
6792             AND     S.PLAN_ID = I.PLAN_ID
6793             AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6794             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6795             AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
6796                     -- Exclude Cancelled Supplies 2460645
6797             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6798             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6799             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6800             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6801             AND     C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6802             AND     C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6803             AND     TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6804             AND     DECODE(S.LAST_UNIT_COMPLETION_DATE,
6805                            NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6806             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6807             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6808             AND     P.PARTNER_TYPE    = 3
6809             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6810            )
6811     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6812             last_update_date, last_updated_by, creation_date, created_by );
6813 
6814     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6815     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT End ********');
6816 
6817 END LOAD_SD_FULL_UNALLOC_UNOPT;
6818 
6819 
6820 -- summary enhancement : private procedure for full summation of supply/demand
6821 --                       for unconstrained plans for unallocated cases if time
6822 --                       phased PF ATP setup exists for the plan
6823 PROCEDURE LOAD_SD_FULL_UNALLOC_UNOPT_PF(p_plan_id  IN NUMBER,
6824                                         p_sys_date IN DATE)
6825 IS
6826     l_user_id NUMBER;
6827 BEGIN
6828 
6829     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF Begin ********');
6830 
6831     l_user_id := FND_GLOBAL.USER_ID;
6832 
6833     INSERT INTO MSC_ATP_SUMMARY_SD (
6834             plan_id,
6835             sr_instance_id,
6836             organization_id,
6837             inventory_item_id,
6838             demand_class,
6839             sd_date,
6840             sd_qty,
6841             last_update_date,
6842             last_updated_by,
6843             creation_date,
6844             created_by)
6845    (SELECT  plan_id,
6846             sr_instance_id,
6847             organization_id,
6848             inventory_item_id,
6849             demand_class,
6850             SD_DATE,
6851             sum(sd_qty),
6852             last_update_date,
6853             last_updated_by,
6854             creation_date,
6855             created_by
6856     from   (SELECT /*+ ORDERED */
6857                     I.plan_id plan_id,
6858                     I.sr_instance_id,
6859                     I.organization_id,
6860                     I.inventory_item_id,
6861                     '@@@' demand_class,
6862                     -- TRUNC(C.PRIOR_DATE) SD_DATE,
6863                     C.CALENDAR_DATE SD_DATE, -- 2859130
6864                     -1* DECODE(D.ORIGINATION_TYPE,
6865                                4, D.DAILY_DEMAND_RATE,
6866                                   D.USING_REQUIREMENT_QUANTITY) SD_QTY,
6867                     p_sys_date last_update_date,
6868                     l_user_id last_updated_by,
6869                     p_sys_date creation_date,
6870                     l_user_id created_by
6871             FROM    MSC_SYSTEM_ITEMS I,
6872                     MSC_TRADING_PARTNERS P,
6873                     MSC_DEMANDS D,
6874                     MSC_CALENDAR_DATES C
6875             WHERE   I.ATP_FLAG = 'Y'
6876             AND     I.PLAN_ID = p_plan_id
6877             AND     D.PLAN_ID = I.PLAN_ID
6878             AND     D.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6879             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6880             AND     D.ORGANIZATION_ID = I.ORGANIZATION_ID
6881                     -- 1243985
6882             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
6883                     -- Bug 1530311, forecast to be excluded
6884             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6885             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6886             AND     C.SR_INSTANCE_ID = D.SR_INSTANCE_ID
6887                     -- since we store repetitive schedule demand in different ways for
6888                     -- ods (total quantity on start date) and pds  (daily quantity from
6889                     -- start date to end date), we need to make sure we only select work day
6890                     -- for pds's repetitive schedule demand.
6891                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
6892             AND     C.CALENDAR_DATE
6893                         BETWEEN TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6894                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6895                                                 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))
6896                         AND     TRUNC(NVL(D.ASSEMBLY_DEMAND_COMP_DATE,
6897                                           DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
6898                                              2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
6899                                                 NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))))--plan by request date, promise date or schedule date
6900             AND     ((D.ORIGINATION_TYPE = 4 AND C.SEQ_NUM IS NOT NULL) OR
6901                     (D.ORIGINATION_TYPE  <> 4))
6902             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6903             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6904             AND     P.PARTNER_TYPE    = 3
6905             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6906             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6907 
6908             UNION ALL
6909 
6910             SELECT  /*+ ORDERED */
6911                     I.plan_id plan_id,
6912                     I.sr_instance_id,
6913                     I.organization_id,
6914                     I.inventory_item_id,
6915                     '@@@' demand_class,
6916                     -- TRUNC(C.NEXT_DATE) SD_DATE, -- 2859130
6917                     C.CALENDAR_DATE SD_DATE,
6918                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
6919                     p_sys_date last_update_date,
6920                     l_user_id last_updated_by,
6921                     p_sys_date creation_date,
6922                     l_user_id created_by
6923             FROM    MSC_SYSTEM_ITEMS I,
6924                     MSC_TRADING_PARTNERS P,
6925                     MSC_SUPPLIES S,
6926                     MSC_CALENDAR_DATES C
6927             WHERE   I.ATP_FLAG = 'Y'
6928             AND     I.PLAN_ID = p_plan_id
6929             AND     S.PLAN_ID = I.PLAN_ID
6930             AND     S.SR_INSTANCE_ID = I.SR_INSTANCE_ID
6931             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
6932             AND     S.ORGANIZATION_ID = I.ORGANIZATION_ID
6933                     -- Exclude Cancelled Supplies 2460645
6934             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2 -- Bug 2460645
6935             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0 -- 1243985
6936             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
6937             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
6938             AND     C.SR_INSTANCE_ID = S.SR_INSTANCE_ID
6939             AND     C.CALENDAR_DATE BETWEEN TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE))
6940             AND     TRUNC(NVL(S.LAST_UNIT_COMPLETION_DATE, NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)))
6941             AND     DECODE(S.LAST_UNIT_COMPLETION_DATE,
6942                            NULL, C.NEXT_SEQ_NUM, C.SEQ_NUM) IS NOT NULL
6943             AND     I.ORGANIZATION_ID = P.SR_TP_ID
6944             AND     I.SR_INSTANCE_ID  = P.SR_INSTANCE_ID
6945             AND     P.PARTNER_TYPE    = 3
6946             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
6947             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
6948 
6949             UNION ALL
6950 
6951             SELECT  /*+ ORDERED */
6952                     AD.plan_id,
6953                     AD.sr_instance_id,
6954                     AD.organization_id,
6955                     AD.inventory_item_id,
6956                     '@@@' demand_class,
6957                     TRUNC(AD.demand_date) SD_DATE,
6958                     -1 * AD.allocated_quantity SD_QTY,
6959                     p_sys_date last_update_date,
6960                     l_user_id last_updated_by,
6961                     p_sys_date creation_date,
6962                     l_user_id created_by
6963             FROM    MSC_ALLOC_DEMANDS AD
6964             WHERE   AD.PLAN_ID = p_plan_id
6965             AND     AD.allocated_quantity <> 0
6966             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
6967 
6968             UNION ALL
6969 
6970             SELECT  /*+ ORDERED */
6971                     SA.plan_id,
6972                     SA.sr_instance_id,
6973                     SA.organization_id,
6974                     SA.inventory_item_id,
6975                     '@@@' demand_class,
6976                     TRUNC(SA.supply_date) SD_DATE,
6977                     SA.allocated_quantity SD_QTY,
6978                     p_sys_date last_update_date,
6979                     l_user_id last_updated_by,
6980                     p_sys_date creation_date,
6981                     l_user_id created_by
6982             FROM    MSC_ALLOC_SUPPLIES SA
6983             WHERE   SA.PLAN_ID = p_plan_id
6984             AND     SA.allocated_quantity <> 0
6985             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
6986            )
6987     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id,demand_class, sd_date,
6988             last_update_date, last_updated_by, creation_date, created_by );
6989 
6990     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_UNOPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
6991     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_UNOPT_PF End ********');
6992 
6993 END LOAD_SD_FULL_UNALLOC_UNOPT_PF;
6994 
6995 
6996 -- summary enhancement : private procedure for full summation of supply/demand
6997 --                       for constrained plans for unallocated cases if no time
6998 --                       phased PF ATP setup exist for the plan
6999 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT(p_plan_id  IN NUMBER,
7000                                    p_sys_date IN DATE)
7001 IS
7002     l_user_id NUMBER;
7003 BEGIN
7004 
7005     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT Begin ********');
7006 
7007     l_user_id := FND_GLOBAL.USER_ID;
7008 
7009     INSERT INTO MSC_ATP_SUMMARY_SD (
7010             plan_id,
7011             sr_instance_id,
7012             organization_id,
7013             inventory_item_id,
7014             demand_class,
7015             sd_date,
7016             sd_qty,
7017             last_update_date,
7018             last_updated_by,
7019             creation_date,
7020             created_by)
7021    (SELECT  plan_id,
7022             sr_instance_id,
7023             organization_id,
7024             inventory_item_id,
7025             demand_class,
7026             SD_DATE,
7027             sum(sd_qty),
7028             last_update_date,
7029             last_updated_by,
7030             creation_date,
7031             created_by
7032     from   (SELECT  /*+ ORDERED */
7033                     I.plan_id plan_id,
7034                     I.sr_instance_id,
7035                     I.organization_id,
7036                     I.inventory_item_id,
7037                     '@@@' demand_class,
7038                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7039                     TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7040                                  2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7041                                     NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7042                                     --plan by request date, promise date or schedule date -- 2859130
7043                     -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7044                     p_sys_date last_update_date,
7045                     l_user_id last_updated_by,
7046                     p_sys_date creation_date,
7047                     l_user_id created_by
7048             FROM    MSC_SYSTEM_ITEMS I,
7049                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7050                                                 -- Not required as calendar has been removed
7051                     MSC_DEMANDS D
7052             WHERE   I.ATP_FLAG          = 'Y'
7053             AND     I.PLAN_ID           = p_plan_id
7054             AND     D.PLAN_ID           = I.PLAN_ID
7055             AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7056             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7057             AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7058             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7059             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7060             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7061             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7062             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7063 
7064             UNION ALL
7065 
7066             SELECT  /*+ ORDERED */
7067                     I.plan_id plan_id,
7068                     I.sr_instance_id,
7069                     I.organization_id,
7070                     I.inventory_item_id,
7071                     '@@@' demand_class,
7072                     TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7073                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
7074                     p_sys_date last_update_date,
7075                     l_user_id last_updated_by,
7076                     p_sys_date creation_date,
7077                     l_user_id created_by
7078             FROM    MSC_SYSTEM_ITEMS I,
7079                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7080                                                 -- Not required as calendar has been removed
7081                     MSC_SUPPLIES S
7082             WHERE   I.ATP_FLAG          = 'Y'
7083             AND     I.PLAN_ID           = p_plan_id
7084             AND     S.PLAN_ID           = I.PLAN_ID
7085             AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7086             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7087             AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7088             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7089             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7090             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7091             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7092             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7093             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7094            )
7095     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7096              last_update_date, last_updated_by, creation_date, created_by );
7097 
7098     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7099     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT End ********');
7100 
7101 END LOAD_SD_FULL_UNALLOC_OPT;
7102 
7103 
7104 -- summary enhancement : private procedure for full summation of supply/demand
7105 --                       for constrained plans for unallocated cases if time
7106 --                       phased PF ATP setup exists for the plan
7107 PROCEDURE LOAD_SD_FULL_UNALLOC_OPT_PF(p_plan_id  IN NUMBER,
7108                                       p_sys_date IN DATE)
7109 IS
7110     l_user_id NUMBER;
7111 BEGIN
7112 
7113     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF Begin ********');
7114 
7115     l_user_id := FND_GLOBAL.USER_ID;
7116 
7117     INSERT INTO MSC_ATP_SUMMARY_SD (
7118             plan_id,
7119             sr_instance_id,
7120             organization_id,
7121             inventory_item_id,
7122             demand_class,
7123             sd_date,
7124             sd_qty,
7125             last_update_date,
7126             last_updated_by,
7127             creation_date,
7128             created_by)
7129    (SELECT  plan_id,
7130             sr_instance_id,
7131             organization_id,
7132             inventory_item_id,
7133             demand_class,
7134             SD_DATE,
7135             sum(sd_qty),
7136             last_update_date,
7137             last_updated_by,
7138             creation_date,
7139             created_by
7140     from   (SELECT  /*+ ORDERED */
7141                     I.plan_id plan_id,
7142                     I.sr_instance_id,
7143                     I.organization_id,
7144                     I.inventory_item_id,
7145                     '@@@' demand_class,
7146                     -- Bug 3574164 DMD_SATISFIED_DATE IS CHANGED TO PLANNED_SHIP_DATE.
7147                     TRUNC(DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7148                                  2, NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE),
7149                                     NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE))) SD_DATE,
7150                                     --plan by request date, promise date or schedule date -- 2859130
7151                     -1* D.USING_REQUIREMENT_QUANTITY SD_QTY,
7152                     p_sys_date last_update_date,
7153                     l_user_id last_updated_by,
7154                     p_sys_date creation_date,
7155                     l_user_id created_by
7156             FROM    MSC_SYSTEM_ITEMS I,
7157                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7158                                                 -- Not required as calendar has been removed
7159                     MSC_DEMANDS D
7160             WHERE   I.ATP_FLAG          = 'Y'
7161             AND     I.PLAN_ID           = p_plan_id
7162             AND     D.PLAN_ID           = I.PLAN_ID
7163             AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7164             AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7165             AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7166             AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7167             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7168             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7169             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7170             AND     D.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7171             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7172 
7173             UNION ALL
7174 
7175             SELECT  /*+ ORDERED */
7176                     I.plan_id plan_id,
7177                     I.sr_instance_id,
7178                     I.organization_id,
7179                     I.inventory_item_id,
7180                     '@@@' demand_class,
7181                     TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7182                     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY,
7183                     p_sys_date last_update_date,
7184                     l_user_id last_updated_by,
7185                     p_sys_date creation_date,
7186                     l_user_id created_by
7187             FROM    MSC_SYSTEM_ITEMS I,
7188                     -- MSC_TRADING_PARTNERS P,  -- Removed with summary enhancement changes
7189                                                 -- Not required as calendar has been removed
7190                     MSC_SUPPLIES S
7191             WHERE   I.ATP_FLAG          = 'Y'
7192             AND     I.PLAN_ID           = p_plan_id
7193             AND     S.PLAN_ID           = I.PLAN_ID
7194             AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7195             AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7196             AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7197             AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
7198             AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0
7199             --AND   I.ORGANIZATION_ID   = P.SR_TP_ID        -- Removed with summary enhancement
7200             --AND   I.SR_INSTANCE_ID    = P.SR_INSTANCE_ID  -- changes. Not required as calendar
7201             --AND   P.PARTNER_TYPE      = 3                 -- has been removed
7202             AND     S.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
7203             AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7204 
7205             UNION ALL
7206 
7207             SELECT  /*+ ORDERED */
7208                     AD.plan_id,
7209                     AD.sr_instance_id,
7210                     AD.organization_id,
7211                     AD.inventory_item_id,
7212                     '@@@' demand_class,
7213                     TRUNC(AD.demand_date) SD_DATE,
7214                     -1 * AD.allocated_quantity SD_QTY,
7215                     p_sys_date last_update_date,
7216                     l_user_id last_updated_by,
7217                     p_sys_date creation_date,
7218                     l_user_id created_by
7219             FROM    MSC_ALLOC_DEMANDS AD
7220             WHERE   AD.PLAN_ID = p_plan_id
7221             AND     AD.allocated_quantity <> 0
7222             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7223 
7224             UNION ALL
7225 
7226             SELECT  /*+ ORDERED */
7227                     SA.plan_id,
7228                     SA.sr_instance_id,
7229                     SA.organization_id,
7230                     SA.inventory_item_id,
7231                     '@@@' demand_class,
7232                     TRUNC(SA.supply_date) SD_DATE,
7233                     SA.allocated_quantity SD_QTY,
7234                     p_sys_date last_update_date,
7235                     l_user_id last_updated_by,
7236                     p_sys_date creation_date,
7237                     l_user_id created_by
7238             FROM    MSC_ALLOC_SUPPLIES SA
7239             WHERE   SA.PLAN_ID = p_plan_id
7240             AND     SA.allocated_quantity <> 0
7241             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7242            )
7243     GROUP BY plan_id, inventory_item_id,organization_id, sr_instance_id, demand_class, sd_date,
7244              last_update_date, last_updated_by, creation_date, created_by );
7245 
7246     msc_util.msc_log('LOAD_SD_FULL_UNALLOC_OPT_PF: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7247     msc_util.msc_log('******** LOAD_SD_FULL_UNALLOC_OPT_PF End ********');
7248 
7249 END LOAD_SD_FULL_UNALLOC_OPT_PF;
7250 
7251 
7252 -- summary enhancement : private procedure for full summation of supply/demand
7253 --                       for allocated cases. separate procedures for PF/non-PF
7254 --                       cases are not required because we always select from
7255 --                       alloc tables. separate procedures for opt/unopt not required
7256 --                       because data in alloc tables is populated using pegging and
7257 --                       pegging for repetitive schedules would not have been generated
7258 --                       on non-working days.
7259 PROCEDURE LOAD_SD_FULL_ALLOC(p_plan_id  IN NUMBER,
7260                              p_sys_date IN DATE)
7261 IS
7262     l_user_id  number;
7263 BEGIN
7264 
7265     msc_util.msc_log('******** LOAD_SD_FULL_ALLOC Begin ********');
7266 
7267     l_user_id := FND_GLOBAL.USER_ID;
7268 
7269     INSERT INTO MSC_ATP_SUMMARY_SD (
7270             plan_id,
7271             sr_instance_id,
7272             organization_id,
7273             inventory_item_id,
7274             demand_class,
7275             sd_date,
7276             sd_qty,
7277             last_update_date,
7278             last_updated_by,
7279             creation_date,
7280             created_by)
7281    (SELECT  plan_id,
7282             sr_instance_id,
7283             organization_id,
7284             inventory_item_id,
7285             demand_class,
7286             SD_DATE,
7287             sum(sd_qty),
7288             last_update_date,
7289             last_updated_by,
7290             creation_date,
7291             created_by
7292     from   (SELECT  /*+ ORDERED */
7293                     AD.plan_id,
7294                     AD.sr_instance_id,
7295                     AD.organization_id,
7296                     AD.inventory_item_id,
7297                     AD.demand_class,
7298                     TRUNC(AD.demand_date) SD_DATE,
7299                     -1 * AD.allocated_quantity SD_QTY,
7300                     p_sys_date last_update_date,
7301                     l_user_id last_updated_by,
7302                     p_sys_date creation_date,
7303                     l_user_id created_by
7304             FROM    MSC_ALLOC_DEMANDS AD
7305             WHERE   AD.PLAN_ID = p_plan_id
7306             AND     AD.allocated_quantity <> 0
7307             AND     AD.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7308 
7309             UNION ALL
7310 
7311             SELECT  /*+ ORDERED */
7312                     SA.plan_id,
7313                     SA.sr_instance_id,
7314                     SA.organization_id,
7315                     SA.inventory_item_id,
7316                     SA.demand_class,
7317                     TRUNC(SA.supply_date) SD_DATE,
7318                     SA.allocated_quantity SD_QTY,
7319                     p_sys_date last_update_date,
7320                     l_user_id last_updated_by,
7321                     p_sys_date creation_date,
7322                     l_user_id created_by
7323             FROM    MSC_ALLOC_SUPPLIES SA
7324             WHERE   SA.PLAN_ID = p_plan_id
7325             AND     SA.allocated_quantity <> 0
7326             AND     SA.refresh_number IS NULL   -- consider only planning records in full summation - summary enhancement
7327            )
7328     GROUP BY plan_id, inventory_item_id, organization_id, sr_instance_id,demand_class, sd_date,
7329             last_update_date, last_updated_by, creation_date, created_by
7330     HAVING sum(SD_QTY) <> 0);
7331 
7332     msc_util.msc_log('LOAD_SD_FULL_ALLOC: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7333     msc_util.msc_log('******** LOAD_SD_FULL_ALLOC End ********');
7334 
7335 END LOAD_SD_FULL_ALLOC;
7336 
7337 
7338 -- summary enhancement : private procedure for net summation of supply/demand
7339 --                       for unallocated cases. separate procedures for opt/unopt not required
7340 --                       because we bother only about ATP generated records.
7341 PROCEDURE LOAD_SD_NET_UNALLOC(p_plan_id             IN NUMBER,
7342                               p_last_refresh_number IN NUMBER,
7343                               p_new_refresh_number  IN NUMBER,
7344                               p_time_phased_pf      IN NUMBER, -- 1:Yes, 2:No
7345                               p_sys_date            IN DATE)
7346 IS
7347     l_user_id   number;
7348     j           pls_integer;
7349     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7350     l_organization_id_tab       MRP_ATP_PUB.number_arr;
7351     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7352     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7353     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7354     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7355     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7356     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7357     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7358     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7359 
7360     CURSOR c_net_sd (p_plan_id             IN NUMBER,
7361                      p_last_refresh_number IN NUMBER,
7362                      p_new_refresh_number  IN NUMBER)
7363     IS
7364         SELECT  sr_instance_id,
7365                 organization_id,
7366                 inventory_item_id,
7367                 SD_DATE,
7368                 sum(sd_qty)
7369                 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7370                 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7371         from   (SELECT  I.sr_instance_id,
7372                         I.organization_id,
7373                         I.inventory_item_id,
7374                         TRUNC(DECODE(D.RECORD_SOURCE,
7375                                      2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7376                                         DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7377                                                2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7378                                                   NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7379                                                   --plan by request date, promise date or schedule date
7380                         decode(D.USING_REQUIREMENT_QUANTITY,            -- Consider unscheduled orders as dummy supplies
7381                                0, D.OLD_DEMAND_QUANTITY,                -- For summary enhancement
7382                                   -1 * D.USING_REQUIREMENT_QUANTITY)  SD_QTY
7383                 FROM    MSC_SYSTEM_ITEMS I,
7384                         MSC_DEMANDS D
7385                 WHERE   I.ATP_FLAG          = 'Y'
7386                 AND     I.PLAN_ID           = p_plan_id
7387                 AND     D.PLAN_ID           = I.PLAN_ID
7388                 AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7389                 AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7390                 AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7391                 AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7392                 AND     D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7393 
7394                 UNION ALL
7395 
7396                 SELECT  I.sr_instance_id,
7397                         I.organization_id,
7398                         I.inventory_item_id,
7399                         TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7400                         NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY
7401                 FROM    MSC_SYSTEM_ITEMS I,
7402                         MSC_SUPPLIES S
7403                 WHERE   I.ATP_FLAG          = 'Y'
7404                 AND     I.PLAN_ID           = p_plan_id
7405                 AND     S.PLAN_ID           = I.PLAN_ID
7406                 AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7407                 AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7408                 AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7409                 AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2          -- These two conditions
7410                 AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0  -- may not be required
7411                 AND     S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7412                )
7413         GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7414 
7415 
7416     CURSOR c_net_sd_pf (p_plan_id             IN NUMBER,
7417                         p_last_refresh_number IN NUMBER,
7418                         p_new_refresh_number  IN NUMBER)
7419     IS
7420         SELECT  sr_instance_id,
7421                 organization_id,
7422                 inventory_item_id,
7423                 SD_DATE,
7424                 sum(sd_qty)
7425                 -- Bug 3550296 and 3574164. IMPLEMENT_DATE AND DMD_SATISFIED_DATE are changed to
7426                 -- IMPLEMENT_SHIP_DATE and PLANNED_SHIP_DATE resp.
7427         from   (SELECT  I.sr_instance_id,
7428                         I.organization_id,
7429                         I.inventory_item_id,
7430                         TRUNC(DECODE(D.RECORD_SOURCE,
7431                                      2, NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE),
7432                                         DECODE(MSC_ATP_PVT.G_HP_DEMAND_BUCKETING_PREF,
7433                                                2, NVL(D.IMPLEMENT_SHIP_DATE,NVL(D.FIRM_DATE,NVL(d.PLANNED_SHIP_DATE,d.USING_ASSEMBLY_DEMAND_DATE))),
7434                                                   NVL(D.SCHEDULE_SHIP_DATE,D.USING_ASSEMBLY_DEMAND_DATE)))) SD_DATE,
7435                                                   --plan by request date, promise date or schedule date
7436                         decode(D.USING_REQUIREMENT_QUANTITY,            -- Consider unscheduled orders as dummy supplies
7437                                0, D.OLD_DEMAND_QUANTITY,                -- For summary enhancement
7438                                   -1 * D.USING_REQUIREMENT_QUANTITY)  SD_QTY
7439                 FROM    MSC_SYSTEM_ITEMS I,
7440                         MSC_DEMANDS D
7441                 WHERE   I.ATP_FLAG          = 'Y'
7442                 AND     I.PLAN_ID           = p_plan_id
7443                 AND     D.PLAN_ID           = I.PLAN_ID
7444                 AND     D.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7445                 AND     D.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7446                 AND     D.ORGANIZATION_ID   = I.ORGANIZATION_ID
7447                 AND     D.ORIGINATION_TYPE NOT IN (5,7,8,9,11,15,22,28,29,31,70)
7448                 AND     D.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7449                 AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7450 
7451                 UNION ALL
7452 
7453                 SELECT  I.sr_instance_id,
7454                         I.organization_id,
7455                         I.inventory_item_id,
7456                         TRUNC(NVL(S.FIRM_DATE,S.NEW_SCHEDULE_DATE)) SD_DATE,
7457                         NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY)  SD_QTY
7458                 FROM    MSC_SYSTEM_ITEMS I,
7459                         MSC_SUPPLIES S
7460                 WHERE   I.ATP_FLAG          = 'Y'
7461                 AND     I.PLAN_ID           = p_plan_id
7462                 AND     S.PLAN_ID           = I.PLAN_ID
7463                 AND     S.SR_INSTANCE_ID    = I.SR_INSTANCE_ID
7464                 AND     S.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
7465                 AND     S.ORGANIZATION_ID   = I.ORGANIZATION_ID
7466                 AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2          -- These two conditions
7467                 AND     NVL(S.FIRM_QUANTITY,S.NEW_ORDER_QUANTITY) <> 0  -- may not be required
7468                 AND     S.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7469                 AND     I.AGGREGATE_TIME_FENCE_DATE IS NULL -- PF and members to be picked from alloc tables
7470 
7471                 UNION ALL
7472 
7473                 SELECT  AD.sr_instance_id,
7474                         AD.organization_id,
7475                         AD.inventory_item_id,
7476                         TRUNC(AD.demand_date) SD_DATE,
7477                         decode(AD.allocated_quantity,
7478                                0, AD.old_allocated_quantity,
7479                                   -1 * AD.allocated_quantity) SD_QTY
7480                 FROM    MSC_ALLOC_DEMANDS AD
7481                 WHERE   AD.PLAN_ID = p_plan_id
7482                 AND     AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7483 
7484                 UNION ALL
7485 
7486                 SELECT  SA.sr_instance_id,
7487                         SA.organization_id,
7488                         SA.inventory_item_id,
7489                         TRUNC(SA.supply_date) SD_DATE,
7490                         SA.allocated_quantity SD_QTY
7491                 FROM    MSC_ALLOC_SUPPLIES SA
7492                 WHERE   SA.PLAN_ID = p_plan_id
7493                 AND     SA.allocated_quantity <> 0
7494                 AND     SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7495                )
7496         GROUP BY inventory_item_id, organization_id, sr_instance_id, sd_date;
7497 
7498 BEGIN
7499 
7500     msc_util.msc_log('******** LOAD_SD_NET_UNALLOC Begin ********');
7501     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_last_refresh_number - ' || p_last_refresh_number);
7502     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_new_refresh_number -  ' || p_new_refresh_number);
7503     msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'p_time_phased_pf -      ' || p_time_phased_pf);
7504 
7505     l_user_id := FND_GLOBAL.USER_ID;
7506 
7507     IF p_time_phased_pf = 2 THEN
7508         OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7509         FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7510                                          l_organization_id_tab,
7511                                          l_inventory_item_id_tab,
7512                                          l_sd_date_tab,
7513                                          l_sd_quantity_tab;
7514         CLOSE c_net_sd;
7515     ELSE
7516         OPEN c_net_sd_pf(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7517         FETCH c_net_sd_pf BULK COLLECT INTO l_sr_instance_id_tab,
7518                                             l_organization_id_tab,
7519                                             l_inventory_item_id_tab,
7520                                             l_sd_date_tab,
7521                                             l_sd_quantity_tab;
7522         CLOSE c_net_sd_pf;
7523     END IF;
7524 
7525     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7526 
7527         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7528 
7529         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7530         UPDATE MSC_ATP_SUMMARY_SD
7531         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
7532                last_update_date  = p_sys_date,
7533                last_updated_by   = l_user_id
7534         WHERE  plan_id           = p_plan_id
7535         AND    sr_instance_id    = l_sr_instance_id_tab(j)
7536         AND    inventory_item_id = l_inventory_item_id_tab(j)
7537         AND    organization_id   = l_organization_id_tab(j)
7538         AND    sd_date           = l_sd_date_tab(j);
7539 
7540         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL UPDATE');
7541 
7542         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7543             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7544                 l_ins_sr_instance_id_tab.EXTEND;
7545                 l_ins_organization_id_tab.EXTEND;
7546                 l_ins_inventory_item_id_tab.EXTEND;
7547                 l_ins_sd_date_tab.EXTEND;
7548                 l_ins_sd_quantity_tab.EXTEND;
7549 
7550                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
7551                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
7552                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
7553                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
7554                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
7555             END IF;
7556         END LOOP;
7557 
7558         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7559 
7560             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7561 
7562             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7563             INSERT  INTO MSC_ATP_SUMMARY_SD (
7564                     plan_id,
7565                     sr_instance_id,
7566                     organization_id,
7567                     inventory_item_id,
7568                     demand_class,
7569                     sd_date,
7570                     sd_qty,
7571                     last_update_date,
7572                     last_updated_by,
7573                     creation_date,
7574                     created_by)
7575             VALUES (p_plan_id,
7576                     l_ins_sr_instance_id_tab(j),
7577                     l_ins_organization_id_tab(j),
7578                     l_ins_inventory_item_id_tab(j),
7579                     '@@@',
7580                     l_ins_sd_date_tab(j),
7581                     l_ins_sd_quantity_tab(j),
7582                     p_sys_date,
7583                     l_user_id,
7584                     p_sys_date,
7585                     l_user_id);
7586 
7587             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'After FORALL INSERT');
7588 
7589         ELSE
7590             msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records to be inserted');
7591         END IF;
7592     ELSE
7593         msc_util.msc_log('LOAD_SD_NET_UNALLOC: ' || 'No records fetched in the net cursor');
7594     END IF;
7595 
7596     msc_util.msc_log('******** LOAD_SD_NET_UNALLOC End ********');
7597 
7598 END LOAD_SD_NET_UNALLOC;
7599 
7600 
7601 -- summary enhancement : private procedure for net summation of supply/demand
7602 --                       for allocated cases.
7603 PROCEDURE LOAD_SD_NET_ALLOC(p_plan_id             IN NUMBER,
7604                             p_last_refresh_number IN NUMBER,
7605                             p_new_refresh_number  IN NUMBER,
7606                             p_sys_date            IN DATE)
7607 IS
7608     l_user_id   number;
7609     j           pls_integer;
7610     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7611     l_organization_id_tab       MRP_ATP_PUB.number_arr;
7612     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7613     l_demand_class_tab          MRP_ATP_PUB.char30_arr;
7614     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7615     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7616 
7617     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7618     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7619     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7620     l_ins_demand_class_tab      MRP_ATP_PUB.char30_arr := MRP_ATP_PUB.char30_arr();
7621     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7622     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7623 
7624     CURSOR c_net_sd (p_plan_id             IN NUMBER,
7625                      p_last_refresh_number IN NUMBER,
7626                      p_new_refresh_number  IN NUMBER)
7627     IS
7628         SELECT  sr_instance_id,
7629                 organization_id,
7630                 inventory_item_id,
7631                 demand_class,
7632                 SD_DATE,
7633                 sum(sd_qty)
7634         from   (SELECT  AD.sr_instance_id,
7635                         AD.organization_id,
7636                         AD.inventory_item_id,
7637                         AD.demand_class,
7638                         TRUNC(AD.demand_date) SD_DATE,
7639                         decode(AD.allocated_quantity,
7640                                0, AD.old_allocated_quantity,
7641                                   -1 * AD.allocated_quantity) SD_QTY
7642                 FROM    MSC_ALLOC_DEMANDS AD
7643                 WHERE   AD.PLAN_ID = p_plan_id
7644                 AND     AD.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7645 
7646                 UNION ALL
7647 
7648                 SELECT  SA.sr_instance_id,
7649                         SA.organization_id,
7650                         SA.inventory_item_id,
7651                         SA.demand_class,
7652                         TRUNC(SA.supply_date) SD_DATE,
7653                         decode(SA.ALLOCATED_QUANTITY,           -- Consider deleted stealing records as dummy demands
7654                                0, -1 * OLD_ALLOCATED_QUANTITY,  -- For summary enhancement
7655                                   SA.ALLOCATED_QUANTITY) SD_QTY
7656                 FROM    MSC_ALLOC_SUPPLIES SA
7657                 WHERE   SA.PLAN_ID = p_plan_id
7658                 AND     SA.REFRESH_NUMBER BETWEEN (p_last_refresh_number + 1) and p_new_refresh_number
7659                )
7660         GROUP BY inventory_item_id, organization_id, sr_instance_id, demand_class, sd_date;
7661 
7662 BEGIN
7663 
7664     msc_util.msc_log('******** LOAD_SD_NET_ALLOC Begin ********');
7665 
7666     l_user_id := FND_GLOBAL.USER_ID;
7667 
7668     OPEN c_net_sd(p_plan_id, p_last_refresh_number, p_new_refresh_number);
7669     FETCH c_net_sd BULK COLLECT INTO l_sr_instance_id_tab,
7670                                      l_organization_id_tab,
7671                                      l_inventory_item_id_tab,
7672                                      l_demand_class_tab,
7673                                      l_sd_date_tab,
7674                                      l_sd_quantity_tab;
7675     CLOSE c_net_sd;
7676 
7677     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
7678 
7679         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
7680 
7681         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
7682         UPDATE MSC_ATP_SUMMARY_SD
7683         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
7684                last_update_date  = p_sys_date,
7685                last_updated_by   = l_user_id
7686         WHERE  plan_id           = p_plan_id
7687         AND    sr_instance_id    = l_sr_instance_id_tab(j)
7688         AND    inventory_item_id = l_inventory_item_id_tab(j)
7689         AND    organization_id   = l_organization_id_tab(j)
7690         AND    sd_date           = l_sd_date_tab(j)
7691         AND    demand_class      = l_demand_class_tab(j);
7692 
7693         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL UPDATE');
7694 
7695         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
7696             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
7697                 l_ins_sr_instance_id_tab.EXTEND;
7698                 l_ins_organization_id_tab.EXTEND;
7699                 l_ins_inventory_item_id_tab.EXTEND;
7700                 l_ins_demand_class_tab.EXTEND;
7701                 l_ins_sd_date_tab.EXTEND;
7702                 l_ins_sd_quantity_tab.EXTEND;
7703 
7704                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
7705                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
7706                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
7707                 l_ins_demand_class_tab(l_ins_demand_class_tab.COUNT)            := l_demand_class_tab(j);
7708                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
7709                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
7710             END IF;
7711         END LOOP;
7712 
7713         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
7714 
7715             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
7716 
7717             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
7718             INSERT  INTO MSC_ATP_SUMMARY_SD (
7719                     plan_id,
7720                     sr_instance_id,
7721                     organization_id,
7722                     inventory_item_id,
7723                     demand_class,
7724                     sd_date,
7725                     sd_qty,
7726                     last_update_date,
7727                     last_updated_by,
7728                     creation_date,
7729                     created_by)
7730             VALUES (p_plan_id,
7731                     l_ins_sr_instance_id_tab(j),
7732                     l_ins_organization_id_tab(j),
7733                     l_ins_inventory_item_id_tab(j),
7734                     l_ins_demand_class_tab(j),
7735                     l_ins_sd_date_tab(j),
7736                     l_ins_sd_quantity_tab(j),
7737                     p_sys_date,
7738                     l_user_id,
7739                     p_sys_date,
7740                     l_user_id);
7741 
7742             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'After FORALL INSERT');
7743 
7744         ELSE
7745             msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records to be inserted');
7746         END IF;
7747     ELSE
7748         msc_util.msc_log('LOAD_SD_NET_ALLOC: ' || 'No records fetched in the net cursor');
7749     END IF;
7750 
7751     msc_util.msc_log('******** LOAD_SD_NET_ALLOC End ********');
7752 
7753 END LOAD_SD_NET_ALLOC;
7754 
7755 
7756 PROCEDURE LOAD_SUP_DATA_FULL(p_plan_id  IN NUMBER,
7757                              p_sys_date IN DATE)
7758 IS
7759     l_plan_start_date date;
7760     l_instance_id number;
7761     l_cutoff_date date;
7762     l_org_id number;
7763     -- l_default_atp_rule_id number;            -- Bug 3912422
7764     l_calendar_code  VARCHAR2(14);
7765     l_calendar_exception_set_id  NUMBER := -1;  -- Bug 3912422 - Initiallize to -1
7766     -- l_default_demand_class VARCHAR2(34);     -- Bug 3912422
7767     l_user_id  number;
7768     -- l_org_code     VARCHAR2(7);              -- Bug 3912422
7769 BEGIN
7770 
7771     msc_util.msc_log('******** LOAD_SUP_DATA_FULL Begin ********');
7772 
7773     SELECT  trunc(p.plan_start_date),
7774             p.sr_instance_id,
7775             p.organization_id,
7776             trunc(p.cutoff_date),
7777             tp.calendar_code
7778     INTO    l_plan_start_date,
7779             l_instance_id,
7780             l_org_id,
7781             l_cutoff_date,
7782             l_calendar_code
7783     FROM    msc_plans p,
7784             msc_trading_partners tp
7785     WHERE   p.plan_id           = p_plan_id
7786     AND     p.organization_id   = tp.sr_tp_id
7787     AND     p.sr_instance_id    = tp.sr_instance_id
7788     AND     tp.partner_type     = 3;
7789 
7790     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_plan_start_date = ' || l_plan_start_date);
7791     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_instance_id =     ' || l_instance_id);
7792     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_org_id =          ' || l_org_id);
7793     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'l_calendar_code =   ' || l_calendar_code);
7794 
7795     l_user_id := FND_GLOBAL.USER_ID;
7796 
7797     INSERT INTO MSC_ATP_SUMMARY_SUP(
7798                 plan_id,
7799                 sr_instance_id,
7800                 inventory_item_id,
7801                 supplier_id,
7802                 supplier_site_id,
7803                 sd_date,
7804                 sd_qty,
7805                 demand_class,
7806                 last_update_date,
7807                 last_updated_by,
7808                 creation_date,
7809                 created_by)
7810     (SELECT plan_id, sr_instance_id, inventory_item_id, supplier_id, supplier_site_id, sd_date, sum(sd_qty),
7811     demand_class, last_update_date, last_updated_by, creation_date, created_by
7812     FROM (
7813             SELECT  SV.plan_id plan_id,
7814                     SV.sr_instance_id,
7815                     SV.inventory_item_id inventory_item_id,
7816                     SV.supplier_id supplier_id,
7817                     SV.supplier_site_id supplier_site_id,
7818                     c.calendar_date sd_date, -- 2859130 remove trunc
7819                     SV.capacity sd_qty,
7820                     null demand_class,
7821                     p_sys_date last_update_date,
7822                     l_user_id last_updated_by,
7823                     p_sys_date creation_date,
7824                     l_user_id created_by
7825             FROM    msc_calendar_dates c,
7826                    (SELECT  /*+ LEADING (I) */
7827                             I.plan_id plan_id,
7828                             I.sr_instance_id,
7829                             I.inventory_item_id inventory_item_id,
7830                             S.supplier_id supplier_id,
7831                             S.supplier_site_id supplier_site_id,
7832                             S.capacity,
7833                             trunc(S.from_date) from_date,
7834                             trunc(S.to_date) to_date,
7835                             mis.delivery_calendar_code,
7836                             mis.supplier_lead_time_date
7837                     FROM    msc_system_items I,
7838                             msc_supplier_capacities s,
7839                             msc_item_suppliers mis                      -- Bug 3912422 - Move to the inner query
7840                     WHERE   I.plan_id = p_plan_id
7841                     AND     I.atp_components_flag in ('Y', 'C')
7842                     AND     s.inventory_item_id = I.inventory_item_id
7843                     AND     s.sr_instance_id = I.sr_instance_id
7844                     AND     s.plan_id = I.plan_id
7845                     AND     s.organization_id = i.organization_id       --\
7846                     AND     s.inventory_item_id = mis.inventory_item_id --|
7847                     AND     s.sr_instance_id = mis.sr_instance_id       --> Bug 3912422
7848                     AND     s.plan_id = mis.plan_id                     --|
7849                     AND     s.organization_id = mis.organization_id     --/
7850                     AND NOT EXISTS --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7851                     --AND     (I.inventory_item_id, S.supplier_id, nvl(S.supplier_site_id,-1)) NOT IN
7852                              -- Bug 3912422
7853                             (SELECT 'x'        -- summary is not supported with flex flences : summary enhancement
7854                              FROM   msc_supplier_flex_fences msff
7855                              WHERE  plan_id = p_plan_id
7856                              AND msff.inventory_item_id = s.inventory_item_id --\
7857                              AND msff.supplier_id = s.supplier_id             -- } Bug 3912422
7858                              AND msff.supplier_site_id = s.supplier_site_id   --/
7859                              AND rownum = 1)
7860                     group by I.plan_id,
7861                             I.inventory_item_id,
7862                             I.sr_instance_id,
7863                             s.supplier_id,
7864                             s.supplier_site_id,
7865                             s.capacity,
7866                             trunc(s.from_date),
7867                             trunc(s.to_date),
7868                             mis.delivery_calendar_code,
7869                             mis.supplier_lead_time_date) SV
7870                     -- msc_item_suppliers mis                           -- Bug 3912422 - Move to the inner query
7871             WHERE   /* SV.inventory_item_id        = mis.inventory_item_id
7872             AND     SV.supplier_id              = mis.supplier_id
7873             AND     nvl(SV.supplier_site_id,-1) = nvl(mis.supplier_site_id, -1)
7874             AND     SV.sr_instance_id           = mis.sr_instance_id
7875             AND     c.calendar_code             = nvl(mis.delivery_calendar_code, l_calendar_code)
7876             AND*/     c.calendar_code             = nvl(SV.delivery_calendar_code, l_calendar_code)
7877             AND     c.calendar_date BETWEEN trunc(SV.from_date)
7878                                     AND NVL(SV.to_date,l_cutoff_date)
7879             -- AND     (c.seq_num IS NOT NULL OR mis.delivery_calendar_code IS NULL) -- Bug 3912422
7880             AND     (c.seq_num IS NOT NULL OR SV.delivery_calendar_code IS NULL) -- NULL means FOC
7881             AND     c.exception_set_id          = l_calendar_exception_set_id
7882             AND     c.sr_instance_id            = l_instance_id
7883             -- AND     c.calendar_date             >= mis.supplier_lead_time_date -- Bug 3912422
7884             AND     c.calendar_date             > SV.supplier_lead_time_date
7885                     -- Bug 3912422 - We should start looking from the day after supplier_lead_time_date
7886                     -- to accomodate for planning's additional "-1". If SMC is found in ASL then this
7887                     -- would mean one day offset as per ASL. If it is FOC then it would mean starting
7888                     -- from the next day.
7889 
7890             UNION ALL
7891             -- Net out planned orders, purchase orders and purchase requisitions /
7892             -- bug 1303196
7893 
7894             SELECT  /*+ LEADING (I) */
7895                     I.plan_id,
7896                     I.sr_instance_id,
7897                     I.inventory_item_id,
7898                     P.supplier_id,
7899                     P.supplier_site_id,
7900                     DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7901                     (NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty,
7902                     null demand_class,
7903                     p_sys_date last_update_date,
7904                     l_user_id last_updated_by,
7905                     p_sys_date creation_date,
7906                     l_user_id created_by
7907             FROM    msc_supplies p,
7908             --      msc_trading_partners tp,
7909             --      msc_calendar_dates c,
7910             --      msc_calendar_dates c1,
7911                     msc_trading_partner_sites tps,
7912                     msc_system_items I
7913             WHERE   I.plan_id = p_plan_id
7914             AND     I.atp_components_flag in ( 'Y', 'C')
7915             AND     (p.order_type IN (5, 2)
7916                     OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
7917                         AND p.order_type = 1 AND p.promised_date IS NULL))
7918             AND     p.plan_id = I.plan_id
7919             AND     p.sr_instance_id = I.sr_instance_id
7920             AND     p.inventory_item_id = I.inventory_item_id
7921             AND     p.organization_id = I.organization_id
7922             AND     p.sr_instance_id  = I.sr_instance_id
7923             AND     NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
7924             AND     p.supplier_id is not null
7925             AND     p.supplier_id = tps.partner_id (+)
7926             AND     p.supplier_site_id = tps.partner_site_id (+)
7927             AND NOT EXISTS  --Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
7928             --AND     (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
7929                      -- Bug 3912422
7930                     (SELECT 'x'     -- summary is not supported with flex flences : summary enhancement
7931                      FROM   msc_supplier_flex_fences msff
7932                      WHERE  plan_id = p_plan_id
7933                      AND msff.inventory_item_id = p.inventory_item_id  --\
7934                      AND msff.supplier_id = p.supplier_id              -- } Bug 3912422
7935                      AND msff.supplier_site_id = p.supplier_site_id    --/
7936                      AND rownum = 1)
7937     /*      AND     tp.sr_tp_id = p.organization_id
7938             AND     tp.sr_instance_id = p.sr_instance_id
7939             AND     tp.partner_type = 3
7940             AND     c.calendar_date = trunc(p.new_schedule_date) -- 1529756
7941             AND     c.calendar_code = tp.calendar_code
7942             AND     c.exception_set_id = tp.calendar_exception_set_id
7943             AND     c.sr_instance_id = tp.sr_instance_id
7944             AND     c1.seq_num = c.prior_seq_num-
7945                                  nvl(I.postprocessing_lead_time, 0)
7946             AND     c1.calendar_code = c.calendar_code
7947             AND     c1.exception_set_id = c.exception_set_id
7948             AND     c1.sr_instance_id = c.sr_instance_id*/
7949             AND     p.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation  - summary enhancement
7950         )
7951     group by plan_id,inventory_item_id, supplier_id, supplier_site_id, sr_instance_id,
7952              sd_date, demand_class, last_update_date, last_updated_by, creation_date, created_by
7953     );
7954 
7955     msc_util.msc_log('LOAD_SUP_DATA_FULL: ' || 'Records inserted : ' || SQL%ROWCOUNT);
7956     msc_util.msc_log('******** LOAD_SUP_DATA_FULL End ********');
7957 
7958 END LOAD_SUP_DATA_FULL;
7959 
7960 
7961 PROCEDURE LOAD_SUP_DATA_NET(p_plan_id                   IN NUMBER,
7962                             p_last_refresh_number       IN NUMBER,
7963                             p_new_refresh_number        IN NUMBER,
7964                             p_sys_date                  IN DATE)
7965 IS
7966     l_user_id                   number;
7967     j                           pls_integer;
7968     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
7969     l_inventory_item_id_tab     MRP_ATP_PUB.number_arr;
7970     l_supplier_id_tab           MRP_ATP_PUB.number_arr;
7971     l_supplier_site_id_tab      MRP_ATP_PUB.number_arr;
7972     l_sd_date_tab               MRP_ATP_PUB.date_arr;
7973     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
7974 
7975     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7976     l_ins_inventory_item_id_tab MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7977     l_ins_supplier_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7978     l_ins_supplier_site_id_tab  MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7979     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
7980     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
7981 
7982     CURSOR c_net_sup (p_plan_id             IN NUMBER, -- Cursor does not require msc_supplier_capacities because
7983                       p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
7984                       p_new_refresh_number  IN NUMBER)
7985     IS
7986         SELECT  I.sr_instance_id,
7987                 I.inventory_item_id,
7988                 P.supplier_id,
7989                 P.supplier_site_id,
7990                 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date),
7991                 sum(NVL(p.implement_quantity,0) - p.new_order_quantity) sd_qty
7992         FROM    msc_supplies p,
7993         --      msc_trading_partners tp,
7994         --      msc_calendar_dates c,
7995         --      msc_calendar_dates c1,
7996                 msc_trading_partner_sites tps,
7997                 msc_system_items I
7998         WHERE   I.plan_id = p_plan_id
7999         AND     I.atp_components_flag in ( 'Y', 'C')
8000         AND     (p.order_type IN (5, 2)
8001                 OR (MSC_ATP_REQ.G_PURCHASE_ORDER_PREFERENCE = MSC_ATP_REQ.G_PROMISE_DATE
8002                     AND p.order_type = 1 AND p.promised_date IS NULL))
8003         AND     p.plan_id = I.plan_id
8004         AND     p.sr_instance_id = I.sr_instance_id
8005         AND     p.inventory_item_id = I.inventory_item_id
8006         AND     p.organization_id = I.organization_id
8007         AND     p.sr_instance_id  = I.sr_instance_id
8008         AND     NVL(P.DISPOSITION_STATUS_TYPE, 1) <> 2
8009         AND     p.supplier_id is not null
8010         AND     p.supplier_id = tps.partner_id (+)
8011         AND     p.supplier_site_id = tps.partner_site_id (+)
8012         AND NOT EXISTS -- Bug 3912422, Replaced 'NOT IN' by 'NOT EXISTS'
8013         --AND     (i.inventory_item_id, p.supplier_id, nvl(p.supplier_site_id,-1)) NOT IN
8014                 -- Bug 3912422
8015                 (SELECT 'x'      -- summary is not supported with flex flences : summary enhancement
8016                  FROM   msc_supplier_flex_fences msff
8017                  WHERE  plan_id = p_plan_id
8018                  AND msff.inventory_item_id = p.inventory_item_id  --\
8019                  AND msff.supplier_id = p.supplier_id              -- } Bug 3912422
8020                  AND msff.supplier_site_id = p.supplier_site_id    --/
8021                  AND rownum = 1)
8022     /*  AND     tp.sr_tp_id = p.organization_id
8023         AND     tp.sr_instance_id = p.sr_instance_id
8024         AND     tp.partner_type = 3
8025         AND     c.calendar_date = trunc(p.new_schedule_date)
8026         AND     c.calendar_code = tp.calendar_code
8027         AND     c.exception_set_id = tp.calendar_exception_set_id
8028         AND     c.sr_instance_id = tp.sr_instance_id
8029         AND     c1.seq_num = c.prior_seq_num-
8030                              nvl(I.postprocessing_lead_time, 0)
8031         AND     c1.calendar_code = c.calendar_code
8032         AND     c1.exception_set_id = c.exception_set_id
8033         AND     c1.sr_instance_id = c.sr_instance_id  */
8034         AND     p.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8035         GROUP BY I.inventory_item_id, P.supplier_id, P.supplier_site_id, I.sr_instance_id,
8036                 DECODE(tps.shipping_control,'BUYER',p.new_ship_date,p.new_dock_date);
8037 
8038 
8039 BEGIN
8040 
8041     msc_util.msc_log('******** LOAD_SUP_DATA_NET Begin ********');
8042 
8043     l_user_id := FND_GLOBAL.USER_ID;
8044 
8045     OPEN c_net_sup(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8046     FETCH c_net_sup BULK COLLECT INTO l_sr_instance_id_tab,
8047                                     l_inventory_item_id_tab,
8048                                     l_supplier_id_tab,
8049                                     l_supplier_site_id_tab,
8050                                     l_sd_date_tab,
8051                                     l_sd_quantity_tab;
8052     CLOSE c_net_sup;
8053 
8054     IF l_inventory_item_id_tab IS NOT NULL AND l_inventory_item_id_tab.COUNT > 0 THEN
8055 
8056         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_inventory_item_id_tab.COUNT := ' || l_inventory_item_id_tab.COUNT);
8057 
8058         forall j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last
8059         UPDATE MSC_ATP_SUMMARY_SUP
8060         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
8061                last_update_date  = p_sys_date,
8062                last_updated_by   = l_user_id
8063         WHERE  plan_id           = p_plan_id
8064         AND    sr_instance_id    = l_sr_instance_id_tab(j)
8065         AND    inventory_item_id = l_inventory_item_id_tab(j)
8066         AND    supplier_id       = l_supplier_id_tab(j)
8067         AND    supplier_site_id  = l_supplier_site_id_tab(j)
8068         AND    sd_date           = l_sd_date_tab(j);
8069 
8070         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL UPDATE');
8071 
8072         FOR j IN l_inventory_item_id_tab.first.. l_inventory_item_id_tab.last LOOP
8073             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8074                 l_ins_sr_instance_id_tab.EXTEND;
8075                 l_ins_inventory_item_id_tab.EXTEND;
8076                 l_ins_supplier_id_tab.EXTEND;
8077                 l_ins_supplier_site_id_tab.EXTEND;
8078                 l_ins_sd_date_tab.EXTEND;
8079                 l_ins_sd_quantity_tab.EXTEND;
8080 
8081                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
8082                 l_ins_inventory_item_id_tab(l_ins_inventory_item_id_tab.COUNT)  := l_inventory_item_id_tab(j);
8083                 l_ins_supplier_id_tab(l_ins_supplier_id_tab.COUNT)              := l_supplier_id_tab(j);
8084                 l_ins_supplier_site_id_tab(l_ins_supplier_site_id_tab.COUNT)    := l_supplier_site_id_tab(j);
8085                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
8086                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
8087             END IF;
8088         END LOOP;
8089 
8090         IF l_ins_inventory_item_id_tab IS NOT NULL AND l_ins_inventory_item_id_tab.COUNT > 0 THEN
8091 
8092             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'l_ins_inventory_item_id_tab.COUNT := ' || l_ins_inventory_item_id_tab.COUNT);
8093 
8094             forall  j IN l_ins_inventory_item_id_tab.first.. l_ins_inventory_item_id_tab.last
8095             INSERT  INTO MSC_ATP_SUMMARY_SUP (
8096                     plan_id,
8097                     sr_instance_id,
8098                     inventory_item_id,
8099                     supplier_id,
8100                     supplier_site_id,
8101                     sd_date,
8102                     sd_qty,
8103                     demand_class,
8104                     last_update_date,
8105                     last_updated_by,
8106                     creation_date,
8107                     created_by)
8108             VALUES (p_plan_id,
8109                     l_ins_sr_instance_id_tab(j),
8110                     l_ins_inventory_item_id_tab(j),
8111                     l_ins_supplier_id_tab(j),
8112                     l_ins_supplier_site_id_tab(j),
8113                     l_ins_sd_date_tab(j),
8114                     l_ins_sd_quantity_tab(j),
8115                     NULL,
8116                     p_sys_date,
8117                     l_user_id,
8118                     p_sys_date,
8119                     l_user_id);
8120 
8121             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'After FORALL INSERT');
8122 
8123         ELSE
8124             msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records to be inserted');
8125         END IF;
8126     ELSE
8127         msc_util.msc_log('LOAD_SUP_DATA_NET: ' || 'No records fetched in the net cursor');
8128     END IF;
8129 
8130     msc_util.msc_log('******** LOAD_SUP_DATA_NET End ********');
8131 
8132 END LOAD_SUP_DATA_NET;
8133 
8134 
8135 PROCEDURE LOAD_RES_FULL_UNOPT_BATCH(p_plan_id           IN NUMBER,
8136                                     p_plan_start_date   IN DATE,
8137                                     p_sys_date          IN DATE)
8138 IS
8139     l_user_id   number;
8140 BEGIN
8141 
8142     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH Begin ********');
8143 
8144     l_user_id := FND_GLOBAL.USER_ID;
8145 
8146     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8147     INSERT INTO MSC_ATP_SUMMARY_RES(
8148             plan_id,
8149             department_id,
8150             resource_id,
8151             organization_id,
8152             sr_instance_id,
8153             sd_date,
8154             sd_qty,
8155             last_update_date,
8156             last_updated_by,
8157             creation_date,
8158             created_by)
8159     (SELECT plan_id,
8160             department_id,
8161             resource_id,
8162             organization_id,
8163             sr_instance_id,
8164             SD_DATE,
8165             SUM(SD_QTY),
8166             last_update_date,
8167             last_updated_by,
8168             creation_date,
8169             created_by
8170     FROM
8171            (SELECT  RES_VIEW.plan_id plan_id,
8172                     RES_VIEW.department_id department_id,
8173                     RES_VIEW.resource_id resource_id,
8174                     RES_VIEW.organization_id organization_id,
8175                     RES_VIEW.sr_instance_id sr_instance_id,
8176                     trunc(RES_VIEW.SD_DATE) SD_DATE,
8177                     RES_VIEW.SD_QTY
8178                         * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8179                     p_sys_date last_update_date,
8180                     l_user_id last_updated_by,
8181                     p_sys_date creation_date,
8182                     l_user_id created_by
8183             FROM    MSC_UOM_CONVERSIONS MUC,
8184                    (SELECT  -- hint for better performance.
8185                             /*+  ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8186                             DR.PLAN_ID plan_id,
8187                             NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8188                             DR.RESOURCE_ID resource_id,
8189                             DR.organization_id organization_id,
8190                             DR.SR_INSTANCE_ID sr_instance_id,
8191                             C.CALENDAR_DATE SD_DATE,
8192                             -- Bug 3321897, 2943979 For Line Based Resources,
8193                             -- Resource_ID is not NULL but -1
8194                             -1 * DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8195                                     DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8196                                         REQ.DAILY_RESOURCE_HOURS)) *
8197                                  DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8198                                     (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8199                                         NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1)  SD_QTY,
8200                             NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8201                             DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8202                     FROM    MSC_DEPARTMENT_RESOURCES DR,
8203                             MSC_TRADING_PARTNERS P,
8204                             MSC_RESOURCE_REQUIREMENTS REQ,
8205                             MSC_SYSTEM_ITEMS I,
8206                             MSC_SUPPLIES S,
8207                             ----  re-ordered tables for performance
8208                             MSC_CALENDAR_DATES C
8209                     WHERE   DR.PLAN_ID = REQ.PLAN_ID
8210                     AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8211                     AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8212                     AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8213                     AND     DR.organization_id = REQ.ORGANIZATION_ID
8214                     AND     REQ.PLAN_ID = p_plan_id
8215                     AND     NVL(REQ.PARENT_ID, 2) = 2
8216                     AND     I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8217                     AND     I.PLAN_ID = S.PLAN_ID
8218                     AND     I.ORGANIZATION_ID = S.ORGANIZATION_ID
8219                     AND     I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8220                     AND     I.inventory_item_id = REQ.assembly_item_id    ----\
8221                     AND     ((I.bom_item_type <> 1                          --|
8222                               and I.bom_item_type <> 2                      --|- summary enhancement change for CTO ODR
8223                               AND I.atp_flag <> 'N')                        --|
8224                              OR (REQ.record_source = 2))                  ----/
8225                     AND     S.TRANSACTION_ID = REQ.SUPPLY_ID
8226                     AND     S.PLAN_ID = REQ.PLAN_ID
8227                     AND     S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8228                     AND     S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8229                     AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8230                     AND     P.SR_TP_ID = DR.ORGANIZATION_ID
8231                     AND     P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8232                     AND     P.PARTNER_TYPE = 3
8233                     AND     C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8234                     AND     C.CALENDAR_CODE = P.CALENDAR_CODE
8235                     AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8236                     AND     C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8237                                                     TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8238                     AND     C.SEQ_NUM IS NOT NULL
8239                     AND     C.CALENDAR_DATE >= p_plan_start_date  -- summary enhancement - made consistent
8240                     AND     REQ.REFRESH_NUMBER IS NULL)RES_VIEW   -- consider only planning records in full summation - summary enhancement
8241             WHERE   RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8242             AND     RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8243             AND     MUC.INVENTORY_ITEM_ID (+)= 0
8244 
8245             UNION ALL
8246 
8247             SELECT  MNRA.plan_id plan_id,
8248                     MNRA.department_id,
8249                     MNRA.resource_id,
8250                     MNRA.organization_id,
8251                     MNRA.sr_instance_id,
8252                     trunc(MNRA.SHIFT_DATE) SD_DATE,
8253                     MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8254                         MNRA.to_time,to_time + 24*3600,
8255                         MNRA.to_time) - MNRA.from_time)/3600)
8256                             * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8257                             DR.MAX_CAPACITY *  NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8258                     p_sys_date last_update_date,
8259                     l_user_id last_updated_by,
8260                     p_sys_date creation_date,
8261                     l_user_id created_by
8262             FROM    MSC_NET_RESOURCE_AVAIL MNRA,
8263                     MSC_DEPARTMENT_RESOURCES DR,
8264                     MSC_UOM_CONVERSIONS MUC         -- noted in summary enhancement : inconsistent with MSCRATPB
8265             WHERE   MNRA.PLAN_ID = p_plan_id
8266             AND     NVL(MNRA.PARENT_ID, -2) <> -1
8267             AND     DR.PLAN_ID = MNRA.PLAN_ID
8268             AND     DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8269             AND     DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8270             AND     DR.RESOURCE_ID = MNRA.RESOURCE_ID
8271             AND     DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8272             AND     DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8273             AND     DR.SR_INSTANCE_ID =  MUC.SR_INSTANCE_ID (+)
8274             AND     MUC.INVENTORY_ITEM_ID (+) = 0
8275                     --- un commented the following row. This is done so that less number of rows are selected
8276             AND     SHIFT_DATE >= p_plan_start_date  -- summary enhancement - made consistent
8277             ) group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8278             last_update_date,last_updated_by, creation_date, created_by
8279     );
8280 
8281     msc_util.msc_log('LOAD_RES_FULL_UNOPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8282     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_BATCH End ********');
8283 
8284 END LOAD_RES_FULL_UNOPT_BATCH;
8285 
8286 
8287 PROCEDURE LOAD_RES_FULL_OPT_BATCH(p_plan_id           IN NUMBER,
8288                                   p_plan_start_date   IN DATE,
8289                                   p_sys_date          IN DATE)
8290 IS
8291     l_user_id   number;
8292 BEGIN
8293 
8294     msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH Begin ********');
8295 
8296     l_user_id := FND_GLOBAL.USER_ID;
8297 
8298     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8299     INSERT INTO MSC_ATP_SUMMARY_RES(
8300             plan_id,
8301             department_id,
8302             resource_id,
8303             organization_id,
8304             sr_instance_id,
8305             sd_date,
8306             sd_qty,
8307             last_update_date,
8308             last_updated_by,
8309             creation_date,
8310             created_by)
8311     (SELECT plan_id,
8312             department_id,
8313             resource_id,
8314             organization_id,
8315             sr_instance_id,
8316             SD_DATE,
8317             SUM(SD_QTY),
8318             last_update_date,
8319             last_updated_by,
8320             creation_date,
8321             created_by
8322     FROM
8323             (SELECT RES_VIEW.plan_id plan_id,
8324                     RES_VIEW.department_id department_id,
8325                     RES_VIEW.resource_id resource_id,
8326                     RES_VIEW.organization_id organization_id,
8327                     RES_VIEW.sr_instance_id sr_instance_id,
8328                     trunc(RES_VIEW.SD_DATE) SD_DATE,
8329                     RES_VIEW.SD_QTY
8330                     * DECODE(RES_VIEW.BATCHABLE_FLAG, 0, 1, NVL(MUC.CONVERSION_RATE,1)) SD_QTY,
8331                     p_sys_date last_update_date,
8332                     l_user_id last_updated_by,
8333                     p_sys_date creation_date,
8334                     l_user_id created_by
8335             FROM    MSC_UOM_CONVERSIONS MUC,
8336                     (SELECT -- hint for better performance.
8337                             /*+  ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) */
8338                             DR.PLAN_ID plan_id,
8339                             NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8340                             DR.RESOURCE_ID resource_id,
8341                             DR.organization_id organization_id,
8342                             DR.SR_INSTANCE_ID sr_instance_id,
8343                             TRUNC(REQ.START_DATE) SD_DATE,
8344                             -- Bug 3321897, 2943979 For Line Based Resources,
8345                             -- Resource_ID is not NULL but -1
8346                             -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8347                             REQ.RESOURCE_HOURS) * -- 2859130         -- noted in summary enhancement : inconsistent with MSCRATPB
8348                             -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8349                             -- REQ.DAILY_RESOURCE_HOURS)) *
8350                             DECODE(NVL(DR.BATCHABLE_FLAG,2), 1,
8351                                 (DECODE(DR.UOM_CLASS_TYPE, 1, I.UNIT_WEIGHT, 2, I.UNIT_VOLUME) *
8352                                     NVL(S.NEW_ORDER_QUANTITY, S.FIRM_QUANTITY)), 1)  SD_QTY,
8353                             NVL(DR.BATCHABLE_FLAG,2) BATCHABLE_FLAG,
8354                             DECODE(DR.UOM_CLASS_TYPE,1 , I.WEIGHT_UOM, 2, I.VOLUME_UOM) UOM_CODE
8355                     FROM    MSC_DEPARTMENT_RESOURCES DR,
8356                             MSC_RESOURCE_REQUIREMENTS REQ,
8357                             MSC_SYSTEM_ITEMS I,
8358                             MSC_SUPPLIES S
8359                             ----  re-ordered tables for performance
8360                     WHERE   DR.PLAN_ID = REQ.PLAN_ID
8361                     AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID
8362                     AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8363                     AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8364                     AND     DR.organization_id = REQ.ORGANIZATION_ID
8365                     AND     REQ.PLAN_ID = p_plan_id
8366                     AND     NVL(REQ.PARENT_ID, 1) = 1
8367                     AND     I.SR_INSTANCE_ID = S.SR_INSTANCE_Id
8368                     AND     I.PLAN_ID = S.PLAN_ID
8369                     AND     I.ORGANIZATION_ID = S.ORGANIZATION_ID
8370                     AND     I.INVENTORY_ITEM_ID = S.INVENTORY_ITEM_ID
8371                     AND     S.TRANSACTION_ID = REQ.SUPPLY_ID
8372                     AND     S.PLAN_ID = REQ.PLAN_ID
8373                     AND     S.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8374                     AND     S.ORGANIZATION_ID = REQ.ORGANIZATION_ID
8375                     AND     NVL(S.DISPOSITION_STATUS_TYPE, 1) <> 2
8376                     AND     I.inventory_item_id = REQ.assembly_item_id    ----\
8377                     AND     ((I.bom_item_type <> 1                          --|
8378                               and I.bom_item_type <> 2                      --|- summary enhancement change for CTO ODR
8379                               AND I.atp_flag <> 'N')                        --|
8380                              OR (REQ.record_source = 2))                  ----/
8381                     AND     REQ.START_DATE >= p_plan_start_date     -- summary enhancement - made consistent
8382                     AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8383                     )RES_VIEW
8384             WHERE RES_VIEW.UOM_CODE = MUC.UOM_CODE (+)
8385             AND   RES_VIEW.SR_INSTANCE_ID = MUC.SR_INSTANCE_ID (+)
8386             AND   MUC.INVENTORY_ITEM_ID (+)= 0
8387 
8388             UNION ALL
8389 
8390             SELECT  MNRA.plan_id plan_id,
8391                     MNRA.department_id,
8392                     MNRA.resource_id,
8393                     MNRA.organization_id,
8394                     MNRA.sr_instance_id,
8395                     trunc(MNRA.SHIFT_DATE) SD_DATE,
8396                     MNRA.CAPACITY_UNITS * ((DECODE(LEAST(MNRA.from_time, MNRA.to_time),
8397                         MNRA.to_time,to_time + 24*3600,
8398                         MNRA.to_time) - MNRA.from_time)/3600)
8399                             * DECODE(NVL(DR.BATCHABLE_FLAG, 2), 1,
8400                               DR.MAX_CAPACITY *  NVL(MUC.CONVERSION_RATE, 1), 1) SD_QTY,
8401                     p_sys_date last_update_date,
8402                     l_user_id last_updated_by,
8403                     p_sys_date creation_date,
8404                     l_user_id created_by
8405             FROM    MSC_NET_RESOURCE_AVAIL MNRA,
8406                     MSC_DEPARTMENT_RESOURCES DR,
8407                     MSC_UOM_CONVERSIONS MUC             -- noted in summary enhancement : inconsistent with MSCRATPB
8408             WHERE   MNRA.PLAN_ID = p_plan_id
8409             AND     NVL(MNRA.PARENT_ID, -2) <> -1
8410             AND     DR.PLAN_ID = MNRA.PLAN_ID
8411             AND     DR.SR_INSTANCE_ID = MNRA.SR_INSTANCE_ID
8412             AND     DR.ORGANIZATION_ID = MNRA.ORGANIZATION_ID
8413             AND     DR.RESOURCE_ID = MNRA.RESOURCE_ID
8414             AND     DR.DEPARTMENT_ID = MNRA.DEPARTMENT_ID
8415             AND     DR.UNIT_OF_MEASURE = MUC.UOM_CODE (+)
8416             AND     DR.SR_INSTANCE_ID =  MUC.SR_INSTANCE_ID (+)
8417             AND     MUC.INVENTORY_ITEM_ID (+) = 0
8418                     --- un commented the following row. This is done so that less number of rows are selected
8419             AND     SHIFT_DATE >= p_plan_start_date -- summary enhancement - made consistent
8420             )
8421     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8422             last_update_date,last_updated_by, creation_date, created_by
8423     );
8424 
8425     msc_util.msc_log('LOAD_RES_FULL_OPT_BATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8426     msc_util.msc_log('******** LOAD_RES_FULL_OPT_BATCH End ********');
8427 
8428 END LOAD_RES_FULL_OPT_BATCH;
8429 
8430 
8431 PROCEDURE LOAD_RES_FULL_UNOPT_NOBATCH(p_plan_id           IN NUMBER,
8432                                       p_plan_start_date   IN DATE,
8433                                       p_sys_date          IN DATE)
8434 IS
8435     l_user_id   number;
8436 BEGIN
8437 
8438     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH Begin ********');
8439 
8440     l_user_id := FND_GLOBAL.USER_ID;
8441 
8442     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8443     INSERT INTO MSC_ATP_SUMMARY_RES(
8444             plan_id,
8445             department_id,
8446             resource_id,
8447             organization_id,
8448             sr_instance_id,
8449             sd_date,
8450             sd_qty,
8451             last_update_date,
8452             last_updated_by,
8453             creation_date,
8454             created_by)
8455     (SELECT plan_id,
8456             department_id,
8457             resource_id,
8458             organization_id,
8459             sr_instance_id,
8460             SD_DATE,
8461             SUM(SD_QTY),
8462             last_update_date,
8463             last_updated_by,
8464             creation_date,
8465             created_by
8466     FROM
8467         (
8468             SELECT  /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8469                     DR.PLAN_ID plan_id,
8470                     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8471                     DR.RESOURCE_ID resource_id,
8472                     DR.organization_id organization_id,
8473                     DR.SR_INSTANCE_ID sr_instance_id,
8474                     C.CALENDAR_DATE SD_DATE, -- 2859130 remove trunc
8475                     -- Bug 3321897, 2943979 For Line Based Resources,
8476                     -- Resource_ID is not NULL but -1
8477                     -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8478                         DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,
8479                             REQ.DAILY_RESOURCE_HOURS))  SD_QTY,
8480                     p_sys_date last_update_date,
8481                     l_user_id last_updated_by,
8482                     p_sys_date creation_date,
8483                     l_user_id created_by
8484             FROM    MSC_DEPARTMENT_RESOURCES DR,
8485                     MSC_TRADING_PARTNERS P,
8486                     MSC_RESOURCE_REQUIREMENTS REQ,
8487                     MSC_SYSTEM_ITEMS I,                 -- summary enhancement change for CTO ODR
8488                     MSC_CALENDAR_DATES C
8489                     ----  re-ordered tables for performance
8490             WHERE   DR.PLAN_ID = REQ.PLAN_ID
8491             AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID    -- summary enhancement - made consistent
8492             AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8493             AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8494             AND     DR.organization_id = REQ.ORGANIZATION_ID
8495             AND     REQ.PLAN_ID = p_plan_id
8496             AND     NVL(REQ.PARENT_ID, 2) = 2
8497             AND     P.SR_TP_ID = DR.ORGANIZATION_ID
8498             AND     P.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8499             AND     P.PARTNER_TYPE = 3
8500             AND     C.SR_INSTANCE_ID = DR.SR_INSTANCE_ID
8501             AND     C.CALENDAR_CODE = P.CALENDAR_CODE
8502             AND     C.EXCEPTION_SET_ID = P.CALENDAR_EXCEPTION_SET_ID
8503             AND     C.CALENDAR_DATE BETWEEN TRUNC(REQ.START_DATE) AND
8504                     TRUNC(NVL(REQ.END_DATE, REQ.START_DATE))
8505             AND     C.SEQ_NUM IS NOT NULL
8506             AND     C.CALENDAR_DATE >= p_plan_start_date
8507             AND     I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id         ----\
8508             AND     I.PLAN_ID = REQ.PLAN_ID                         --|
8509             AND     I.ORGANIZATION_ID = REQ.ORGANIZATION_ID         --|
8510             AND     I.inventory_item_id = REQ.assembly_item_id      --|\ summary enhancement
8511             AND     ((I.bom_item_type <> 1                          --|/ change for CTO ODR
8512                       and I.bom_item_type <> 2                      --|
8513                       AND I.atp_flag <> 'N')                        --|
8514                      OR (REQ.record_source = 2))                  ----/
8515             AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8516 
8517             UNION ALL
8518 
8519             SELECT  plan_id plan_id,
8520                     department_id,
8521                     resource_id,
8522                     organization_id,
8523                     sr_instance_id,
8524                     trunc(SHIFT_DATE) SD_DATE,
8525                     CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8526                         to_time,to_time + 24*3600,
8527                         to_time) - from_time)/3600) SD_QTY,
8528                     p_sys_date last_update_date,
8529                     l_user_id last_updated_by,
8530                     p_sys_date creation_date,
8531                     l_user_id created_by
8532             FROM    MSC_NET_RESOURCE_AVAIL
8533             WHERE   PLAN_ID = p_plan_id
8534             AND     NVL(PARENT_ID, -2) <> -1
8535                     -- uncommented following line so that less number of rows are selected
8536             AND     SHIFT_DATE >= p_plan_start_date     -- summary enhancement - made consistent
8537         )
8538     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8539             last_update_date,last_updated_by, creation_date, created_by
8540     );
8541 
8542     msc_util.msc_log('LOAD_RES_FULL_UNOPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8543     msc_util.msc_log('******** LOAD_RES_FULL_UNOPT_NOBATCH End ********');
8544 
8545 END LOAD_RES_FULL_UNOPT_NOBATCH;
8546 
8547 
8548 PROCEDURE LOAD_RES_FULL_OPT_NOBATCH(p_plan_id           IN NUMBER,
8549                                     p_plan_start_date   IN DATE,
8550                                     p_sys_date          IN DATE)
8551 IS
8552     l_user_id   number;
8553 BEGIN
8554 
8555     msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH Begin ********');
8556 
8557     l_user_id := FND_GLOBAL.USER_ID;
8558 
8559     -- summary enhancement - made changes to make it consistent with regular SQLs in MSCRATPB
8560     INSERT INTO MSC_ATP_SUMMARY_RES(
8561             plan_id,
8562             department_id,
8563             resource_id,
8564             organization_id,
8565             sr_instance_id,
8566             sd_date,
8567             sd_qty,
8568             last_update_date,
8569             last_updated_by,
8570             creation_date,
8571             created_by)
8572     (SELECT plan_id,
8573             department_id,
8574             resource_id,
8575             organization_id,
8576             sr_instance_id,
8577             SD_DATE,
8578             SUM(SD_QTY),
8579             last_update_date,
8580             last_updated_by,
8581             creation_date,
8582             created_by
8583     FROM
8584         (
8585             SELECT  /*+ ORDERED index(REQ MSC_RESOURCE_REQUIREMENTS_N2) index(C MSC_CALENDAR_DATES_U1) */
8586                     DR.PLAN_ID plan_id,
8587                     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8588                     DR.RESOURCE_ID resource_id,
8589                     DR.organization_id organization_id,
8590                     DR.SR_INSTANCE_ID sr_instance_id,
8591                     TRUNC(REQ.START_DATE) SD_DATE,
8592                     -- Bug 3321897, 2943979 For Line Based Resources,
8593                     -- Resource_ID is not NULL but -1
8594                     -1*DECODE(REQ.RESOURCE_ID, -1, REQ.LOAD_RATE,
8595                         REQ.RESOURCE_HOURS) SD_QTY, --2859130
8596                     -- DECODE(REQ.END_DATE, NULL, REQ.RESOURCE_HOURS,   -- noted in summary enhancement : inconsistent with MSCRATPB
8597                         -- REQ.DAILY_RESOURCE_HOURS))  SD_QTY,
8598                     p_sys_date last_update_date,
8599                     l_user_id last_updated_by,
8600                     p_sys_date creation_date,
8601                     l_user_id created_by
8602             FROM    MSC_DEPARTMENT_RESOURCES DR,
8603                     MSC_RESOURCE_REQUIREMENTS REQ,
8604                     MSC_SYSTEM_ITEMS I                  -- summary enhancement change for CTO ODR
8605             WHERE   DR.PLAN_ID = REQ.PLAN_ID
8606             AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID)=REQ.DEPARTMENT_ID    -- summary enhancement: made consistent
8607             AND     DR.RESOURCE_ID = REQ.RESOURCE_ID
8608             AND     DR.SR_INSTANCE_ID = REQ.SR_INSTANCE_ID
8609             AND     DR.organization_id = REQ.ORGANIZATION_ID
8610             AND     REQ.PLAN_ID = p_plan_id
8611             AND     NVL(REQ.PARENT_ID, 1) = 1
8612             AND     I.SR_INSTANCE_ID = REQ.SR_INSTANCE_Id         ----\
8613             AND     I.PLAN_ID = REQ.PLAN_ID                         --|
8614             AND     I.ORGANIZATION_ID = REQ.ORGANIZATION_ID         --|
8615             AND     I.inventory_item_id = REQ.assembly_item_id      --|\ summary enhancement
8616             AND     ((I.bom_item_type <> 1                          --|/ change for CTO ODR
8617                       and I.bom_item_type <> 2                      --|
8618                       AND I.atp_flag <> 'N')                        --|
8619                      OR (REQ.record_source = 2))                  ----/
8620             AND     REQ.START_DATE >= p_plan_start_date                                     -- summary enhancement: made consistent
8621             AND     REQ.REFRESH_NUMBER IS NULL   -- consider only planning records in full summation - summary enhancement
8622 
8623             UNION ALL
8624 
8625             SELECT  plan_id plan_id,
8626                     department_id,
8627                     resource_id,
8628                     organization_id,
8629                     sr_instance_id,
8630                     trunc(SHIFT_DATE) SD_DATE,
8631                     CAPACITY_UNITS * ((DECODE(LEAST(from_time, to_time),
8632                         to_time,to_time + 24*3600,
8633                         to_time) - from_time)/3600) SD_QTY,
8634                     p_sys_date last_update_date,
8635                     l_user_id last_updated_by,
8636                     p_sys_date creation_date,
8637                     l_user_id created_by
8638             FROM    MSC_NET_RESOURCE_AVAIL
8639             WHERE   PLAN_ID = p_plan_id
8640             AND     NVL(PARENT_ID, -2) <> -1
8641             AND     SHIFT_DATE >= p_plan_start_date         -- summary enhancement: made consistent
8642         )
8643     group by plan_id, department_id, resource_id, organization_id, sr_instance_id, sd_date,
8644             last_update_date,last_updated_by, creation_date, created_by
8645     );
8646 
8647     msc_util.msc_log('LOAD_RES_FULL_OPT_NOBATCH: ' || 'Records inserted : ' || SQL%ROWCOUNT);
8648     msc_util.msc_log('******** LOAD_RES_FULL_OPT_NOBATCH End ********');
8649 
8650 END LOAD_RES_FULL_OPT_NOBATCH;
8651 
8652 
8653 PROCEDURE LOAD_RES_DATA_NET(p_plan_id                   IN NUMBER,
8654                             p_last_refresh_number       IN NUMBER,
8655                             p_new_refresh_number        IN NUMBER,
8656                             p_sys_date                  IN DATE)
8657 IS
8658     l_user_id   number;
8659     j           pls_integer;
8660     l_department_id_tab         MRP_ATP_PUB.number_arr;
8661     l_resource_id_tab           MRP_ATP_PUB.number_arr;
8662     l_organization_id_tab       MRP_ATP_PUB.number_arr;
8663     l_sr_instance_id_tab        MRP_ATP_PUB.number_arr;
8664     l_sd_date_tab               MRP_ATP_PUB.date_arr;
8665     l_sd_quantity_tab           MRP_ATP_PUB.number_arr;
8666 
8667     l_ins_department_id_tab     MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8668     l_ins_resource_id_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8669     l_ins_organization_id_tab   MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8670     l_ins_sr_instance_id_tab    MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8671     l_ins_sd_date_tab           MRP_ATP_PUB.date_arr   := MRP_ATP_PUB.date_arr();
8672     l_ins_sd_quantity_tab       MRP_ATP_PUB.number_arr := MRP_ATP_PUB.number_arr();
8673 
8674     CURSOR c_net_res (p_plan_id             IN NUMBER, -- Cursor does not require msc_net_resource_avail because
8675                       p_last_refresh_number IN NUMBER, -- data in that does not change between plan runs
8676                       p_new_refresh_number  IN NUMBER)
8677     IS
8678         SELECT  NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) department_id,
8679                 DR.RESOURCE_ID resource_id,
8680                 DR.organization_id organization_id,
8681                 DR.SR_INSTANCE_ID sr_instance_id,
8682                 -- Bug 3348095
8683                 -- Only ATP created records, so use end_date
8684                 TRUNC(NVL(REQ.END_DATE, REQ.START_DATE)) SD_DATE,
8685                 -- TRUNC(REQ.START_DATE) SD_DATE,
8686                 -- End Bug 3348095
8687                 SUM((-1) * REQ.RESOURCE_HOURS) SD_QTY -- ATP always populates resource_hours
8688         FROM    MSC_DEPARTMENT_RESOURCES DR,
8689                 MSC_RESOURCE_REQUIREMENTS REQ
8690         WHERE   DR.PLAN_ID = p_plan_id
8691         AND     REQ.PLAN_ID = DR.PLAN_ID
8692         AND     REQ.SR_INSTANCE_ID = DR.sr_instance_id
8693         AND     REQ.RESOURCE_ID = DR.resource_id
8694         AND     NVL(DR.OWNING_DEPARTMENT_ID, DR.DEPARTMENT_ID) = DR.DEPARTMENT_ID
8695         AND     REQ.refresh_number between (p_last_refresh_number + 1) and p_new_refresh_number
8696         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));
8697                   -- Bug 3348095  Only ATP created records, so use end_date.
8698 
8699 BEGIN
8700 
8701     msc_util.msc_log('******** LOAD_RES_DATA_NET Begin ********');
8702 
8703     l_user_id := FND_GLOBAL.USER_ID;
8704 
8705     OPEN c_net_res(p_plan_id, p_last_refresh_number, p_new_refresh_number);
8706     FETCH c_net_res BULK COLLECT INTO l_department_id_tab,
8707                                       l_resource_id_tab,
8708                                       l_organization_id_tab,
8709                                       l_sr_instance_id_tab,
8710                                       l_sd_date_tab,
8711                                       l_sd_quantity_tab;
8712     CLOSE c_net_res;
8713 
8714     IF l_resource_id_tab IS NOT NULL AND l_resource_id_tab.COUNT > 0 THEN
8715 
8716         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_resource_id_tab.COUNT := ' || l_resource_id_tab.COUNT);
8717 
8718         forall j IN l_resource_id_tab.first.. l_resource_id_tab.last
8719         UPDATE MSC_ATP_SUMMARY_RES
8720         SET    sd_qty = sd_qty + l_sd_quantity_tab(j),
8721                last_update_date  = p_sys_date,
8722                last_updated_by   = l_user_id
8723         WHERE  plan_id           = p_plan_id
8724         AND    sr_instance_id    = l_sr_instance_id_tab(j)
8725         AND    organization_id   = l_organization_id_tab(j)
8726         AND    resource_id       = l_resource_id_tab(j)
8727         AND    department_id     = l_department_id_tab(j)
8728         AND    sd_date           = l_sd_date_tab(j);
8729 
8730         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL UPDATE');
8731 
8732         FOR j IN l_resource_id_tab.first.. l_resource_id_tab.last LOOP
8733             IF SQL%BULK_ROWCOUNT(j) = 0 THEN
8734                 l_ins_department_id_tab.EXTEND;
8735                 l_ins_resource_id_tab.EXTEND;
8736                 l_ins_organization_id_tab.EXTEND;
8737                 l_ins_sr_instance_id_tab.EXTEND;
8738                 l_ins_sd_date_tab.EXTEND;
8739                 l_ins_sd_quantity_tab.EXTEND;
8740 
8741                 l_ins_department_id_tab(l_ins_department_id_tab.COUNT)          := l_department_id_tab(j);
8742                 l_ins_resource_id_tab(l_ins_resource_id_tab.COUNT)              := l_resource_id_tab(j);
8743                 l_ins_organization_id_tab(l_ins_organization_id_tab.COUNT)      := l_organization_id_tab(j);
8744                 l_ins_sr_instance_id_tab(l_ins_sr_instance_id_tab.COUNT)        := l_sr_instance_id_tab(j);
8745                 l_ins_sd_date_tab(l_ins_sd_date_tab.COUNT)                      := l_sd_date_tab(j);
8746                 l_ins_sd_quantity_tab(l_ins_sd_quantity_tab.COUNT)              := l_sd_quantity_tab(j);
8747             END IF;
8748         END LOOP;
8749 
8750         IF l_ins_resource_id_tab IS NOT NULL AND l_ins_resource_id_tab.COUNT > 0 THEN
8751 
8752             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'l_ins_resource_id_tab.COUNT := ' || l_ins_resource_id_tab.COUNT);
8753 
8754             forall  j IN l_ins_resource_id_tab.first.. l_ins_resource_id_tab.last
8755             INSERT  INTO MSC_ATP_SUMMARY_RES (
8756                     plan_id,
8757                     department_id,
8758                     resource_id,
8759                     organization_id,
8760                     sr_instance_id,
8761                     sd_date,
8762                     sd_qty,
8763                     last_update_date,
8764                     last_updated_by,
8765                     creation_date,
8766                     created_by)
8767             VALUES (p_plan_id,
8768                     l_ins_department_id_tab(j),
8769                     l_ins_resource_id_tab(j),
8770                     l_ins_organization_id_tab(j),
8771                     l_ins_sr_instance_id_tab(j),
8772                     l_ins_sd_date_tab(j),
8773                     l_ins_sd_quantity_tab(j),
8774                     p_sys_date,
8775                     l_user_id,
8776                     p_sys_date,
8777                     l_user_id);
8778 
8779             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'After FORALL INSERT');
8780 
8781         ELSE
8782             msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records to be inserted');
8783         END IF;
8784     ELSE
8785         msc_util.msc_log('LOAD_RES_DATA_NET: ' || 'No records fetched in the net cursor');
8786     END IF;
8787 
8788     msc_util.msc_log('******** LOAD_RES_DATA_NET End ********');
8789 
8790 END LOAD_RES_DATA_NET;
8791 
8792 
8793 PROCEDURE Truncate_Summ_Plan_Partition(p_plan_id IN NUMBER,
8794                                        p_applsys_schema IN Varchar2)
8795 IS
8796     l_partition_name            varchar2(30);
8797     l_sql_stmt                  varchar2(300);
8798 BEGIN
8799     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_plan_id  - ' || p_plan_id);
8800     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'p_applsys_schema  - ' || p_applsys_schema);
8801 
8802 ------------------------------------------------
8803 
8804     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sd');
8805     l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8806     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8807     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SD TRUNCATE PARTITION ' ||
8808                     l_partition_name  || ' DROP STORAGE';
8809 
8810     BEGIN
8811         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SD');
8812         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8813                       APPLICATION_SHORT_NAME => 'MSC',
8814                       STATEMENT_TYPE => ad_ddl.alter_table,
8815                       STATEMENT => l_sql_stmt,
8816                       OBJECT_NAME => 'MSC_ATP_SUMMARY_SD');
8817     END;
8818     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating SD partition');
8819 
8820 ------------------------------------------------
8821 
8822     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for sup');
8823     l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8824     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8825     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_SUP TRUNCATE PARTITION ' ||
8826                     l_partition_name  || ' DROP STORAGE';
8827 
8828     BEGIN
8829         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_SUP');
8830         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8831                       APPLICATION_SHORT_NAME => 'MSC',
8832                       STATEMENT_TYPE => ad_ddl.alter_table,
8833                       STATEMENT => l_sql_stmt,
8834                       OBJECT_NAME => 'MSC_ATP_SUMMARY_SUP');
8835     END;
8836     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating sup partition');
8837 
8838 ------------------------------------------------
8839 
8840     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'truncate partition for res');
8841     l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8842     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'Partition name : ' || l_partition_name);
8843     l_sql_stmt := 'ALTER TABLE MSC_ATP_SUMMARY_RES TRUNCATE PARTITION ' ||
8844                     l_partition_name  || ' DROP STORAGE';
8845 
8846     BEGIN
8847         msc_util.msc_log('Before alter table MSC_ATP_SUMMARY_RES');
8848         ad_ddl.do_ddl(APPLSYS_SCHEMA => p_applsys_schema,
8849                       APPLICATION_SHORT_NAME => 'MSC',
8850                       STATEMENT_TYPE => ad_ddl.alter_table,
8851                       STATEMENT => l_sql_stmt,
8852                       OBJECT_NAME => 'MSC_ATP_SUMMARY_RES');
8853     END;
8854     msc_util.msc_log('Truncate_Summ_Plan_Partition: ' || 'After truncating res partition');
8855 
8856 ------------------------------------------------
8857 
8858 END Truncate_Summ_Plan_Partition;
8859 
8860 
8861 PROCEDURE Gather_Summ_Plan_Stats(p_plan_id              IN NUMBER,
8862                                  p_share_partition      IN varchar2)
8863 IS
8864     l_partition_name            varchar2(30);
8865     l_msc_schema             	VARCHAR2(30);
8866 BEGIN
8867 
8868 ------------------------------------------------
8869     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for S/D Tables');
8870 
8871     SELECT  a.oracle_username
8872       	INTO    l_msc_schema
8873       	FROM    FND_ORACLE_USERID a,
8874                 FND_PRODUCT_INSTALLATIONS b
8875       	WHERE   a.oracle_id = b.oracle_id
8876       	AND     b.application_id = 724;
8877 
8878     IF p_share_partition = 'Y' THEN
8879         l_partition_name := 'ATP_SUMMARY_SD_999999';
8880     ELSE
8881         l_partition_name := 'ATP_SUMMARY_SD_' || to_char(p_plan_id);
8882     END IF;
8883 
8884     fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8885                                  tabname=>'MSC_ATP_SUMMARY_SD',
8886                                  partname=>l_partition_name,
8887                                  granularity=>'PARTITION',
8888                                  percent =>10);
8889     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for S/D tables');
8890 ------------------------------------------------
8891     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Sup Tables');
8892     IF p_share_partition = 'Y' THEN
8893         l_partition_name := 'ATP_SUMMARY_SUP_999999';
8894     ELSE
8895         l_partition_name := 'ATP_SUMMARY_SUP_' || to_char(p_plan_id);
8896     END IF;
8897 
8898     fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8899                                  tabname=>'MSC_ATP_SUMMARY_SUP',
8900                                  partname=>l_partition_name,
8901                                  granularity=>'PARTITION',
8902                                  percent =>10);
8903     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Sup tables');
8904 ------------------------------------------------
8905     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'Gather Table Stats for Res Tables');
8906     IF p_share_partition = 'Y' THEN
8907         l_partition_name := 'ATP_SUMMARY_RES_999999';
8908     ELSE
8909         l_partition_name := 'ATP_SUMMARY_RES_' || to_char(p_plan_id);
8910     END IF;
8911 
8912     fnd_stats.gather_table_stats(ownname=>l_msc_schema,
8913                                  tabname=>'MSC_ATP_SUMMARY_RES',
8914                                  partname=>l_partition_name,
8915                                  granularity=>'PARTITION',
8916                                  percent =>10);
8917     msc_util.msc_log('Gather_Summ_Plan_Stats: ' || 'After gathering stats for Res tables');
8918 ------------------------------------------------
8919 
8920 
8921 END Gather_Summ_Plan_Stats;
8922 
8923 --*************************************************************---
8924 --New Procedure added for collection enhancement --bug3049003
8925 --*************************************************************--
8926 PROCEDURE atp_snapshot_hook(
8927 	                      p_plan_id       IN 	NUMBER
8928                          )
8929 
8930 IS
8931 --bug3663487 start SQL_ID  9425117
8932 -- IO Perf:3693983: Don't Launch ATP Post snapshot Processes for IO Plans
8933 l_count                 NUMBER := 0;
8934 --bug3663487 end
8935 Begin
8936 
8937         msc_util.msc_log('Begin procedure atp_snapshot_hook');
8938 
8939         SELECT count(*)
8940         INTO   l_count
8941         FROM   msc_plans plans,
8942                msc_designators desig
8943         WHERE  plans.plan_id = p_plan_id
8944         AND    plans.plan_type <> 4
8945         AND    plans.compile_designator = desig.designator
8946         AND    plans.sr_instance_id = desig.sr_instance_id
8947         AND    plans.organization_id = desig.organization_id
8948         AND    (desig.inventory_atp_flag = 1
8949                 OR plans.copy_plan_id IS NOT NULL);
8950 
8951         msc_util.msc_log('atp_snapshot_hook: l_count: '|| nvl(l_count,0));
8952 
8953         IF ( NVL(l_count,0) > 0) THEN
8954         msc_util.msc_log('atp_snapshot_hook: Updating msc_plan_organizations..');
8955         UPDATE msc_plan_organizations mpo
8956         SET so_lrn =(SELECT so_lrn
8957                     FROM msc_instance_orgs mio
8958                     WHERE mio.sr_instance_id=mpo.sr_instance_id
8959                     AND mio.organization_id=mpo.organization_id
8960                      )
8961         WHERE plan_id=p_plan_id;
8962         --RETURNING organization_id, sr_instance_id
8963         --BULK COLLECT INTO l_organization_id, l_sr_instance_id;
8964         msc_util.msc_log('atp_snapshot_hook: No. of Rows updated: '|| SQL%ROWCOUNT );
8965         END IF;
8966 
8967         --bug3663487 start
8968         /*
8969         UPDATE msc_system_items mst1
8970         SET (REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG) =(SELECT REPLENISH_TO_ORDER_FLAG,PICK_COMPONENTS_FLAG
8971                     FROM msc_system_items mst2
8972                     WHERE mst2.sr_instance_id=mst1.sr_instance_id
8973                     AND mst2.organization_id=mst1.organization_id
8974                     AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8975                     AND mst2.plan_id=-1
8976                      )
8977         WHERE plan_id=p_plan_id;
8978         */
8979         -- ATP_RULE_ID and DEMAND_TIME_FENCE_DAYS is also flushed as we are using it in populate_atf_date
8980         -- to make its performance better.
8981         -- IO Perf:3693983: Moved update of msc_system_items to Load_Plan_SD
8982         /*
8983         FORALL j IN l_organization_id.first.. l_organization_id.last
8984         UPDATE msc_system_items mst1
8985         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
8986                     FROM msc_system_items mst2
8987                     WHERE mst2.sr_instance_id=mst1.sr_instance_id
8988                     AND mst2.organization_id=mst1.organization_id
8989                     AND mst2.INVENTORY_ITEM_ID=mst1.INVENTORY_ITEM_ID
8990                     AND mst2.plan_id=-1
8991                      )
8992         WHERE plan_id=p_plan_id
8993         AND     mst1.ORGANIZATION_ID = l_organization_id(j)
8994         AND     mst1.SR_INSTANCE_ID = l_sr_instance_id(j)
8995         AND     mst1.bom_item_type  in (1,4,5)
8996         AND     mst1.atp_flag <> 'N'
8997         OR      mst1.atp_components_flag <> 'N';
8998         */
8999         --bug3663487 end
9000 
9001         commit;
9002 
9003 EXCEPTION
9004 	WHEN others THEN
9005 	     msc_util.msc_log('Error in atp_snapshot_hook: ' || SQLCODE || '-' || SQLERRM);
9006 END atp_snapshot_hook;
9007 
9008 -- 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
9009 -- This API will be called by "Purge Plan" conc program.
9010 
9011 Procedure Delete_CTO_BOM_OSS(
9012           p_plan_id			IN		NUMBER)
9013 IS
9014 BEGIN
9015     msc_util.msc_log('Begin Delete_CTO_BOM_OSS for plan_id: ' || p_plan_id);
9016     msc_util.msc_log('Before Delete data for CTO BOM');
9017 
9018     DELETE msc_cto_bom
9019 	WHERE  nvl(plan_id, p_plan_id) = p_plan_id;
9020 
9021     msc_util.msc_log('After Delete data for CTO BOM: ' || SQL%ROWCOUNT);
9022 
9023     msc_util.msc_log('Before Delete data for CTO OSS');
9024 
9025     DELETE msc_cto_sources
9026 	WHERE  nvl(plan_id, p_plan_id) = p_plan_id;
9027 
9028     msc_util.msc_log('After Delete data for CTO OSS: ' || SQL%ROWCOUNT);
9029 
9030 	commit;
9031 
9032     msc_util.msc_log('End Delete_CTO_BOM_OSS');
9033 EXCEPTION
9034 	WHEN others THEN
9035 		 msc_util.msc_log('Exception in Delete_CTO_BOM_OSS :' || SQLCODE || '-' || SQLERRM);
9036 END Delete_CTO_BOM_OSS;
9037 
9038 END MSC_POST_PRO;