DBA Data[Home] [Help]

PACKAGE BODY: APPS.MRP_FLOW_SCHEDULE_UTIL

Source


1 PACKAGE BODY MRP_Flow_Schedule_Util AS
2 /* $Header: MRPUSCNB.pls 120.9.12000000.2 2007/07/26 01:44:43 ksuleman ship $ */
3 
4 --  Global constant holding the package name
5 
6 G_PKG_NAME                    CONSTANT VARCHAR2(30) := 'MRP_Flow_Schedule_Util';
7 
8 --
9 -- Local Types
10 --
11 TYPE t_line_rec IS RECORD (
12   line_id	NUMBER,
13   order_quantity	NUMBER,
14   fs_quantity	NUMBER,
15   needed_quantity	NUMBER,
16   distributed_quantity	NUMBER,
17   parent_line_id	NUMBER,
18   first_child		NUMBER,
19   last_child		NUMBER,
20   previous_brother      NUMBER, /** Bug 2536351 **/
21   next_brother		NUMBER);
22 
23 TYPE t_line_tbl IS TABLE OF  t_line_rec
24   INDEX BY BINARY_INTEGER;
25 
26 l_lines	t_line_tbl;
27 
28 --  Procedure Clear_Dependent_Attr
29 
30 PROCEDURE Clear_Dependent_Attr
31 (   p_attr_id                       IN  NUMBER DEFAULT NULL
32 ,   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
33 ,   p_old_flow_schedule_rec         IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
34 ,   x_flow_schedule_rec             IN  OUT NOCOPY MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
35 )
36 IS
37 BEGIN
38 
39     --  Load out record
40 
41     x_flow_schedule_rec := p_flow_schedule_rec;
42 
43     --  If attr_id is missing compare old and new records and for
44     --  every changed attribute clear its dependent fields.
45 
46     -- Commenting for pl-sql coding standards and instead check if p_attr_id is null
47     -- IF p_attr_id = FND_API.G_MISS_NUM THEN
48     IF p_attr_id IS NULL THEN
49 
50         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.alternate_bom_designator,p_old_flow_schedule_rec.alternate_bom_designator)
51         THEN
52             x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
53             x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
54         END IF;
55 
56         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.alternate_routing_desig,p_old_flow_schedule_rec.alternate_routing_desig)
57         THEN
58             x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
59             x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
60             x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
61             x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
62         END IF;
63 
64         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.bom_revision,p_old_flow_schedule_rec.bom_revision)
65         THEN
66             x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
67         END IF;
68 
69         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.bom_revision_date,p_old_flow_schedule_rec.bom_revision_date)
70         THEN
71             NULL;
72         END IF;
73 
74         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.build_sequence,p_old_flow_schedule_rec.build_sequence)
75         THEN
76             NULL;
77         END IF;
78 
79         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.class_code,p_old_flow_schedule_rec.class_code)
80         THEN
81             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
82             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
83             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
84             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
85             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
86             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
87             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
88             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
89             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
90             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
91         END IF;
92 
93         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.completion_locator_id,p_old_flow_schedule_rec.completion_locator_id)
94         THEN
95             NULL;
96         END IF;
97 
98         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.completion_subinventory,p_old_flow_schedule_rec.completion_subinventory)
99         THEN
100             x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
101         END IF;
102 
103         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.created_by,p_old_flow_schedule_rec.created_by)
104         THEN
105             NULL;
106         END IF;
107 
108         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.creation_date,p_old_flow_schedule_rec.creation_date)
109         THEN
110             NULL;
111         END IF;
112 
113         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.date_closed,p_old_flow_schedule_rec.date_closed)
114         THEN
115             NULL;
116         END IF;
117 
118         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_class,p_old_flow_schedule_rec.demand_class)
119         THEN
120             NULL;
121         END IF;
122 
123         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_delivery,p_old_flow_schedule_rec.demand_source_delivery)
124         THEN
125             NULL;
126         END IF;
127 
128         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_header_id,p_old_flow_schedule_rec.demand_source_header_id)
129         THEN
130             x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
131             x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
132         END IF;
133 
134         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_line,p_old_flow_schedule_rec.demand_source_line)
135         THEN
136             NULL;
137         END IF;
138 
139         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_type,p_old_flow_schedule_rec.demand_source_type)
140         THEN
141             NULL;
142         END IF;
143 
144         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_updated_by,p_old_flow_schedule_rec.last_updated_by)
145         THEN
146             NULL;
147         END IF;
148 
149         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_update_date,p_old_flow_schedule_rec.last_update_date)
150         THEN
151             NULL;
152         END IF;
153 
154         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_update_login,p_old_flow_schedule_rec.last_update_login)
155         THEN
156             NULL;
157         END IF;
158 
159         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.line_id,p_old_flow_schedule_rec.line_id)
160         THEN
161             x_flow_schedule_rec.alternate_routing_desig := FND_API.G_MISS_CHAR;
162         END IF;
163 
164         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_account,p_old_flow_schedule_rec.material_account)
165         THEN
166             NULL;
167         END IF;
168 
169         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_overhead_account,p_old_flow_schedule_rec.material_overhead_account)
170         THEN
171             NULL;
172         END IF;
173 
174         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_variance_account,p_old_flow_schedule_rec.material_variance_account)
175         THEN
176             NULL;
177         END IF;
178 
179         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.mps_net_quantity,p_old_flow_schedule_rec.mps_net_quantity)
180         THEN
181             NULL;
182         END IF;
183 
184         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.mps_scheduled_comp_date,p_old_flow_schedule_rec.mps_scheduled_comp_date)
185         THEN
186             NULL;
187         END IF;
188 
189         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.organization_id,p_old_flow_schedule_rec.organization_id)
190         THEN
191             x_flow_schedule_rec.primary_item_id := FND_API.G_MISS_NUM;
192             x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
193             x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
194             x_flow_schedule_rec.demand_source_header_id := FND_API.G_MISS_NUM;
195             x_flow_schedule_rec.demand_source_type := FND_API.G_MISS_NUM;
196             x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
197             x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
198             x_flow_schedule_rec.alternate_bom_designator := FND_API.G_MISS_CHAR;
199             x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
200             x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
201             x_flow_schedule_rec.alternate_routing_desig := FND_API.G_MISS_CHAR;
202             x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
203             x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
204             x_flow_schedule_rec.line_id := FND_API.G_MISS_NUM;
205             x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
206             x_flow_schedule_rec.schedule_group_id := FND_API.G_MISS_NUM;
207             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
208             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
209             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
210             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
211             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
212             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
213             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
214             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
215             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
216             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
217         END IF;
218 
219         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.outside_processing_acct,p_old_flow_schedule_rec.outside_processing_acct)
220         THEN
221             NULL;
222         END IF;
223 
224         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.outside_proc_var_acct,p_old_flow_schedule_rec.outside_proc_var_acct)
225         THEN
226             NULL;
227         END IF;
228 
229         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.overhead_account,p_old_flow_schedule_rec.overhead_account)
230         THEN
231             NULL;
232         END IF;
233 
234         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.overhead_variance_account,p_old_flow_schedule_rec.overhead_variance_account)
235         THEN
236             NULL;
237         END IF;
238 
239         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.planned_quantity,p_old_flow_schedule_rec.planned_quantity)
240         THEN
241             x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
242         END IF;
243 
244         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.primary_item_id,p_old_flow_schedule_rec.primary_item_id)
245         THEN
246             x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
247             x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
248             x_flow_schedule_rec.demand_source_header_id := FND_API.G_MISS_NUM;
249             x_flow_schedule_rec.demand_source_type := FND_API.G_MISS_NUM;
250             x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
251             x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
252             x_flow_schedule_rec.alternate_bom_designator := FND_API.G_MISS_CHAR;
253             x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
254             x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
255             x_flow_schedule_rec.alternate_routing_desig := FND_API.G_MISS_CHAR;
256             x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
257             x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
258             x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
259             x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
260             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
261             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
262             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
263             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
264             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
265             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
266             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
267             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
268             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
269             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
270         END IF;
271 
272         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_application_id,p_old_flow_schedule_rec.program_application_id)
273         THEN
274             NULL;
275         END IF;
276 
277         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_id,p_old_flow_schedule_rec.program_id)
278         THEN
279             NULL;
280         END IF;
281 
282         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_update_date,p_old_flow_schedule_rec.program_update_date)
283         THEN
284             NULL;
285         END IF;
286 
287         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.project_id,p_old_flow_schedule_rec.project_id)
288         THEN
289             x_flow_schedule_rec.task_id := FND_API.G_MISS_NUM;
290             x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
291             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
292             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
293             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
294             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
295             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
296             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
297             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
298             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
299             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
300             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
301         END IF;
302 
303         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.quantity_completed,p_old_flow_schedule_rec.quantity_completed)
304         THEN
305             NULL;
306         END IF;
307 
308         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.request_id,p_old_flow_schedule_rec.request_id)
309         THEN
310             NULL;
311         END IF;
312 
313         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.resource_account,p_old_flow_schedule_rec.resource_account)
314         THEN
315             NULL;
316         END IF;
317 
318         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.resource_variance_account,p_old_flow_schedule_rec.resource_variance_account)
319         THEN
320             NULL;
321         END IF;
322 
323         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.routing_revision,p_old_flow_schedule_rec.routing_revision)
324         THEN
325             x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
326         END IF;
327 
328         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.routing_revision_date,p_old_flow_schedule_rec.routing_revision_date)
329         THEN
330             NULL;
331         END IF;
332 
333         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_completion_date,p_old_flow_schedule_rec.scheduled_completion_date)
334         THEN
335             x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
336             x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
337             x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
338             x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
339             x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
340         END IF;
341 
342         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_flag,p_old_flow_schedule_rec.scheduled_flag)
343         THEN
344             NULL;
345         END IF;
346 
347         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_start_date,p_old_flow_schedule_rec.scheduled_start_date)
348         THEN
349             NULL;
350         END IF;
351 
352 -- Comment it out to fix bug 1198493. We don't want the build_sequence set to null
353 -- when schedule group is changed
354 /*
355         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.schedule_group_id,p_old_flow_schedule_rec.schedule_group_id)
356         THEN
357             x_flow_schedule_rec.build_sequence := FND_API.G_MISS_NUM;
358         END IF;
359 */
360 
361         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.schedule_number,p_old_flow_schedule_rec.schedule_number)
362         THEN
363             NULL;
364         END IF;
365 
366         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.status,p_old_flow_schedule_rec.status)
367         THEN
368             NULL;
369         END IF;
370 
371         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.std_cost_adjustment_acct,p_old_flow_schedule_rec.std_cost_adjustment_acct)
372         THEN
373             NULL;
374         END IF;
375 
376         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.task_id,p_old_flow_schedule_rec.task_id)
377         THEN
378             NULL;
379         END IF;
380 
381         IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.wip_entity_id,p_old_flow_schedule_rec.wip_entity_id)
382         THEN
383             NULL;
384         END IF;
385 
386     ELSIF p_attr_id = G_ALTERNATE_BOM_DESIGNATOR THEN
387         x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
388         x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
389     ELSIF p_attr_id = G_ALTERNATE_ROUTING_DESIG THEN
390         x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
391         x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
392         x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
393         x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
394     ELSIF p_attr_id = G_BOM_REVISION THEN
395         x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
396     ELSIF p_attr_id = G_BOM_REVISION_DATE THEN
397         NULL;
398     ELSIF p_attr_id = G_BUILD_SEQUENCE THEN
399         NULL;
400     ELSIF p_attr_id = G_CLASS THEN
401         x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
402         x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
403         x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
404         x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
405         x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
406         x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
407         x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
408         x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
409         x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
410         x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
411     ELSIF p_attr_id = G_COMPLETION_LOCATOR THEN
412         NULL;
413     ELSIF p_attr_id = G_COMPLETION_SUBINVENTORY THEN
414         x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
415     ELSIF p_attr_id = G_CREATED_BY THEN
416         NULL;
417     ELSIF p_attr_id = G_CREATION_DATE THEN
418         NULL;
419     ELSIF p_attr_id = G_DATE_CLOSED THEN
420         NULL;
421     ELSIF p_attr_id = G_DEMAND_CLASS THEN
422         NULL;
423     ELSIF p_attr_id = G_DEMAND_SOURCE_DELIVERY THEN
424         NULL;
425     ELSIF p_attr_id = G_DEMAND_SOURCE_HEADER THEN
426         x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
427         x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
428     ELSIF p_attr_id = G_DEMAND_SOURCE_LINE THEN
429         NULL;
430     ELSIF p_attr_id = G_DEMAND_SOURCE_TYPE THEN
431         NULL;
432     ELSIF p_attr_id = G_LAST_UPDATED_BY THEN
433         NULL;
434     ELSIF p_attr_id = G_LAST_UPDATE_DATE THEN
435         NULL;
436     ELSIF p_attr_id = G_LAST_UPDATE_LOGIN THEN
437         NULL;
438     ELSIF p_attr_id = G_LINE THEN
439         NULL;
440     ELSIF p_attr_id = G_MATERIAL_ACCOUNT THEN
441         NULL;
442     ELSIF p_attr_id = G_MATERIAL_OVERHEAD_ACCOUNT THEN
443         NULL;
444     ELSIF p_attr_id = G_MATERIAL_VARIANCE_ACCOUNT THEN
445         NULL;
446     ELSIF p_attr_id = G_MPS_NET_QUANTITY THEN
447         NULL;
448     ELSIF p_attr_id = G_MPS_SCHEDULED_COMP_DATE THEN
449         NULL;
450     ELSIF p_attr_id = G_ORGANIZATION THEN
451         x_flow_schedule_rec.primary_item_id := FND_API.G_MISS_NUM;
452         x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
453         x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
454         x_flow_schedule_rec.demand_source_header_id := FND_API.G_MISS_NUM;
455         x_flow_schedule_rec.demand_source_type := FND_API.G_MISS_NUM;
456         x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
457         x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
458         x_flow_schedule_rec.alternate_bom_designator := FND_API.G_MISS_CHAR;
459         x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
460         x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
461         x_flow_schedule_rec.alternate_routing_desig := FND_API.G_MISS_CHAR;
462         x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
463         x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
464         x_flow_schedule_rec.line_id := FND_API.G_MISS_NUM;
465         x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
466         x_flow_schedule_rec.schedule_group_id := FND_API.G_MISS_NUM;
467         x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
468         x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
469         x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
470         x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
471         x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
472         x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
473         x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
474         x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
475         x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
476         x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
477     ELSIF p_attr_id = G_OUTSIDE_PROCESSING_ACCT THEN
478         NULL;
479     ELSIF p_attr_id = G_OUTSIDE_PROC_VAR_ACCT THEN
480         NULL;
481     ELSIF p_attr_id = G_OVERHEAD_ACCOUNT THEN
482         NULL;
483     ELSIF p_attr_id = G_OVERHEAD_VARIANCE_ACCOUNT THEN
484         NULL;
485     ELSIF p_attr_id = G_PLANNED_QUANTITY THEN
486         x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
487     ELSIF p_attr_id = G_PRIMARY_ITEM THEN
488         x_flow_schedule_rec.completion_subinventory := FND_API.G_MISS_CHAR;
489         x_flow_schedule_rec.completion_locator_id := FND_API.G_MISS_NUM;
490         x_flow_schedule_rec.demand_source_header_id := FND_API.G_MISS_NUM;
491         x_flow_schedule_rec.demand_source_type := FND_API.G_MISS_NUM;
492         x_flow_schedule_rec.demand_source_line := FND_API.G_MISS_CHAR;
493         x_flow_schedule_rec.demand_source_delivery := FND_API.G_MISS_CHAR;
494         x_flow_schedule_rec.alternate_bom_designator := FND_API.G_MISS_CHAR;
495         x_flow_schedule_rec.bom_revision := FND_API.G_MISS_CHAR;
496         x_flow_schedule_rec.bom_revision_date := FND_API.G_MISS_DATE;
497         x_flow_schedule_rec.alternate_routing_desig := FND_API.G_MISS_CHAR;
498         x_flow_schedule_rec.routing_revision := FND_API.G_MISS_CHAR;
499         x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
500         x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
501         x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
502             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
503             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
504             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
505             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
506             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
507             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
508             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
509             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
510             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
511             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
512     ELSIF p_attr_id = G_PROGRAM_APPLICATION THEN
513         NULL;
514     ELSIF p_attr_id = G_PROGRAM THEN
515         NULL;
516     ELSIF p_attr_id = G_PROGRAM_UPDATE_DATE THEN
517         NULL;
518     ELSIF p_attr_id = G_PROJECT THEN
519         x_flow_schedule_rec.task_id := FND_API.G_MISS_NUM;
520         x_flow_schedule_rec.class_code := FND_API.G_MISS_CHAR;
521             x_flow_schedule_rec.material_account := FND_API.G_MISS_NUM;
522             x_flow_schedule_rec.material_overhead_account := FND_API.G_MISS_NUM;
523             x_flow_schedule_rec.resource_account := FND_API.G_MISS_NUM;
524             x_flow_schedule_rec.outside_processing_acct := FND_API.G_MISS_NUM;
525             x_flow_schedule_rec.material_variance_account := FND_API.G_MISS_NUM;
526             x_flow_schedule_rec.resource_variance_account := FND_API.G_MISS_NUM;
527             x_flow_schedule_rec.outside_proc_var_acct := FND_API.G_MISS_NUM;
528             x_flow_schedule_rec.std_cost_adjustment_acct := FND_API.G_MISS_NUM;
529             x_flow_schedule_rec.overhead_account := FND_API.G_MISS_NUM;
530             x_flow_schedule_rec.overhead_variance_account := FND_API.G_MISS_NUM;
531     ELSIF p_attr_id = G_QUANTITY_COMPLETED THEN
532         NULL;
533     ELSIF p_attr_id = G_REQUEST THEN
534         NULL;
535     ELSIF p_attr_id = G_RESOURCE_ACCOUNT THEN
536         NULL;
537     ELSIF p_attr_id = G_RESOURCE_VARIANCE_ACCOUNT THEN
538         NULL;
539     ELSIF p_attr_id = G_ROUTING_REVISION THEN
540         x_flow_schedule_rec.routing_revision_date := FND_API.G_MISS_DATE;
541     ELSIF p_attr_id = G_ROUTING_REVISION_DATE THEN
542         NULL;
543     ELSIF p_attr_id = G_SCHEDULED_COMPLETION_DATE THEN
544         x_flow_schedule_rec.scheduled_start_date := FND_API.G_MISS_DATE;
545     ELSIF p_attr_id = G_SCHEDULED THEN
546         NULL;
547     ELSIF p_attr_id = G_SCHEDULED_START_DATE THEN
548         NULL;
549     ELSIF p_attr_id = G_SCHEDULE_GROUP THEN
550         x_flow_schedule_rec.build_sequence := FND_API.G_MISS_NUM;
551     ELSIF p_attr_id = G_SCHEDULE_NUMBER THEN
552         NULL;
553     ELSIF p_attr_id = G_STATUS THEN
554         NULL;
555     ELSIF p_attr_id = G_STD_COST_ADJUSTMENT_ACCT THEN
556         NULL;
557     ELSIF p_attr_id = G_TASK THEN
558         NULL;
559     ELSIF p_attr_id = G_WIP_ENTITY THEN
560         NULL;
561     END IF;
562 
563 END Clear_Dependent_Attr;
564 
565 --  Procedure Apply_Attribute_Changes
566 
567 PROCEDURE Apply_Attribute_Changes
568 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
569 ,   p_old_flow_schedule_rec         IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
570 ,   x_flow_schedule_rec             IN  OUT NOCOPY MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
571 )
572 IS
573 l_bom_revision		NUMBER := NULL;
574 l_revision		NUMBER := NULL;
575 l_bom_date		DATE := NULL;
576 l_routing_revision	NUMBER := NULL;
577 l_routing_date		DATE := NULL;
578 l_error_number		NUMBER := 1;
579 BEGIN
580 
581     --  Load out record
582 
583     x_flow_schedule_rec := p_flow_schedule_rec;
584 
585     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.alternate_bom_designator,p_old_flow_schedule_rec.alternate_bom_designator)
586     THEN
587         NULL;
588     END IF;
589 
590     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.alternate_routing_desig,p_old_flow_schedule_rec.alternate_routing_desig)
591     THEN
592         NULL;
593     END IF;
594 
595     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.bom_revision,p_old_flow_schedule_rec.bom_revision)
596     THEN
597         NULL;
598     END IF;
599 
600     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.bom_revision_date,p_old_flow_schedule_rec.bom_revision_date)
601     THEN
602         NULL;
603     END IF;
604 
605     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.build_sequence,p_old_flow_schedule_rec.build_sequence)
606     THEN
607         NULL;
608     END IF;
609 
610     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.class_code,p_old_flow_schedule_rec.class_code)
611     THEN
612         NULL;
613     END IF;
614 
615     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.completion_locator_id,p_old_flow_schedule_rec.completion_locator_id)
616     THEN
617         NULL;
618     END IF;
619 
620     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.completion_subinventory,p_old_flow_schedule_rec.completion_subinventory)
621     THEN
622         NULL;
623     END IF;
624 
625     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.created_by,p_old_flow_schedule_rec.created_by)
626     THEN
627         NULL;
628     END IF;
629 
630     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.creation_date,p_old_flow_schedule_rec.creation_date)
631     THEN
632         NULL;
633     END IF;
634 
635     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.date_closed,p_old_flow_schedule_rec.date_closed)
636     THEN
637         NULL;
638     END IF;
639 
640     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_class,p_old_flow_schedule_rec.demand_class)
641     THEN
642         NULL;
643     END IF;
644 
645     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_delivery,p_old_flow_schedule_rec.demand_source_delivery)
646     THEN
647         NULL;
648     END IF;
649 
650     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_header_id,p_old_flow_schedule_rec.demand_source_header_id)
651     THEN
652         NULL;
653     END IF;
654 
655     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_line,p_old_flow_schedule_rec.demand_source_line)
656     THEN
657         NULL;
658     END IF;
659 
660     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.demand_source_type,p_old_flow_schedule_rec.demand_source_type)
661     THEN
662         NULL;
663     END IF;
664 
665     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_updated_by,p_old_flow_schedule_rec.last_updated_by)
666     THEN
667         NULL;
668     END IF;
669 
670     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_update_date,p_old_flow_schedule_rec.last_update_date)
671     THEN
672         NULL;
673     END IF;
674 
675     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.last_update_login,p_old_flow_schedule_rec.last_update_login)
676     THEN
677         NULL;
678     END IF;
679 
680     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.line_id,p_old_flow_schedule_rec.line_id)
681     THEN
682         NULL;
683     END IF;
684 
685     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_account,p_old_flow_schedule_rec.material_account)
686     THEN
687         NULL;
688     END IF;
689 
690     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_overhead_account,p_old_flow_schedule_rec.material_overhead_account)
691     THEN
692         NULL;
693     END IF;
694 
695     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.material_variance_account,p_old_flow_schedule_rec.material_variance_account)
696     THEN
697         NULL;
698     END IF;
699 
700     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.mps_net_quantity,p_old_flow_schedule_rec.mps_net_quantity)
701     THEN
702         NULL;
703     END IF;
704 
705     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.mps_scheduled_comp_date,p_old_flow_schedule_rec.mps_scheduled_comp_date)
706     THEN
707         NULL;
708     END IF;
709 
710     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.organization_id,p_old_flow_schedule_rec.organization_id)
711     THEN
712         NULL;
713     END IF;
714 
715     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.outside_processing_acct,p_old_flow_schedule_rec.outside_processing_acct)
716     THEN
717         NULL;
718     END IF;
719 
720     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.outside_proc_var_acct,p_old_flow_schedule_rec.outside_proc_var_acct)
721     THEN
722         NULL;
723     END IF;
724 
725     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.overhead_account,p_old_flow_schedule_rec.overhead_account)
726     THEN
727         NULL;
728     END IF;
729 
730     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.overhead_variance_account,p_old_flow_schedule_rec.overhead_variance_account)
731     THEN
732         NULL;
733     END IF;
734 
735     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.planned_quantity,p_old_flow_schedule_rec.planned_quantity)
736     THEN
737         NULL;
738     END IF;
739 
740     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.primary_item_id,p_old_flow_schedule_rec.primary_item_id)
741     THEN
742     /* Fix for bug 3661250. Added the following SQL to update primary_item_id in WIP_ENTITIES if it has been changed.
743     */
744         UPDATE WIP_ENTITIES
745            SET primary_item_id = p_flow_schedule_rec.primary_item_id
746          WHERE wip_entity_id   = p_flow_schedule_rec.wip_entity_id
747            AND organization_id = p_flow_schedule_rec.organization_id;
748 
749    /* End of fix for bug 3661250 */
750     END IF;
751 
752     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_application_id,p_old_flow_schedule_rec.program_application_id)
753     THEN
754         NULL;
755     END IF;
756 
757     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_id,p_old_flow_schedule_rec.program_id)
758     THEN
759         NULL;
760     END IF;
761 
762     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.program_update_date,p_old_flow_schedule_rec.program_update_date)
763     THEN
764         NULL;
765     END IF;
766 
767     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.project_id,p_old_flow_schedule_rec.project_id)
768     THEN
769         NULL;
770     END IF;
771 
772     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.quantity_completed,p_old_flow_schedule_rec.quantity_completed)
773     THEN
774         NULL;
775     END IF;
776 
777     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.request_id,p_old_flow_schedule_rec.request_id)
778     THEN
779         NULL;
780     END IF;
781 
782     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.resource_account,p_old_flow_schedule_rec.resource_account)
783     THEN
784         NULL;
785     END IF;
786 
787     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.resource_variance_account,p_old_flow_schedule_rec.resource_variance_account)
788     THEN
789         NULL;
790     END IF;
791 
792     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.routing_revision,p_old_flow_schedule_rec.routing_revision)
793     THEN
794         NULL;
795     END IF;
796 
797     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.routing_revision_date,p_old_flow_schedule_rec.routing_revision_date)
798     THEN
799         NULL;
800     END IF;
801 
802     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_completion_date,p_old_flow_schedule_rec.scheduled_completion_date)
803     THEN
804         NULL;
805     END IF;
806 
807     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_flag,p_old_flow_schedule_rec.scheduled_flag)
808     THEN
809         NULL;
810     END IF;
811 
812     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.scheduled_start_date,p_old_flow_schedule_rec.scheduled_start_date)
813     THEN
814         NULL;
815     END IF;
816 
817     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.schedule_group_id,p_old_flow_schedule_rec.schedule_group_id)
818     THEN
819         NULL;
820     END IF;
821 
822     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.schedule_number,p_old_flow_schedule_rec.schedule_number)
823     THEN
824         UPDATE wip_entities
825         SET wip_entity_name = p_flow_schedule_rec.schedule_number
826         WHERE wip_entity_id = p_flow_schedule_rec.wip_entity_id;
827     END IF;
828 
829     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.status,p_old_flow_schedule_rec.status)
830     THEN
831         NULL;
832     END IF;
833 
834     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.std_cost_adjustment_acct,p_old_flow_schedule_rec.std_cost_adjustment_acct)
835     THEN
836         NULL;
837     END IF;
838 
839     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.task_id,p_old_flow_schedule_rec.task_id)
840     THEN
841         NULL;
842     END IF;
843 
844     IF NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.wip_entity_id,p_old_flow_schedule_rec.wip_entity_id)
845     THEN
846         NULL;
847     END IF;
848 
849 END Apply_Attribute_Changes;
850 
851 --  Function Complete_Record
852 
853 FUNCTION Complete_Record
854 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
855 ,   p_old_flow_schedule_rec         IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
856 ) RETURN MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
857 IS
858 l_flow_schedule_rec           MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type := p_flow_schedule_rec;
859 BEGIN
860 
861     IF l_flow_schedule_rec.alternate_bom_designator = FND_API.G_MISS_CHAR THEN
862 	l_flow_schedule_rec.alternate_bom_designator := NULL ;
863     ELSIF l_flow_schedule_rec.alternate_bom_designator IS NULL THEN
864         l_flow_schedule_rec.alternate_bom_designator := p_old_flow_schedule_rec.alternate_bom_designator;
865     END IF;
866 
867     IF l_flow_schedule_rec.alternate_routing_desig = FND_API.G_MISS_CHAR THEN
868         l_flow_schedule_rec.alternate_routing_desig :=  NULL ;
869     ELSIF l_flow_schedule_rec.alternate_routing_desig IS NULL THEN
870         l_flow_schedule_rec.alternate_routing_desig := p_old_flow_schedule_rec.alternate_routing_desig;
871     END IF;
872 
873     IF l_flow_schedule_rec.attribute1 = FND_API.G_MISS_CHAR THEN
874         l_flow_schedule_rec.attribute1 :=  NULL ;
875     ELSIF l_flow_schedule_rec.attribute1 IS NULL THEN
876         l_flow_schedule_rec.attribute1 := p_old_flow_schedule_rec.attribute1;
877     END IF;
878 
879     IF l_flow_schedule_rec.attribute10 = FND_API.G_MISS_CHAR THEN
880         l_flow_schedule_rec.attribute10 := NULL ;
881     ELSIF l_flow_schedule_rec.attribute10 IS NULL THEN
882         l_flow_schedule_rec.attribute10 := p_old_flow_schedule_rec.attribute10;
883     END IF;
884 
885     IF l_flow_schedule_rec.attribute11 = FND_API.G_MISS_CHAR THEN
886         l_flow_schedule_rec.attribute11 := NULL ;
887     ELSIF l_flow_schedule_rec.attribute11 IS NULL THEN
888         l_flow_schedule_rec.attribute11 := p_old_flow_schedule_rec.attribute11;
889     END IF;
890 
891     IF l_flow_schedule_rec.attribute12 = FND_API.G_MISS_CHAR THEN
892         l_flow_schedule_rec.attribute12 := NULL ;
893     ELSIF l_flow_schedule_rec.attribute12 IS NULL THEN
894         l_flow_schedule_rec.attribute12 := p_old_flow_schedule_rec.attribute12;
895     END IF;
896 
897     IF l_flow_schedule_rec.attribute13 = FND_API.G_MISS_CHAR THEN
898         l_flow_schedule_rec.attribute13 := NULL ;
899     ELSIF l_flow_schedule_rec.attribute13 IS NULL THEN
900         l_flow_schedule_rec.attribute13 := p_old_flow_schedule_rec.attribute13;
901     END IF;
902 
903     IF l_flow_schedule_rec.attribute14 = FND_API.G_MISS_CHAR THEN
904         l_flow_schedule_rec.attribute14 := NULL ;
905     ELSIF l_flow_schedule_rec.attribute14 IS NULL THEN
906         l_flow_schedule_rec.attribute14 := p_old_flow_schedule_rec.attribute14;
907     END IF;
908 
909     IF l_flow_schedule_rec.attribute15 = FND_API.G_MISS_CHAR THEN
910         l_flow_schedule_rec.attribute15 := NULL ;
911     ELSIF l_flow_schedule_rec.attribute15 IS NULL THEN
912         l_flow_schedule_rec.attribute15 := p_old_flow_schedule_rec.attribute15;
913     END IF;
914 
915     IF l_flow_schedule_rec.attribute2 = FND_API.G_MISS_CHAR THEN
916         l_flow_schedule_rec.attribute2 :=  NULL ;
917     ELSIF l_flow_schedule_rec.attribute2 IS NULL THEN
918         l_flow_schedule_rec.attribute2 := p_old_flow_schedule_rec.attribute2;
919     END IF;
920 
921     IF l_flow_schedule_rec.attribute3 = FND_API.G_MISS_CHAR THEN
922         l_flow_schedule_rec.attribute3 :=  NULL ;
923     ELSIF l_flow_schedule_rec.attribute3 IS NULL THEN
924         l_flow_schedule_rec.attribute3 := p_old_flow_schedule_rec.attribute3;
925     END IF;
926 
927     IF l_flow_schedule_rec.attribute4 = FND_API.G_MISS_CHAR THEN
928         l_flow_schedule_rec.attribute4 :=  NULL ;
929     ELSIF l_flow_schedule_rec.attribute4 IS NULL THEN
930         l_flow_schedule_rec.attribute4 := p_old_flow_schedule_rec.attribute4;
931     END IF;
932 
933     IF l_flow_schedule_rec.attribute5 = FND_API.G_MISS_CHAR THEN
934         l_flow_schedule_rec.attribute5 :=  NULL ;
935     ELSIF l_flow_schedule_rec.attribute5 IS NULL THEN
936         l_flow_schedule_rec.attribute5 := p_old_flow_schedule_rec.attribute5;
937     END IF;
938 
939     IF l_flow_schedule_rec.attribute6 = FND_API.G_MISS_CHAR THEN
940         l_flow_schedule_rec.attribute6 :=  NULL ;
941     ELSIF l_flow_schedule_rec.attribute6 IS NULL THEN
942         l_flow_schedule_rec.attribute6 := p_old_flow_schedule_rec.attribute6;
943     END IF;
944 
945     IF l_flow_schedule_rec.attribute7 = FND_API.G_MISS_CHAR THEN
946         l_flow_schedule_rec.attribute7 :=  NULL ;
947     ELSIF l_flow_schedule_rec.attribute7 IS NULL THEN
948         l_flow_schedule_rec.attribute7 := p_old_flow_schedule_rec.attribute7;
949     END IF;
950 
951     IF l_flow_schedule_rec.attribute8 = FND_API.G_MISS_CHAR THEN
952         l_flow_schedule_rec.attribute8 :=  NULL ;
953     ELSIF l_flow_schedule_rec.attribute8 IS NULL THEN
954         l_flow_schedule_rec.attribute8 := p_old_flow_schedule_rec.attribute8;
955     END IF;
956 
957     IF l_flow_schedule_rec.attribute9 = FND_API.G_MISS_CHAR THEN
958         l_flow_schedule_rec.attribute9 :=  NULL ;
959     ELSIF l_flow_schedule_rec.attribute9 IS NULL THEN
960         l_flow_schedule_rec.attribute9 := p_old_flow_schedule_rec.attribute9;
961     END IF;
962 
963     IF l_flow_schedule_rec.attribute_category = FND_API.G_MISS_CHAR THEN
964         l_flow_schedule_rec.attribute_category :=  NULL ;
965     ELSIF l_flow_schedule_rec.attribute_category IS NULL  THEN
966         l_flow_schedule_rec.attribute_category := p_old_flow_schedule_rec.attribute_category;
967     END IF;
968 
969     IF l_flow_schedule_rec.bom_revision = FND_API.G_MISS_CHAR THEN
970         l_flow_schedule_rec.bom_revision :=  NULL ;
971     ELSIF l_flow_schedule_rec.bom_revision IS NULL THEN
972         l_flow_schedule_rec.bom_revision := p_old_flow_schedule_rec.bom_revision;
973     END IF;
974 
975     IF l_flow_schedule_rec.bom_revision_date = FND_API.G_MISS_DATE THEN
976         l_flow_schedule_rec.bom_revision_date :=  NULL ;
977     ELSIF l_flow_schedule_rec.bom_revision_date IS NULL THEN
978         l_flow_schedule_rec.bom_revision_date := p_old_flow_schedule_rec.bom_revision_date;
979     END IF;
980 
981     IF l_flow_schedule_rec.build_sequence = FND_API.G_MISS_NUM THEN
982         l_flow_schedule_rec.build_sequence :=  NULL ;
983     ELSIF l_flow_schedule_rec.build_sequence IS NULL THEN
984         l_flow_schedule_rec.build_sequence := p_old_flow_schedule_rec.build_sequence;
985     END IF;
986 
987     IF l_flow_schedule_rec.class_code = FND_API.G_MISS_CHAR THEN
988         l_flow_schedule_rec.class_code :=  NULL ;
989     ELSIF l_flow_schedule_rec.class_code IS NULL THEN
990         l_flow_schedule_rec.class_code := p_old_flow_schedule_rec.class_code;
991     END IF;
992 
993     IF l_flow_schedule_rec.completion_locator_id = FND_API.G_MISS_NUM THEN
994         l_flow_schedule_rec.completion_locator_id :=  NULL ;
995     ELSIF l_flow_schedule_rec.completion_locator_id IS NULL THEN
996         l_flow_schedule_rec.completion_locator_id := p_old_flow_schedule_rec.completion_locator_id;
997     END IF;
998 
999     IF l_flow_schedule_rec.completion_subinventory = FND_API.G_MISS_CHAR THEN
1000         l_flow_schedule_rec.completion_subinventory := NULL ;
1001     ELSIF l_flow_schedule_rec.completion_subinventory IS NULL THEN
1002         l_flow_schedule_rec.completion_subinventory := p_old_flow_schedule_rec.completion_subinventory;
1003     END IF;
1004 
1005     IF l_flow_schedule_rec.created_by = FND_API.G_MISS_NUM THEN
1006         l_flow_schedule_rec.created_by :=  NULL ;
1007     ELSIF l_flow_schedule_rec.created_by IS NULL THEN
1008         l_flow_schedule_rec.created_by := p_old_flow_schedule_rec.created_by;
1009     END IF;
1010 
1011     IF l_flow_schedule_rec.creation_date = FND_API.G_MISS_DATE THEN
1012         l_flow_schedule_rec.creation_date :=  NULL ;
1013     ELSIF l_flow_schedule_rec.creation_date IS NULL THEN
1014         l_flow_schedule_rec.creation_date := p_old_flow_schedule_rec.creation_date;
1015     END IF;
1016 
1017     IF l_flow_schedule_rec.date_closed = FND_API.G_MISS_DATE THEN
1018         l_flow_schedule_rec.date_closed :=  NULL ;
1019     ELSIF l_flow_schedule_rec.date_closed IS NULL THEN
1020         l_flow_schedule_rec.date_closed := p_old_flow_schedule_rec.date_closed;
1021     END IF;
1022 
1023     IF l_flow_schedule_rec.demand_class = FND_API.G_MISS_CHAR THEN
1024         l_flow_schedule_rec.demand_class := NULL ;
1025     ELSIF l_flow_schedule_rec.demand_class IS NULL THEN
1026         l_flow_schedule_rec.demand_class := p_old_flow_schedule_rec.demand_class;
1027     END IF;
1028 
1029     IF l_flow_schedule_rec.demand_source_delivery = FND_API.G_MISS_CHAR THEN
1030         l_flow_schedule_rec.demand_source_delivery :=  NULL ;
1031     ELSIF l_flow_schedule_rec.demand_source_delivery IS NULL THEN
1032         l_flow_schedule_rec.demand_source_delivery := p_old_flow_schedule_rec.demand_source_delivery;
1033     END IF;
1034 
1035     IF l_flow_schedule_rec.demand_source_header_id = FND_API.G_MISS_NUM THEN
1036         l_flow_schedule_rec.demand_source_header_id := NULL ;
1037     ELSIF l_flow_schedule_rec.demand_source_header_id IS NULL THEN
1038         l_flow_schedule_rec.demand_source_header_id := p_old_flow_schedule_rec.demand_source_header_id;
1039     END IF;
1040 
1041     IF l_flow_schedule_rec.demand_source_line = FND_API.G_MISS_CHAR THEN
1042         l_flow_schedule_rec.demand_source_line :=  NULL ;
1043     ELSIF l_flow_schedule_rec.demand_source_line IS NULL THEN
1044         l_flow_schedule_rec.demand_source_line := p_old_flow_schedule_rec.demand_source_line;
1045     END IF;
1046 
1047     IF l_flow_schedule_rec.demand_source_type = FND_API.G_MISS_NUM THEN
1048         l_flow_schedule_rec.demand_source_type :=  NULL ;
1049     ELSIF l_flow_schedule_rec.demand_source_type IS NULL THEN
1050         l_flow_schedule_rec.demand_source_type := p_old_flow_schedule_rec.demand_source_type;
1051     END IF;
1052 
1053     IF l_flow_schedule_rec.last_updated_by = FND_API.G_MISS_NUM THEN
1054         l_flow_schedule_rec.last_updated_by :=  NULL ;
1055     ELSIF l_flow_schedule_rec.last_updated_by IS NULL THEN
1056         l_flow_schedule_rec.last_updated_by := p_old_flow_schedule_rec.last_updated_by;
1057     END IF;
1058 
1059     IF l_flow_schedule_rec.last_update_date = FND_API.G_MISS_DATE THEN
1060         l_flow_schedule_rec.last_update_date := NULL ;
1061     ELSIF l_flow_schedule_rec.last_update_date IS NULL THEN
1062         l_flow_schedule_rec.last_update_date := p_old_flow_schedule_rec.last_update_date;
1063     END IF;
1064 
1065     IF l_flow_schedule_rec.last_update_login = FND_API.G_MISS_NUM THEN
1066         l_flow_schedule_rec.last_update_login :=  NULL ;
1067     ELSIF l_flow_schedule_rec.last_update_login IS NULL THEN
1068         l_flow_schedule_rec.last_update_login := p_old_flow_schedule_rec.last_update_login;
1069     END IF;
1070 
1071     IF l_flow_schedule_rec.line_id = FND_API.G_MISS_NUM THEN
1072         l_flow_schedule_rec.line_id :=  NULL ;
1073     ELSIF l_flow_schedule_rec.line_id IS NULL THEN
1074         l_flow_schedule_rec.line_id := p_old_flow_schedule_rec.line_id;
1075     END IF;
1076 
1077     IF l_flow_schedule_rec.material_account = FND_API.G_MISS_NUM THEN
1078         l_flow_schedule_rec.material_account := NULL ;
1079     ELSIF l_flow_schedule_rec.material_account IS NULL THEN
1080         l_flow_schedule_rec.material_account := p_old_flow_schedule_rec.material_account;
1081     END IF;
1082 
1083     IF l_flow_schedule_rec.material_overhead_account = FND_API.G_MISS_NUM THEN
1084         l_flow_schedule_rec.material_overhead_account :=   NULL ;
1085     ELSIF l_flow_schedule_rec.material_overhead_account IS NULL THEN
1086         l_flow_schedule_rec.material_overhead_account := p_old_flow_schedule_rec.material_overhead_account;
1087     END IF;
1088 
1089     IF l_flow_schedule_rec.material_variance_account = FND_API.G_MISS_NUM THEN
1090         l_flow_schedule_rec.material_variance_account :=  NULL ;
1091     ELSIF l_flow_schedule_rec.material_variance_account IS NULL THEN
1092         l_flow_schedule_rec.material_variance_account := p_old_flow_schedule_rec.material_variance_account;
1093     END IF;
1094 
1095     IF l_flow_schedule_rec.mps_net_quantity = FND_API.G_MISS_NUM THEN
1096         l_flow_schedule_rec.mps_net_quantity :=   NULL ;
1097     ELSIF l_flow_schedule_rec.mps_net_quantity IS NULL THEN
1098         l_flow_schedule_rec.mps_net_quantity := p_old_flow_schedule_rec.mps_net_quantity;
1099     END IF;
1100 
1101     IF l_flow_schedule_rec.mps_scheduled_comp_date = FND_API.G_MISS_DATE THEN
1102         l_flow_schedule_rec.mps_scheduled_comp_date :=   NULL ;
1103     ELSIF l_flow_schedule_rec.mps_scheduled_comp_date IS NULL THEN
1104         l_flow_schedule_rec.mps_scheduled_comp_date := p_old_flow_schedule_rec.mps_scheduled_comp_date;
1105     END IF;
1106 
1107     IF l_flow_schedule_rec.organization_id = FND_API.G_MISS_NUM THEN
1108         l_flow_schedule_rec.organization_id :=   NULL ;
1109     ELSIF l_flow_schedule_rec.organization_id IS NULL THEN
1110         l_flow_schedule_rec.organization_id := p_old_flow_schedule_rec.organization_id;
1111     END IF;
1112 
1113     IF l_flow_schedule_rec.outside_processing_acct = FND_API.G_MISS_NUM THEN
1114         l_flow_schedule_rec.outside_processing_acct :=   NULL ;
1115     ELSIF l_flow_schedule_rec.outside_processing_acct IS NULL  THEN
1116         l_flow_schedule_rec.outside_processing_acct := p_old_flow_schedule_rec.outside_processing_acct;
1117     END IF;
1118 
1119     IF l_flow_schedule_rec.outside_proc_var_acct = FND_API.G_MISS_NUM THEN
1120         l_flow_schedule_rec.outside_proc_var_acct :=   NULL ;
1121     ELSIF l_flow_schedule_rec.outside_proc_var_acct IS NULL THEN
1122         l_flow_schedule_rec.outside_proc_var_acct := p_old_flow_schedule_rec.outside_proc_var_acct;
1123     END IF;
1124 
1125     IF l_flow_schedule_rec.overhead_account = FND_API.G_MISS_NUM THEN
1126         l_flow_schedule_rec.overhead_account :=   NULL ;
1127     ELSIF l_flow_schedule_rec.overhead_account IS NULL THEN
1128         l_flow_schedule_rec.overhead_account := p_old_flow_schedule_rec.overhead_account;
1129     END IF;
1130 
1131     IF l_flow_schedule_rec.overhead_variance_account = FND_API.G_MISS_NUM THEN
1132         l_flow_schedule_rec.overhead_variance_account :=  NULL ;
1133     ELSIF l_flow_schedule_rec.overhead_variance_account IS NULL THEN
1134         l_flow_schedule_rec.overhead_variance_account := p_old_flow_schedule_rec.overhead_variance_account;
1135     END IF;
1136 
1137     IF l_flow_schedule_rec.planned_quantity = FND_API.G_MISS_NUM THEN
1138         l_flow_schedule_rec.planned_quantity :=   NULL ;
1139     ELSIF l_flow_schedule_rec.overhead_variance_account IS NULL THEN
1140         l_flow_schedule_rec.planned_quantity := p_old_flow_schedule_rec.planned_quantity;
1141     END IF;
1142 
1143     IF l_flow_schedule_rec.primary_item_id = FND_API.G_MISS_NUM THEN
1144         l_flow_schedule_rec.primary_item_id :=   NULL ;
1145     ELSIF l_flow_schedule_rec.primary_item_id IS NULL THEN
1146         l_flow_schedule_rec.primary_item_id := p_old_flow_schedule_rec.primary_item_id;
1147     END IF;
1148 
1149     IF l_flow_schedule_rec.program_application_id = FND_API.G_MISS_NUM THEN
1150         l_flow_schedule_rec.program_application_id :=   NULL ;
1151     ELSIF l_flow_schedule_rec.program_application_id IS NULL THEN
1152         l_flow_schedule_rec.program_application_id := p_old_flow_schedule_rec.program_application_id;
1153     END IF;
1154 
1155     IF l_flow_schedule_rec.program_id = FND_API.G_MISS_NUM THEN
1156         l_flow_schedule_rec.program_id :=   NULL ;
1157     ELSIF l_flow_schedule_rec.program_id IS NULL THEN
1158         l_flow_schedule_rec.program_id := p_old_flow_schedule_rec.program_id;
1159     END IF;
1160 
1161     IF l_flow_schedule_rec.program_update_date = FND_API.G_MISS_DATE THEN
1162         l_flow_schedule_rec.program_update_date :=  NULL ;
1163     ELSIF l_flow_schedule_rec.program_update_date IS NULL THEN
1164         l_flow_schedule_rec.program_update_date := p_old_flow_schedule_rec.program_update_date;
1165     END IF;
1166 
1167     IF l_flow_schedule_rec.project_id = FND_API.G_MISS_NUM THEN
1168         l_flow_schedule_rec.project_id :=   NULL ;
1169     ELSIF l_flow_schedule_rec.project_id IS NULL THEN
1170         l_flow_schedule_rec.project_id := p_old_flow_schedule_rec.project_id;
1171     END IF;
1172 
1173     IF l_flow_schedule_rec.quantity_completed = FND_API.G_MISS_NUM THEN
1174         l_flow_schedule_rec.quantity_completed :=   NULL ;
1175     ELSIF l_flow_schedule_rec.quantity_completed IS NULL  THEN
1176         l_flow_schedule_rec.quantity_completed := p_old_flow_schedule_rec.quantity_completed;
1177     END IF;
1178 
1179     IF l_flow_schedule_rec.request_id = FND_API.G_MISS_NUM THEN
1180         l_flow_schedule_rec.request_id :=   NULL ;
1181     ELSIF l_flow_schedule_rec.request_id IS NULL THEN
1182         l_flow_schedule_rec.request_id := p_old_flow_schedule_rec.request_id;
1183     END IF;
1184 
1185     IF l_flow_schedule_rec.resource_account = FND_API.G_MISS_NUM THEN
1186         l_flow_schedule_rec.resource_account :=   NULL ;
1187     ELSIF l_flow_schedule_rec.resource_account IS NULL THEN
1188         l_flow_schedule_rec.resource_account := p_old_flow_schedule_rec.resource_account;
1189     END IF;
1190 
1191     IF l_flow_schedule_rec.resource_variance_account = FND_API.G_MISS_NUM THEN
1192         l_flow_schedule_rec.resource_variance_account :=  NULL ;
1193     ELSIF l_flow_schedule_rec.resource_variance_account IS NULL THEN
1194         l_flow_schedule_rec.resource_variance_account := p_old_flow_schedule_rec.resource_variance_account;
1195     END IF;
1196 
1197     IF l_flow_schedule_rec.routing_revision = FND_API.G_MISS_CHAR THEN
1198         l_flow_schedule_rec.routing_revision :=   NULL ;
1199     ELSIF l_flow_schedule_rec.routing_revision IS NULL THEN
1200         l_flow_schedule_rec.routing_revision := p_old_flow_schedule_rec.routing_revision;
1201     END IF;
1202 
1203     IF l_flow_schedule_rec.routing_revision_date = FND_API.G_MISS_DATE THEN
1204         l_flow_schedule_rec.routing_revision_date :=   NULL ;
1205     ELSIF l_flow_schedule_rec.routing_revision_date IS NULL THEN
1206         l_flow_schedule_rec.routing_revision_date := p_old_flow_schedule_rec.routing_revision_date;
1207     END IF;
1208 
1209     IF l_flow_schedule_rec.scheduled_completion_date = FND_API.G_MISS_DATE THEN
1210         l_flow_schedule_rec.scheduled_completion_date :=   NULL ;
1211     ELSIF l_flow_schedule_rec.scheduled_completion_date IS NULL THEN
1212         l_flow_schedule_rec.scheduled_completion_date := p_old_flow_schedule_rec.scheduled_completion_date;
1213     END IF;
1214 
1215     IF l_flow_schedule_rec.scheduled_flag = FND_API.G_MISS_NUM THEN
1216         l_flow_schedule_rec.scheduled_flag :=   NULL ;
1217     ELSIF l_flow_schedule_rec.scheduled_flag IS NULL THEN
1218         l_flow_schedule_rec.scheduled_flag := p_old_flow_schedule_rec.scheduled_flag;
1219     END IF;
1220 
1221     IF l_flow_schedule_rec.scheduled_start_date = FND_API.G_MISS_DATE THEN
1222         l_flow_schedule_rec.scheduled_start_date :=   NULL ;
1223     ELSIF l_flow_schedule_rec.scheduled_start_date IS NULL THEN
1224         l_flow_schedule_rec.scheduled_start_date := p_old_flow_schedule_rec.scheduled_start_date;
1225     END IF;
1226 
1227     IF l_flow_schedule_rec.schedule_group_id = FND_API.G_MISS_NUM THEN
1228         l_flow_schedule_rec.schedule_group_id :=   NULL ;
1229     ELSIF l_flow_schedule_rec.schedule_group_id IS NULL THEN
1230         l_flow_schedule_rec.schedule_group_id := p_old_flow_schedule_rec.schedule_group_id;
1231     END IF;
1232 
1233     IF l_flow_schedule_rec.schedule_number = FND_API.G_MISS_CHAR THEN
1234         l_flow_schedule_rec.schedule_number :=   NULL ;
1235     ELSIF l_flow_schedule_rec.schedule_number IS NULL THEN
1236         l_flow_schedule_rec.schedule_number := p_old_flow_schedule_rec.schedule_number;
1237     END IF;
1238 
1239     IF l_flow_schedule_rec.status = FND_API.G_MISS_NUM THEN
1240         l_flow_schedule_rec.status :=   NULL ;
1241     ELSIF l_flow_schedule_rec.status IS NULL THEN
1242         l_flow_schedule_rec.status := p_old_flow_schedule_rec.status;
1243     END IF;
1244 
1245     IF l_flow_schedule_rec.std_cost_adjustment_acct = FND_API.G_MISS_NUM THEN
1246         l_flow_schedule_rec.std_cost_adjustment_acct :=   NULL ;
1247     ELSIF l_flow_schedule_rec.std_cost_adjustment_acct IS NULL THEN
1248         l_flow_schedule_rec.std_cost_adjustment_acct := p_old_flow_schedule_rec.std_cost_adjustment_acct;
1249     END IF;
1250 
1251     IF l_flow_schedule_rec.task_id = FND_API.G_MISS_NUM THEN
1252         l_flow_schedule_rec.task_id :=   NULL ;
1253     ELSIF l_flow_schedule_rec.task_id IS NULL THEN
1254         l_flow_schedule_rec.task_id := p_old_flow_schedule_rec.task_id;
1255     END IF;
1256 
1257     IF l_flow_schedule_rec.wip_entity_id = FND_API.G_MISS_NUM THEN
1258         l_flow_schedule_rec.wip_entity_id :=   NULL ;
1259     ELSIF l_flow_schedule_rec.wip_entity_id IS NULL THEN
1260         l_flow_schedule_rec.wip_entity_id := p_old_flow_schedule_rec.wip_entity_id;
1261     END IF;
1262 
1263     IF l_flow_schedule_rec.end_item_unit_number = FND_API.G_MISS_CHAR THEN
1264         l_flow_schedule_rec.end_item_unit_number :=   NULL ;
1265     ELSIF l_flow_schedule_rec.end_item_unit_number IS NULL THEN
1266         l_flow_schedule_rec.end_item_unit_number := p_old_flow_schedule_rec.end_item_unit_number;
1267     END IF;
1268 
1269 
1270     IF l_flow_schedule_rec.quantity_scrapped = FND_API.G_MISS_NUM THEN
1271         l_flow_schedule_rec.quantity_scrapped :=   NULL ;
1272     ELSIF l_flow_schedule_rec.quantity_scrapped IS NULL THEN
1273         l_flow_schedule_rec.quantity_scrapped := p_old_flow_schedule_rec.quantity_scrapped;
1274     END IF;
1275 
1276     RETURN l_flow_schedule_rec;
1277 
1278 END Complete_Record;
1279 
1280 --  Function Convert_Miss_To_Null
1281 
1282 FUNCTION Convert_Miss_To_Null
1283 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
1284 ) RETURN MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
1285 IS
1286 l_flow_schedule_rec           MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type:= p_flow_schedule_rec;
1287 BEGIN
1288 
1289     IF l_flow_schedule_rec.alternate_bom_designator = FND_API.G_MISS_CHAR THEN
1290         l_flow_schedule_rec.alternate_bom_designator := NULL;
1291     END IF;
1292 
1293     IF l_flow_schedule_rec.alternate_routing_desig = FND_API.G_MISS_CHAR THEN
1294         l_flow_schedule_rec.alternate_routing_desig := NULL;
1295     END IF;
1296 
1297     IF l_flow_schedule_rec.attribute1 = FND_API.G_MISS_CHAR THEN
1298         l_flow_schedule_rec.attribute1 := NULL;
1299     END IF;
1300 
1301     IF l_flow_schedule_rec.attribute10 = FND_API.G_MISS_CHAR THEN
1302         l_flow_schedule_rec.attribute10 := NULL;
1303     END IF;
1304 
1305     IF l_flow_schedule_rec.attribute11 = FND_API.G_MISS_CHAR THEN
1306         l_flow_schedule_rec.attribute11 := NULL;
1307     END IF;
1308 
1309     IF l_flow_schedule_rec.attribute12 = FND_API.G_MISS_CHAR THEN
1310         l_flow_schedule_rec.attribute12 := NULL;
1311     END IF;
1312 
1313     IF l_flow_schedule_rec.attribute13 = FND_API.G_MISS_CHAR THEN
1314         l_flow_schedule_rec.attribute13 := NULL;
1315     END IF;
1316 
1317     IF l_flow_schedule_rec.attribute14 = FND_API.G_MISS_CHAR THEN
1318         l_flow_schedule_rec.attribute14 := NULL;
1319     END IF;
1320 
1321     IF l_flow_schedule_rec.attribute15 = FND_API.G_MISS_CHAR THEN
1322         l_flow_schedule_rec.attribute15 := NULL;
1323     END IF;
1324 
1325     IF l_flow_schedule_rec.attribute2 = FND_API.G_MISS_CHAR THEN
1326         l_flow_schedule_rec.attribute2 := NULL;
1327     END IF;
1328 
1329     IF l_flow_schedule_rec.attribute3 = FND_API.G_MISS_CHAR THEN
1330         l_flow_schedule_rec.attribute3 := NULL;
1331     END IF;
1332 
1333     IF l_flow_schedule_rec.attribute4 = FND_API.G_MISS_CHAR THEN
1334         l_flow_schedule_rec.attribute4 := NULL;
1335     END IF;
1336 
1337     IF l_flow_schedule_rec.attribute5 = FND_API.G_MISS_CHAR THEN
1338         l_flow_schedule_rec.attribute5 := NULL;
1339     END IF;
1340 
1341     IF l_flow_schedule_rec.attribute6 = FND_API.G_MISS_CHAR THEN
1342         l_flow_schedule_rec.attribute6 := NULL;
1343     END IF;
1344 
1345     IF l_flow_schedule_rec.attribute7 = FND_API.G_MISS_CHAR THEN
1346         l_flow_schedule_rec.attribute7 := NULL;
1347     END IF;
1348 
1349     IF l_flow_schedule_rec.attribute8 = FND_API.G_MISS_CHAR THEN
1350         l_flow_schedule_rec.attribute8 := NULL;
1351     END IF;
1352 
1353     IF l_flow_schedule_rec.attribute9 = FND_API.G_MISS_CHAR THEN
1354         l_flow_schedule_rec.attribute9 := NULL;
1355     END IF;
1356 
1357     IF l_flow_schedule_rec.attribute_category = FND_API.G_MISS_CHAR THEN
1358         l_flow_schedule_rec.attribute_category := NULL;
1359     END IF;
1360 
1361     IF l_flow_schedule_rec.bom_revision = FND_API.G_MISS_CHAR THEN
1362         l_flow_schedule_rec.bom_revision := NULL;
1363     END IF;
1364 
1365     IF l_flow_schedule_rec.bom_revision_date = FND_API.G_MISS_DATE THEN
1366         l_flow_schedule_rec.bom_revision_date := NULL;
1367     END IF;
1368 
1369     IF l_flow_schedule_rec.build_sequence = FND_API.G_MISS_NUM THEN
1370         l_flow_schedule_rec.build_sequence := NULL;
1371     END IF;
1372 
1373     IF l_flow_schedule_rec.class_code = FND_API.G_MISS_CHAR THEN
1374         l_flow_schedule_rec.class_code := NULL;
1375     END IF;
1376 
1377     IF l_flow_schedule_rec.completion_locator_id = FND_API.G_MISS_NUM THEN
1378         l_flow_schedule_rec.completion_locator_id := NULL;
1379     END IF;
1380 
1381     IF l_flow_schedule_rec.completion_subinventory = FND_API.G_MISS_CHAR THEN
1382         l_flow_schedule_rec.completion_subinventory := NULL;
1383     END IF;
1384 
1385     IF l_flow_schedule_rec.created_by = FND_API.G_MISS_NUM THEN
1386         l_flow_schedule_rec.created_by := NULL;
1387     END IF;
1388 
1389     IF l_flow_schedule_rec.creation_date = FND_API.G_MISS_DATE THEN
1390         l_flow_schedule_rec.creation_date := NULL;
1391     END IF;
1392 
1393     IF l_flow_schedule_rec.date_closed = FND_API.G_MISS_DATE THEN
1394         l_flow_schedule_rec.date_closed := NULL;
1395     END IF;
1396 
1397     IF l_flow_schedule_rec.demand_class = FND_API.G_MISS_CHAR THEN
1398         l_flow_schedule_rec.demand_class := NULL;
1399     END IF;
1400 
1401     IF l_flow_schedule_rec.demand_source_delivery = FND_API.G_MISS_CHAR THEN
1402         l_flow_schedule_rec.demand_source_delivery := NULL;
1403     END IF;
1404 
1405     IF l_flow_schedule_rec.demand_source_header_id = FND_API.G_MISS_NUM THEN
1406         l_flow_schedule_rec.demand_source_header_id := NULL;
1407     END IF;
1408 
1409     IF l_flow_schedule_rec.demand_source_line = FND_API.G_MISS_CHAR THEN
1410         l_flow_schedule_rec.demand_source_line := NULL;
1411     END IF;
1412 
1413     IF l_flow_schedule_rec.demand_source_type = FND_API.G_MISS_NUM THEN
1414         l_flow_schedule_rec.demand_source_type := NULL;
1415     END IF;
1416 
1417     IF l_flow_schedule_rec.last_updated_by = FND_API.G_MISS_NUM THEN
1418         l_flow_schedule_rec.last_updated_by := NULL;
1419     END IF;
1420 
1421     IF l_flow_schedule_rec.last_update_date = FND_API.G_MISS_DATE THEN
1422         l_flow_schedule_rec.last_update_date := NULL;
1423     END IF;
1424 
1425     IF l_flow_schedule_rec.last_update_login = FND_API.G_MISS_NUM THEN
1426         l_flow_schedule_rec.last_update_login := NULL;
1427     END IF;
1428 
1429     IF l_flow_schedule_rec.line_id = FND_API.G_MISS_NUM THEN
1430         l_flow_schedule_rec.line_id := NULL;
1431     END IF;
1432 
1433     IF l_flow_schedule_rec.material_account = FND_API.G_MISS_NUM THEN
1434         l_flow_schedule_rec.material_account := NULL;
1435     END IF;
1436 
1437     IF l_flow_schedule_rec.material_overhead_account = FND_API.G_MISS_NUM THEN
1438         l_flow_schedule_rec.material_overhead_account := NULL;
1439     END IF;
1440 
1441     IF l_flow_schedule_rec.material_variance_account = FND_API.G_MISS_NUM THEN
1442         l_flow_schedule_rec.material_variance_account := NULL;
1443     END IF;
1444 
1445     IF l_flow_schedule_rec.mps_net_quantity = FND_API.G_MISS_NUM THEN
1446         l_flow_schedule_rec.mps_net_quantity := NULL;
1447     END IF;
1448 
1449     IF l_flow_schedule_rec.mps_scheduled_comp_date = FND_API.G_MISS_DATE THEN
1450         l_flow_schedule_rec.mps_scheduled_comp_date := NULL;
1451     END IF;
1452 
1453     IF l_flow_schedule_rec.organization_id = FND_API.G_MISS_NUM THEN
1454         l_flow_schedule_rec.organization_id := NULL;
1455     END IF;
1456 
1457     IF l_flow_schedule_rec.outside_processing_acct = FND_API.G_MISS_NUM THEN
1458         l_flow_schedule_rec.outside_processing_acct := NULL;
1459     END IF;
1460 
1461     IF l_flow_schedule_rec.outside_proc_var_acct = FND_API.G_MISS_NUM THEN
1462         l_flow_schedule_rec.outside_proc_var_acct := NULL;
1463     END IF;
1464 
1465     IF l_flow_schedule_rec.overhead_account = FND_API.G_MISS_NUM THEN
1466         l_flow_schedule_rec.overhead_account := NULL;
1467     END IF;
1468 
1469     IF l_flow_schedule_rec.overhead_variance_account = FND_API.G_MISS_NUM THEN
1470         l_flow_schedule_rec.overhead_variance_account := NULL;
1471     END IF;
1472 
1473     IF l_flow_schedule_rec.planned_quantity = FND_API.G_MISS_NUM THEN
1474         l_flow_schedule_rec.planned_quantity := NULL;
1475     END IF;
1476 
1477     IF l_flow_schedule_rec.primary_item_id = FND_API.G_MISS_NUM THEN
1478         l_flow_schedule_rec.primary_item_id := NULL;
1479     END IF;
1480 
1481     IF l_flow_schedule_rec.program_application_id = FND_API.G_MISS_NUM THEN
1482         l_flow_schedule_rec.program_application_id := NULL;
1483     END IF;
1484 
1485     IF l_flow_schedule_rec.program_id = FND_API.G_MISS_NUM THEN
1486         l_flow_schedule_rec.program_id := NULL;
1487     END IF;
1488 
1489     IF l_flow_schedule_rec.program_update_date = FND_API.G_MISS_DATE THEN
1490         l_flow_schedule_rec.program_update_date := NULL;
1491     END IF;
1492 
1493     IF l_flow_schedule_rec.project_id = FND_API.G_MISS_NUM THEN
1494         l_flow_schedule_rec.project_id := NULL;
1495     END IF;
1496 
1497     IF l_flow_schedule_rec.quantity_completed = FND_API.G_MISS_NUM THEN
1498         l_flow_schedule_rec.quantity_completed := NULL;
1499     END IF;
1500 
1501     IF l_flow_schedule_rec.request_id = FND_API.G_MISS_NUM THEN
1502         l_flow_schedule_rec.request_id := NULL;
1503     END IF;
1504 
1505     IF l_flow_schedule_rec.resource_account = FND_API.G_MISS_NUM THEN
1506         l_flow_schedule_rec.resource_account := NULL;
1507     END IF;
1508 
1509     IF l_flow_schedule_rec.resource_variance_account = FND_API.G_MISS_NUM THEN
1510         l_flow_schedule_rec.resource_variance_account := NULL;
1511     END IF;
1512 
1513     IF l_flow_schedule_rec.routing_revision = FND_API.G_MISS_CHAR THEN
1514         l_flow_schedule_rec.routing_revision := NULL;
1515     END IF;
1516 
1517     IF l_flow_schedule_rec.routing_revision_date = FND_API.G_MISS_DATE THEN
1518         l_flow_schedule_rec.routing_revision_date := NULL;
1519     END IF;
1520 
1521     IF l_flow_schedule_rec.scheduled_completion_date = FND_API.G_MISS_DATE THEN
1522         l_flow_schedule_rec.scheduled_completion_date := NULL;
1523     END IF;
1524 
1525     IF l_flow_schedule_rec.scheduled_flag = FND_API.G_MISS_NUM THEN
1526         l_flow_schedule_rec.scheduled_flag := NULL;
1527     END IF;
1528 
1529     IF l_flow_schedule_rec.scheduled_start_date = FND_API.G_MISS_DATE THEN
1530         l_flow_schedule_rec.scheduled_start_date := NULL;
1531     END IF;
1532 
1533     IF l_flow_schedule_rec.schedule_group_id = FND_API.G_MISS_NUM THEN
1534         l_flow_schedule_rec.schedule_group_id := NULL;
1535     END IF;
1536 
1537     IF l_flow_schedule_rec.schedule_number = FND_API.G_MISS_CHAR THEN
1538         l_flow_schedule_rec.schedule_number := NULL;
1539     END IF;
1540 
1541     IF l_flow_schedule_rec.status = FND_API.G_MISS_NUM THEN
1542         l_flow_schedule_rec.status := NULL;
1543     END IF;
1544 
1545     IF l_flow_schedule_rec.std_cost_adjustment_acct = FND_API.G_MISS_NUM THEN
1546         l_flow_schedule_rec.std_cost_adjustment_acct := NULL;
1547     END IF;
1548 
1549     IF l_flow_schedule_rec.task_id = FND_API.G_MISS_NUM THEN
1550         l_flow_schedule_rec.task_id := NULL;
1551     END IF;
1552 
1553     IF l_flow_schedule_rec.wip_entity_id = FND_API.G_MISS_NUM THEN
1554         l_flow_schedule_rec.wip_entity_id := NULL;
1555     END IF;
1556 
1557     IF l_flow_schedule_rec.end_item_unit_number = FND_API.G_MISS_CHAR THEN
1558         l_flow_schedule_rec.end_item_unit_number := NULL;
1559     END IF;
1560 
1561     IF l_flow_schedule_rec.quantity_scrapped = FND_API.G_MISS_NUM THEN
1562        l_flow_schedule_rec.quantity_scrapped := NULL;
1563     END IF;
1564 
1565     IF l_flow_schedule_rec.kanban_card_id = FND_API.G_MISS_NUM THEN
1566        l_flow_schedule_rec.kanban_card_id := NULL;
1567     END IF;
1568 
1569     IF l_flow_schedule_rec.synch_schedule_num = FND_API.G_MISS_CHAR THEN
1570         l_flow_schedule_rec.synch_schedule_num := NULL;
1571     END IF;
1572 
1573     IF l_flow_schedule_rec.synch_operation_seq_num = FND_API.G_MISS_NUM THEN
1574        l_flow_schedule_rec.synch_operation_seq_num := NULL;
1575     END IF;
1576 
1577     IF l_flow_schedule_rec.roll_forwarded_flag = FND_API.G_MISS_NUM THEN
1578        l_flow_schedule_rec.roll_forwarded_flag := NULL;
1579     END IF;
1580 
1581     IF l_flow_schedule_rec.current_line_operation = FND_API.G_MISS_NUM THEN
1582        l_flow_schedule_rec.current_line_operation := NULL;
1583     END IF;
1584 
1585     RETURN l_flow_schedule_rec;
1586 
1587 END Convert_Miss_To_Null;
1588 
1589 --  Procedure Update_Row
1590 
1591 PROCEDURE Update_Row
1592 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
1593 )
1594 IS
1595     --bug 3906891: also changed the p_flow_schedules_rec.XXX to l_flow_schedule_rec.XXX
1596     --in the UPDATE statement below
1597     l_flow_schedule_rec MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type := Convert_Miss_To_Null (p_flow_schedule_rec);
1598 BEGIN
1599 
1600     UPDATE  WIP_FLOW_SCHEDULES
1601     SET     ALTERNATE_BOM_DESIGNATOR       = l_flow_schedule_rec.alternate_bom_designator
1602     ,       ALTERNATE_ROUTING_DESIGNATOR   = l_flow_schedule_rec.alternate_routing_desig
1603     ,       ATTRIBUTE1                     = l_flow_schedule_rec.attribute1
1604     ,       ATTRIBUTE10                    = l_flow_schedule_rec.attribute10
1605     ,       ATTRIBUTE11                    = l_flow_schedule_rec.attribute11
1606     ,       ATTRIBUTE12                    = l_flow_schedule_rec.attribute12
1607     ,       ATTRIBUTE13                    = l_flow_schedule_rec.attribute13
1608     ,       ATTRIBUTE14                    = l_flow_schedule_rec.attribute14
1609     ,       ATTRIBUTE15                    = l_flow_schedule_rec.attribute15
1610     ,       ATTRIBUTE2                     = l_flow_schedule_rec.attribute2
1611     ,       ATTRIBUTE3                     = l_flow_schedule_rec.attribute3
1612     ,       ATTRIBUTE4                     = l_flow_schedule_rec.attribute4
1613     ,       ATTRIBUTE5                     = l_flow_schedule_rec.attribute5
1614     ,       ATTRIBUTE6                     = l_flow_schedule_rec.attribute6
1615     ,       ATTRIBUTE7                     = l_flow_schedule_rec.attribute7
1616     ,       ATTRIBUTE8                     = l_flow_schedule_rec.attribute8
1617     ,       ATTRIBUTE9                     = l_flow_schedule_rec.attribute9
1618     ,       ATTRIBUTE_CATEGORY             = l_flow_schedule_rec.attribute_category
1619     ,       BOM_REVISION                   = l_flow_schedule_rec.bom_revision
1620     ,       BOM_REVISION_DATE              = l_flow_schedule_rec.bom_revision_date
1621     ,       BUILD_SEQUENCE                 = l_flow_schedule_rec.build_sequence
1622     ,       CLASS_CODE                     = l_flow_schedule_rec.class_code
1623     ,       COMPLETION_LOCATOR_ID          = l_flow_schedule_rec.completion_locator_id
1624     ,       COMPLETION_SUBINVENTORY        = l_flow_schedule_rec.completion_subinventory
1625     ,       CREATED_BY                     = l_flow_schedule_rec.created_by
1626     ,       CREATION_DATE                  = l_flow_schedule_rec.creation_date
1627     ,       DATE_CLOSED                    = l_flow_schedule_rec.date_closed
1628     ,       DEMAND_CLASS                   = l_flow_schedule_rec.demand_class
1629     ,       DEMAND_SOURCE_DELIVERY         = l_flow_schedule_rec.demand_source_delivery
1630     ,       DEMAND_SOURCE_HEADER_ID        = l_flow_schedule_rec.demand_source_header_id
1631     ,       DEMAND_SOURCE_LINE             = l_flow_schedule_rec.demand_source_line
1632     ,       DEMAND_SOURCE_TYPE             = l_flow_schedule_rec.demand_source_type
1633     ,       LAST_UPDATED_BY                = l_flow_schedule_rec.last_updated_by
1634     ,       LAST_UPDATE_DATE               = l_flow_schedule_rec.last_update_date
1635     ,       LAST_UPDATE_LOGIN              = l_flow_schedule_rec.last_update_login
1636     ,       LINE_ID                        = l_flow_schedule_rec.line_id
1637     ,       MATERIAL_ACCOUNT               = l_flow_schedule_rec.material_account
1638     ,       MATERIAL_OVERHEAD_ACCOUNT      = l_flow_schedule_rec.material_overhead_account
1639     ,       MATERIAL_VARIANCE_ACCOUNT      = l_flow_schedule_rec.material_variance_account
1640     ,       MPS_NET_QUANTITY               = l_flow_schedule_rec.mps_net_quantity
1641     ,       MPS_SCHEDULED_COMPLETION_DATE  = l_flow_schedule_rec.mps_scheduled_comp_date
1642     ,       ORGANIZATION_ID                = l_flow_schedule_rec.organization_id
1643     ,       OUTSIDE_PROCESSING_ACCOUNT     = l_flow_schedule_rec.outside_processing_acct
1644     ,       OUTSIDE_PROC_VARIANCE_ACCOUNT  = l_flow_schedule_rec.outside_proc_var_acct
1645     ,       OVERHEAD_ACCOUNT               = l_flow_schedule_rec.overhead_account
1646     ,       OVERHEAD_VARIANCE_ACCOUNT      = l_flow_schedule_rec.overhead_variance_account
1647     ,       PLANNED_QUANTITY               = l_flow_schedule_rec.planned_quantity
1648     ,       PRIMARY_ITEM_ID                = l_flow_schedule_rec.primary_item_id
1649     ,       PROGRAM_APPLICATION_ID         = l_flow_schedule_rec.program_application_id
1650     ,       PROGRAM_ID                     = l_flow_schedule_rec.program_id
1651     ,       PROGRAM_UPDATE_DATE            = l_flow_schedule_rec.program_update_date
1652     ,       PROJECT_ID                     = l_flow_schedule_rec.project_id
1653     ,       QUANTITY_COMPLETED             = l_flow_schedule_rec.quantity_completed
1654     ,       REQUEST_ID                     = l_flow_schedule_rec.request_id
1655     ,       RESOURCE_ACCOUNT               = l_flow_schedule_rec.resource_account
1656     ,       RESOURCE_VARIANCE_ACCOUNT      = l_flow_schedule_rec.resource_variance_account
1657     ,       ROUTING_REVISION               = l_flow_schedule_rec.routing_revision
1658     ,       ROUTING_REVISION_DATE          = l_flow_schedule_rec.routing_revision_date
1659     ,       SCHEDULED_COMPLETION_DATE      = l_flow_schedule_rec.scheduled_completion_date
1660     ,       SCHEDULED_FLAG                 = l_flow_schedule_rec.scheduled_flag
1661     ,       SCHEDULED_START_DATE           = l_flow_schedule_rec.scheduled_start_date
1662     ,       SCHEDULE_GROUP_ID              = l_flow_schedule_rec.schedule_group_id
1663     ,       SCHEDULE_NUMBER                = l_flow_schedule_rec.schedule_number
1664     ,       STATUS                         = l_flow_schedule_rec.status
1665     ,       STD_COST_ADJUSTMENT_ACCOUNT    = l_flow_schedule_rec.std_cost_adjustment_acct
1666     ,       TASK_ID                        = l_flow_schedule_rec.task_id
1667     ,       END_ITEM_UNIT_NUMBER           = l_flow_schedule_rec.end_item_unit_number
1668     ,       QUANTITY_SCRAPPED              = l_flow_schedule_rec.quantity_scrapped
1669     ,       WIP_ENTITY_ID                  = l_flow_schedule_rec.wip_entity_id
1670     WHERE   ORGANIZATION_ID = l_flow_schedule_rec.organization_id
1671     AND     WIP_ENTITY_ID = l_flow_schedule_rec.wip_entity_id
1672     ;
1673 
1674 EXCEPTION
1675 
1676     WHEN OTHERS THEN
1677 
1678         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1679         THEN
1680             FND_MSG_PUB.Add_Exc_Msg
1681             (   G_PKG_NAME
1682             ,   'Update_Row'
1683             );
1684         END IF;
1685 
1686         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1687 
1688 END Update_Row;
1689 
1690 --  Procedure Insert_Row
1691 
1692 PROCEDURE Insert_Row
1693 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
1694 )
1695 IS
1696     --bug 3906891: also changed the p_flow_schedules_rec.XXX to l_flow_schedule_rec.XXX
1697     --in the INSERT statement below
1698     l_flow_schedule_rec MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type := Convert_Miss_To_Null (p_flow_schedule_rec);
1699 BEGIN
1700 
1701     INSERT  INTO WIP_FLOW_SCHEDULES
1702     (       ALTERNATE_BOM_DESIGNATOR
1703     ,       ALTERNATE_ROUTING_DESIGNATOR
1704     ,       ATTRIBUTE1
1705     ,       ATTRIBUTE10
1706     ,       ATTRIBUTE11
1707     ,       ATTRIBUTE12
1708     ,       ATTRIBUTE13
1709     ,       ATTRIBUTE14
1710     ,       ATTRIBUTE15
1711     ,       ATTRIBUTE2
1712     ,       ATTRIBUTE3
1713     ,       ATTRIBUTE4
1714     ,       ATTRIBUTE5
1715     ,       ATTRIBUTE6
1716     ,       ATTRIBUTE7
1717     ,       ATTRIBUTE8
1718     ,       ATTRIBUTE9
1719     ,       ATTRIBUTE_CATEGORY
1720     ,       BOM_REVISION
1721     ,       BOM_REVISION_DATE
1722     ,       BUILD_SEQUENCE
1723     ,       CLASS_CODE
1724     ,       COMPLETION_LOCATOR_ID
1725     ,       COMPLETION_SUBINVENTORY
1726     ,       CREATED_BY
1727     ,       CREATION_DATE
1728     ,       DATE_CLOSED
1729     ,       DEMAND_CLASS
1730     ,       DEMAND_SOURCE_DELIVERY
1731     ,       DEMAND_SOURCE_HEADER_ID
1732     ,       DEMAND_SOURCE_LINE
1733     ,       DEMAND_SOURCE_TYPE
1734     ,       LAST_UPDATED_BY
1735     ,       LAST_UPDATE_DATE
1736     ,       LAST_UPDATE_LOGIN
1737     ,       LINE_ID
1738     ,       MATERIAL_ACCOUNT
1739     ,       MATERIAL_OVERHEAD_ACCOUNT
1740     ,       MATERIAL_VARIANCE_ACCOUNT
1741     ,       MPS_NET_QUANTITY
1742     ,       MPS_SCHEDULED_COMPLETION_DATE
1743     ,       ORGANIZATION_ID
1744     ,       OUTSIDE_PROCESSING_ACCOUNT
1745     ,       OUTSIDE_PROC_VARIANCE_ACCOUNT
1746     ,       OVERHEAD_ACCOUNT
1747     ,       OVERHEAD_VARIANCE_ACCOUNT
1748     ,       PLANNED_QUANTITY
1749     ,       PRIMARY_ITEM_ID
1750     ,       PROGRAM_APPLICATION_ID
1751     ,       PROGRAM_ID
1752     ,       PROGRAM_UPDATE_DATE
1753     ,       PROJECT_ID
1754     ,       QUANTITY_COMPLETED
1755     ,       REQUEST_ID
1756     ,       RESOURCE_ACCOUNT
1757     ,       RESOURCE_VARIANCE_ACCOUNT
1758     ,       ROUTING_REVISION
1759     ,       ROUTING_REVISION_DATE
1760     ,       SCHEDULED_COMPLETION_DATE
1761     ,       SCHEDULED_FLAG
1762     ,       SCHEDULED_START_DATE
1763     ,       SCHEDULE_GROUP_ID
1764     ,       SCHEDULE_NUMBER
1765     ,       STATUS
1766     ,       STD_COST_ADJUSTMENT_ACCOUNT
1767     ,       TASK_ID
1768     ,       END_ITEM_UNIT_NUMBER
1769     ,       QUANTITY_SCRAPPED
1770     ,       WIP_ENTITY_ID
1771     ,	    KANBAN_CARD_ID
1772     ,	    SYNCH_SCHEDULE_NUM
1773     ,	    SYNCH_OPERATION_SEQ_NUM
1774     ,       ROLL_FORWARDED_FLAG
1775     ,       CURRENT_LINE_OPERATION
1776     )
1777     VALUES
1778     (       l_flow_schedule_rec.alternate_bom_designator
1779     ,       l_flow_schedule_rec.alternate_routing_desig
1780     ,       l_flow_schedule_rec.attribute1
1781     ,       l_flow_schedule_rec.attribute10
1782     ,       l_flow_schedule_rec.attribute11
1783     ,       l_flow_schedule_rec.attribute12
1784     ,       l_flow_schedule_rec.attribute13
1785     ,       l_flow_schedule_rec.attribute14
1786     ,       l_flow_schedule_rec.attribute15
1787     ,       l_flow_schedule_rec.attribute2
1788     ,       l_flow_schedule_rec.attribute3
1789     ,       l_flow_schedule_rec.attribute4
1790     ,       l_flow_schedule_rec.attribute5
1791     ,       l_flow_schedule_rec.attribute6
1792     ,       l_flow_schedule_rec.attribute7
1793     ,       l_flow_schedule_rec.attribute8
1794     ,       l_flow_schedule_rec.attribute9
1795     ,       l_flow_schedule_rec.attribute_category
1796     ,       l_flow_schedule_rec.bom_revision
1797     ,       l_flow_schedule_rec.bom_revision_date
1798     ,       l_flow_schedule_rec.build_sequence
1799     ,       l_flow_schedule_rec.class_code
1800     ,       l_flow_schedule_rec.completion_locator_id
1801     ,       l_flow_schedule_rec.completion_subinventory
1802     ,       l_flow_schedule_rec.created_by
1803     ,       l_flow_schedule_rec.creation_date
1804     ,       l_flow_schedule_rec.date_closed
1805     ,       l_flow_schedule_rec.demand_class
1806     ,       l_flow_schedule_rec.demand_source_delivery
1807     ,       l_flow_schedule_rec.demand_source_header_id
1808     ,       l_flow_schedule_rec.demand_source_line
1809     ,       l_flow_schedule_rec.demand_source_type
1810     ,       l_flow_schedule_rec.last_updated_by
1811     ,       l_flow_schedule_rec.last_update_date
1812     ,       l_flow_schedule_rec.last_update_login
1813     ,       l_flow_schedule_rec.line_id
1814     ,       l_flow_schedule_rec.material_account
1815     ,       l_flow_schedule_rec.material_overhead_account
1816     ,       l_flow_schedule_rec.material_variance_account
1817     ,       l_flow_schedule_rec.mps_net_quantity
1818     ,       l_flow_schedule_rec.mps_scheduled_comp_date
1819     ,       l_flow_schedule_rec.organization_id
1820     ,       l_flow_schedule_rec.outside_processing_acct
1821     ,       l_flow_schedule_rec.outside_proc_var_acct
1822     ,       l_flow_schedule_rec.overhead_account
1823     ,       l_flow_schedule_rec.overhead_variance_account
1824     ,       l_flow_schedule_rec.planned_quantity
1825     ,       l_flow_schedule_rec.primary_item_id
1826     ,       l_flow_schedule_rec.program_application_id
1827     ,       l_flow_schedule_rec.program_id
1828     ,       l_flow_schedule_rec.program_update_date
1829     ,       l_flow_schedule_rec.project_id
1830     ,       l_flow_schedule_rec.quantity_completed
1831     ,       l_flow_schedule_rec.request_id
1832     ,       l_flow_schedule_rec.resource_account
1833     ,       l_flow_schedule_rec.resource_variance_account
1834     ,       l_flow_schedule_rec.routing_revision
1835     ,       l_flow_schedule_rec.routing_revision_date
1836     ,       l_flow_schedule_rec.scheduled_completion_date
1837     ,       l_flow_schedule_rec.scheduled_flag
1838     ,       l_flow_schedule_rec.scheduled_start_date
1839     ,       l_flow_schedule_rec.schedule_group_id
1840     ,       l_flow_schedule_rec.schedule_number
1841     ,       l_flow_schedule_rec.status
1842     ,       l_flow_schedule_rec.std_cost_adjustment_acct
1843     ,       l_flow_schedule_rec.task_id
1844     ,       l_flow_schedule_rec.end_item_unit_number
1845     ,       l_flow_schedule_rec.quantity_scrapped
1846     ,       l_flow_schedule_rec.wip_entity_id
1847     ,       l_flow_schedule_rec.kanban_card_id
1848     ,       l_flow_schedule_rec.synch_schedule_num
1849     ,       l_flow_schedule_rec.synch_operation_seq_num
1850     ,       l_flow_schedule_rec.roll_forwarded_flag
1851     ,       l_flow_schedule_rec.current_line_operation
1852     );
1853 
1854 EXCEPTION
1855 
1856     WHEN OTHERS THEN
1857 
1858         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1859         THEN
1860             FND_MSG_PUB.Add_Exc_Msg
1861             (   G_PKG_NAME
1862             ,   'Insert_Row'
1863             );
1864         END IF;
1865 
1866         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1867 
1868 END Insert_Row;
1869 
1870 --  Procedure Delete_Row
1871 
1872 PROCEDURE Delete_Row
1873 (   p_wip_entity_id                 IN  NUMBER
1874 )
1875 IS
1876 BEGIN
1877 
1878     DELETE  FROM WIP_FLOW_SCHEDULES
1879     WHERE   WIP_ENTITY_ID = p_wip_entity_id
1880     ;
1881 
1882 EXCEPTION
1883 
1884     WHEN OTHERS THEN
1885 
1886         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1887         THEN
1888             FND_MSG_PUB.Add_Exc_Msg
1889             (   G_PKG_NAME
1890             ,   'Delete_Row'
1891             );
1892         END IF;
1893 
1894         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1895 
1896 END Delete_Row;
1897 
1898 --  Function Query_Row
1899 
1900 FUNCTION Query_Row
1901 (   p_wip_entity_id                 IN  NUMBER
1902 ) RETURN MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
1903 IS
1904 l_flow_schedule_rec           MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type;
1905 BEGIN
1906 
1907     SELECT  ALTERNATE_BOM_DESIGNATOR
1908     ,       ALTERNATE_ROUTING_DESIGNATOR
1909     ,       ATTRIBUTE1
1910     ,       ATTRIBUTE10
1911     ,       ATTRIBUTE11
1912     ,       ATTRIBUTE12
1913     ,       ATTRIBUTE13
1914     ,       ATTRIBUTE14
1915     ,       ATTRIBUTE15
1916     ,       ATTRIBUTE2
1917     ,       ATTRIBUTE3
1918     ,       ATTRIBUTE4
1919     ,       ATTRIBUTE5
1920     ,       ATTRIBUTE6
1921     ,       ATTRIBUTE7
1922     ,       ATTRIBUTE8
1923     ,       ATTRIBUTE9
1924     ,       ATTRIBUTE_CATEGORY
1925     ,       BOM_REVISION
1926     ,       BOM_REVISION_DATE
1927     ,       BUILD_SEQUENCE
1928     ,       CLASS_CODE
1929     ,       COMPLETION_LOCATOR_ID
1930     ,       COMPLETION_SUBINVENTORY
1931     ,       CREATED_BY
1932     ,       CREATION_DATE
1933     ,       DATE_CLOSED
1934     ,       DEMAND_CLASS
1935     ,       DEMAND_SOURCE_DELIVERY
1936     ,       DEMAND_SOURCE_HEADER_ID
1937     ,       DEMAND_SOURCE_LINE
1938     ,       DEMAND_SOURCE_TYPE
1939     ,       LAST_UPDATED_BY
1940     ,       LAST_UPDATE_DATE
1941     ,       LAST_UPDATE_LOGIN
1942     ,       LINE_ID
1943     ,       MATERIAL_ACCOUNT
1944     ,       MATERIAL_OVERHEAD_ACCOUNT
1945     ,       MATERIAL_VARIANCE_ACCOUNT
1946     ,       MPS_NET_QUANTITY
1947     ,       MPS_SCHEDULED_COMPLETION_DATE
1948     ,       ORGANIZATION_ID
1949     ,       OUTSIDE_PROCESSING_ACCOUNT
1950     ,       OUTSIDE_PROC_VARIANCE_ACCOUNT
1951     ,       OVERHEAD_ACCOUNT
1952     ,       OVERHEAD_VARIANCE_ACCOUNT
1953     ,       PLANNED_QUANTITY
1954     ,       PRIMARY_ITEM_ID
1955     ,       PROGRAM_APPLICATION_ID
1956     ,       PROGRAM_ID
1957     ,       PROGRAM_UPDATE_DATE
1958     ,       PROJECT_ID
1959     ,       QUANTITY_COMPLETED
1960     ,       REQUEST_ID
1961     ,       RESOURCE_ACCOUNT
1962     ,       RESOURCE_VARIANCE_ACCOUNT
1963     ,       ROUTING_REVISION
1964     ,       ROUTING_REVISION_DATE
1965     ,       SCHEDULED_COMPLETION_DATE
1966     ,       SCHEDULED_FLAG
1967     ,       SCHEDULED_START_DATE
1968     ,       SCHEDULE_GROUP_ID
1969     ,       SCHEDULE_NUMBER
1970     ,       STATUS
1971     ,       STD_COST_ADJUSTMENT_ACCOUNT
1972     ,       TASK_ID
1973     ,       WIP_ENTITY_ID
1974     ,       END_ITEM_UNIT_NUMBER
1975     ,       QUANTITY_SCRAPPED
1976     INTO    l_flow_schedule_rec.alternate_bom_designator
1977     ,       l_flow_schedule_rec.alternate_routing_desig
1978     ,       l_flow_schedule_rec.attribute1
1979     ,       l_flow_schedule_rec.attribute10
1980     ,       l_flow_schedule_rec.attribute11
1981     ,       l_flow_schedule_rec.attribute12
1982     ,       l_flow_schedule_rec.attribute13
1983     ,       l_flow_schedule_rec.attribute14
1984     ,       l_flow_schedule_rec.attribute15
1985     ,       l_flow_schedule_rec.attribute2
1986     ,       l_flow_schedule_rec.attribute3
1987     ,       l_flow_schedule_rec.attribute4
1988     ,       l_flow_schedule_rec.attribute5
1989     ,       l_flow_schedule_rec.attribute6
1990     ,       l_flow_schedule_rec.attribute7
1991     ,       l_flow_schedule_rec.attribute8
1992     ,       l_flow_schedule_rec.attribute9
1993     ,       l_flow_schedule_rec.attribute_category
1994     ,       l_flow_schedule_rec.bom_revision
1995     ,       l_flow_schedule_rec.bom_revision_date
1996     ,       l_flow_schedule_rec.build_sequence
1997     ,       l_flow_schedule_rec.class_code
1998     ,       l_flow_schedule_rec.completion_locator_id
1999     ,       l_flow_schedule_rec.completion_subinventory
2000     ,       l_flow_schedule_rec.created_by
2001     ,       l_flow_schedule_rec.creation_date
2002     ,       l_flow_schedule_rec.date_closed
2003     ,       l_flow_schedule_rec.demand_class
2004     ,       l_flow_schedule_rec.demand_source_delivery
2005     ,       l_flow_schedule_rec.demand_source_header_id
2006     ,       l_flow_schedule_rec.demand_source_line
2007     ,       l_flow_schedule_rec.demand_source_type
2008     ,       l_flow_schedule_rec.last_updated_by
2009     ,       l_flow_schedule_rec.last_update_date
2010     ,       l_flow_schedule_rec.last_update_login
2011     ,       l_flow_schedule_rec.line_id
2012     ,       l_flow_schedule_rec.material_account
2013     ,       l_flow_schedule_rec.material_overhead_account
2014     ,       l_flow_schedule_rec.material_variance_account
2015     ,       l_flow_schedule_rec.mps_net_quantity
2016     ,       l_flow_schedule_rec.mps_scheduled_comp_date
2017     ,       l_flow_schedule_rec.organization_id
2018     ,       l_flow_schedule_rec.outside_processing_acct
2019     ,       l_flow_schedule_rec.outside_proc_var_acct
2020     ,       l_flow_schedule_rec.overhead_account
2021     ,       l_flow_schedule_rec.overhead_variance_account
2022     ,       l_flow_schedule_rec.planned_quantity
2023     ,       l_flow_schedule_rec.primary_item_id
2024     ,       l_flow_schedule_rec.program_application_id
2025     ,       l_flow_schedule_rec.program_id
2026     ,       l_flow_schedule_rec.program_update_date
2027     ,       l_flow_schedule_rec.project_id
2028     ,       l_flow_schedule_rec.quantity_completed
2029     ,       l_flow_schedule_rec.request_id
2030     ,       l_flow_schedule_rec.resource_account
2031     ,       l_flow_schedule_rec.resource_variance_account
2032     ,       l_flow_schedule_rec.routing_revision
2033     ,       l_flow_schedule_rec.routing_revision_date
2034     ,       l_flow_schedule_rec.scheduled_completion_date
2035     ,       l_flow_schedule_rec.scheduled_flag
2036     ,       l_flow_schedule_rec.scheduled_start_date
2037     ,       l_flow_schedule_rec.schedule_group_id
2038     ,       l_flow_schedule_rec.schedule_number
2039     ,       l_flow_schedule_rec.status
2040     ,       l_flow_schedule_rec.std_cost_adjustment_acct
2041     ,       l_flow_schedule_rec.task_id
2042     ,       l_flow_schedule_rec.wip_entity_id
2043     ,       l_flow_schedule_rec.end_item_unit_number
2044     ,       l_flow_schedule_rec.quantity_scrapped
2045     FROM    WIP_FLOW_SCHEDULES
2046     WHERE   WIP_ENTITY_ID = p_wip_entity_id
2047     ;
2048 
2049     RETURN l_flow_schedule_rec;
2050 
2051 EXCEPTION
2052 
2053     WHEN OTHERS THEN
2054 
2055         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2056         THEN
2057             FND_MSG_PUB.Add_Exc_Msg
2058             (   G_PKG_NAME
2059             ,   'Query_Row'
2060             );
2061         END IF;
2062 
2063         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2064 
2065 END Query_Row;
2066 
2067 --  Procedure       lock_Row
2068 --
2069 
2070 PROCEDURE Lock_Row
2071 (   x_return_status                 OUT NOCOPY VARCHAR2
2072 ,   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2073 ,   x_flow_schedule_rec             IN  OUT NOCOPY MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2074 )
2075 IS
2076 l_flow_schedule_rec           MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type;
2077 temp		VARCHAR2(240);
2078 BEGIN
2079 
2080     SELECT  ALTERNATE_BOM_DESIGNATOR
2081     ,       ALTERNATE_ROUTING_DESIGNATOR
2082     ,       ATTRIBUTE1
2083     ,       ATTRIBUTE10
2084     ,       ATTRIBUTE11
2085     ,       ATTRIBUTE12
2086     ,       ATTRIBUTE13
2087     ,       ATTRIBUTE14
2088     ,       ATTRIBUTE15
2089     ,       ATTRIBUTE2
2090     ,       ATTRIBUTE3
2091     ,       ATTRIBUTE4
2092     ,       ATTRIBUTE5
2093     ,       ATTRIBUTE6
2094     ,       ATTRIBUTE7
2095     ,       ATTRIBUTE8
2096     ,       ATTRIBUTE9
2097     ,       ATTRIBUTE_CATEGORY
2098     ,       BOM_REVISION
2099     ,       BOM_REVISION_DATE
2100     ,       BUILD_SEQUENCE
2101     ,       CLASS_CODE
2102     ,       COMPLETION_LOCATOR_ID
2103     ,       COMPLETION_SUBINVENTORY
2104     ,       CREATED_BY
2105     ,       CREATION_DATE
2106     ,       DATE_CLOSED
2107     ,       DEMAND_CLASS
2108     ,       DEMAND_SOURCE_DELIVERY
2109     ,       DEMAND_SOURCE_HEADER_ID
2110     ,       DEMAND_SOURCE_LINE
2111     ,       DEMAND_SOURCE_TYPE
2112     ,       LAST_UPDATED_BY
2113     ,       LAST_UPDATE_DATE
2114     ,       LAST_UPDATE_LOGIN
2115     ,       LINE_ID
2116     ,       MATERIAL_ACCOUNT
2117     ,       MATERIAL_OVERHEAD_ACCOUNT
2118     ,       MATERIAL_VARIANCE_ACCOUNT
2119     ,       MPS_NET_QUANTITY
2120     ,       MPS_SCHEDULED_COMPLETION_DATE
2121     ,       ORGANIZATION_ID
2122     ,       OUTSIDE_PROCESSING_ACCOUNT
2123     ,       OUTSIDE_PROC_VARIANCE_ACCOUNT
2124     ,       OVERHEAD_ACCOUNT
2125     ,       OVERHEAD_VARIANCE_ACCOUNT
2126     ,       PLANNED_QUANTITY
2127     ,       PRIMARY_ITEM_ID
2128     ,       PROGRAM_APPLICATION_ID
2129     ,       PROGRAM_ID
2130     ,       PROGRAM_UPDATE_DATE
2131     ,       PROJECT_ID
2132     ,       QUANTITY_COMPLETED
2133     ,       REQUEST_ID
2134     ,       RESOURCE_ACCOUNT
2135     ,       RESOURCE_VARIANCE_ACCOUNT
2136     ,       ROUTING_REVISION
2137     ,       ROUTING_REVISION_DATE
2138     ,       SCHEDULED_COMPLETION_DATE
2139     ,       SCHEDULED_FLAG
2140     ,       SCHEDULED_START_DATE
2141     ,       SCHEDULE_GROUP_ID
2142     ,       SCHEDULE_NUMBER
2143     ,       STATUS
2144     ,       STD_COST_ADJUSTMENT_ACCOUNT
2145     ,       TASK_ID
2146     ,       WIP_ENTITY_ID
2147     ,       END_ITEM_UNIT_NUMBER
2148     ,       QUANTITY_SCRAPPED
2149     INTO    l_flow_schedule_rec.alternate_bom_designator
2150     ,       l_flow_schedule_rec.alternate_routing_desig
2151     ,       l_flow_schedule_rec.attribute1
2152     ,       l_flow_schedule_rec.attribute10
2153     ,       l_flow_schedule_rec.attribute11
2154     ,       l_flow_schedule_rec.attribute12
2155     ,       l_flow_schedule_rec.attribute13
2156     ,       l_flow_schedule_rec.attribute14
2157     ,       l_flow_schedule_rec.attribute15
2158     ,       l_flow_schedule_rec.attribute2
2159     ,       l_flow_schedule_rec.attribute3
2160     ,       l_flow_schedule_rec.attribute4
2161     ,       l_flow_schedule_rec.attribute5
2162     ,       l_flow_schedule_rec.attribute6
2163     ,       l_flow_schedule_rec.attribute7
2164     ,       l_flow_schedule_rec.attribute8
2165     ,       l_flow_schedule_rec.attribute9
2166     ,       l_flow_schedule_rec.attribute_category
2167     ,       l_flow_schedule_rec.bom_revision
2168     ,       l_flow_schedule_rec.bom_revision_date
2169     ,       l_flow_schedule_rec.build_sequence
2170     ,       l_flow_schedule_rec.class_code
2171     ,       l_flow_schedule_rec.completion_locator_id
2172     ,       l_flow_schedule_rec.completion_subinventory
2173     ,       l_flow_schedule_rec.created_by
2174     ,       l_flow_schedule_rec.creation_date
2175     ,       l_flow_schedule_rec.date_closed
2176     ,       l_flow_schedule_rec.demand_class
2177     ,       l_flow_schedule_rec.demand_source_delivery
2178     ,       l_flow_schedule_rec.demand_source_header_id
2179     ,       l_flow_schedule_rec.demand_source_line
2180     ,       l_flow_schedule_rec.demand_source_type
2181     ,       l_flow_schedule_rec.last_updated_by
2182     ,       l_flow_schedule_rec.last_update_date
2183     ,       l_flow_schedule_rec.last_update_login
2184     ,       l_flow_schedule_rec.line_id
2185     ,       l_flow_schedule_rec.material_account
2186     ,       l_flow_schedule_rec.material_overhead_account
2187     ,       l_flow_schedule_rec.material_variance_account
2188     ,       l_flow_schedule_rec.mps_net_quantity
2189     ,       l_flow_schedule_rec.mps_scheduled_comp_date
2190     ,       l_flow_schedule_rec.organization_id
2191     ,       l_flow_schedule_rec.outside_processing_acct
2192     ,       l_flow_schedule_rec.outside_proc_var_acct
2193     ,       l_flow_schedule_rec.overhead_account
2194     ,       l_flow_schedule_rec.overhead_variance_account
2195     ,       l_flow_schedule_rec.planned_quantity
2196     ,       l_flow_schedule_rec.primary_item_id
2197     ,       l_flow_schedule_rec.program_application_id
2198     ,       l_flow_schedule_rec.program_id
2199     ,       l_flow_schedule_rec.program_update_date
2200     ,       l_flow_schedule_rec.project_id
2201     ,       l_flow_schedule_rec.quantity_completed
2202     ,       l_flow_schedule_rec.request_id
2203     ,       l_flow_schedule_rec.resource_account
2204     ,       l_flow_schedule_rec.resource_variance_account
2205     ,       l_flow_schedule_rec.routing_revision
2206     ,       l_flow_schedule_rec.routing_revision_date
2207     ,       l_flow_schedule_rec.scheduled_completion_date
2208     ,       l_flow_schedule_rec.scheduled_flag
2209     ,       l_flow_schedule_rec.scheduled_start_date
2210     ,       l_flow_schedule_rec.schedule_group_id
2211     ,       l_flow_schedule_rec.schedule_number
2212     ,       l_flow_schedule_rec.status
2213     ,       l_flow_schedule_rec.std_cost_adjustment_acct
2214     ,       l_flow_schedule_rec.task_id
2215     ,       l_flow_schedule_rec.wip_entity_id
2216     ,       l_flow_schedule_rec.end_item_unit_number
2217     ,       l_flow_schedule_rec.quantity_scrapped
2218     FROM    WIP_FLOW_SCHEDULES
2219     WHERE   WIP_ENTITY_ID = p_flow_schedule_rec.wip_entity_id
2220         FOR UPDATE NOWAIT;
2221 
2222     --  Row locked. Compare IN attributes to DB attributes.
2223 
2224     IF  (   (l_flow_schedule_rec.alternate_bom_designator =
2225              p_flow_schedule_rec.alternate_bom_designator) OR
2226             ((p_flow_schedule_rec.alternate_bom_designator = FND_API.G_MISS_CHAR) OR
2227             (   (l_flow_schedule_rec.alternate_bom_designator IS NULL) AND
2228                 (p_flow_schedule_rec.alternate_bom_designator IS NULL))))
2229     AND (   (l_flow_schedule_rec.alternate_routing_desig =
2230              p_flow_schedule_rec.alternate_routing_desig) OR
2231             ((p_flow_schedule_rec.alternate_routing_desig = FND_API.G_MISS_CHAR) OR
2232             (   (l_flow_schedule_rec.alternate_routing_desig IS NULL) AND
2233                 (p_flow_schedule_rec.alternate_routing_desig IS NULL))))
2234     AND (   (l_flow_schedule_rec.attribute1 =
2235              p_flow_schedule_rec.attribute1) OR
2236             ((p_flow_schedule_rec.attribute1 = FND_API.G_MISS_CHAR) OR
2237             (   (l_flow_schedule_rec.attribute1 IS NULL) AND
2238                 (p_flow_schedule_rec.attribute1 IS NULL))))
2239     AND (   (l_flow_schedule_rec.attribute10 =
2240              p_flow_schedule_rec.attribute10) OR
2241             ((p_flow_schedule_rec.attribute10 = FND_API.G_MISS_CHAR) OR
2242             (   (l_flow_schedule_rec.attribute10 IS NULL) AND
2243                 (p_flow_schedule_rec.attribute10 IS NULL))))
2244     AND (   (l_flow_schedule_rec.attribute11 =
2245              p_flow_schedule_rec.attribute11) OR
2246             ((p_flow_schedule_rec.attribute11 = FND_API.G_MISS_CHAR) OR
2247             (   (l_flow_schedule_rec.attribute11 IS NULL) AND
2248                 (p_flow_schedule_rec.attribute11 IS NULL))))
2249     AND (   (l_flow_schedule_rec.attribute12 =
2250              p_flow_schedule_rec.attribute12) OR
2251             ((p_flow_schedule_rec.attribute12 = FND_API.G_MISS_CHAR) OR
2252             (   (l_flow_schedule_rec.attribute12 IS NULL) AND
2253                 (p_flow_schedule_rec.attribute12 IS NULL))))
2254     AND (   (l_flow_schedule_rec.attribute13 =
2255              p_flow_schedule_rec.attribute13) OR
2256             ((p_flow_schedule_rec.attribute13 = FND_API.G_MISS_CHAR) OR
2257             (   (l_flow_schedule_rec.attribute13 IS NULL) AND
2258                 (p_flow_schedule_rec.attribute13 IS NULL))))
2259     AND (   (l_flow_schedule_rec.attribute14 =
2260              p_flow_schedule_rec.attribute14) OR
2261             ((p_flow_schedule_rec.attribute14 = FND_API.G_MISS_CHAR) OR
2262             (   (l_flow_schedule_rec.attribute14 IS NULL) AND
2263                 (p_flow_schedule_rec.attribute14 IS NULL))))
2264     AND (   (l_flow_schedule_rec.attribute15 =
2265              p_flow_schedule_rec.attribute15) OR
2266             ((p_flow_schedule_rec.attribute15 = FND_API.G_MISS_CHAR) OR
2267             (   (l_flow_schedule_rec.attribute15 IS NULL) AND
2268                 (p_flow_schedule_rec.attribute15 IS NULL))))
2269     AND (   (l_flow_schedule_rec.attribute2 =
2270              p_flow_schedule_rec.attribute2) OR
2271             ((p_flow_schedule_rec.attribute2 = FND_API.G_MISS_CHAR) OR
2272             (   (l_flow_schedule_rec.attribute2 IS NULL) AND
2273                 (p_flow_schedule_rec.attribute2 IS NULL))))
2274     AND (   (l_flow_schedule_rec.attribute3 =
2275              p_flow_schedule_rec.attribute3) OR
2276             ((p_flow_schedule_rec.attribute3 = FND_API.G_MISS_CHAR) OR
2277             (   (l_flow_schedule_rec.attribute3 IS NULL) AND
2278                 (p_flow_schedule_rec.attribute3 IS NULL))))
2279     AND (   (l_flow_schedule_rec.attribute4 =
2280              p_flow_schedule_rec.attribute4) OR
2281             ((p_flow_schedule_rec.attribute4 = FND_API.G_MISS_CHAR) OR
2282             (   (l_flow_schedule_rec.attribute4 IS NULL) AND
2283                 (p_flow_schedule_rec.attribute4 IS NULL))))
2284     AND (   (l_flow_schedule_rec.attribute5 =
2285              p_flow_schedule_rec.attribute5) OR
2286             ((p_flow_schedule_rec.attribute5 = FND_API.G_MISS_CHAR) OR
2287             (   (l_flow_schedule_rec.attribute5 IS NULL) AND
2288                 (p_flow_schedule_rec.attribute5 IS NULL))))
2289     AND (   (l_flow_schedule_rec.attribute6 =
2290              p_flow_schedule_rec.attribute6) OR
2291             ((p_flow_schedule_rec.attribute6 = FND_API.G_MISS_CHAR) OR
2292             (   (l_flow_schedule_rec.attribute6 IS NULL) AND
2293                 (p_flow_schedule_rec.attribute6 IS NULL))))
2294     AND (   (l_flow_schedule_rec.attribute7 =
2295              p_flow_schedule_rec.attribute7) OR
2296             ((p_flow_schedule_rec.attribute7 = FND_API.G_MISS_CHAR) OR
2297             (   (l_flow_schedule_rec.attribute7 IS NULL) AND
2298                 (p_flow_schedule_rec.attribute7 IS NULL))))
2299     AND (   (l_flow_schedule_rec.attribute8 =
2300              p_flow_schedule_rec.attribute8) OR
2301             ((p_flow_schedule_rec.attribute8 = FND_API.G_MISS_CHAR) OR
2302             (   (l_flow_schedule_rec.attribute8 IS NULL) AND
2303                 (p_flow_schedule_rec.attribute8 IS NULL))))
2304     AND (   (l_flow_schedule_rec.attribute9 =
2305              p_flow_schedule_rec.attribute9) OR
2306             ((p_flow_schedule_rec.attribute9 = FND_API.G_MISS_CHAR) OR
2307             (   (l_flow_schedule_rec.attribute9 IS NULL) AND
2308                 (p_flow_schedule_rec.attribute9 IS NULL))))
2309     AND (   (l_flow_schedule_rec.attribute_category =
2310              p_flow_schedule_rec.attribute_category) OR
2311             ((p_flow_schedule_rec.attribute_category = FND_API.G_MISS_CHAR) OR
2312             (   (l_flow_schedule_rec.attribute_category IS NULL) AND
2313                 (p_flow_schedule_rec.attribute_category IS NULL))))
2314     AND (   (l_flow_schedule_rec.bom_revision =
2315              p_flow_schedule_rec.bom_revision) OR
2316             ((p_flow_schedule_rec.bom_revision = FND_API.G_MISS_CHAR) OR
2317             (   (l_flow_schedule_rec.bom_revision IS NULL) AND
2318                 (p_flow_schedule_rec.bom_revision IS NULL))))
2319     AND (   (l_flow_schedule_rec.bom_revision_date =
2320              p_flow_schedule_rec.bom_revision_date) OR
2321             ((p_flow_schedule_rec.bom_revision_date = FND_API.G_MISS_DATE) OR
2322             (   (l_flow_schedule_rec.bom_revision_date IS NULL) AND
2323                 (p_flow_schedule_rec.bom_revision_date IS NULL))))
2324     AND (   (l_flow_schedule_rec.build_sequence =
2325              p_flow_schedule_rec.build_sequence) OR
2326             ((p_flow_schedule_rec.build_sequence = FND_API.G_MISS_NUM) OR
2327             (   (l_flow_schedule_rec.build_sequence IS NULL) AND
2328                 (p_flow_schedule_rec.build_sequence IS NULL))))
2329     AND (   (l_flow_schedule_rec.class_code =
2330              p_flow_schedule_rec.class_code) OR
2331             ((p_flow_schedule_rec.class_code = FND_API.G_MISS_CHAR) OR
2332             (   (l_flow_schedule_rec.class_code IS NULL) AND
2333                 (p_flow_schedule_rec.class_code IS NULL))))
2334     AND (   (l_flow_schedule_rec.completion_locator_id =
2335              p_flow_schedule_rec.completion_locator_id) OR
2336             ((p_flow_schedule_rec.completion_locator_id = FND_API.G_MISS_NUM) OR
2337             (   (l_flow_schedule_rec.completion_locator_id IS NULL) AND
2338                 (p_flow_schedule_rec.completion_locator_id IS NULL))))
2339     AND (   (l_flow_schedule_rec.completion_subinventory =
2340              p_flow_schedule_rec.completion_subinventory) OR
2341             ((p_flow_schedule_rec.completion_subinventory = FND_API.G_MISS_CHAR) OR
2342             (   (l_flow_schedule_rec.completion_subinventory IS NULL) AND
2343                 (p_flow_schedule_rec.completion_subinventory IS NULL))))
2344 /*    AND (   (l_flow_schedule_rec.created_by =
2345              p_flow_schedule_rec.created_by) OR
2346             ((p_flow_schedule_rec.created_by = FND_API.G_MISS_NUM) OR
2347             (   (l_flow_schedule_rec.created_by IS NULL) AND
2348                 (p_flow_schedule_rec.created_by IS NULL))))
2349     AND (   (l_flow_schedule_rec.creation_date =
2350              p_flow_schedule_rec.creation_date) OR
2351             ((p_flow_schedule_rec.creation_date = FND_API.G_MISS_DATE) OR
2352             (   (l_flow_schedule_rec.creation_date IS NULL) AND
2353                 (p_flow_schedule_rec.creation_date IS NULL)))) */
2354     AND (   (l_flow_schedule_rec.date_closed =
2355              p_flow_schedule_rec.date_closed) OR
2356             ((p_flow_schedule_rec.date_closed = FND_API.G_MISS_DATE) OR
2357             (   (l_flow_schedule_rec.date_closed IS NULL) AND
2358                 (p_flow_schedule_rec.date_closed IS NULL))))
2359     AND (   (l_flow_schedule_rec.demand_class =
2360              p_flow_schedule_rec.demand_class) OR
2361             ((p_flow_schedule_rec.demand_class = FND_API.G_MISS_CHAR) OR
2362             (   (l_flow_schedule_rec.demand_class IS NULL) AND
2363                 (p_flow_schedule_rec.demand_class IS NULL))))
2364     AND (   (l_flow_schedule_rec.demand_source_delivery =
2365              p_flow_schedule_rec.demand_source_delivery) OR
2366             ((p_flow_schedule_rec.demand_source_delivery = FND_API.G_MISS_CHAR) OR
2367             (   (l_flow_schedule_rec.demand_source_delivery IS NULL) AND
2368                 (p_flow_schedule_rec.demand_source_delivery IS NULL))))
2369     AND (   (l_flow_schedule_rec.demand_source_header_id =
2370              p_flow_schedule_rec.demand_source_header_id) OR
2371             ((p_flow_schedule_rec.demand_source_header_id = FND_API.G_MISS_NUM) OR
2372             (   (l_flow_schedule_rec.demand_source_header_id IS NULL) AND
2373                 (p_flow_schedule_rec.demand_source_header_id IS NULL))))
2374     AND (   (l_flow_schedule_rec.demand_source_line =
2375              p_flow_schedule_rec.demand_source_line) OR
2376             ((p_flow_schedule_rec.demand_source_line = FND_API.G_MISS_CHAR) OR
2377             (   (l_flow_schedule_rec.demand_source_line IS NULL) AND
2378                 (p_flow_schedule_rec.demand_source_line IS NULL))))
2379     AND (   (l_flow_schedule_rec.demand_source_type =
2380              p_flow_schedule_rec.demand_source_type) OR
2381             ((p_flow_schedule_rec.demand_source_type = FND_API.G_MISS_NUM) OR
2382             (   (l_flow_schedule_rec.demand_source_type IS NULL) AND
2383                 (p_flow_schedule_rec.demand_source_type IS NULL))))
2384 /*    AND (   (l_flow_schedule_rec.last_updated_by =
2385              p_flow_schedule_rec.last_updated_by) OR
2386             ((p_flow_schedule_rec.last_updated_by = FND_API.G_MISS_NUM) OR
2387             (   (l_flow_schedule_rec.last_updated_by IS NULL) AND
2388                 (p_flow_schedule_rec.last_updated_by IS NULL))))
2389     AND (   (l_flow_schedule_rec.last_update_date =
2390              p_flow_schedule_rec.last_update_date) OR
2391             ((p_flow_schedule_rec.last_update_date = FND_API.G_MISS_DATE) OR
2392             (   (l_flow_schedule_rec.last_update_date IS NULL) AND
2393                 (p_flow_schedule_rec.last_update_date IS NULL))))
2394     AND (   (l_flow_schedule_rec.last_update_login =
2395              p_flow_schedule_rec.last_update_login) OR
2396             ((p_flow_schedule_rec.last_update_login = FND_API.G_MISS_NUM) OR
2397             (   (l_flow_schedule_rec.last_update_login IS NULL) AND
2398                 (p_flow_schedule_rec.last_update_login IS NULL)))) */
2399     AND (   (l_flow_schedule_rec.line_id =
2400              p_flow_schedule_rec.line_id) OR
2401             ((p_flow_schedule_rec.line_id = FND_API.G_MISS_NUM) OR
2402             (   (l_flow_schedule_rec.line_id IS NULL) AND
2403                 (p_flow_schedule_rec.line_id IS NULL))))
2404     AND (   (l_flow_schedule_rec.material_account =
2405              p_flow_schedule_rec.material_account) OR
2406             ((p_flow_schedule_rec.material_account = FND_API.G_MISS_NUM) OR
2407             (   (l_flow_schedule_rec.material_account IS NULL) AND
2408                 (p_flow_schedule_rec.material_account IS NULL))))
2409     AND (   (l_flow_schedule_rec.material_overhead_account =
2410              p_flow_schedule_rec.material_overhead_account) OR
2411             ((p_flow_schedule_rec.material_overhead_account = FND_API.G_MISS_NUM) OR
2412             (   (l_flow_schedule_rec.material_overhead_account IS NULL) AND
2413                 (p_flow_schedule_rec.material_overhead_account IS NULL))))
2414     AND (   (l_flow_schedule_rec.material_variance_account =
2415              p_flow_schedule_rec.material_variance_account) OR
2416             ((p_flow_schedule_rec.material_variance_account = FND_API.G_MISS_NUM) OR
2417             (   (l_flow_schedule_rec.material_variance_account IS NULL) AND
2418                 (p_flow_schedule_rec.material_variance_account IS NULL))))
2419     AND (   (l_flow_schedule_rec.mps_net_quantity =
2420              p_flow_schedule_rec.mps_net_quantity) OR
2421             ((p_flow_schedule_rec.mps_net_quantity = FND_API.G_MISS_NUM) OR
2422             (   (l_flow_schedule_rec.mps_net_quantity IS NULL) AND
2423                 (p_flow_schedule_rec.mps_net_quantity IS NULL))))
2424     AND (   (l_flow_schedule_rec.mps_scheduled_comp_date =
2425              p_flow_schedule_rec.mps_scheduled_comp_date) OR
2426             ((p_flow_schedule_rec.mps_scheduled_comp_date = FND_API.G_MISS_DATE) OR
2427             (   (l_flow_schedule_rec.mps_scheduled_comp_date IS NULL) AND
2428                 (p_flow_schedule_rec.mps_scheduled_comp_date IS NULL))))
2429     AND (   (l_flow_schedule_rec.organization_id =
2430              p_flow_schedule_rec.organization_id) OR
2431             ((p_flow_schedule_rec.organization_id = FND_API.G_MISS_NUM) OR
2432             (   (l_flow_schedule_rec.organization_id IS NULL) AND
2433                 (p_flow_schedule_rec.organization_id IS NULL))))
2434     AND (   (l_flow_schedule_rec.outside_processing_acct =
2435              p_flow_schedule_rec.outside_processing_acct) OR
2436             ((p_flow_schedule_rec.outside_processing_acct = FND_API.G_MISS_NUM) OR
2437             (   (l_flow_schedule_rec.outside_processing_acct IS NULL) AND
2438                 (p_flow_schedule_rec.outside_processing_acct IS NULL))))
2439     AND (   (l_flow_schedule_rec.outside_proc_var_acct =
2440              p_flow_schedule_rec.outside_proc_var_acct) OR
2441             ((p_flow_schedule_rec.outside_proc_var_acct = FND_API.G_MISS_NUM) OR
2442             (   (l_flow_schedule_rec.outside_proc_var_acct IS NULL) AND
2443                 (p_flow_schedule_rec.outside_proc_var_acct IS NULL))))
2444     AND (   (l_flow_schedule_rec.overhead_account =
2445              p_flow_schedule_rec.overhead_account) OR
2446             ((p_flow_schedule_rec.overhead_account = FND_API.G_MISS_NUM) OR
2447             (   (l_flow_schedule_rec.overhead_account IS NULL) AND
2448                 (p_flow_schedule_rec.overhead_account IS NULL))))
2449     AND (   (l_flow_schedule_rec.overhead_variance_account =
2450              p_flow_schedule_rec.overhead_variance_account) OR
2451             ((p_flow_schedule_rec.overhead_variance_account = FND_API.G_MISS_NUM) OR
2452             (   (l_flow_schedule_rec.overhead_variance_account IS NULL) AND
2453                 (p_flow_schedule_rec.overhead_variance_account IS NULL))))
2454     AND (   (l_flow_schedule_rec.planned_quantity =
2455              p_flow_schedule_rec.planned_quantity) OR
2456             ((p_flow_schedule_rec.planned_quantity = FND_API.G_MISS_NUM) OR
2457             (   (l_flow_schedule_rec.planned_quantity IS NULL) AND
2458                 (p_flow_schedule_rec.planned_quantity IS NULL))))
2459     AND (   (l_flow_schedule_rec.primary_item_id =
2460              p_flow_schedule_rec.primary_item_id) OR
2461             ((p_flow_schedule_rec.primary_item_id = FND_API.G_MISS_NUM) OR
2462             (   (l_flow_schedule_rec.primary_item_id IS NULL) AND
2463                 (p_flow_schedule_rec.primary_item_id IS NULL))))
2464     AND (   (l_flow_schedule_rec.program_application_id =
2465              p_flow_schedule_rec.program_application_id) OR
2466             ((p_flow_schedule_rec.program_application_id = FND_API.G_MISS_NUM) OR
2467             (   (l_flow_schedule_rec.program_application_id IS NULL) AND
2468                 (p_flow_schedule_rec.program_application_id IS NULL))))
2469     AND (   (l_flow_schedule_rec.program_id =
2470              p_flow_schedule_rec.program_id) OR
2471             ((p_flow_schedule_rec.program_id = FND_API.G_MISS_NUM) OR
2472             (   (l_flow_schedule_rec.program_id IS NULL) AND
2473                 (p_flow_schedule_rec.program_id IS NULL))))
2474     AND (   (l_flow_schedule_rec.program_update_date =
2475              p_flow_schedule_rec.program_update_date) OR
2476             ((p_flow_schedule_rec.program_update_date = FND_API.G_MISS_DATE) OR
2477             (   (l_flow_schedule_rec.program_update_date IS NULL) AND
2478                 (p_flow_schedule_rec.program_update_date IS NULL))))
2479     AND (   (l_flow_schedule_rec.project_id =
2480              p_flow_schedule_rec.project_id) OR
2481             ((p_flow_schedule_rec.project_id = FND_API.G_MISS_NUM) OR
2482             (   (l_flow_schedule_rec.project_id IS NULL) AND
2483                 (p_flow_schedule_rec.project_id IS NULL))))
2484     AND (   (l_flow_schedule_rec.quantity_completed =
2485              p_flow_schedule_rec.quantity_completed) OR
2486             ((p_flow_schedule_rec.quantity_completed = FND_API.G_MISS_NUM) OR
2487             (   (l_flow_schedule_rec.quantity_completed IS NULL) AND
2488                 (p_flow_schedule_rec.quantity_completed IS NULL))))
2489     AND (   (l_flow_schedule_rec.request_id =
2490              p_flow_schedule_rec.request_id) OR
2491             ((p_flow_schedule_rec.request_id = FND_API.G_MISS_NUM) OR
2492             (   (l_flow_schedule_rec.request_id IS NULL) AND
2493                 (p_flow_schedule_rec.request_id IS NULL))))
2494     AND (   (l_flow_schedule_rec.resource_account =
2495              p_flow_schedule_rec.resource_account) OR
2496             ((p_flow_schedule_rec.resource_account = FND_API.G_MISS_NUM) OR
2497             (   (l_flow_schedule_rec.resource_account IS NULL) AND
2498                 (p_flow_schedule_rec.resource_account IS NULL))))
2499     AND (   (l_flow_schedule_rec.resource_variance_account =
2500              p_flow_schedule_rec.resource_variance_account) OR
2501             ((p_flow_schedule_rec.resource_variance_account = FND_API.G_MISS_NUM) OR
2502             (   (l_flow_schedule_rec.resource_variance_account IS NULL) AND
2503                 (p_flow_schedule_rec.resource_variance_account IS NULL))))
2504     AND (   (l_flow_schedule_rec.routing_revision =
2505              p_flow_schedule_rec.routing_revision) OR
2506             ((p_flow_schedule_rec.routing_revision = FND_API.G_MISS_CHAR) OR
2507             (   (l_flow_schedule_rec.routing_revision IS NULL) AND
2508                 (p_flow_schedule_rec.routing_revision IS NULL))))
2509     AND (   (l_flow_schedule_rec.routing_revision_date =
2510              p_flow_schedule_rec.routing_revision_date) OR
2511             ((p_flow_schedule_rec.routing_revision_date = FND_API.G_MISS_DATE) OR
2512             (   (l_flow_schedule_rec.routing_revision_date IS NULL) AND
2513                 (p_flow_schedule_rec.routing_revision_date IS NULL))))
2514     AND (   (l_flow_schedule_rec.scheduled_completion_date =
2515              p_flow_schedule_rec.scheduled_completion_date) OR
2516             ((p_flow_schedule_rec.scheduled_completion_date = FND_API.G_MISS_DATE) OR
2517             (   (l_flow_schedule_rec.scheduled_completion_date IS NULL) AND
2518                 (p_flow_schedule_rec.scheduled_completion_date IS NULL))))
2519     AND (   (l_flow_schedule_rec.scheduled_flag =
2520              p_flow_schedule_rec.scheduled_flag) OR
2521             ((p_flow_schedule_rec.scheduled_flag = FND_API.G_MISS_NUM) OR
2522             (   (l_flow_schedule_rec.scheduled_flag IS NULL) AND
2523                 (p_flow_schedule_rec.scheduled_flag IS NULL))))
2524     AND (   (l_flow_schedule_rec.scheduled_start_date =
2525              p_flow_schedule_rec.scheduled_start_date) OR
2526             ((p_flow_schedule_rec.scheduled_start_date = FND_API.G_MISS_DATE) OR
2527             (   (l_flow_schedule_rec.scheduled_start_date IS NULL) AND
2528                 (p_flow_schedule_rec.scheduled_start_date IS NULL))))
2529     AND (   (l_flow_schedule_rec.schedule_group_id =
2530              p_flow_schedule_rec.schedule_group_id) OR
2531             ((p_flow_schedule_rec.schedule_group_id = FND_API.G_MISS_NUM) OR
2532             (   (l_flow_schedule_rec.schedule_group_id IS NULL) AND
2533                 (p_flow_schedule_rec.schedule_group_id IS NULL))))
2534     AND (   (l_flow_schedule_rec.schedule_number =
2535              p_flow_schedule_rec.schedule_number) OR
2536             ((p_flow_schedule_rec.schedule_number = FND_API.G_MISS_CHAR) OR
2537             (   (l_flow_schedule_rec.schedule_number IS NULL) AND
2538                 (p_flow_schedule_rec.schedule_number IS NULL))))
2539     AND (   (l_flow_schedule_rec.status =
2540              p_flow_schedule_rec.status) OR
2541             ((p_flow_schedule_rec.status = FND_API.G_MISS_NUM) OR
2542             (   (l_flow_schedule_rec.status IS NULL) AND
2543                 (p_flow_schedule_rec.status IS NULL))))
2544     AND (   (l_flow_schedule_rec.std_cost_adjustment_acct =
2545              p_flow_schedule_rec.std_cost_adjustment_acct) OR
2546             ((p_flow_schedule_rec.std_cost_adjustment_acct = FND_API.G_MISS_NUM) OR
2547             (   (l_flow_schedule_rec.std_cost_adjustment_acct IS NULL) AND
2548                 (p_flow_schedule_rec.std_cost_adjustment_acct IS NULL))))
2549     AND (   (l_flow_schedule_rec.task_id =
2550              p_flow_schedule_rec.task_id) OR
2551             ((p_flow_schedule_rec.task_id = FND_API.G_MISS_NUM) OR
2552             (   (l_flow_schedule_rec.task_id IS NULL) AND
2553                 (p_flow_schedule_rec.task_id IS NULL))))
2554     AND (   (l_flow_schedule_rec.end_item_unit_number =
2555              p_flow_schedule_rec.end_item_unit_number) OR
2556             ((p_flow_schedule_rec.end_item_unit_number = FND_API.G_MISS_CHAR) OR
2557             (   (l_flow_schedule_rec.end_item_unit_number IS NULL) AND
2558                 (p_flow_schedule_rec.end_item_unit_number IS NULL))))
2559     AND (   (l_flow_schedule_rec.quantity_scrapped =
2560              p_flow_schedule_rec.quantity_scrapped) OR
2561             ((p_flow_schedule_rec.quantity_scrapped = FND_API.G_MISS_NUM) OR
2562             (   (l_flow_schedule_rec.quantity_scrapped IS NULL) AND
2563                 (p_flow_schedule_rec.quantity_scrapped IS NULL))))
2564     AND (   (l_flow_schedule_rec.wip_entity_id =
2565              p_flow_schedule_rec.wip_entity_id) OR
2566             ((p_flow_schedule_rec.wip_entity_id = FND_API.G_MISS_NUM) OR
2567             (   (l_flow_schedule_rec.wip_entity_id IS NULL) AND
2568                 (p_flow_schedule_rec.wip_entity_id IS NULL))))
2569     THEN
2570 
2571         --  Row has not changed. Set out parameter.
2572 
2573         x_flow_schedule_rec            := l_flow_schedule_rec;
2574 
2575         --  Set return status
2576 
2577         x_return_status                := FND_API.G_RET_STS_SUCCESS;
2578         x_flow_schedule_rec.return_status := FND_API.G_RET_STS_SUCCESS;
2579 
2580     ELSE
2581         --  Row has changed by another user.
2582 
2583         x_return_status                := FND_API.G_RET_STS_ERROR;
2584         x_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2585 
2586         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2587         THEN
2588 
2589             FND_MESSAGE.SET_NAME('MRP','MRP_LOCK_ROW_CHANGED');
2590             FND_MSG_PUB.Add;
2591 
2592         END IF;
2593 
2594     END IF;
2595 
2596 EXCEPTION
2597 
2598     WHEN NO_DATA_FOUND THEN
2599 
2600         x_return_status                := FND_API.G_RET_STS_ERROR;
2601         x_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2602 
2603         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2604         THEN
2605 
2606             FND_MESSAGE.SET_NAME('MRP','MRP_LOCK_ROW_DELETED');
2607             FND_MSG_PUB.Add;
2608 
2609         END IF;
2610     WHEN APP_EXCEPTIONS.RECORD_LOCK_EXCEPTION THEN
2611 
2612         x_return_status                := FND_API.G_RET_STS_ERROR;
2613         x_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2614 
2615         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2616         THEN
2617 
2618             FND_MESSAGE.SET_NAME('MRP','MRP_LOCK_ROW_ALREADY_LOCKED');
2619             FND_MSG_PUB.Add;
2620 
2621         END IF;
2622     WHEN OTHERS THEN
2623 
2624         x_return_status                := FND_API.G_RET_STS_UNEXP_ERROR;
2625         x_flow_schedule_rec.return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2626 
2627         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2628         THEN
2629             FND_MSG_PUB.Add_Exc_Msg
2630             (   G_PKG_NAME
2631             ,   'Lock_Row'
2632             );
2633         END IF;
2634 
2635 END Lock_Row;
2636 
2637 --  Function Get_Values
2638 
2639 FUNCTION Get_Values
2640 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2641 ,   p_old_flow_schedule_rec         IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2642 ) RETURN MRP_Flow_Schedule_PVT.Flow_Schedule_Val_PVT_Rec_Type
2643 IS
2644 l_flow_schedule_val_rec       MRP_Flow_Schedule_PVT.Flow_Schedule_Val_PVT_Rec_Type ;
2645 BEGIN
2646 
2647     IF p_flow_schedule_rec.completion_locator_id IS NOT NULL AND
2648         p_flow_schedule_rec.completion_locator_id <> FND_API.G_MISS_NUM AND
2649         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.completion_locator_id,
2650         p_old_flow_schedule_rec.completion_locator_id)
2651     THEN
2652         l_flow_schedule_val_rec.completion_locator := MRP_Id_To_Value.Completion_Locator
2653         (   p_completion_locator_id       => p_flow_schedule_rec.completion_locator_id
2654         );
2655     END IF;
2656 
2657     IF p_flow_schedule_rec.line_id IS NOT NULL AND
2658         p_flow_schedule_rec.line_id <> FND_API.G_MISS_NUM AND
2659         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.line_id,
2660         p_old_flow_schedule_rec.line_id)
2661     THEN
2662         l_flow_schedule_val_rec.line := MRP_Id_To_Value.Line
2663         (   p_line_id                     => p_flow_schedule_rec.line_id
2664         );
2665     END IF;
2666 
2667     IF p_flow_schedule_rec.organization_id IS NOT NULL AND
2668         p_flow_schedule_rec.organization_id <> FND_API.G_MISS_NUM AND
2669         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.organization_id,
2670         p_old_flow_schedule_rec.organization_id)
2671     THEN
2672         l_flow_schedule_val_rec.organization := MRP_Id_To_Value.Organization
2673         (   p_organization_id             => p_flow_schedule_rec.organization_id
2674         );
2675     END IF;
2676 
2677     IF p_flow_schedule_rec.primary_item_id IS NOT NULL AND
2678         p_flow_schedule_rec.primary_item_id <> FND_API.G_MISS_NUM AND
2679         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.primary_item_id,
2680         p_old_flow_schedule_rec.primary_item_id)
2681     THEN
2682         l_flow_schedule_val_rec.primary_item := MRP_Id_To_Value.Primary_Item
2683         (   p_primary_item_id             => p_flow_schedule_rec.primary_item_id
2684         );
2685     END IF;
2686 
2687     IF p_flow_schedule_rec.project_id IS NOT NULL AND
2688         p_flow_schedule_rec.project_id <> FND_API.G_MISS_NUM AND
2689         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.project_id,
2690         p_old_flow_schedule_rec.project_id)
2691     THEN
2692         l_flow_schedule_val_rec.project := MRP_Id_To_Value.Project
2693         (   p_project_id                  => p_flow_schedule_rec.project_id
2694         );
2695     END IF;
2696 
2697     IF p_flow_schedule_rec.schedule_group_id IS NOT NULL AND
2698         p_flow_schedule_rec.schedule_group_id <> FND_API.G_MISS_NUM AND
2699         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.schedule_group_id,
2700         p_old_flow_schedule_rec.schedule_group_id)
2701     THEN
2702         l_flow_schedule_val_rec.schedule_group := MRP_Id_To_Value.Schedule_Group
2703         (   p_schedule_group_id           => p_flow_schedule_rec.schedule_group_id
2704         );
2705     END IF;
2706 
2707     IF p_flow_schedule_rec.task_id IS NOT NULL AND
2708         p_flow_schedule_rec.task_id <> FND_API.G_MISS_NUM AND
2709         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.task_id,
2710         p_old_flow_schedule_rec.task_id)
2711     THEN
2712         l_flow_schedule_val_rec.task := MRP_Id_To_Value.Task
2713         (   p_task_id                     => p_flow_schedule_rec.task_id
2714         );
2715     END IF;
2716 
2717     IF p_flow_schedule_rec.wip_entity_id IS NOT NULL AND
2718         p_flow_schedule_rec.wip_entity_id <> FND_API.G_MISS_NUM AND
2719         NOT MRP_GLOBALS.Equal(p_flow_schedule_rec.wip_entity_id,
2720         p_old_flow_schedule_rec.wip_entity_id)
2721     THEN
2722         l_flow_schedule_val_rec.wip_entity := MRP_Id_To_Value.Wip_Entity
2723         (   p_wip_entity_id               => p_flow_schedule_rec.wip_entity_id
2724         );
2725     END IF;
2726 
2727     RETURN l_flow_schedule_val_rec;
2728 
2729 END Get_Values;
2730 
2731 --  Function Get_Ids
2732 
2733 FUNCTION Get_Ids
2734 (   p_flow_schedule_rec             IN  MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2735 ,   p_flow_schedule_val_rec         IN  MRP_Flow_Schedule_PVT.Flow_Schedule_Val_PVT_Rec_Type
2736 ) RETURN MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type
2737 IS
2738 l_flow_schedule_rec           MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type;
2739 BEGIN
2740 
2741     --  initialize  return_status.
2742 
2743     l_flow_schedule_rec.return_status := FND_API.G_RET_STS_SUCCESS;
2744 
2745     --  initialize l_flow_schedule_rec.
2746 
2747     l_flow_schedule_rec := p_flow_schedule_rec;
2748 
2749     IF  p_flow_schedule_val_rec.completion_locator <> FND_API.G_MISS_CHAR
2750     THEN
2751 
2752         IF p_flow_schedule_rec.completion_locator_id <> FND_API.G_MISS_NUM THEN
2753 
2754             l_flow_schedule_rec.completion_locator_id := p_flow_schedule_rec.completion_locator_id;
2755 
2756             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2757             THEN
2758 
2759                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2760                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','completion_locator');
2761                 FND_MSG_PUB.Add;
2762 
2763             END IF;
2764 
2765         ELSE
2766 
2767             l_flow_schedule_rec.completion_locator_id := MRP_Value_To_Id.completion_locator
2768             (   p_completion_locator          => p_flow_schedule_val_rec.completion_locator
2769             );
2770 
2771             IF l_flow_schedule_rec.completion_locator_id = FND_API.G_MISS_NUM THEN
2772                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2773             END IF;
2774 
2775         END IF;
2776 
2777     END IF;
2778 
2779     IF  p_flow_schedule_val_rec.line <> FND_API.G_MISS_CHAR
2780     THEN
2781 
2782         IF p_flow_schedule_rec.line_id <> FND_API.G_MISS_NUM THEN
2783 
2784             l_flow_schedule_rec.line_id := p_flow_schedule_rec.line_id;
2785 
2786             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2787             THEN
2788 
2789                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2790                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','line');
2791                 FND_MSG_PUB.Add;
2792 
2793             END IF;
2794 
2795         ELSE
2796 
2797             l_flow_schedule_rec.line_id := MRP_Value_To_Id.line
2798             (   p_line                        => p_flow_schedule_val_rec.line
2799             );
2800 
2801             IF l_flow_schedule_rec.line_id = FND_API.G_MISS_NUM THEN
2802                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2803             END IF;
2804 
2805         END IF;
2806 
2807     END IF;
2808 
2809     IF  p_flow_schedule_val_rec.organization <> FND_API.G_MISS_CHAR
2810     THEN
2811 
2812         IF p_flow_schedule_rec.organization_id <> FND_API.G_MISS_NUM THEN
2813 
2814             l_flow_schedule_rec.organization_id := p_flow_schedule_rec.organization_id;
2815 
2816             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2817             THEN
2818 
2819                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2820                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','organization');
2821                 FND_MSG_PUB.Add;
2822 
2823             END IF;
2824 
2825         ELSE
2826 
2827             l_flow_schedule_rec.organization_id := MRP_Value_To_Id.organization
2828             (   p_organization                => p_flow_schedule_val_rec.organization
2829             );
2830 
2831             IF l_flow_schedule_rec.organization_id = FND_API.G_MISS_NUM THEN
2832                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2833             END IF;
2834 
2835         END IF;
2836 
2837     END IF;
2838 
2839     IF  p_flow_schedule_val_rec.primary_item <> FND_API.G_MISS_CHAR
2840     THEN
2841 
2842         IF p_flow_schedule_rec.primary_item_id <> FND_API.G_MISS_NUM THEN
2843 
2844             l_flow_schedule_rec.primary_item_id := p_flow_schedule_rec.primary_item_id;
2845 
2846             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2847             THEN
2848 
2849                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2850                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','primary_item');
2851                 FND_MSG_PUB.Add;
2852 
2853             END IF;
2854 
2855         ELSE
2856 
2857             l_flow_schedule_rec.primary_item_id := MRP_Value_To_Id.primary_item
2858             (   p_primary_item                => p_flow_schedule_val_rec.primary_item
2859             );
2860 
2861             IF l_flow_schedule_rec.primary_item_id = FND_API.G_MISS_NUM THEN
2862                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2863             END IF;
2864 
2865         END IF;
2866 
2867     END IF;
2868 
2869     IF  p_flow_schedule_val_rec.project <> FND_API.G_MISS_CHAR
2870     THEN
2871 
2872         IF p_flow_schedule_rec.project_id <> FND_API.G_MISS_NUM THEN
2873 
2874             l_flow_schedule_rec.project_id := p_flow_schedule_rec.project_id;
2875 
2876             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2877             THEN
2878 
2879                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2880                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','project');
2881                 FND_MSG_PUB.Add;
2882 
2883             END IF;
2884 
2885         ELSE
2886 
2887             l_flow_schedule_rec.project_id := MRP_Value_To_Id.project
2888             (   p_project                     => p_flow_schedule_val_rec.project
2889             );
2890 
2891             IF l_flow_schedule_rec.project_id = FND_API.G_MISS_NUM THEN
2892                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2893             END IF;
2894 
2895         END IF;
2896 
2897     END IF;
2898 
2899     IF  p_flow_schedule_val_rec.schedule_group <> FND_API.G_MISS_CHAR
2900     THEN
2901 
2902         IF p_flow_schedule_rec.schedule_group_id <> FND_API.G_MISS_NUM THEN
2903 
2904             l_flow_schedule_rec.schedule_group_id := p_flow_schedule_rec.schedule_group_id;
2905 
2906             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2907             THEN
2908 
2909                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2910                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','schedule_group');
2911                 FND_MSG_PUB.Add;
2912 
2913             END IF;
2914 
2915         ELSE
2916 
2917             l_flow_schedule_rec.schedule_group_id := MRP_Value_To_Id.schedule_group
2918             (   p_schedule_group              => p_flow_schedule_val_rec.schedule_group
2919             );
2920 
2921             IF l_flow_schedule_rec.schedule_group_id = FND_API.G_MISS_NUM THEN
2922                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2923             END IF;
2924 
2925         END IF;
2926 
2927     END IF;
2928 
2929     IF  p_flow_schedule_val_rec.task <> FND_API.G_MISS_CHAR
2930     THEN
2931 
2932         IF p_flow_schedule_rec.task_id <> FND_API.G_MISS_NUM THEN
2933 
2934             l_flow_schedule_rec.task_id := p_flow_schedule_rec.task_id;
2935 
2936             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2937             THEN
2938 
2939                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2940                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','task');
2941                 FND_MSG_PUB.Add;
2942 
2943             END IF;
2944 
2945         ELSE
2946 
2947             l_flow_schedule_rec.task_id := MRP_Value_To_Id.task
2948             (   p_task                        => p_flow_schedule_val_rec.task
2949             );
2950 
2951             IF l_flow_schedule_rec.task_id = FND_API.G_MISS_NUM THEN
2952                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2953             END IF;
2954 
2955         END IF;
2956 
2957     END IF;
2958 
2959     IF  p_flow_schedule_val_rec.wip_entity <> FND_API.G_MISS_CHAR
2960     THEN
2961 
2962         IF p_flow_schedule_rec.wip_entity_id <> FND_API.G_MISS_NUM THEN
2963 
2964             l_flow_schedule_rec.wip_entity_id := p_flow_schedule_rec.wip_entity_id;
2965 
2966             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2967             THEN
2968 
2969                 FND_MESSAGE.SET_NAME('MRP','MRP_BOTH_VAL_AND_ID_EXIST');
2970                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','wip_entity');
2971                 FND_MSG_PUB.Add;
2972 
2973             END IF;
2974 
2975         ELSE
2976 
2977             l_flow_schedule_rec.wip_entity_id := MRP_Value_To_Id.wip_entity
2978             (   p_wip_entity                  => p_flow_schedule_val_rec.wip_entity
2979             );
2980 
2981             IF l_flow_schedule_rec.wip_entity_id = FND_API.G_MISS_NUM THEN
2982                 l_flow_schedule_rec.return_status := FND_API.G_RET_STS_ERROR;
2983             END IF;
2984 
2985         END IF;
2986 
2987     END IF;
2988 
2989 
2990     RETURN l_flow_schedule_rec;
2991 
2992 END Get_Ids;
2993 
2994 PROCEDURE Populate_Flow_Summary(
2995         x_return_status         OUT     NOCOPY	VARCHAR2,
2996         p_line_id               IN      NUMBER,
2997         p_org_id                IN      NUMBER,
2998         p_first_bucket_date     IN      DATE,   -- server timezone of client
2999                                                 -- start date of week at 0:00:00
3000         p_query_id              IN      NUMBER
3001 )
3002 IS
3003 
3004 CURSOR flow_schedule_info(l_query_id NUMBER, x NUMBER, start_date DATE,
3005                           client_start_date DATE) IS  --TZ BOM Calendar bug 3832684 --fix bug#3170105
3006 SELECT  mls.primary_item_id,
3007         -- bucket_counter
3008         floor(mls.scheduled_completion_date-start_date)+1,
3009         -- bucket_date
3010         floor(mls.scheduled_completion_date-start_date)+client_start_date,--TZ BOM Calendar bug 3832684
3011         decode(x,1,sum(nvl(mls.planned_quantity,0)),
3012                 2,sum(nvl(mls.quantity_completed,0)),
3013                 sum((nvl(mls.planned_quantity,0)-nvl(mls.quantity_completed,0))))
3014 FROM mrp_line_sch_avail_v mls
3015 WHERE mls.line_id = p_line_id
3016 AND mls.organization_id = p_org_id
3017 AND mls.scheduled_completion_date
3018 BETWEEN start_date and start_date+(7-1/(24*60*60))
3019 GROUP BY mls.primary_item_id, floor(mls.scheduled_completion_date-start_date)
3020 order by mls.primary_item_id;
3021 
3022 TYPE summary_rec IS RECORD
3023         ( item_id               NUMBER,
3024           bucket_counter        NUMBER,
3025           bucket_date           DATE,
3026           quantity              NUMBER );
3027 
3028 flow_activity_rec       summary_rec;
3029 
3030 TYPE calendar_date IS TABLE OF DATE INDEX BY BINARY_INTEGER;
3031 TYPE column_number IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3032 
3033 l_last_item_id          NUMBER := -1;
3034 bucket_dates            calendar_date;
3035 bucket_quantity         column_number;
3036 l_query_id1             NUMBER;
3037 
3038 l_first_bucket_client	DATE;  --fix bug#3170105
3039 
3040 PROCEDURE flush_summary_rec (p_item_id NUMBER,
3041                                 p_query_id NUMBER,
3042 				x NUMBER) IS
3043 
3044   l_item_segments		VARCHAR2(2000);
3045 
3046   CURSOR ITEM_SEGMENTS IS
3047 	SELECT concatenated_segments
3048 	FROM mtl_system_items_kfv
3049 	WHERE inventory_item_id = p_item_id
3050 	AND organization_id = p_org_id;
3051 
3052 BEGIN
3053 
3054   OPEN ITEM_SEGMENTS;
3055   FETCH ITEM_SEGMENTS INTO l_item_segments;
3056   CLOSE ITEM_SEGMENTS;
3057 
3058   INSERT INTO mrp_form_query(
3059         query_id,
3060         last_update_date,
3061         last_updated_by,
3062         creation_date,
3063         created_by,
3064         number15,
3065         char1,
3066         number14,
3067         date1,
3068         date2,
3069         date3,
3070         date4,
3071         date5,
3072         date6,
3073         date7,
3074         number1,
3075         number2,
3076         number3,
3077         number4,
3078         number5,
3079         number6,
3080         number7,
3081 	number10 )
3082   VALUES (
3083         p_query_id,
3084         sysdate,
3085         1,
3086         sysdate,
3087         1,
3088         p_item_id,
3089         substr(l_item_segments,1,80),
3090         x,
3091         bucket_dates(1),
3092         bucket_dates(2),
3093         bucket_dates(3),
3094         bucket_dates(4),
3095         bucket_dates(5),
3096         bucket_dates(6),
3097         bucket_dates(7),
3098         bucket_quantity(1),
3099         bucket_quantity(2),
3100         bucket_quantity(3),
3101         bucket_quantity(4),
3102         bucket_quantity(5),
3103         bucket_quantity(6),
3104         bucket_quantity(7),
3105 	bucket_quantity(1)+bucket_quantity(2)+bucket_quantity(3)+bucket_quantity(4)+bucket_quantity(5)+bucket_quantity(6)+bucket_quantity(7)
3106   );
3107 
3108 END flush_summary_rec;
3109 
3110 PROCEDURE Calculate_Totals(p_query_id NUMBER) IS
3111 BEGIN
3112 
3113   INSERT INTO mrp_form_query(
3114         query_id,
3115         last_update_date,
3116         last_updated_by,
3117         creation_date,
3118         created_by,
3119         number14,
3120         number1,
3121         number2,
3122         number3,
3123         number4,
3124         number5,
3125         number6,
3126         number7,
3127         number10 )
3128   SELECT
3129         p_query_id,
3130         sysdate,
3131         1,
3132         sysdate,
3133         1,
3134         number14 + 10,
3135         sum(number1),
3136         sum(number2),
3137         sum(number3),
3138         sum(number4),
3139         sum(number5),
3140         sum(number6),
3141         sum(number7),
3142         sum(number1) + sum(number2) + sum(number3) + sum(number4) +
3143 		sum(number5) + sum(number6) + sum(number7)
3144   FROM mrp_form_query
3145   WHERE query_id = p_query_id
3146   AND number14 in (1,2,3)
3147   GROUP BY number14;
3148 
3149 END Calculate_Totals;
3150 
3151 BEGIN
3152 
3153   FND_MSG_PUB.Initialize;
3154 
3155   --start bug 3783650: TZ BOM Calendar bug 3832684
3156   IF flm_timezone.g_enabled THEN
3157   --fix bug#3170105
3158     l_first_bucket_client := flm_timezone.server_to_client(p_first_bucket_date);
3159     l_first_bucket_client := trunc(l_first_bucket_client);
3160   --end of fix bug#3170105
3161   ELSE
3162     l_first_bucket_client := trunc(p_first_bucket_date);
3163   END IF;
3164   --end bug 3783650
3165 
3166   SELECT mrp_form_query_s.nextval
3167   INTO l_query_id1
3168   FROM dual;
3169 
3170   x_return_status := FND_API.G_RET_STS_SUCCESS;
3171 
3172   FOR loop in 1..7 LOOP
3173     INSERT INTO mrp_form_query (
3174         query_id,
3175         last_update_date,
3176         last_updated_by,
3177         creation_date,
3178         created_by,
3179         number13,
3180         number14,
3181         number1,
3182         date1 )
3183     VALUES (
3184         l_query_id1,
3185         sysdate,
3186         1,
3187         sysdate,
3188         1,
3189         p_line_id,
3190         p_org_id,
3191         loop,
3192         l_first_bucket_client + (loop - 1)  --fix bug#3170105
3193     );
3194   END LOOP;
3195 
3196   FOR x in 1..3 LOOP
3197 
3198     -- -----------------------------
3199     -- Initialize bucket values
3200     -- -----------------------------
3201     FOR loop in 1..7 LOOP
3202       bucket_dates(loop) := l_first_bucket_client + (loop - 1);
3203       bucket_quantity(loop) := 0;
3204     END LOOP;
3205 
3206     l_last_item_id := -1;
3207 
3208     --fix bug#3170105
3209     --TZ BOM Calendar bug 3832684
3210     OPEN flow_schedule_info(l_query_id1,x,p_first_bucket_date,l_first_bucket_client);
3211 
3212     LOOP
3213       FETCH flow_schedule_info
3214       INTO flow_activity_rec;
3215 
3216       -- ---------------------------------------
3217       -- Flush previous record to mrp_form_query
3218       -- ---------------------------------------
3219       IF ( (flow_schedule_info%NOTFOUND) OR
3220         	(flow_activity_rec.item_id <> l_last_item_id))
3221         	AND (l_last_item_id <> -1) THEN
3222         flush_summary_rec(l_last_item_id, p_query_id, x);
3223 
3224         -- ---------------------------
3225         -- Reinitialize bucket values
3226         -- ---------------------------
3227         FOR loop in 1..7 LOOP
3228           bucket_dates(loop) := l_first_bucket_client + (loop - 1);  --fix bug#3170105
3229           bucket_quantity(loop) := 0;
3230         END LOOP;
3231 
3232       ELSIF ((flow_schedule_info%NOTFOUND) AND (l_last_item_id = -1)) THEN
3233 
3234         FOR loop in 1..7 LOOP
3235           bucket_dates(loop) := l_first_bucket_client + (loop - 1);  --fix bug#3170105
3236           bucket_quantity(loop) := NULL;
3237         END LOOP;
3238 
3239         flush_summary_rec(NULL, p_query_id, x);
3240 
3241         EXIT;
3242 
3243       END IF;
3244 
3245       -- ------------------------
3246       -- Set bucket values
3247       -- ------------------------
3248 
3249       bucket_dates(flow_activity_rec.bucket_counter) :=
3250                 flow_activity_rec.bucket_date;
3251       bucket_quantity(flow_activity_rec.bucket_counter) :=
3252                 flow_activity_rec.quantity;
3253 
3254       -- --------------------------
3255       -- Reinitialize last_item_id
3256       -- --------------------------
3257       l_last_item_id := flow_activity_rec.item_id;
3258 
3259       EXIT WHEN flow_schedule_info%NOTFOUND;
3260     END LOOP;
3261     CLOSE flow_schedule_info;
3262 
3263   END LOOP;
3264 
3265   calculate_totals(p_query_id);
3266 
3267 EXCEPTION
3268 
3269   WHEN OTHERS THEN
3270 
3271     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3272 
3273     IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3274 
3275       FND_MSG_PUB.Add_Exc_Msg
3276       (   G_PKG_NAME
3277       ,   'populate_flow_summary'
3278       );
3279     END IF;
3280 
3281     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3282 
3283 END Populate_Flow_Summary;
3284 
3285 PROCEDURE Update_Quantity(
3286 	x_return_status 	OUT	NOCOPY	VARCHAR2,
3287         x_msg_count		OUT	NOCOPY	NUMBER,
3288         x_msg_data		OUT	NOCOPY	VARCHAR2,
3289 	p_wip_entity_id		IN	NUMBER,
3290 	p_quantity		IN	NUMBER ) IS
3291 
3292 BEGIN
3293 
3294     FND_MSG_PUB.Initialize;
3295 
3296     UPDATE wip_flow_schedules
3297     SET planned_quantity = planned_quantity + p_quantity
3298     WHERE wip_entity_id = p_wip_entity_id;
3299 
3300     x_return_status := FND_API.G_RET_STS_SUCCESS;
3301 
3302     --  Get message count and data
3303 
3304     FND_MSG_PUB.Count_And_Get
3305     (   p_count                       => x_msg_count
3306     ,   p_data                        => x_msg_data
3307     );
3308 
3309 EXCEPTION
3310 
3311   WHEN OTHERS THEN
3312 
3313         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3314 
3315         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3316 
3317           FND_MSG_PUB.Add_Exc_Msg
3318           (   G_PKG_NAME
3319           ,   'update_quantity'
3320           );
3321         END IF;
3322 
3323         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3324 
3325         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3326 
3327         --  Get message count and data
3328 
3329         FND_MSG_PUB.Count_And_Get
3330         (   p_count                       => x_msg_count
3331         ,   p_data                        => x_msg_data
3332         );
3333 
3334 END Update_Quantity;
3335 
3336 PROCEDURE Update_Quantity(
3337 	p_wip_entity_id		IN	NUMBER,
3338 	p_quantity		IN	NUMBER ) IS
3339 
3340 BEGIN
3341 
3342     UPDATE wip_flow_schedules
3343     SET planned_quantity = planned_quantity + p_quantity
3344     WHERE wip_entity_id = p_wip_entity_id;
3345 
3346 EXCEPTION
3347 
3348   WHEN OTHERS THEN
3349 
3350         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3351 
3352           FND_MSG_PUB.Add_Exc_Msg
3353           (   G_PKG_NAME
3354           ,   'update_quantity'
3355           );
3356         END IF;
3357 
3358         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3359 
3360 END Update_Quantity;
3361 
3362 PROCEDURE Delete_Flow_Row
3363 (  x_return_status      OUT NOCOPY	VARCHAR2,
3364    x_msg_count          OUT NOCOPY	NUMBER,
3365    x_msg_data           OUT NOCOPY	VARCHAR2,
3366    p_wip_entity_id      IN  NUMBER
3367 )
3368 IS
3369 BEGIN
3370 
3371     FND_MSG_PUB.Initialize;
3372 
3373     DELETE  FROM WIP_FLOW_SCHEDULES
3374     WHERE   WIP_ENTITY_ID = p_wip_entity_id
3375       AND status = 1
3376       AND nvl(transacted_flag, 'N') = 'N'
3377       AND quantity_completed = 0
3378       AND quantity_scrapped = 0 ;
3379 
3380     x_return_status := FND_API.G_RET_STS_SUCCESS;
3381 
3382     --  Get message count and data
3383 
3384     FND_MSG_PUB.Count_And_Get
3385     (   p_count                       => x_msg_count
3386     ,   p_data                        => x_msg_data
3387     );
3388 EXCEPTION
3389 
3390     WHEN OTHERS THEN
3391 
3392         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3393         THEN
3394             FND_MSG_PUB.Add_Exc_Msg
3395             (   G_PKG_NAME
3396             ,   'Delete_Flow_Row'
3397             );
3398         END IF;
3399 
3400         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3401 
3402         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3403 
3404         --  Get message count and data
3405 
3406         FND_MSG_PUB.Count_And_Get
3407         (   p_count                       => x_msg_count
3408         ,   p_data                        => x_msg_data
3409         );
3410 
3411 END Delete_Flow_Row;
3412 
3413 PROCEDURE Delete_Flow_Schedules( ERRBUF                 OUT     NOCOPY	VARCHAR2,
3414                                  RETCODE                OUT     NOCOPY	VARCHAR2,
3415                                  p_organization_id      IN      NUMBER,
3416                                  p_start_date           IN      VARCHAR2,
3417                                  p_end_date             IN      VARCHAR2,
3418                                  p_from_line            IN      VARCHAR2,
3419                                  p_to_line              IN      VARCHAR2,
3420                                  p_from_item            IN      VARCHAR2,
3421                                  p_to_item              IN      VARCHAR2,
3422                                  p_category_set_id      IN      NUMBER,
3423                                  p_category_structure_id IN     NUMBER,
3424                                  p_from_category        IN      VARCHAR2,
3425                                  p_to_category          IN      VARCHAR2) IS
3426 
3427   -- Local variables
3428   l_log_message         VARCHAR2(2000);
3429   l_return              BOOLEAN;
3430   l_err_buf             VARCHAR2(2000);
3431   l_where_clause        VARCHAR2(2000) := NULL;
3432   l_item_where_clause   VARCHAR2(2000) := NULL;
3433   l_cat_where_clause    VARCHAR2(2000) := NULL;
3434   l_rows_processed      INTEGER := 0;
3435   l_dummy      		INTEGER;
3436   l_cursor              INTEGER;
3437   l_sql_stmt            VARCHAR2(2000) := NULL;
3438   l_demand_source_line	VARCHAR2(30);
3439   l_replenish_to_order_flag VARCHAR2(1);
3440   l_build_in_wip_flag VARCHAR2(1);
3441   l_wip_entity_id	NUMBER;
3442   l_return_status       VARCHAR2(100);
3443   l_msg_count           NUMBER;
3444   l_msg_data            VARCHAR2(2000);
3445 
3446   -- Exceptions
3447   expected_error        EXCEPTION;
3448   unexpected_error      EXCEPTION;
3449 
3450   --fix bug#3170105
3451   l_start_date		DATE;
3452   l_end_date		DATE;
3453   --end of fix bug#3170105
3454 
3455 BEGIN
3456 
3457   --fix bug#3170105
3458   l_start_date := flm_timezone.client_to_server(
3459     fnd_date.canonical_to_date(p_start_date));
3460   l_end_date := flm_timezone.client_to_server(
3461     fnd_date.canonical_to_date(p_end_date));
3462   --end of fix bug#3170105
3463 
3464   -- Print report parameters
3465   FND_MESSAGE.set_name('MRP','EC_REPORT_PARAMETERS');
3466   l_log_message := FND_MESSAGE.get;
3467   MRP_UTIL.MRP_LOG(l_log_message);
3468 
3469   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3470   FND_MESSAGE.set_token('NUMBER','1');
3471   FND_MESSAGE.set_token('TOKEN','(ORGANIZATION_ID)');
3472   FND_MESSAGE.set_token('VALUE',to_char(p_organization_id));
3473   l_log_message := FND_MESSAGE.get;
3474   MRP_UTIL.MRP_LOG(l_log_message);
3475 
3476   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3477   FND_MESSAGE.set_token('NUMBER','2');
3478   FND_MESSAGE.set_token('TOKEN','(START_DATE)');
3479   FND_MESSAGE.set_token('VALUE',to_char(l_start_date));  --fix bug#3170105
3480   l_log_message := FND_MESSAGE.get;
3481   MRP_UTIL.MRP_LOG(l_log_message);
3482 
3483   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3484   FND_MESSAGE.set_token('NUMBER','3');
3485   FND_MESSAGE.set_token('TOKEN','(END_DATE)');
3486   FND_MESSAGE.set_token('VALUE',to_char(l_end_date));  --fix bug#3170105
3487   l_log_message := FND_MESSAGE.get;
3488   MRP_UTIL.MRP_LOG(l_log_message);
3489 
3490   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3491   FND_MESSAGE.set_token('NUMBER','4');
3492   FND_MESSAGE.set_token('TOKEN','(FROM_LINE)');
3493   FND_MESSAGE.set_token('VALUE',p_from_line);
3494   l_log_message := FND_MESSAGE.get;
3495   MRP_UTIL.MRP_LOG(l_log_message);
3496 
3497   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3498   FND_MESSAGE.set_token('NUMBER','5');
3499   FND_MESSAGE.set_token('TOKEN','(TO_LINE)');
3500   FND_MESSAGE.set_token('VALUE',p_to_line);
3501   l_log_message := FND_MESSAGE.get;
3502   MRP_UTIL.MRP_LOG(l_log_message);
3503 
3504   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3505   FND_MESSAGE.set_token('NUMBER','6');
3506   FND_MESSAGE.set_token('TOKEN','(FROM_ITEM)');
3507   FND_MESSAGE.set_token('VALUE',p_from_item);
3508   l_log_message := FND_MESSAGE.get;
3509   MRP_UTIL.MRP_LOG(l_log_message);
3510 
3511   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3512   FND_MESSAGE.set_token('NUMBER','7');
3513   FND_MESSAGE.set_token('TOKEN','(TO_ITEM)');
3514   FND_MESSAGE.set_token('VALUE',p_to_item);
3515   l_log_message := FND_MESSAGE.get;
3516   MRP_UTIL.MRP_LOG(l_log_message);
3517 
3518   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3519   FND_MESSAGE.set_token('NUMBER','8');
3520   FND_MESSAGE.set_token('TOKEN','(CATEGORY_SET_ID)');
3521   FND_MESSAGE.set_token('VALUE',to_char(p_category_set_id));
3522   l_log_message := FND_MESSAGE.get;
3523   MRP_UTIL.MRP_LOG(l_log_message);
3524 
3525   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3526   FND_MESSAGE.set_token('NUMBER','9');
3527   FND_MESSAGE.set_token('TOKEN','(CATEGORY_STRUCTURE_ID)');
3528   FND_MESSAGE.set_token('VALUE',to_char(p_category_structure_id));
3529   l_log_message := FND_MESSAGE.get;
3530   MRP_UTIL.MRP_LOG(l_log_message);
3531 
3532   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3533   FND_MESSAGE.set_token('NUMBER','10');
3534   FND_MESSAGE.set_token('TOKEN','(FROM_CATEGORY)');
3535   FND_MESSAGE.set_token('VALUE',p_from_category);
3536   l_log_message := FND_MESSAGE.get;
3537   MRP_UTIL.MRP_LOG(l_log_message);
3538 
3539   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
3540   FND_MESSAGE.set_token('NUMBER','11');
3541   FND_MESSAGE.set_token('TOKEN','(TO_CATEGORY)');
3542   FND_MESSAGE.set_token('VALUE',p_to_category);
3543   l_log_message := FND_MESSAGE.get;
3544   MRP_UTIL.MRP_LOG(l_log_message);
3545 
3546   -- Check for mandatory parameters and issue an error message
3547   -- Check for mandatory parameters and issue an error message
3548   -- if NULL.  If line, item or category are null, assume all.
3549   IF p_organization_id IS NULL THEN
3550     FND_MESSAGE.set_name('MRP','MRP_ORG_ID_REQUIRED');
3551     l_log_message := FND_MESSAGE.get;
3552     MRP_UTIL.MRP_LOG(l_log_message);
3553     RAISE expected_error;
3554   END IF;
3555   IF p_start_date IS NULL THEN
3556     FND_MESSAGE.set_name('MRP','MRP_START_DATE_REQUIRED');
3557     l_log_message := FND_MESSAGE.get;
3558     MRP_UTIL.MRP_LOG(l_log_message);
3559     RAISE expected_error;
3560   END IF;
3561   IF p_end_date IS NULL THEN
3562     FND_MESSAGE.set_name('MRP','MRP_END_DATE_REQUIRED');
3563     l_log_message := FND_MESSAGE.get;
3564     MRP_UTIL.MRP_LOG(l_log_message);
3565     RAISE expected_error;
3566   END IF;
3567 
3568   -- begin new binds
3569   flm_util.init_bind;
3570 
3571   -- Construct where clause
3572   IF p_from_line IS NOT NULL and p_to_line IS NOT NULL THEN
3573     l_where_clause := ' and wfs.line_id in (select line_id from wip_lines '||
3574                       '  where line_code between :from_line and :to_line )';
3575     flm_util.add_bind(':from_line', p_from_line);
3576     flm_util.add_bind(':to_line', p_to_line);
3577   END IF;
3578 
3579   IF p_from_item IS NOT NULL and p_to_item IS NOT NULL THEN
3580     -- Call procedure (from Kanban) to construct item_where_clause
3581     l_return := flm_util.Item_Where_Clause(
3582                         p_from_item,
3583                         p_to_item,
3584                         'msi',
3585                         l_item_where_clause,
3586                         l_err_buf);
3587 
3588     IF NOT l_return THEN
3589       -- English because unexpected error
3590       l_log_message := 'Problem constructing item_where_clause';
3591       MRP_UTIL.MRP_LOG(l_log_message);
3592       l_log_message := l_err_buf;
3593       MRP_UTIL.MRP_LOG(l_log_message);
3594       RAISE unexpected_error;
3595     END IF;
3596     l_item_where_clause := ' AND wfs.primary_item_id in ' ||
3597 	    '(select inventory_item_id from mtl_system_items msi ' ||
3598  	    ' where ' || l_item_where_clause || ')';
3599   END IF;
3600 
3601   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
3602   AND p_category_set_id IS NOT NULL THEN
3603     l_return := flm_util.Category_Where_Clause(
3604                         p_from_category,
3605                         p_to_category,
3606                         'cat',
3607                         p_category_structure_id,
3608                         l_cat_where_clause,
3609                         l_err_buf);
3610 
3611     IF NOT l_return THEN
3612       -- English because unexpected error
3613       l_log_message := 'Problem constructing category_where_clause';
3614       MRP_UTIL.MRP_LOG(l_log_message);
3615       l_log_message := l_err_buf;
3616       MRP_UTIL.MRP_LOG(l_log_message);
3617       RAISE unexpected_error;
3618     END IF;
3619     l_cat_where_clause := ' AND wfs.primary_item_id in (select ' ||
3620 		' inventory_item_id from mtl_item_categories mic, '||
3621 		' mtl_categories cat where ' ||
3622                 ' cat.category_id = mic.category_id ' ||
3623                 ' and mic.organization_id = :cat_organization_id ' ||
3624 		' and mic.category_set_id = :cat_category_set_id ' ||
3625 		' and ' || l_cat_where_clause || ')';
3626     flm_util.add_bind(':cat_organization_id', p_organization_id);
3627     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
3628   ELSIF p_category_set_id IS NOT NULL THEN
3629     l_cat_where_clause := ' AND wfs.primary_item_id in (select ' ||
3630                 ' inventory_item_id from mtl_item_categories mic '||
3631                 ' where mic.organization_id = :cat_organization_id '||
3632                 ' and mic.category_set_id = :cat_category_set_id ) ';
3633     flm_util.add_bind(':cat_organization_id', p_organization_id);
3634     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
3635   END IF;
3636 
3637   l_where_clause := l_where_clause || l_item_where_clause ||
3638 		l_cat_where_clause;
3639 
3640   --fix bug#3170105
3641 /* Bug 3267578: Added not exists from MTL_TRANSACTIONS_INTERFACE */
3642   l_sql_stmt :=
3643     'SELECT wfs.wip_entity_id, wfs.demand_source_line, msi.replenish_to_order_flag, msi.build_in_wip_flag ' ||
3644     ' FROM wip_flow_schedules wfs, mtl_system_items msi ' ||
3645     ' WHERE wfs.primary_item_id = msi.inventory_item_id '||
3646     '   AND wfs.organization_id = msi.organization_id ' ||
3647     '   AND wfs.organization_id = to_char(:organization_id) ' ||
3648     l_where_clause ||
3649     '   AND wfs.status = 1 AND wfs.quantity_completed = 0 ' ||
3650     '   AND wfs.scheduled_completion_date between ' ||
3651     '         :start_date ' ||
3652     '         and :end_date '||
3653     ' and not exists ( select 1 from mtl_transactions_interface ' ||
3654     '                   where transaction_source_id = wfs.wip_entity_id ' ||
3655     '                     and organization_id = wfs.organization_id ' ||
3656     '                     and transaction_source_type_id = 5 ' || -- perf bug 4911894
3657     '                     and transaction_action_id in (1, 27, 30, 31, 32, 33, 34)  ) ';
3658   flm_util.add_bind(':organization_id', p_organization_id);
3659   flm_util.add_bind(':start_date', l_start_date);
3660   flm_util.add_bind(':end_date', l_end_date+1-1/(24*60*60));
3661   --end of fix bug#3170105
3662   -- get the cursor
3663   l_cursor := dbms_sql.open_cursor;
3664 
3665   -- parse the sql statement
3666   dbms_sql.parse(l_cursor, l_sql_stmt, dbms_sql.native);
3667   flm_util.do_binds(l_cursor);
3668 
3669 
3670   -- define column
3671   dbms_sql.define_column(l_cursor, 1, l_wip_entity_id);
3672   dbms_sql.define_column(l_cursor, 2, l_demand_source_line, 30);
3673   dbms_sql.define_column(l_cursor, 3, l_replenish_to_order_flag, 1);
3674   dbms_sql.define_column(l_cursor, 4, l_build_in_wip_flag, 1);
3675 
3676   -- execute the sql statement
3677   l_dummy := dbms_sql.execute(l_cursor);
3678 
3679   WHILE dbms_sql.fetch_rows(l_cursor) > 0 LOOP
3680     dbms_sql.column_value(l_cursor,1, l_wip_entity_id);
3681     dbms_sql.column_value(l_cursor,2, l_demand_source_line);
3682     dbms_sql.column_value(l_cursor,3, l_replenish_to_order_flag);
3683     dbms_sql.column_value(l_cursor,4, l_build_in_wip_flag);
3684 
3685     -- Added to support component picking. It will cancel the move order when the flow
3686     -- schedule is to be deleted.
3687     wip_picking_pvt.cancel_allocations(l_wip_entity_id, 4, null, l_return_status, l_msg_data);
3688     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3689       MRP_UTIL.MRP_LOG(l_msg_data);
3690     ELSE
3691       DELETE FROM wip_flow_schedules
3692       WHERE wip_entity_id = l_wip_entity_id AND organization_id = p_organization_id;
3693 
3694       l_rows_processed := l_rows_processed + 1;
3695 
3696       IF (l_replenish_to_order_flag = 'Y' AND l_build_in_wip_flag = 'Y'  AND l_demand_source_line IS NOT NULL) THEN
3697         CTO_WIP_WORKFLOW_API_PK.flow_deletion(to_number(l_demand_source_line), l_return_status,
3698 					    l_msg_count, l_msg_data);
3699       END IF;
3700 
3701       -- Added for Flow Execution Workstation. Deleting from execution table
3702       delete from flm_exe_operations
3703       where organization_id = p_organization_id and wip_entity_id = l_wip_entity_id;
3704       delete from flm_exe_req_operations
3705       where organization_id = p_organization_id and wip_entity_id = l_wip_entity_id;
3706       delete from flm_exe_lot_numbers
3707       where organization_id = p_organization_id and wip_entity_id = l_wip_entity_id;
3708       delete from flm_exe_serial_numbers
3709       where organization_id = p_organization_id and wip_entity_id = l_wip_entity_id;
3710     END IF;
3711 
3712   END LOOP;
3713 
3714   -- close the cursor
3715   dbms_sql.close_cursor(l_cursor);
3716 
3717   FND_MESSAGE.set_name('MRP','MRP_ROWS_DELETED');
3718   FND_MESSAGE.set_token('ROW_COUNT',l_rows_processed);
3719   ERRBUF := FND_MESSAGE.get;
3720   l_log_message := FND_MESSAGE.get;
3721   MRP_UTIL.MRP_LOG(l_log_message);
3722 
3723   FND_MESSAGE.set_name('MRP','MRP_FLOW_DELETE');
3724   l_log_message := FND_MESSAGE.get;
3725   MRP_UTIL.MRP_LOG(l_log_message);
3726 
3727   RETCODE := G_SUCCESS;
3728 
3729 EXCEPTION
3730   WHEN NO_DATA_FOUND THEN
3731     ROLLBACK;
3732     RETCODE := G_WARNING;
3733     FND_MESSAGE.set_name('MRP','MRP_NO_FLOW_DELETED');
3734     l_log_message := FND_MESSAGE.get;
3735     MRP_UTIL.MRP_LOG(l_log_message);
3736 
3737   WHEN expected_error THEN
3738     ROLLBACK;
3739     IF RETCODE <> 1 THEN
3740       RETCODE := G_ERROR;
3741     END IF;
3742     FND_MESSAGE.set_name('MRP','MRP_DELETE_FLOW_ERROR');
3743     ERRBUF := FND_MESSAGE.get;
3744     l_log_message := FND_MESSAGE.get;
3745     MRP_UTIL.MRP_LOG(l_log_message);
3746 
3747   WHEN unexpected_error THEN
3748     ROLLBACK;
3749     RETCODE := G_ERROR;
3750     FND_MESSAGE.set_name('MRP','MRP_DELETE_FLOW_ERROR');
3751     ERRBUF := FND_MESSAGE.get;
3752     l_log_message := FND_MESSAGE.get;
3753     MRP_UTIL.MRP_LOG(l_log_message);
3754 
3755   WHEN OTHERS THEN
3756     ROLLBACK;
3757     RETCODE := G_ERROR;
3758     FND_MESSAGE.set_name('MRP','MRP_DELETE_FLOW_ERROR');
3759     ERRBUF := FND_MESSAGE.get;
3760     l_log_message := FND_MESSAGE.get;
3761     MRP_UTIL.MRP_LOG(l_log_message);
3762     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
3763     MRP_UTIL.MRP_LOG(l_log_message);
3764 
3765 END Delete_Flow_Schedules;
3766 
3767 
3768 PROCEDURE Roll_Flow_Schedules( ERRBUF                 OUT     NOCOPY	VARCHAR2,
3769                                  RETCODE                OUT     NOCOPY	VARCHAR2,
3770                                  p_organization_id      IN      NUMBER,
3771                                  p_spread_qty           IN      NUMBER,
3772                                  p_dummy	        IN      NUMBER,
3773                                  p_dummy1	        IN      NUMBER,
3774                                  p_dummy2	        IN      NUMBER,
3775                                  p_dummy3	        IN      NUMBER,
3776                                  p_dummy4	        IN      NUMBER,
3777                                  p_output               IN      NUMBER,
3778                                  p_from_start_date      IN      VARCHAR2,
3779                                  p_from_end_date        IN      VARCHAR2,
3780                                  p_to_start_date        IN      VARCHAR2,
3781                                  p_to_end_date          IN      VARCHAR2,
3782                                  p_from_line            IN      VARCHAR2,
3783                                  p_to_line              IN      VARCHAR2,
3784                                  p_from_item            IN      VARCHAR2,
3785                                  p_to_item              IN      VARCHAR2,
3786                                  p_category_set_id      IN      NUMBER,
3787                                  p_category_structure_id IN     NUMBER,
3788                                  p_from_category        IN      VARCHAR2,
3789                                  p_to_category          IN      VARCHAR2)
3790 IS
3791 
3792   --b boolean;
3793   -- Local variables
3794   l_log_message         VARCHAR2(2000);
3795   l_out_message         VARCHAR2(2000);
3796   l_return              BOOLEAN;
3797   l_err_buf             VARCHAR2(2000);
3798 
3799   l_cursor		INTEGER := NULL;
3800   l_rows		INTEGER := NULL;
3801 
3802   l_temp_date		DATE;  --fix bug#3170105
3803   l_from_start_date	DATE;  --fix bug#3170105
3804   l_from_end_date	DATE;
3805   l_to_end_date		DATE;
3806   l_to_start_date	DATE;
3807 
3808   l_to_start_time       NUMBER;  --TZ BOM Calendar bug 3832684
3809   l_to_end_time         NUMBER;  --TZ BOM Calendar bug 3832684
3810 
3811   l_variance		NUMBER := 0;
3812   l_daily_variance	NUMBER := 0;
3813   l_update_variance     NUMBER := 0;
3814   l_unprocessed_var	NUMBER := 0;
3815   l_remainder		NUMBER := 0;
3816   l_row_count		NUMBER := 0;
3817 
3818   l_wip_entity_id	NUMBER := FND_API.G_MISS_NUM;
3819   l_wip_entity_id2	NUMBER := FND_API.G_MISS_NUM;
3820   l_completion_date	DATE := FND_API.G_MISS_DATE;
3821   l_old_completion_date DATE := FND_API.G_MISS_DATE;
3822   l_planned_quantity    NUMBER := FND_API.G_MISS_NUM;
3823   l_quantity_completed    NUMBER := FND_API.G_MISS_NUM;
3824 
3825   l_report_query_id     NUMBER;
3826 
3827   fs_report_rec		REPORT_REC_TYPE;
3828 
3829   l_planned_total	NUMBER;
3830   l_completed_total	NUMBER;
3831   l_variance1_total	NUMBER;
3832   l_scheduled_total	NUMBER;
3833   l_adjusted_total	NUMBER;
3834   l_variance2_total	NUMBER;
3835 
3836   l_old_line_id		NUMBER := -1;
3837   l_old_line_code	VARCHAR2(30);
3838   l_old_item_id		NUMBER := -1;
3839   l_old_item		VARCHAR2(240);
3840   l_old_sg_id		NUMBER := -1;
3841 
3842   l_trans_var1		VARCHAR2(30);
3843   l_trans_var2		VARCHAR2(30);
3844   l_trans_var3		VARCHAR2(30);
3845   l_trans_var4		VARCHAR2(30);
3846   l_trans_var5		VARCHAR2(30);
3847   l_trans_var6		VARCHAR2(30);
3848 
3849   l_flow_schedule_rec	MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type;
3850   l_x_flow_schedule_rec	MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type;
3851   l_control_rec         MRP_GLOBALS.Control_Rec_Type := MRP_GLOBALS.G_MISS_CONTROL_REC;
3852   l_old_flow_schedule_rec         MRP_Flow_Schedule_PVT.Flow_Schedule_PVT_Rec_Type ;
3853 
3854 
3855   l_return_status	VARCHAR2(1);
3856   l_msg_count		NUMBER;
3857   l_msg_data		VARCHAR2(2000);
3858   i			NUMBER;
3859   msg			VARCHAR2(2000);
3860 
3861   /* Added for Enhancement #2829204 */
3862   l_auto_replenish	VARCHAR2(1);
3863   l_kanban_activity_id	NUMBER;
3864 
3865   CURSOR Kanban_Card_Activity_Csr(p_wip_entity_id IN NUMBER) IS
3866     SELECT Kanban_Activity_Id
3867       FROM mtl_kanban_card_activity
3868      WHERE source_wip_entity_id = p_wip_entity_id;
3869 
3870 -- Bug 2213859
3871    TYPE build_seq_counter_rec_type is RECORD(
3872    current_build_seq     NUMBER,
3873    base_number           NUMBER);
3874 
3875    TYPE l_build_seq_counter_type is TABLE of build_seq_counter_rec_type index by binary_integer;
3876    l_build_seq_counter   l_build_seq_counter_type;
3877    l_temp_build_sequence NUMBER;
3878    l_base_number         NUMBER;
3879    l_total_count         NUMBER;
3880    l_index               BINARY_INTEGER;
3881 -- Bug 2213859
3882 
3883   -- Exceptions
3884   expected_error        EXCEPTION;
3885   unexpected_error      EXCEPTION;
3886 
3887   -- Added for project 'Roll Flow Schedules: Maintain Schedule Number'
3888   -- To hold old/new schedule_number/wip_entity_id that will be used for swapping at the end of process
3889   oldFSSchNum		FSSchNum;
3890   oldFSWipId		FSWipId;
3891   newFSSchNum		FSSchNum;
3892   newFSWipId		FSWipId;
3893   l_loop_count		NUMBER:=0;
3894 
3895   CURSOR C1(p_line_id NUMBER, p_item_id NUMBER, p_schedule_group_id NUMBER,
3896             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
3897   IS
3898   SELECT nvl(sum(planned_quantity),0)
3899   FROM wip_flow_schedules
3900   WHERE organization_id = p_organization_id
3901   AND line_id = p_line_id
3902   AND primary_item_id = p_item_id
3903   AND nvl(schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
3904   AND build_sequence IS NULL
3905   AND demand_source_header_id IS NULL
3906   AND scheduled_completion_date  --fix bug#3170105
3907 	BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60);
3908 
3909   CURSOR C2(p_line_id NUMBER, p_item_id NUMBER, p_schedule_group_id NUMBER,
3910             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
3911   IS
3912   SELECT wip_entity_id,
3913 	planned_quantity
3914   FROM wip_flow_schedules
3915   WHERE organization_id = p_organization_id
3916   AND line_id = p_line_id
3917   AND primary_item_id = p_item_id
3918   AND nvl(schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
3919   AND build_sequence IS NULL
3920   AND demand_source_header_id IS NULL
3921   AND scheduled_completion_date  --fix bug#3170105
3922 	BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60);
3923 
3924   CURSOR C3(p_line_id NUMBER, p_item_id NUMBER,
3925             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
3926   IS
3927   SELECT wip_entity_id,
3928 	scheduled_completion_date,
3929 	planned_quantity,
3930         quantity_completed
3931   FROM wip_flow_schedules
3932   WHERE organization_id = p_organization_id
3933   AND line_id = p_line_id
3934   AND primary_item_id = p_item_id
3935   AND demand_source_header_id IS NULL
3936   AND planned_quantity > quantity_completed
3937   AND scheduled_completion_date  --fix bug#3170105
3938 	BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60)
3939   UNION
3940   SELECT 0,
3941 	flm_timezone.calendar_to_server(calendar_date), --TZ Bug 3832684
3942 	0,
3943         0
3944   FROM mtl_parameters mp,
3945 	bom_calendar_dates bom
3946   WHERE mp.organization_id = p_organization_id
3947   AND mp.calendar_exception_set_id = bom.exception_set_id
3948   AND mp.calendar_code = bom.calendar_code
3949   AND bom.seq_num IS NOT NULL
3950   AND bom.calendar_date between flm_timezone.server_to_calendar(p_to_start_date) --fix bug#3170105
3951       AND flm_timezone.server_to_calendar(p_to_end_date)
3952   AND bom.calendar_date NOT IN (select flm_timezone.server_to_calendar(scheduled_completion_date)
3953   	FROM wip_flow_schedules
3954         WHERE organization_id = p_organization_id
3955   	AND line_id = p_line_id
3956   	AND primary_item_id = p_item_id
3957   	AND demand_source_header_id IS NULL
3958         AND scheduled_completion_date  --fix bug#3170105
3959 	BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60))
3960   ORDER BY 2 desc;
3961 
3962   CURSOR C4(p_line_id NUMBER, p_item_id NUMBER,
3963             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
3964   IS
3965   SELECT count(bom.calendar_date)
3966   FROM mtl_parameters mp,
3967  	bom_calendar_dates bom
3968   WHERE mp.calendar_exception_set_id = bom.exception_set_id
3969   AND mp.calendar_code = bom.calendar_code
3970   AND mp.organization_id = p_organization_id
3971   AND bom.calendar_date BETWEEN flm_timezone.server_to_calendar(p_to_start_date) --fix bug#3170105
3972       AND flm_timezone.server_to_calendar(p_to_end_date)
3973   AND ((bom.seq_num IS NOT NULL) OR
3974 	(bom.calendar_date IN (SELECT flm_timezone.server_to_calendar(scheduled_completion_date)
3975 	FROM wip_flow_schedules
3976 	WHERE organization_id = p_organization_id
3977 	AND line_id = p_line_id
3978 	AND primary_item_id = p_item_id
3979         AND scheduled_completion_date BETWEEN
3980             flm_timezone.calendar_to_server(bom.calendar_date)
3981         AND flm_timezone.calendar_to_server(bom.calendar_date)+1-1/(24*60*60)
3982 	AND demand_source_header_id IS NULL)));
3983 
3984   CURSOR C5(p_line_id NUMBER, p_item_id NUMBER,
3985             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
3986   IS
3987   SELECT wip_entity_id,
3988 	scheduled_completion_date,  --fix bug#3170105
3989 	planned_quantity
3990   FROM wip_flow_schedules
3991   WHERE organization_id = p_organization_id
3992   AND line_id = p_line_id
3993   AND primary_item_id = p_item_id
3994   AND build_sequence IS NULL
3995   AND demand_source_header_id IS NULL
3996   AND scheduled_completion_date  --fix bug#3170105
3997 BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60)
3998   ORDER BY scheduled_completion_date desc
3999   FOR UPDATE OF wip_entity_id NOWAIT;
4000 
4001   CURSOR C6(p_line_id NUMBER, p_item_id NUMBER, p_schedule_group_id NUMBER,
4002 		p_completion_date DATE,
4003             p_from_start_date DATE, p_from_end_date DATE,
4004             p_to_start_date DATE, p_to_end_date DATE)  --fix bug#3170105
4005   IS
4006   SELECT wip_entity_id,
4007 	scheduled_completion_date,  --fix bug#3170105
4008 	planned_quantity
4009   FROM wip_flow_schedules
4010   WHERE organization_id = p_organization_id
4011   AND line_id = p_line_id
4012   AND primary_item_id = p_item_id
4013   AND planned_quantity > 0
4014   AND nvl(schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
4015   AND build_sequence IS NULL
4016   AND demand_source_header_id IS NULL
4017   AND scheduled_completion_date BETWEEN
4018      p_to_start_date + (p_completion_date - p_from_start_date)
4019   AND p_to_start_date + (p_completion_date - p_from_start_date) +1-1/(24*60*60)
4020   AND scheduled_completion_date  --fix bug#3170105
4021 	BETWEEN p_to_start_date AND p_to_end_date+1-1/(24*60*60)
4022   ORDER BY scheduled_completion_date desc
4023   FOR UPDATE OF wip_entity_id NOWAIT;
4024 
4025   CURSOR REPORT_CURSOR(l_query_id NUMBER) IS
4026   SELECT rpad(substr(wl.line_code,1,10),10),
4027         number1,
4028 	rpad(substr(kfv.concatenated_segments,1,14),14),
4029         number2,
4030 	rpad(substr(nvl(sg.schedule_group_name,' '),1,8),8),
4031         number3,
4032 	date1,
4033 	number4,
4034 	number5,
4035 	number4 - number5,
4036 	date2,
4037 	nvl(number6,0),
4038 	number7,
4039 	number7 - nvl(number6,0)
4040   FROM wip_lines wl,
4041 	mtl_system_items_kfv kfv,
4042 	wip_schedule_groups sg,
4043 	mrp_form_query
4044   WHERE wl.line_id = number1
4045   AND wl.organization_id = number10
4046   AND kfv.inventory_item_id = number2
4047   AND kfv.organization_id = number10
4048   AND sg.schedule_group_id(+) = number3
4049   AND sg.organization_id(+) = number10
4050   AND query_id = l_query_id
4051   ORDER BY wl.line_code, kfv.concatenated_segments,schedule_group_name,
4052 	date1, date2, number4, number5, number6, number7;
4053 
4054   CURSOR REPORT_TOTALS(l_query_id NUMBER, l_line_id NUMBER,
4055 	l_item_id NUMBER, l_schedule_group_id NUMBER) IS
4056   SELECT sum(number4),
4057 	sum(number5),
4058 	sum(number4 - number5),
4059 	sum(nvl(number6,0)),
4060 	sum(number7),
4061 	sum(number7 - nvl(number6,0))
4062   FROM mrp_form_query
4063   WHERE query_id = l_query_id
4064   AND number1 = l_line_id
4065   AND number2 = l_item_id
4066   AND nvl(number3,-1) = nvl(l_schedule_group_id,-1);
4067 
4068 -- Bug 2213859
4069  FUNCTION Get_Base_Number(p_line_id NUMBER ,p_target_date DATE,
4070                           p_from_start_date DATE, p_from_end_date DATE)  --fix bug#3170105
4071   RETURN NUMBER IS
4072  CURSOR Get_Target_Max_Build_Seq(p_line_id NUMBER, p_target_date DATE)
4073    IS
4074      SELECT nvl(max(build_sequence),0)
4075        FROM wip_flow_schedules
4076       WHERE organization_id = p_organization_id
4077         AND line_id = p_line_id
4078         AND build_sequence is NOT NULL
4079         AND (ROLL_FORWARDED_FLAG <> G_INTERMEDIATE_ROLL_FORWARDED OR
4080              ROLL_FORWARDED_FLAG IS NULL) /*Bug 3019639*/
4081         /** Forward ported bug 3055939 */
4082         AND scheduled_completion_date >= flm_timezone.client00_in_server(p_target_date)  --fix bug#3170105
4083         AND scheduled_completion_date < flm_timezone.client00_in_server(p_target_date+1);  --fix bug#3170105
4084 
4085  CURSOR Count_Orig_Schedules (p_line_id NUMBER,
4086                               p_from_start_date DATE, p_from_end_date DATE)  --fix bug#3170105)
4087    IS
4088    SELECT count(*)
4089    FROM wip_flow_schedules
4090    WHERE organization_id = p_organization_id
4091    AND line_id = p_line_id
4092    AND nvl(planned_quantity,0) > nvl(quantity_completed,0)
4093         /** Forward ported bug 3055939 */
4094    AND scheduled_completion_date >= p_from_start_date  --fix bug#3170105
4095    AND scheduled_completion_date < p_from_end_date+1;  --fix bug#3170105
4096 
4097     l_max_build_seq         NUMBER:=0;
4098     l_count_schedule        NUMBER:=0;
4099  BEGIN
4100    OPEN Get_Target_Max_Build_Seq(p_line_id, p_target_date);
4101    FETCH Get_Target_Max_Build_Seq INTO l_max_build_seq;
4102    CLOSE Get_Target_Max_Build_Seq;
4103 
4104    OPEN Count_Orig_Schedules(p_line_id,p_from_start_date,p_from_end_date);
4105    FETCH Count_Orig_Schedules INTO l_count_schedule;
4106    CLOSE Count_Orig_Schedules;
4107 
4108    RETURN (l_max_build_seq + l_count_schedule + 1);
4109  END Get_Base_Number;
4110 
4111 -- Bug 2213859
4112 
4113 FUNCTION Time_Schedule(p_line_id NUMBER ,p_scheduled_completion_date DATE,
4114                            p_quantity NUMBER)
4115  RETURN DATE IS
4116  CURSOR Check_Schedule_Roll_Types
4117  (p_line_id NUMBER ,p_scheduled_completion_date DATE)
4118   IS
4119   SELECT count(distinct(nvl(roll_forwarded_flag,-1)))
4120   FROM wip_flow_schedules
4121   WHERE organization_id = p_organization_id
4122   AND line_id = p_line_id
4123         /** Forward ported bug 3055939 */
4124   AND scheduled_completion_date >= flm_timezone.client00_in_server(p_scheduled_completion_date)  --fix bug#3170105
4125   AND scheduled_completion_date < flm_timezone.client00_in_server(p_scheduled_completion_date+1);  --fix bug#3170105
4126 
4127  CURSOR Check_Schedule_Distinct_Type
4128  (p_line_id NUMBER ,p_scheduled_completion_date DATE)
4129   IS
4130   SELECT distinct(nvl(roll_forwarded_flag,-1))
4131   FROM wip_flow_schedules
4132   WHERE organization_id = p_organization_id
4133   AND line_id = p_line_id
4134         /** Forward ported bug 3055939 */
4135   AND scheduled_completion_date >= flm_timezone.client00_in_server(p_scheduled_completion_date)  --fix bug#3170105
4136   AND scheduled_completion_date < flm_timezone.client00_in_server(p_scheduled_completion_date+1);  --fix bug#3170105
4137 
4138   CURSOR Line_Details(p_line_id NUMBER)
4139    IS SELECT START_TIME,MAXIMUM_RATE FROM wip_lines
4140    WHERE organization_id = p_organization_id
4141    AND LINE_ID = p_line_id;
4142 
4143  CURSOR Check_Last_Schedule
4144  (p_line_id NUMBER ,p_scheduled_completion_date DATE)
4145   IS
4146   SELECT MAX(scheduled_completion_date)
4147   FROM wip_flow_schedules
4148   WHERE organization_id = p_organization_id
4149   AND line_id = p_line_id
4150         /** Forward ported bug 3055939 */
4151   AND scheduled_completion_date >= flm_timezone.client00_in_server(p_scheduled_completion_date)  --fix bug#3170105
4152   AND scheduled_completion_date < flm_timezone.client00_in_server(p_scheduled_completion_date+1);  --fix bug#3170105
4153 
4154    l_type_count           NUMBER:=0;
4155    l_distinct_type        NUMBER:=0;
4156    l_start_time           NUMBER:=0;
4157    l_time_flag            NUMBER:=0;
4158    l_time                 NUMBER:=0;
4159    l_maximum_rate         NUMBER:=0;
4160    l_schedule_date        DATE;
4161    l_last_schedule_date   DATE;
4162 BEGIN
4163   OPEN Check_Schedule_Roll_Types(p_line_id, p_scheduled_completion_date);  --fix bug#3170105
4164     FETCH Check_Schedule_Roll_Types INTO l_type_count;
4165     IF l_type_count = 0 THEN
4166       l_time_flag := 2;--meaning no schedules
4167     ELSIF l_type_count =1 THEN
4168       OPEN Check_Schedule_Distinct_Type(
4169       p_line_id, p_scheduled_completion_date);  --fix bug#3170105
4170       FETCH Check_Schedule_Distinct_Type INTO l_distinct_type;
4171       CLOSE Check_Schedule_Distinct_Type;
4172       IF l_distinct_type = 2 THEN
4173         l_time_flag := 1;
4174         /*meaning schedules are present but
4175         all are created in this session.*/
4176       ELSE
4177         l_time_flag := 0;
4178         /*meaning schedules are present and
4179         all are created previously.*/
4180       END IF;
4181     ELSIF l_type_count > 1 THEN
4182         l_time_flag := 0;
4183         /*meaning schedules are present and
4184         may be some are created previously.*/
4185     END IF;
4186 
4187     IF l_time_flag <> 0 THEN
4188       OPEN Line_Details(p_line_id);
4189       FETCH Line_Details INTO l_start_time,l_maximum_rate;
4190 
4191       --TZ 3832684: Calculate completion date in Client TZ.
4192       --l_schedule_date and p_completion_date should be in Client00 time.
4193       --If p_completion_date is not in Client00 time, which means that there are
4194       --FS in the date, then l_time_flag=0 and thus, will not get into this IF flow.
4195       if flm_timezone.g_enabled then
4196         l_start_time := flm_timezone.g_client_start_time;
4197 	l_schedule_date := flm_timezone.server_to_client(p_scheduled_completion_date);
4198       else
4199         l_schedule_date := p_scheduled_completion_date;  --fix bug#3170105
4200       end if;
4201 
4202       IF l_time_flag = 1 THEN
4203         OPEN Check_Last_Schedule(p_line_id,p_scheduled_completion_date);  --fix bug#3170105
4204         FETCH Check_Last_Schedule INTO l_last_schedule_date;
4205 
4206 	--TZ 3832684: calculate completion date in Client TZ
4207 	if flm_timezone.g_enabled then
4208 	  l_last_schedule_date := flm_timezone.server_to_client(l_last_schedule_date);
4209 	end if;
4210 
4211         --TZ 3832684: better way to get the seconds in Client time
4212 	l_start_time := to_char(l_last_schedule_date,'SSSSS');
4213 
4214 	CLOSE Check_Last_Schedule;
4215       END IF;
4216       l_time := l_start_time + 60*60*(p_quantity/l_maximum_rate);
4217 
4218       --fix bug#3170105 not yet
4219       MRP_UTIL.MRP_LOG('the client date before :'||to_char(l_schedule_date,'DD-MON-YYYY HH24:MI:SS'));
4220 
4221       --TZ 3832684: Will have to do the time addition in Client TZ doe to some corner cases
4222       --The p_completion_date is assumed to be in Client00_in_server
4223       l_schedule_date := l_schedule_date+(l_time/86400);
4224 
4225       MRP_UTIL.MRP_LOG('the client date after :'||to_char(l_schedule_date,'DD-MON-YYYY HH24:MI:SS'));
4226       --end of fix bug#3170105
4227 
4228       --TZ 3832684: conversion back to server to be passed back to caller
4229       if flm_timezone.g_enabled then
4230         l_schedule_date := flm_timezone.client_to_server(l_schedule_date);
4231         MRP_UTIL.MRP_LOG('the datetime after conv :'||to_char(l_schedule_date,'DD-MON-YY HH24:MI:SS'));
4232       end if;
4233 
4234       CLOSE Line_Details;
4235     ELSE
4236         l_schedule_date := p_scheduled_completion_date;  --fix bug#3170105
4237     END IF;
4238   CLOSE Check_Schedule_Roll_Types;
4239   return l_schedule_date;
4240 END;
4241 
4242 FUNCTION Close_All_Past_Schedules
4243  RETURN INTEGER IS
4244   l_where_clause		VARCHAR2(2000);
4245   l_item_where_clause		VARCHAR2(2000);
4246   l_cat_where_clause		VARCHAR2(2000);
4247   l_cat_sql 			VARCHAR2(2000);
4248   l_cat_table_sql		VARCHAR2(2000);
4249   l_sql_stmt			VARCHAR2(2000) := NULL;
4250   l_rows_processed		NUMBER;
4251   l_cursor_name			INTEGER := NULL;
4252 
4253   l_log_message			VARCHAR2(2000);
4254   l_return			BOOLEAN;
4255 BEGIN
4256 
4257   -- begin new binds
4258   flm_util.init_bind;
4259 
4260   -- Construct where clause
4261   IF p_from_line IS NOT NULL and p_to_line IS NOT NULL THEN
4262    l_where_clause := ' and line.line_code between :from_line and :to_line ';
4263     flm_util.add_bind(':from_line', p_from_line);
4264     flm_util.add_bind(':to_line', p_to_line);
4265   END IF;
4266 
4267   IF p_from_item IS NOT NULL and p_to_item IS NOT NULL THEN
4268     -- Call procedure to construct item_where_clause
4269     l_return := flm_util.Item_Where_Clause(
4270                         p_from_item,
4271                         p_to_item,
4272                         'msi',
4273                         l_item_where_clause,
4274                         l_err_buf);
4275 
4276     IF NOT l_return THEN
4277       -- English because unexpected error
4278       l_log_message := 'Problem constructing item_where_clause';
4279       MRP_UTIL.MRP_LOG(l_log_message);
4280       l_log_message := l_err_buf;
4281       MRP_UTIL.MRP_LOG(l_log_message);
4282       RAISE unexpected_error;
4283     END IF;
4284     l_item_where_clause := ' AND ' || l_item_where_clause;
4285   END IF;
4286 
4287   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
4288   AND p_category_set_id IS NOT NULL THEN
4289 
4290     l_return := flm_util.Category_Where_Clause(
4291                         p_from_category,
4292                         p_to_category,
4293                         'cat',
4294                         p_category_structure_id,
4295                         l_cat_where_clause,
4296                         l_err_buf);
4297 
4298     IF NOT l_return THEN
4299       -- English because unexpected error
4300       l_log_message := 'Problem constructing category_where_clause';
4301       MRP_UTIL.MRP_LOG(l_log_message);
4302       l_log_message := l_err_buf;
4303       MRP_UTIL.MRP_LOG(l_log_message);
4304       RAISE unexpected_error;
4305     END IF;
4306     l_cat_where_clause := ' AND fs.primary_item_id in (select ' ||
4307 		' inventory_item_id from mtl_item_categories mic, '||
4308 		' mtl_categories cat where ' ||
4309                 ' cat.category_id = mic.category_id ' ||
4310                 ' and mic.organization_id = :cat_organization_id ' ||
4311 		' and mic.category_set_id = :cat_category_set_id ' ||
4312 		' and ' || l_cat_where_clause || ')';
4313     flm_util.add_bind(':cat_organization_id', p_organization_id);
4314     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
4315   END IF;
4316 
4317   l_where_clause := l_where_clause || l_item_where_clause ||
4318 		l_cat_where_clause;
4319 
4320   IF p_category_set_id IS NOT NULL THEN
4321     l_cat_table_sql := ' mtl_item_categories mic, ';
4322     l_cat_sql :=
4323     ' and mic.inventory_item_id = fs.primary_item_id ' ||
4324     ' and mic.organization_id = fs.organization_id ' ||
4325     ' and mic.category_set_id = :cat2_category_set_id ';
4326     flm_util.add_bind(':cat2_category_set_id', p_category_set_id);
4327   ELSE
4328     l_cat_table_sql := ' ';
4329     l_cat_sql := ' ';
4330   END IF;
4331 
4332 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
4333   -- Define the select statement
4334   --fix bug#3170105
4335   l_sql_stmt :=
4336     'SELECT fs.wip_entity_id ' ||
4337     ' FROM wip_lines line, '||
4338     l_cat_table_sql ||
4339     ' mtl_system_items_kfv msi, '||
4340     ' wip_flow_schedules fs ' ||
4341     ' WHERE fs.organization_id = to_char( :organization_id) ' ||
4342     l_where_clause ||
4343     ' AND fs.scheduled_completion_date < flm_timezone.sysdate00_in_server' ||
4344     ' and line.line_id = fs.line_id ' ||
4345     ' and line.organization_id = fs.organization_id '||
4346     ' and nvl(fs.status ,0) = 1 '||
4347     l_cat_sql ||
4348     ' and msi.inventory_item_id = fs.primary_item_id ' ||
4349     ' and msi.organization_id = fs.organization_id ' ||
4350     ' and not exists ( select 1 from mtl_transactions_interface ' ||
4351     '                   where transaction_source_id = fs.wip_entity_id ' ||
4352     '                     and organization_id = fs.organization_id '  ||
4353     '                     and transaction_source_type_id = 5 ' || -- perf bug 4911894
4354     '                     and transaction_action_id in (1, 27, 30, 31, 32, 33, 34)  ) ';
4355 
4356 
4357   flm_util.add_bind(':organization_id', p_organization_id);
4358 
4359   -- get the cursor
4360   l_cursor_name := dbms_sql.open_cursor;
4361 
4362   -- parse the sql statement
4363   dbms_sql.parse(l_cursor_name, l_sql_stmt, dbms_sql.native);
4364   flm_util.do_binds(l_cursor_name);
4365 
4366   dbms_sql.define_column(l_cursor_name, 1, l_flow_schedule_rec.wip_entity_id);
4367 
4368 
4369   -- execute the sql statement
4370   -- execute will return zero rows processed since this is just a select
4371   -- statement.  Need a variable for the return value.
4372   l_rows_processed := dbms_sql.execute(l_cursor_name);
4373 
4374   return(l_cursor_name);
4375 EXCEPTION
4376   WHEN NO_DATA_FOUND THEN
4377       RETCODE := G_ERROR;
4378       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
4379       ERRBUF := FND_MESSAGE.get;
4380       l_log_message := FND_MESSAGE.get;
4381       MRP_UTIL.MRP_LOG(l_log_message);
4382       RETURN NULL;
4383 
4384   WHEN OTHERS THEN
4385       -- English because unexpected error
4386       l_log_message := 'Problem Closing all past Schedules';
4387       MRP_UTIL.MRP_LOG(l_log_message);
4388       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
4389       l_log_message := l_err_buf;
4390       MRP_UTIL.MRP_LOG(l_log_message);
4391       RAISE unexpected_error;
4392       RETURN NULL;
4393 END Close_All_Past_Schedules;
4394 
4395 FUNCTION Create_Cursor_WOD(p_from_start_date IN DATE, p_from_end_date IN DATE)  --fix bug#3170105
4396   RETURN INTEGER IS
4397 
4398   l_where_clause		VARCHAR2(2000);
4399   l_item_where_clause		VARCHAR2(2000);
4400   l_cat_where_clause		VARCHAR2(2000);
4401   l_log_message			VARCHAR2(2000);
4402   l_sql_stmt			VARCHAR2(2000) := NULL;
4403   l_return			BOOLEAN;
4404   l_rows_processed		NUMBER;
4405   l_cursor_name			INTEGER := NULL;
4406   fs_report_rec			REPORT_REC_TYPE;
4407   l_cat_sql                     VARCHAR2(2000);
4408   l_cat_table_sql		VARCHAR2(2000);
4409 
4410 BEGIN
4411 
4412   -- new binds
4413   flm_util.init_bind;
4414 
4415   -- Construct where clause
4416   IF p_from_line IS NOT NULL and p_to_line IS NOT NULL THEN
4417    l_where_clause := ' and line.line_code between :from_line and :to_line ';
4418     flm_util.add_bind(':from_line', p_from_line);
4419     flm_util.add_bind(':to_line', p_to_line);
4420   END IF;
4421 
4422   IF p_from_item IS NOT NULL and p_to_item IS NOT NULL THEN
4423     -- Call procedure to construct item_where_clause
4424     l_return := flm_util.Item_Where_Clause(
4425                         p_from_item,
4426                         p_to_item,
4427                         'msi',
4428                         l_item_where_clause,
4429                         l_err_buf);
4430 
4431     IF NOT l_return THEN
4432       -- English because unexpected error
4433       l_log_message := 'Problem constructing item_where_clause';
4434       MRP_UTIL.MRP_LOG(l_log_message);
4435       l_log_message := l_err_buf;
4436       MRP_UTIL.MRP_LOG(l_log_message);
4437       RAISE unexpected_error;
4438     END IF;
4439     l_item_where_clause := ' AND ' || l_item_where_clause;
4440   END IF;
4441 
4442   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
4443   AND p_category_set_id IS NOT NULL THEN
4444     l_return := flm_util.Category_Where_Clause(
4445                         p_from_category,
4446                         p_to_category,
4447                         'cat',
4448                         p_category_structure_id,
4449                         l_cat_where_clause,
4450                         l_err_buf);
4451 
4452     IF NOT l_return THEN
4453       -- English because unexpected error
4454       l_log_message := 'Problem constructing category_where_clause';
4455       MRP_UTIL.MRP_LOG(l_log_message);
4456       l_log_message := l_err_buf;
4457       MRP_UTIL.MRP_LOG(l_log_message);
4458       RAISE unexpected_error;
4459     END IF;
4460     l_cat_where_clause := ' AND fs.primary_item_id in (select ' ||
4461 		' inventory_item_id from mtl_item_categories mic, '||
4462 		' mtl_categories cat where ' ||
4463                 ' cat.category_id = mic.category_id ' ||
4464                 ' and mic.organization_id = :cat_organization_id ' ||
4465 		' and mic.category_set_id = :cat_category_set_id ' ||
4466 		' and ' || l_cat_where_clause || ')';
4467     flm_util.add_bind(':cat_organization_id', p_organization_id);
4468     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
4469   END IF;
4470 
4471   l_where_clause := l_where_clause || l_item_where_clause ||
4472 		l_cat_where_clause;
4473 
4474   -- Define the select statement
4475   IF p_category_set_id IS NOT NULL THEN
4476     l_cat_table_sql := ' mtl_item_categories mic, ';
4477     l_cat_sql :=
4478     ' and mic.inventory_item_id = fs.primary_item_id ' ||
4479     ' and mic.organization_id = fs.organization_id ' ||
4480     ' and mic.category_set_id = :cat2_category_set_id ';
4481     flm_util.add_bind(':cat2_category_set_id', p_category_set_id);
4482   ELSE
4483     l_cat_table_sql := ' ';
4484     l_cat_sql := ' ';
4485   END IF;
4486 
4487 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
4488   --fix bug#3170105
4489   l_sql_stmt :=
4490     ' SELECT fs.line_id, line.line_code, fs.primary_item_id, ' ||
4491     ' msi.concatenated_segments,null' ||
4492     ' ,sum(nvl(fs.planned_quantity,0)), ' ||
4493     ' sum(nvl(fs.quantity_completed,0)) ' ||
4494     ' FROM wip_lines line, '||
4495     l_cat_table_sql ||
4496     ' mtl_system_items_kfv msi, '||
4497     ' wip_flow_schedules fs ' ||
4498     ' WHERE fs.organization_id = to_char( :organization_id ) ' ||
4499     l_where_clause ||
4500     ' AND (nvl(fs.planned_quantity,0) - nvl(fs.quantity_completed,0)) <> 0 ' ||
4501     ' AND fs.scheduled_completion_date between ' ||
4502     '     :from_start_date ' ||
4503     '     and :from_end_date ' ||
4504     ' and line.line_id = fs.line_id ' ||
4505     ' and fs.demand_source_header_id IS NULL '||
4506     ' and line.organization_id = fs.organization_id '||
4507   --  ' and nvl(fs.status ,0) = 1 '||
4508     l_cat_sql ||
4509     ' and msi.inventory_item_id = fs.primary_item_id ' ||
4510     ' and msi.organization_id = fs.organization_id '||
4511     ' and not exists ( select 1 from mtl_transactions_interface ' ||
4512     '                   where transaction_source_id = fs.wip_entity_id ' ||
4513     '                     and organization_id = fs.organization_id '||
4514     '                     and transaction_source_type_id = 5 ' || -- perf bug 4911894
4515     '                     and transaction_action_id in (1, 27, 30, 31, 32, 33, 34)  ) ' ||
4516     ' group by fs.line_id, line.line_code, fs.primary_item_id, ' ||
4517     ' msi.concatenated_segments ' ||
4518     ' order by line.line_code, msi.concatenated_segments ' ;
4519 
4520   flm_util.add_bind(':organization_id', p_organization_id);
4521   flm_util.add_bind(':from_start_date', p_from_start_date);
4522   flm_util.add_bind(':from_end_date', p_from_end_date+1-1/(24*60*60));
4523   --end of fix bug#3170105
4524 
4525   -- get the cursor
4526   l_cursor_name := dbms_sql.open_cursor;
4527 
4528   -- parse the sql statement
4529   dbms_sql.parse(l_cursor_name, l_sql_stmt, dbms_sql.native);
4530   flm_util.do_binds(l_cursor_name);
4531 
4532   -- define columns
4533   dbms_sql.define_column(l_cursor_name, 1, fs_report_rec.line_id);
4534   dbms_sql.define_column(l_cursor_name, 2, fs_report_rec.line_code, 10);
4535   dbms_sql.define_column(l_cursor_name, 3, fs_report_rec.primary_item_id);
4536   dbms_sql.define_column(l_cursor_name, 4, fs_report_rec.item, 2000);
4537   dbms_sql.define_column(l_cursor_name, 5, fs_report_rec.schedule_group_id);
4538   dbms_sql.define_column(l_cursor_name, 6, fs_report_rec.planned_quantity);
4539   dbms_sql.define_column(l_cursor_name, 7, fs_report_rec.quantity_completed);
4540 
4541 
4542   -- execute the sql statement
4543   -- execute will return zero rows processed since this is just a select
4544   -- statement.  Need a variable for the return value.
4545   l_rows_processed := dbms_sql.execute(l_cursor_name);
4546 
4547   -- return cursor name
4548   return(l_cursor_name);
4549 
4550 EXCEPTION
4551 
4552   WHEN NO_DATA_FOUND THEN
4553 
4554       RETCODE := G_ERROR;
4555       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
4556       ERRBUF := FND_MESSAGE.get;
4557       l_log_message := FND_MESSAGE.get;
4558       MRP_UTIL.MRP_LOG(l_log_message);
4559 
4560       RETURN NULL;
4561 
4562   WHEN OTHERS THEN
4563 
4564       -- English because unexpected error
4565       l_log_message := 'Problem constructing cursor';
4566       MRP_UTIL.MRP_LOG(l_log_message);
4567       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
4568       l_log_message := l_err_buf;
4569       MRP_UTIL.MRP_LOG(l_log_message);
4570       RAISE unexpected_error;
4571 
4572       RETURN NULL;
4573 
4574 END Create_Cursor_WOD;
4575 
4576 FUNCTION Create_Cursor_WD (p_from_start_date IN DATE, p_from_end_date IN DATE)  --fix bug#3170105
4577   RETURN INTEGER IS
4578 
4579   l_where_clause		VARCHAR2(2000);
4580   l_item_where_clause		VARCHAR2(2000);
4581   l_cat_where_clause		VARCHAR2(2000);
4582   l_log_message			VARCHAR2(2000);
4583   l_sql_stmt			VARCHAR2(32000) := NULL;
4584   l_return			BOOLEAN;
4585   l_rows_processed		NUMBER;
4586   l_cursor_name			INTEGER := NULL;
4587   fs_report_rec			REPORT_REC_TYPE;
4588   l_select			VARCHAR2(100);
4589   l_cat_sql                     VARCHAR2(2000);
4590   l_cat_table_sql               VARCHAR2(2000);
4591 
4592 BEGIN
4593 
4594   -- new binds
4595   flm_util.init_bind;
4596 
4597   -- Construct where clause
4598   IF p_from_line IS NOT NULL and p_to_line IS NOT NULL THEN
4599     l_where_clause := ' and line.line_code between :from_line and :to_line ';
4600     flm_util.add_bind(':from_line', p_from_line);
4601     flm_util.add_bind(':to_line', p_to_line);
4602   END IF;
4603 
4604   IF p_from_item IS NOT NULL and p_to_item IS NOT NULL THEN
4605     -- Call procedure to construct item_where_clause
4606     l_return := flm_util.Item_Where_Clause(
4607                         p_from_item,
4608                         p_to_item,
4609                         'msi',
4610                         l_item_where_clause,
4611                         l_err_buf);
4612 
4613     IF NOT l_return THEN
4614       -- English because unexpected error
4615       l_log_message := 'Problem constructing item_where_clause';
4616       MRP_UTIL.MRP_LOG(l_log_message);
4617       l_log_message := l_err_buf;
4618       MRP_UTIL.MRP_LOG(l_log_message);
4619       RAISE unexpected_error;
4620     END IF;
4621     l_item_where_clause := ' AND ' || l_item_where_clause;
4622   END IF;
4623 
4624   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
4625   AND p_category_set_id IS NOT NULL THEN
4626 
4627     l_return := flm_util.Category_Where_Clause(
4628                         p_from_category,
4629                         p_to_category,
4630                         'cat',
4631                         p_category_structure_id,
4632                         l_cat_where_clause,
4633                         l_err_buf);
4634 
4635     IF NOT l_return THEN
4636       -- English because unexpected error
4637       l_log_message := 'Problem constructing category_where_clause';
4638       MRP_UTIL.MRP_LOG(l_log_message);
4639       l_log_message := l_err_buf;
4640       MRP_UTIL.MRP_LOG(l_log_message);
4641       RAISE unexpected_error;
4642     END IF;
4643     l_cat_where_clause := ' AND fs.primary_item_id in (select ' ||
4644 		' inventory_item_id from mtl_item_categories mic, '||
4645 		' mtl_categories cat where ' ||
4646                 ' cat.category_id = mic.category_id ' ||
4647                 ' and mic.organization_id = :cat_organization_id ' ||
4648 		' and mic.category_set_id = :cat_category_set_id ' ||
4649 		' and ' || l_cat_where_clause || ')';
4650     flm_util.add_bind(':cat_organization_id', p_organization_id);
4651     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
4652   END IF;
4653 
4654   l_where_clause := l_where_clause || l_item_where_clause ||
4655 		l_cat_where_clause;
4656 
4657   IF p_category_set_id IS NOT NULL THEN
4658     l_cat_table_sql := ' mtl_item_categories mic, ';
4659     l_cat_sql :=
4660     ' and mic.inventory_item_id = fs.primary_item_id ' ||
4661     ' and mic.organization_id = fs.organization_id ' ||
4662     ' and mic.category_set_id = :cat2_category_set_id ';
4663     flm_util.add_bind(':cat2_category_set_id', p_category_set_id);
4664   ELSE
4665     l_cat_table_sql := ' ';
4666     l_cat_sql := ' ';
4667   END IF;
4668 
4669 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
4670   -- Define the select statement
4671   --fix bug#3170105
4672   l_sql_stmt :=
4673     ' SELECT fs.line_id, line.line_code, fs.primary_item_id, ' ||
4674     ' fs.schedule_group_id,fs.schedule_number,'||
4675     ' fs.build_sequence,fs.demand_source_header_id,fs.demand_source_line, ' ||
4676     ' fs.demand_source_delivery,fs.demand_source_type,fs.demand_class, ' ||
4677     ' msi.concatenated_segments ' ||
4678     ' ,nvl(fs.planned_quantity,0), ' ||
4679     ' nvl(fs.quantity_completed,0), ' ||
4680     ' fs.MPS_SCHEDULED_COMPLETION_DATE, nvl(fs.MPS_NET_QUANTITY,0), '||
4681     ' fs.BOM_REVISION, fs.ROUTING_REVISION,fs.BOM_REVISION_DATE, '||
4682     ' fs.ROUTING_REVISION_DATE, fs.ALTERNATE_BOM_DESIGNATOR, '||
4683     ' fs.ALTERNATE_ROUTING_DESIGNATOR, fs.COMPLETION_SUBINVENTORY, '||
4684     ' fs.COMPLETION_LOCATOR_ID, fs.MATERIAL_ACCOUNT, '||
4685     ' fs.MATERIAL_OVERHEAD_ACCOUNT, fs.RESOURCE_ACCOUNT, '||
4686     ' fs.OUTSIDE_PROCESSING_ACCOUNT, fs.MATERIAL_VARIANCE_ACCOUNT, '||
4687     ' fs.RESOURCE_VARIANCE_ACCOUNT, fs.OUTSIDE_PROC_VARIANCE_ACCOUNT, '||
4688     ' fs.STD_COST_ADJUSTMENT_ACCOUNT, fs.OVERHEAD_ACCOUNT, '||
4689     ' fs.OVERHEAD_VARIANCE_ACCOUNT, fs.PROJECT_ID,fs.TASK_ID, '||
4690     ' fs.ATTRIBUTE_CATEGORY, fs.ATTRIBUTE1,fs.ATTRIBUTE2, '||
4691     ' fs.ATTRIBUTE3, fs.ATTRIBUTE4,fs.ATTRIBUTE5, '||
4692     ' fs.ATTRIBUTE6, fs.ATTRIBUTE7,fs.ATTRIBUTE8, '||
4693     ' fs.ATTRIBUTE9, fs.ATTRIBUTE10,fs.ATTRIBUTE11, '||
4694     ' fs.ATTRIBUTE12, fs.ATTRIBUTE13,fs.ATTRIBUTE14, '||
4695     ' fs.ATTRIBUTE15, fs.KANBAN_CARD_ID,fs.END_ITEM_UNIT_NUMBER, '||
4696     ' fs.CURRENT_LINE_OPERATION, '||
4697     ' fs.WIP_ENTITY_ID '||
4698     ' FROM wip_lines line, '||
4699     l_cat_table_sql ||
4700     ' mtl_system_items_kfv msi, '||
4701     ' wip_flow_schedules fs ' ||
4702     ' WHERE fs.organization_id = to_char(:organization_id) '||
4703     l_where_clause ||
4704     ' AND (nvl(fs.planned_quantity,0) - nvl(fs.quantity_completed,0)) > 0 ' ||
4705     ' AND fs.scheduled_completion_date between ' ||
4706     '       :from_start_date ' ||
4707     '       and :from_end_date ' ||
4708     ' and line.line_id = fs.line_id ' ||
4709     ' and line.organization_id = fs.organization_id '||
4710     ' and nvl(fs.status,0) = 1 '||
4711     l_cat_sql ||
4712     ' and msi.inventory_item_id = fs.primary_item_id ' ||
4713     ' and msi.organization_id = fs.organization_id '||
4714     ' and not exists ( select 1 from mtl_transactions_interface ' ||
4715     '                   where transaction_source_id = fs.wip_entity_id ' ||
4716     '                     and organization_id = fs.organization_id ' ||
4717     '                     and transaction_source_type_id = 5 ' || -- perf bug 4911894
4718     '                     and transaction_action_id in (1, 27, 30, 31, 32, 33, 34)  ) ' ||
4719     ' order by line.line_code, trunc(fs.scheduled_completion_date), fs.build_sequence ';
4720   flm_util.add_bind(':organization_id', p_organization_id);
4721   flm_util.add_bind(':from_start_date', p_from_start_date);
4722   flm_util.add_bind(':from_end_date', p_from_end_date+1-1/(24*60*60));
4723   --end of fix bug#3170105
4724 /*
4725    Bug 2213859 - Removed  ' order by line.line_code, msi.concatenated_segments,fs.build_sequence '
4726    and added a new order by above
4727 */
4728  --MRP_UTIL.MRP_LOG(l_sql_stmt);
4729   -- get the cursor
4730   l_cursor_name := dbms_sql.open_cursor;
4731 
4732   -- parse the sql statement
4733   dbms_sql.parse(l_cursor_name, l_sql_stmt, dbms_sql.native);
4734   flm_util.do_binds(l_cursor_name);
4735 
4736 
4737   -- define columns
4738   dbms_sql.define_column(l_cursor_name, 1, fs_report_rec.line_id);
4739   dbms_sql.define_column(l_cursor_name, 2, fs_report_rec.line_code, 10);
4740   dbms_sql.define_column(l_cursor_name, 3, fs_report_rec.primary_item_id);
4741   dbms_sql.define_column(l_cursor_name, 4, fs_report_rec.schedule_group_id);
4742   dbms_sql.define_column(l_cursor_name, 5, fs_report_rec.schedule_number,30);
4743   dbms_sql.define_column(l_cursor_name, 6, fs_report_rec.build_sequence);
4744   dbms_sql.define_column(l_cursor_name, 7,
4745     fs_report_rec.demand_source_header_id);
4746   dbms_sql.define_column(l_cursor_name, 8,
4747     fs_report_rec.demand_source_line,30);
4748   dbms_sql.define_column(l_cursor_name, 9,fs_report_rec.demand_source_delivery,
4749   30);
4750   dbms_sql.define_column(l_cursor_name, 10,fs_report_rec.demand_source_type);
4751   dbms_sql.define_column(l_cursor_name, 11,fs_report_rec.demand_class,30);
4752   dbms_sql.define_column(l_cursor_name, 12, fs_report_rec.item, 2000);
4753   dbms_sql.define_column(l_cursor_name, 13, fs_report_rec.planned_quantity);
4754   dbms_sql.define_column(l_cursor_name, 14, fs_report_rec.quantity_completed);
4755   -- execute the sql statement
4756   dbms_sql.define_column(l_cursor_name, 15,
4757     fs_report_rec.MPS_SCHEDULED_COMPLETION_DATE);
4758   dbms_sql.define_column(l_cursor_name, 16, fs_report_rec.MPS_NET_QUANTITY);
4759   dbms_sql.define_column(l_cursor_name, 17, fs_report_rec.BOM_REVISION,3);
4760   dbms_sql.define_column(l_cursor_name, 18, fs_report_rec.ROUTING_REVISION,3);
4761   dbms_sql.define_column(l_cursor_name, 19, fs_report_rec.BOM_REVISION_DATE);
4762   dbms_sql.define_column(l_cursor_name, 20,
4763     fs_report_rec.ROUTING_REVISION_DATE);
4764   dbms_sql.define_column(l_cursor_name, 21,
4765     fs_report_rec.ALTERNATE_BOM_DESIGNATOR,10);
4766   dbms_sql.define_column(l_cursor_name, 22,
4767     fs_report_rec.ALTERNATE_ROUTING_DESIGNATOR,10);
4768   dbms_sql.define_column(l_cursor_name, 23,
4769     fs_report_rec.COMPLETION_SUBINVENTORY,10);
4770   dbms_sql.define_column(l_cursor_name, 24,
4771     fs_report_rec.COMPLETION_LOCATOR_ID);
4772   dbms_sql.define_column(l_cursor_name, 25, fs_report_rec.MATERIAL_ACCOUNT);
4773   dbms_sql.define_column(l_cursor_name, 26,
4774     fs_report_rec.MATERIAL_OVERHEAD_ACCOUNT);
4775   dbms_sql.define_column(l_cursor_name, 27, fs_report_rec.RESOURCE_ACCOUNT);
4776   dbms_sql.define_column(l_cursor_name, 28,
4777     fs_report_rec.OUTSIDE_PROCESSING_ACCOUNT);
4778   dbms_sql.define_column(l_cursor_name, 29,
4779     fs_report_rec.MATERIAL_VARIANCE_ACCOUNT);
4780   dbms_sql.define_column(l_cursor_name, 30,
4781     fs_report_rec.RESOURCE_VARIANCE_ACCOUNT);
4782   dbms_sql.define_column(l_cursor_name, 31,
4783     fs_report_rec.OUTSIDE_PROC_VARIANCE_ACCOUNT);
4784   dbms_sql.define_column(l_cursor_name, 32,
4785     fs_report_rec.STD_COST_ADJUSTMENT_ACCOUNT);
4786   dbms_sql.define_column(l_cursor_name, 33, fs_report_rec.OVERHEAD_ACCOUNT);
4787   dbms_sql.define_column(l_cursor_name, 34,
4788     fs_report_rec.OVERHEAD_VARIANCE_ACCOUNT);
4789   dbms_sql.define_column(l_cursor_name, 35, fs_report_rec.PROJECT_ID);
4790   dbms_sql.define_column(l_cursor_name, 36, fs_report_rec.TASK_ID);
4791   dbms_sql.define_column(l_cursor_name, 37,
4792     fs_report_rec.ATTRIBUTE_CATEGORY,30);
4793   dbms_sql.define_column(l_cursor_name, 38, fs_report_rec.ATTRIBUTE1,30);
4794   dbms_sql.define_column(l_cursor_name, 39, fs_report_rec.ATTRIBUTE2,150);
4795   dbms_sql.define_column(l_cursor_name, 40, fs_report_rec.ATTRIBUTE3,150);
4796   dbms_sql.define_column(l_cursor_name, 41, fs_report_rec.ATTRIBUTE4,150);
4797   dbms_sql.define_column(l_cursor_name, 42, fs_report_rec.ATTRIBUTE5,150);
4798   dbms_sql.define_column(l_cursor_name, 43, fs_report_rec.ATTRIBUTE6,150);
4799   dbms_sql.define_column(l_cursor_name, 44, fs_report_rec.ATTRIBUTE7,150);
4800   dbms_sql.define_column(l_cursor_name, 45, fs_report_rec.ATTRIBUTE8,150);
4801   dbms_sql.define_column(l_cursor_name, 46, fs_report_rec.ATTRIBUTE9,150);
4802   dbms_sql.define_column(l_cursor_name, 47, fs_report_rec.ATTRIBUTE10,150);
4803   dbms_sql.define_column(l_cursor_name, 48, fs_report_rec.ATTRIBUTE11,150);
4804   dbms_sql.define_column(l_cursor_name, 49, fs_report_rec.ATTRIBUTE12,150);
4805   dbms_sql.define_column(l_cursor_name, 50, fs_report_rec.ATTRIBUTE13,150);
4806   dbms_sql.define_column(l_cursor_name, 51, fs_report_rec.ATTRIBUTE14,150);
4807   dbms_sql.define_column(l_cursor_name, 52, fs_report_rec.ATTRIBUTE15,150);
4808   dbms_sql.define_column(l_cursor_name, 53, fs_report_rec.KANBAN_CARD_ID);
4809   dbms_sql.define_column(l_cursor_name, 54, fs_report_rec.END_ITEM_UNIT_NUMBER,30);
4810   dbms_sql.define_column(l_cursor_name, 55, fs_report_rec.CURRENT_LINE_OPERATION);
4811   dbms_sql.define_column(l_cursor_name, 56, fs_report_rec.WIP_ENTITY_ID);
4812   -- execute will return zero rows processed since this is just a select
4813   -- statement.  Need a variable for the return value.
4814   l_rows_processed := dbms_sql.execute(l_cursor_name);
4815 
4816   -- return cursor name
4817   return(l_cursor_name);
4818 
4819 EXCEPTION
4820 
4821   WHEN NO_DATA_FOUND THEN
4822 
4823       RETCODE := G_ERROR;
4824       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
4825       ERRBUF := FND_MESSAGE.get;
4826       l_log_message := FND_MESSAGE.get;
4827       MRP_UTIL.MRP_LOG(l_log_message);
4828 
4829       RETURN NULL;
4830 
4831   WHEN OTHERS THEN
4832 
4833       -- English because unexpected error
4834       l_log_message := 'Problem constructing cursor';
4835       MRP_UTIL.MRP_LOG(l_log_message);
4836       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
4837       l_log_message := l_err_buf;
4838       MRP_UTIL.MRP_LOG(l_log_message);
4839       RAISE unexpected_error;
4840 
4841       RETURN NULL;
4842 
4843 END Create_Cursor_WD;
4844 
4845 FUNCTION Close_Single_Schedule_WithID ( p_wip_entity_id NUMBER,
4846   p_organization_id NUMBER) RETURN BOOLEAN IS
4847 
4848   l_log_message			VARCHAR2(2000);
4849 BEGIN
4850 
4851   UPDATE WIP_FLOW_SCHEDULES SET
4852   status = 2 , date_closed = flm_timezone.sysdate00_in_server  --fix bug#3170105
4853   WHERE wip_entity_id = p_wip_entity_id
4854   AND organization_id = p_organization_id;
4855 
4856   return TRUE;
4857 EXCEPTION
4858 
4859   WHEN NO_DATA_FOUND THEN
4860 
4861       RETCODE := G_ERROR;
4862       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
4863       ERRBUF := FND_MESSAGE.get;
4864       l_log_message := FND_MESSAGE.get;
4865       MRP_UTIL.MRP_LOG(l_log_message);
4866 
4867       RETURN FALSE;
4868 
4869   WHEN OTHERS THEN
4870 
4871       -- English because unexpected error
4872       l_log_message := 'Problem Closing Schedule';
4873       MRP_UTIL.MRP_LOG(l_log_message);
4874       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
4875       l_log_message := l_err_buf;
4876       MRP_UTIL.MRP_LOG(l_log_message);
4877       RAISE unexpected_error;
4878 
4879       RETURN FALSE;
4880 
4881 END Close_Single_Schedule_WithId;
4882 
4883 FUNCTION Close_Single_Schedule ( p_schedule_number VARCHAR2,
4884   p_organization_id NUMBER) RETURN BOOLEAN IS
4885 
4886   l_log_message			VARCHAR2(2000);
4887   l_sql_stmt			VARCHAR2(2000) := NULL;
4888   l_return			BOOLEAN;
4889   l_rows_processed		NUMBER;
4890   l_cursor_name			INTEGER := NULL;
4891   fs_report_rec			REPORT_REC_TYPE;
4892   l_select			VARCHAR2(100);
4893 BEGIN
4894 
4895   UPDATE WIP_FLOW_SCHEDULES SET
4896   status = 2 , date_closed = flm_timezone.sysdate00_in_server  --fix bug#3170105
4897   WHERE schedule_number = p_schedule_number
4898   AND organization_id = p_organization_id;
4899 
4900   return TRUE;
4901 EXCEPTION
4902 
4903   WHEN NO_DATA_FOUND THEN
4904 
4905       RETCODE := G_ERROR;
4906       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
4907       ERRBUF := FND_MESSAGE.get;
4908       l_log_message := FND_MESSAGE.get;
4909       MRP_UTIL.MRP_LOG(l_log_message);
4910 
4911       RETURN FALSE;
4912 
4913   WHEN OTHERS THEN
4914 
4915       -- English because unexpected error
4916       l_log_message := 'Problem Closing Schedule';
4917       MRP_UTIL.MRP_LOG(l_log_message);
4918       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
4919       l_log_message := l_err_buf;
4920       MRP_UTIL.MRP_LOG(l_log_message);
4921       RAISE unexpected_error;
4922 
4923       RETURN FALSE;
4924 
4925 END Close_Single_Schedule;
4926 
4927 
4928 FUNCTION Create_Relieve_Cursor(p_from_start_date IN DATE, p_from_end_date IN DATE)
4929   RETURN INTEGER IS  --fix bug#3170105
4930 
4931   l_where_clause                VARCHAR2(2000);
4932   l_item_where_clause           VARCHAR2(2000);
4933   l_cat_where_clause            VARCHAR2(2000);
4934   l_log_message                 VARCHAR2(2000);
4935   l_sql_stmt                    VARCHAR2(2000) := NULL;
4936   l_return                      BOOLEAN;
4937   l_rows_processed              NUMBER;
4938   l_cursor_name                 INTEGER := NULL;
4939   l_wip_entity_id               NUMBER;
4940   l_select                      VARCHAR2(2000);
4941   l_cat_sql                     VARCHAR2(2000);
4942   l_cat_table_sql               VARCHAR2(2000);
4943 
4944 BEGIN
4945 
4946   -- new binds
4947   flm_util.init_bind;
4948 
4949   -- Construct where clause
4950   IF p_from_line IS NOT NULL and p_to_line IS NOT NULL THEN
4951    l_where_clause := ' and line.line_code between :from_line and :to_line ';
4952     flm_util.add_bind(':from_line', p_from_line);
4953     flm_util.add_bind(':to_line', p_to_line);
4954   END IF;
4955 
4956   IF p_from_item IS NOT NULL and p_to_item IS NOT NULL THEN
4957     -- Call procedure to construct item_where_clause
4958     l_return := flm_util.Item_Where_Clause(
4959                         p_from_item,
4960                         p_to_item,
4961                         'msi',
4962                         l_item_where_clause,
4963                         l_err_buf);
4964 
4965     IF NOT l_return THEN
4966       -- English because unexpected error
4967       l_log_message := 'Problem constructing item_where_clause';
4968       MRP_UTIL.MRP_LOG(l_log_message);
4969       l_log_message := l_err_buf;
4970       MRP_UTIL.MRP_LOG(l_log_message);
4971       RAISE unexpected_error;
4972     END IF;
4973     l_item_where_clause := ' AND ' || l_item_where_clause;
4974   END IF;
4975 
4976   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
4977   AND p_category_set_id IS NOT NULL THEN
4978 
4979     l_return := flm_util.Category_Where_Clause(
4980                         p_from_category,
4981                         p_to_category,
4982                         'cat',
4983                         p_category_structure_id,
4984                         l_cat_where_clause,
4985                         l_err_buf);
4986 
4987     IF NOT l_return THEN
4988       -- English because unexpected error
4989       l_log_message := 'Problem constructing category_where_clause';
4990       MRP_UTIL.MRP_LOG(l_log_message);
4991       l_log_message := l_err_buf;
4992       MRP_UTIL.MRP_LOG(l_log_message);
4993       RAISE unexpected_error;
4994     END IF;
4995     l_cat_where_clause := ' AND fs.primary_item_id in (select ' ||
4996                 ' inventory_item_id from mtl_item_categories mic, '||
4997                 ' mtl_categories cat where ' ||
4998                 ' cat.category_id = mic.category_id ' ||
4999                 ' and mic.organization_id = :cat_organization_id ' ||
5000                 ' and mic.category_set_id = :cat_category_set_id ' ||
5001                 ' and ' || l_cat_where_clause || ')';
5002     flm_util.add_bind(':cat_organization_id', p_organization_id);
5003     flm_util.add_bind(':cat_category_set_id', p_category_set_id);
5004   END IF;
5005 
5006   l_where_clause := l_where_clause || l_item_where_clause ||
5007                 l_cat_where_clause;
5008 
5009   IF p_spread_qty = 2 THEN
5010     l_select :=  ' AND (nvl(fs.planned_quantity,0) - nvl(fs.quantity_completed,0)) > 0 AND nvl(fs.status,0) = 1 ';
5011   ELSIF p_spread_qty = 1 THEN
5012     l_select :=  ' AND (nvl(fs.planned_quantity,0) - nvl(fs.quantity_completed,0)) <> 0  AND fs.demand_source_header_id IS NULL ';
5013   END IF;
5014 
5015   IF p_category_set_id IS NOT NULL THEN
5016     l_cat_table_sql := ' mtl_item_categories mic, ';
5017     l_cat_sql :=
5018     ' and mic.inventory_item_id = fs.primary_item_id ' ||
5019     ' and mic.organization_id = fs.organization_id ' ||
5020     ' and mic.category_set_id = :cat2_category_set_id ';
5021     flm_util.add_bind(':cat2_category_set_id', p_category_set_id);
5022   ELSE
5023     l_cat_table_sql := ' ';
5024     l_cat_sql := ' ';
5025   END IF;
5026 
5027 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5028   -- Define the select statement
5029   --fix bug#3170105
5030   l_sql_stmt :=
5031     ' SELECT fs.wip_entity_id ' ||
5032     ' FROM wip_lines line, '||
5033     l_cat_table_sql ||
5034     ' mtl_system_items_kfv msi, '||
5035     ' wip_flow_schedules fs ' ||
5036     ' WHERE fs.organization_id = to_char(:organization_id) ' ||
5037     l_where_clause ||
5038     l_select ||
5039     ' AND fs.scheduled_completion_date between ' ||
5040     '      :from_start_date ' ||
5041     '      and :from_end_date ' ||
5042     ' and line.line_id = fs.line_id ' ||
5043     ' and line.organization_id = fs.organization_id '||
5044     l_cat_sql ||
5045     ' and msi.inventory_item_id = fs.primary_item_id ' ||
5046     ' and msi.organization_id = fs.organization_id ' ||
5047     ' and not exists ( select 1 from mtl_transactions_interface ' ||
5048     '                   where transaction_source_id = fs.wip_entity_id ' ||
5049     '                     and organization_id = fs.organization_id  ' ||
5050     '                     and transaction_source_type_id = 5 ' || -- perf bug 4911894
5051     '                     and transaction_action_id in (1, 27, 30, 31, 32, 33, 34)  ) ';
5052 
5053   flm_util.add_bind(':organization_id', p_organization_id);
5054   flm_util.add_bind(':from_start_date', p_from_start_date);
5055   flm_util.add_bind(':from_end_date', p_from_end_date+1-1/(24*60*60));
5056   --end of fix bug#3170105x
5057 
5058   -- get the cursor
5059   l_cursor_name := dbms_sql.open_cursor;
5060 
5061   -- parse the sql statement
5062   dbms_sql.parse(l_cursor_name, l_sql_stmt, dbms_sql.native);
5063   flm_util.do_binds(l_cursor_name);
5064 
5065   -- define columns
5066   dbms_sql.define_column(l_cursor_name, 1, l_wip_entity_id);
5067 
5068 
5069   -- execute the sql statement
5070   -- execute will return zero rows processed since this is just a select
5071   -- statement.  Need a variable for the return value.
5072   l_rows_processed := dbms_sql.execute(l_cursor_name);
5073 
5074   -- return cursor name
5075   return(l_cursor_name);
5076 
5077 EXCEPTION
5078 
5079   WHEN NO_DATA_FOUND THEN
5080 
5081       RETCODE := G_ERROR;
5082       FND_MESSAGE.set_name('MRP','MRP_NO_ROLL_RECORDS');
5083       ERRBUF := FND_MESSAGE.get;
5084       l_log_message := FND_MESSAGE.get;
5085       MRP_UTIL.MRP_LOG(l_log_message);
5086 
5087       RETURN NULL;
5088 
5089   WHEN OTHERS THEN
5090 
5091       -- English because unexpected error
5092       l_log_message := 'Problem constructing Relieve cursor';
5093       MRP_UTIL.MRP_LOG(l_log_message);
5094       l_err_buf := 'Unexpected SQL Error: '||sqlerrm;
5095       l_log_message := l_err_buf;
5096       MRP_UTIL.MRP_LOG(l_log_message);
5097       RAISE unexpected_error;
5098 
5099       RETURN NULL;
5100 
5101 END Create_Relieve_Cursor;
5102 
5103 PROCEDURE initialize_report_WOD(p_query_id OUT NOCOPY NUMBER
5104   ,p_from_start_date IN DATE, p_from_end_date IN DATE
5105   ,p_to_start_date IN DATE, p_to_end_date IN DATE) IS  --fix bug#3170105
5106 
5107 BEGIN
5108     SELECT mrp_form_query_s.nextval
5109     INTO p_query_id
5110     FROM DUAL;
5111 
5112   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
5113      AND p_category_set_id IS NOT NULL THEN
5114 
5115 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5116     INSERT INTO mrp_form_query
5117         (query_id,
5118         last_update_date,
5119         last_updated_by,
5120         creation_date,
5121         created_by,
5122         number1,
5123         number2,
5124         number3,
5125         date1,
5126         number4,
5127         number5,
5128         date2,
5129         number6,
5130         number7,
5131         number10)
5132     SELECT p_query_id,
5133         sysdate,
5134         1,
5135         sysdate,
5136         1,
5137         fs1.line_id,
5138         fs1.primary_item_id,
5139         null,
5140         --fs1.schedule_group_id,
5141         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5142         sum(fs1.planned_quantity),
5143         sum(fs1.quantity_completed),
5144         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date))  --fix bug#3170105
5145         +floor(p_to_start_date-p_from_start_date),
5146         NULL,
5147         0,
5148         fs1.organization_id
5149     FROM wip_lines wl,
5150         mtl_system_items_kfv kfv,
5151         mtl_categories_kfv cat,
5152         mtl_item_categories mic,
5153         wip_flow_schedules fs1
5154     WHERE wl.line_id = fs1.line_id
5155     AND fs1.demand_source_header_id IS NULL
5156   --  AND nvl(fs1.closed,0) = 0
5157     AND wl.organization_id = fs1.organization_id
5158     AND wl.line_code
5159         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5160     AND kfv.inventory_item_id = fs1.primary_item_id
5161     AND kfv.organization_id = fs1.organization_id
5162     AND kfv.concatenated_segments
5163         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5164         NVL(p_to_item,kfv.concatenated_segments)
5165     AND mic.inventory_item_id = fs1.primary_item_id
5166     AND mic.organization_id = fs1.organization_id
5167     AND mic.category_set_id = p_category_set_id
5168     AND cat.category_id = mic.category_id
5169     AND cat.concatenated_segments BETWEEN
5170         NVL(p_from_category,cat.concatenated_segments)
5171         AND NVL(p_to_category,cat.concatenated_segments)
5172     AND fs1.scheduled_completion_date  --fix bug#3170105
5173         BETWEEN p_from_start_date AND
5174                 p_from_end_date+1-1/(24*60*60)
5175     AND fs1.organization_id = p_organization_id
5176     AND not exists ( select 1 from mtl_transactions_interface
5177                       where transaction_source_id = fs1.wip_entity_id
5178                         and organization_id = fs1.organization_id
5179                         and transaction_source_type_id = 5 -- perf bug 4911894
5180                         and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) )
5181     GROUP BY fs1.line_id,
5182         fs1.primary_item_id,
5183         --fs1.schedule_group_id,
5184 	trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),--bug 3827600
5185         --floor(fs1.scheduled_completion_date-p_from_start_date),  --fix bug#3170105
5186         fs1.organization_id;
5187 
5188   ELSIF  p_category_set_id IS NOT NULL THEN
5189 
5190 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5191     INSERT INTO mrp_form_query
5192         (query_id,
5193         last_update_date,
5194         last_updated_by,
5195         creation_date,
5196         created_by,
5197         number1,
5198         number2,
5199         number3,
5200         date1,
5201         number4,
5202         number5,
5203         date2,
5204         number6,
5205         number7,
5206         number10)
5207     SELECT p_query_id,
5208         sysdate,
5209         1,
5210         sysdate,
5211         1,
5212         fs1.line_id,
5213         fs1.primary_item_id,
5214         null,
5215         --fs1.schedule_group_id,
5216         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5217         sum(fs1.planned_quantity),
5218         sum(fs1.quantity_completed),
5219         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date))  --fix bug#3170105
5220         +floor(p_to_start_date-p_from_start_date),
5221         NULL,
5222         0,
5223         fs1.organization_id
5224     FROM wip_lines wl,
5225         mtl_system_items_kfv kfv,
5226         mtl_item_categories mic,
5227         wip_flow_schedules fs1
5228     WHERE wl.line_id = fs1.line_id
5229     AND fs1.demand_source_header_id IS NULL
5230   --  AND nvl(fs1.closed,0) = 0
5231     AND wl.organization_id = fs1.organization_id
5232     AND wl.line_code
5233         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5234     AND kfv.inventory_item_id = fs1.primary_item_id
5235     AND kfv.organization_id = fs1.organization_id
5236     AND kfv.concatenated_segments
5237         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5238         NVL(p_to_item,kfv.concatenated_segments)
5239     AND mic.inventory_item_id = fs1.primary_item_id
5240     AND mic.organization_id = fs1.organization_id
5241     AND mic.category_set_id = p_category_set_id
5242     AND fs1.scheduled_completion_date  --fix bug#3170105
5243         BETWEEN p_from_start_date AND
5244                 p_from_end_date+1-1/(24*60*60)
5245     AND fs1.organization_id = p_organization_id
5246     AND not exists ( select 1 from mtl_transactions_interface
5247                       where transaction_source_id = fs1.wip_entity_id
5248                         and organization_id = fs1.organization_id
5249                         and transaction_source_type_id = 5 -- perf bug 4911894
5250                         and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) )
5251     GROUP BY fs1.line_id,
5252         fs1.primary_item_id,
5253         --fs1.schedule_group_id,
5254 	trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),--bug 3827600
5255         --floor(fs1.scheduled_completion_date-p_from_start_date),  --fix bug#3170105
5256         fs1.organization_id;
5257   ELSE
5258 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5259     INSERT INTO mrp_form_query
5260         (query_id,
5261         last_update_date,
5262         last_updated_by,
5263         creation_date,
5264         created_by,
5265         number1,
5266         number2,
5267         number3,
5268         date1,
5269         number4,
5270         number5,
5271         date2,
5272         number6,
5273         number7,
5274         number10)
5275     SELECT p_query_id,
5276         sysdate,
5277         1,
5278         sysdate,
5279         1,
5280         fs1.line_id,
5281         fs1.primary_item_id,
5282         null,
5283         --fs1.schedule_group_id,
5284         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5285         sum(fs1.planned_quantity),
5286         sum(fs1.quantity_completed),
5287         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date))  --fix bug#3170105
5288         +floor(p_to_start_date-p_from_start_date),
5289         NULL,
5290         0,
5291         fs1.organization_id
5292     FROM wip_lines wl,
5293         mtl_system_items_kfv kfv,
5294         wip_flow_schedules fs1
5295     WHERE wl.line_id = fs1.line_id
5296     AND fs1.demand_source_header_id IS NULL
5297   --  AND nvl(fs1.closed,0) = 0
5298     AND wl.organization_id = fs1.organization_id
5299     AND wl.line_code
5300         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5301     AND kfv.inventory_item_id = fs1.primary_item_id
5302     AND kfv.organization_id = fs1.organization_id
5303     AND kfv.concatenated_segments
5304         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5305         NVL(p_to_item,kfv.concatenated_segments)
5306     AND fs1.scheduled_completion_date  --fix bug#3170105
5307         BETWEEN p_from_start_date AND
5308                 p_from_end_date+1-1/(24*60*60)
5309     AND fs1.organization_id = p_organization_id
5310     AND not exists ( select 1 from mtl_transactions_interface
5311                       where transaction_source_id = fs1.wip_entity_id
5312                         and organization_id = fs1.organization_id
5313                         and transaction_source_type_id = 5 -- perf bug 4911894
5314                         and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) )
5315     GROUP BY fs1.line_id,
5316         fs1.primary_item_id,
5317         --fs1.schedule_group_id,
5318 	trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),--bug 3827600
5319         --floor(fs1.scheduled_completion_date-p_from_start_date),  --fix bug#3170105
5320         fs1.organization_id;
5321   END IF;
5322 
5323 EXCEPTION
5324 
5325   WHEN NO_DATA_FOUND THEN
5326 
5327     NULL;
5328 
5329   WHEN OTHERS THEN
5330     ROLLBACK;
5331     RETCODE := G_ERROR;
5332     FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
5333     ERRBUF := FND_MESSAGE.get;
5334     l_log_message := FND_MESSAGE.get;
5335     MRP_UTIL.MRP_LOG(l_log_message);
5336     l_log_message := 'Problem with initialize_report procedure';
5337     MRP_UTIL.MRP_LOG(l_log_message);
5338     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
5339 
5340 END initialize_report_WOD;
5341 
5342 PROCEDURE initialize_report_WD(p_query_id OUT NOCOPY NUMBER
5343   ,p_from_start_date IN DATE, p_from_end_date IN DATE
5344   ,p_to_start_date IN DATE, p_to_end_date IN DATE) IS  --fix bug#3170105
5345 
5346 BEGIN
5347 
5348     SELECT mrp_form_query_s.nextval
5349     INTO p_query_id
5350     FROM DUAL;
5351 
5352   IF (p_from_category IS NOT NULL OR p_to_category IS NOT NULL)
5353      AND p_category_set_id IS NOT NULL THEN
5354 
5355 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5356     INSERT INTO mrp_form_query
5357         (query_id,
5358         last_update_date,
5359         last_updated_by,
5360         creation_date,
5361         created_by,
5362         number1,
5363         number2,
5364         number3,
5365         date1,
5366         number4,
5367         number5,
5368         date2,
5369         number6,
5370         number7,
5371         number10,
5372         number11)
5373     SELECT p_query_id,
5374         sysdate,
5375         1,
5376         sysdate,
5377         1,
5378         fs1.line_id,
5379         fs1.primary_item_id,
5380         fs1.schedule_group_id,
5381         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5382         fs1.planned_quantity,
5383         fs1.quantity_completed,
5384         flm_timezone.server_to_client(p_to_start_date),  --fix bug#3170105
5385         NULL,
5386         0,
5387         fs1.organization_id,
5388         NVL(fs1.build_sequence,0)
5389     FROM wip_lines wl,
5390         mtl_system_items_kfv kfv,
5391         mtl_categories_kfv cat,
5392         mtl_item_categories mic,
5393         wip_flow_schedules fs1
5394     WHERE wl.line_id = fs1.line_id
5395     AND wl.organization_id = fs1.organization_id
5396     AND wl.line_code
5397         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5398     AND kfv.inventory_item_id = fs1.primary_item_id
5399     AND (nvl(fs1.planned_quantity,0) - nvl(fs1.quantity_completed,0)) > 0
5400     AND nvl(fs1.status,0) = 1
5401     AND kfv.organization_id = fs1.organization_id
5402     AND kfv.concatenated_segments
5403         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5404         NVL(p_to_item,kfv.concatenated_segments)
5405     AND mic.inventory_item_id = fs1.primary_item_id
5406     AND mic.organization_id = fs1.organization_id
5407     AND mic.category_set_id = p_category_set_id
5408     AND cat.category_id = mic.category_id
5409     AND cat.concatenated_segments BETWEEN
5410         NVL(p_from_category,cat.concatenated_segments)
5411         AND NVL(p_to_category,cat.concatenated_segments)
5412     AND fs1.scheduled_completion_date  --fix bug#3170105
5413         BETWEEN p_from_start_date AND
5414                 p_from_end_date+1-1/(24*60*60)
5415     AND fs1.organization_id = p_organization_id
5416     AND not exists ( select 1 from mtl_transactions_interface
5417                       where transaction_source_id = fs1.wip_entity_id
5418                         and organization_id = fs1.organization_id
5419                         and transaction_source_type_id = 5  -- perf bug 4911894
5420                         and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) );
5421 
5422   ELSIF  p_category_set_id IS NOT NULL THEN
5423 
5424 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5425     INSERT INTO mrp_form_query
5426         (query_id,
5427         last_update_date,
5428         last_updated_by,
5429         creation_date,
5430         created_by,
5431         number1,
5432         number2,
5433         number3,
5434         date1,
5435         number4,
5436         number5,
5437         date2,
5438         number6,
5439         number7,
5440         number10,
5441         number11)
5442     SELECT p_query_id,
5443         sysdate,
5444         1,
5445         sysdate,
5446         1,
5447         fs1.line_id,
5448         fs1.primary_item_id,
5449         fs1.schedule_group_id,
5450         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5451         fs1.planned_quantity,
5452         fs1.quantity_completed,
5453         flm_timezone.server_to_client(p_to_start_date),  --fix bug#3170105
5454         NULL,
5455         0,
5456         fs1.organization_id,
5457         NVL(fs1.build_sequence,0)
5458     FROM wip_lines wl,
5459         mtl_system_items_kfv kfv,
5460         mtl_item_categories mic,
5461         wip_flow_schedules fs1
5462     WHERE wl.line_id = fs1.line_id
5463     AND wl.organization_id = fs1.organization_id
5464     AND wl.line_code
5465         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5466     AND kfv.inventory_item_id = fs1.primary_item_id
5467     AND (nvl(fs1.planned_quantity,0) - nvl(fs1.quantity_completed,0)) > 0
5468     AND nvl(fs1.status,0) = 1
5469     AND kfv.organization_id = fs1.organization_id
5470     AND kfv.concatenated_segments
5471         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5472         NVL(p_to_item,kfv.concatenated_segments)
5473     AND mic.inventory_item_id = fs1.primary_item_id
5474     AND mic.organization_id = fs1.organization_id
5475     AND mic.category_set_id = p_category_set_id
5476     AND fs1.scheduled_completion_date  --fix bug#3170105
5477         BETWEEN p_from_start_date AND
5478                 p_from_end_date+1-1/(24*60*60)
5479     AND fs1.organization_id = p_organization_id
5480     AND not exists ( select 1 from mtl_transactions_interface
5481                       where transaction_source_id = fs1.wip_entity_id
5482                         and organization_id = fs1.organization_id
5483                         and transaction_source_type_id = 5
5484                         and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) );
5485 
5486   ELSE
5487 
5488 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5489     INSERT INTO mrp_form_query
5490         (query_id,
5491         last_update_date,
5492         last_updated_by,
5493         creation_date,
5494         created_by,
5495         number1,
5496         number2,
5497         number3,
5498         date1,
5499         number4,
5500         number5,
5501         date2,
5502         number6,
5503         number7,
5504         number10,
5505         number11)
5506     SELECT p_query_id,
5507         sysdate,
5508         1,
5509         sysdate,
5510         1,
5511         fs1.line_id,
5512         fs1.primary_item_id,
5513         fs1.schedule_group_id,
5514         trunc(flm_timezone.server_to_client(fs1.scheduled_completion_date)),  --fix bug#3170105
5515         fs1.planned_quantity,
5516         fs1.quantity_completed,
5517         flm_timezone.server_to_client(p_to_start_date),  --fix bug#3170105
5518         NULL,
5519         0,
5520         fs1.organization_id,
5521         NVL(fs1.build_sequence,0)
5522     FROM wip_lines wl,
5523         mtl_system_items_kfv kfv,
5524         wip_flow_schedules fs1
5525     WHERE wl.line_id = fs1.line_id
5526     AND wl.organization_id = fs1.organization_id
5527     AND wl.line_code
5528         BETWEEN NVL(p_from_line,wl.line_code) AND NVL(p_to_line,wl.line_code)
5529     AND kfv.inventory_item_id = fs1.primary_item_id
5530     AND (nvl(fs1.planned_quantity,0) - nvl(fs1.quantity_completed,0)) > 0
5531     AND nvl(fs1.status,0) = 1
5532     AND kfv.organization_id = fs1.organization_id
5533     AND kfv.concatenated_segments
5534         BETWEEN NVL(p_from_item,kfv.concatenated_segments) AND
5535         NVL(p_to_item,kfv.concatenated_segments)
5536     AND fs1.scheduled_completion_date  --fix bug#3170105
5537         BETWEEN p_from_start_date AND
5538                 p_from_end_date+1-1/(24*60*60)
5539     AND fs1.organization_id = p_organization_id
5540     AND not exists ( select 1 from mtl_transactions_interface
5541                       where transaction_source_id = fs1.wip_entity_id
5542                         and organization_id = fs1.organization_id
5543                         and transaction_source_type_id = 5
5544                         and transaction_action_id in (1, 27, 30, 31, 32, 33,34) );
5545   END IF;
5546 
5547 EXCEPTION
5548 
5549   WHEN NO_DATA_FOUND THEN
5550 
5551     NULL;
5552 
5553   WHEN OTHERS THEN
5554     ROLLBACK;
5555     RETCODE := G_ERROR;
5556     FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
5557     ERRBUF := FND_MESSAGE.get;
5558     l_log_message := FND_MESSAGE.get;
5559     MRP_UTIL.MRP_LOG(l_log_message);
5560     l_log_message := 'Problem with initialize_report procedure';
5561     MRP_UTIL.MRP_LOG(l_log_message);
5562     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
5563 
5564 END initialize_report_WD;
5565 
5566 PROCEDURE report_update_WD(p_query_id IN NUMBER,
5567 			p_line_id IN NUMBER,
5568 			p_item_id IN NUMBER,
5569                         p_schedule_group_id IN NUMBER,
5570 			p_completion_date IN DATE,
5571 			p_build_sequence IN NUMBER,
5572 			p_quantity IN NUMBER,
5573                         p_from_start_date IN DATE,
5574                         p_from_end_date IN DATE,
5575                         p_to_start_date IN DATE,
5576                         p_to_end_date IN DATE) IS  --fix bug#3170105
5577 
5578     l_rowid             VARCHAR2(80);
5579     l_to_upd_qty        NUMBER := 0;
5580 
5581     CURSOR C1 IS
5582     SELECT rowid
5583     FROM mrp_form_query
5584     WHERE query_id = p_query_id
5585     AND number1 = p_line_id
5586     AND number2 = p_item_id
5587     AND NVL(number3,-1) = NVL(p_schedule_group_id,-1)
5588     AND trunc(date2) = trunc(flm_timezone.server_to_client(p_completion_date))  --fix bug#3170105
5589     AND NVL(number11,0) = NVL(p_build_sequence,0);
5590     --mrp form query dates are in client timezone
5591 
5592     CURSOR C2 IS
5593     SELECT planned_quantity
5594     FROM wip_flow_schedules
5595     WHERE   line_id = p_line_id
5596     AND primary_item_id = p_item_id
5597     AND     organization_id = p_organization_id
5598     AND     nvl(schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
5599     AND NVL(build_sequence,0) = NVL(p_build_sequence,0)
5600     AND scheduled_completion_date between flm_timezone.client00_in_server(p_completion_date)
5601     AND flm_timezone.client00_in_server(p_completion_date)+1-1/(24*60*60);  --fix bug#3170105
5602 
5603 BEGIN
5604 
5605     OPEN C1;
5606     FETCH C1 INTO l_rowid;
5607 
5608     IF C1%NOTFOUND THEN
5609 
5610 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5611         INSERT INTO mrp_form_query
5612                 (query_id,
5613                 last_update_date,
5614                 last_updated_by,
5615                 creation_date,
5616                 created_by,
5617                 number1,
5618                 number2,
5619                 number3,
5620                 date1,
5621                 number4,
5622                 number5,
5623                 date2,
5624                 number6,
5625                 number7,
5626                 number10,
5627                 number11)
5628         SELECT
5629                 p_query_id,
5630                 sysdate,
5631                 1,
5632                 sysdate,
5633                 1,
5634                 p_line_id,
5635                 p_item_id,
5636                 p_schedule_group_id,
5637                 flm_timezone.server_to_client(p_completion_date)
5638                 -floor(p_to_start_date-p_from_start_date),  --fix bug#3170105
5639                 0,
5640                 0,
5641                 flm_timezone.server_to_client(p_completion_date),  --fix bug#3170105
5642                 0,
5643                 p_quantity,
5644                 p_organization_id,
5645                 NVL(p_build_sequence,0)
5646         FROM    wip_flow_schedules fs
5647         WHERE   fs.line_id = p_line_id
5648         AND     fs.primary_item_id = p_item_id
5649         AND     fs.organization_id = p_organization_id
5650         AND     nvl(fs.schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
5651         AND     scheduled_completion_date
5652         BETWEEN flm_timezone.client00_in_server(p_completion_date)
5653             AND flm_timezone.client00_in_server(p_completion_date)+1-1/(24*60*60)  --fix bug#3170105
5654         AND     not exists ( select 1 from mtl_transactions_interface
5655                               where transaction_source_id = fs.wip_entity_id
5656                                 and organization_id = fs.organization_id
5657                                 and transaction_source_type_id = 5
5658                                 and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) );
5659 
5660     ELSE
5661 
5662         OPEN C2;
5663         FETCH C2 INTO l_to_upd_qty;
5664         CLOSE C2;
5665 
5666         UPDATE mrp_form_query
5667         SET number6 = decode(number6,NULL,nvl(l_to_upd_qty,0),number6),
5668         number7 = decode(nvl(number7,0),0,nvl(l_to_upd_qty,0),number7) +
5669         p_quantity
5670         WHERE rowid = l_rowid;
5671 
5672     END IF;
5673     CLOSE C1;
5674 
5675 EXCEPTION
5676 
5677     WHEN NO_DATA_FOUND THEN
5678         NULL;
5679     WHEN OTHERS THEN
5680         ROLLBACK;
5681         RETCODE := G_ERROR;
5682         FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
5683         ERRBUF := FND_MESSAGE.get;
5684         l_log_message := FND_MESSAGE.get;
5685         MRP_UTIL.MRP_LOG(l_log_message);
5686         l_log_message := 'Problem in report_update_WD procedure';
5687         MRP_UTIL.MRP_LOG(l_log_message);
5688         l_log_message := 'Unexpected SQL Error: '||sqlerrm;
5689         MRP_UTIL.MRP_LOG(l_log_message);
5690 END report_update_WD;
5691 
5692 PROCEDURE report_update_WOD(p_query_id IN NUMBER,
5693 			p_line_id IN NUMBER,
5694 			p_item_id IN NUMBER,
5695                         p_schedule_group_id IN NUMBER,
5696 			p_completion_date IN DATE,
5697 			p_quantity IN NUMBER,
5698                         p_from_start_date IN DATE,
5699                         p_from_end_date IN DATE,
5700                         p_to_start_date IN DATE,
5701                         p_to_end_date IN DATE) IS  --fix bug#3170105
5702 
5703     l_rowid		VARCHAR2(80);
5704     l_to_upd_qty        NUMBER := 0;
5705 
5706     CURSOR C1 IS
5707     SELECT rowid
5708     FROM mrp_form_query
5709     WHERE query_id = p_query_id
5710     AND number1 = p_line_id
5711     AND number2 = p_item_id
5712 --2    AND NVL(number3,-1) = NVL(p_schedule_group_id,-1)
5713     AND trunc(date2) = trunc(flm_timezone.server_to_client(p_completion_date));  --fix bug#3170105
5714 
5715     CURSOR C2 IS
5716     SELECT sum(planned_quantity)
5717     FROM wip_flow_schedules
5718     WHERE   line_id = p_line_id
5719     AND	primary_item_id = p_item_id
5720     AND     organization_id = p_organization_id
5721 --3    AND     nvl(schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
5722     AND scheduled_completion_date between flm_timezone.client00_in_server(p_completion_date)
5723     AND flm_timezone.client00_in_server(p_completion_date)+1-1/(24*60*60);  --fix bug#3170105
5724 
5725 BEGIN
5726 
5727     OPEN C1;
5728     FETCH C1 INTO l_rowid;
5729 
5730     IF C1%NOTFOUND THEN
5731 
5732 /* Bug 2998385: Added not exists from MTL_TRANSACTIONS_INTERFACE */
5733         INSERT INTO mrp_form_query
5734        		(query_id,
5735 		last_update_date,
5736 		last_updated_by,
5737 		creation_date,
5738 		created_by,
5739 		number1,
5740 		number2,
5741 		number3,
5742 		date1,
5743 		number4,
5744 		number5,
5745 		date2,
5746 		number6,
5747 		number7,
5748                 number10)
5749         SELECT
5750 		p_query_id,
5751 		sysdate,
5752 		1,
5753 		sysdate,
5754 		1,
5755 		p_line_id,
5756 		p_item_id,
5757 		null,
5758 		--p_schedule_group_id,
5759                 flm_timezone.server_to_client(p_completion_date)
5760                 -floor(p_to_start_date-p_from_start_date),  --fix bug#3170105
5761 		0,
5762 		0,
5763                 flm_timezone.server_to_client(p_completion_date),  --fix bug#3170105
5764 		nvl(sum(planned_quantity),0),
5765 		nvl(sum(planned_quantity),0) + p_quantity,
5766                 p_organization_id
5767         FROM    wip_flow_schedules fs
5768         WHERE   fs.line_id = p_line_id
5769 	AND	fs.primary_item_id = p_item_id
5770         AND     fs.organization_id = p_organization_id
5771 --4        AND     nvl(fs.schedule_group_id,-1) = nvl(p_schedule_group_id,-1)
5772         AND     scheduled_completion_date
5773         BETWEEN flm_timezone.client00_in_server(p_completion_date)
5774             AND flm_timezone.client00_in_server(p_completion_date)+1-1/(24*60*60)  --fix bug#317010
5775         AND     not exists ( select 1 from mtl_transactions_interface
5776                               where transaction_source_id = fs.wip_entity_id
5777                                 and organization_id = fs.organization_id
5778                                 and transaction_source_type_id = 5
5779                                 and transaction_action_id in (1, 27, 30, 31, 32, 33, 34) );
5780 
5781     ELSE
5782 
5783         OPEN C2;
5784         FETCH C2 INTO l_to_upd_qty;
5785         CLOSE C2;
5786 
5787         UPDATE mrp_form_query
5788         SET number6 = decode(number6,NULL,nvl(l_to_upd_qty,0),number6),
5789 	    number7 =
5790             decode(nvl(number7,0),0,nvl(l_to_upd_qty,0),number7) + p_quantity
5791         WHERE rowid = l_rowid;
5792 
5793     END IF;
5794 
5795     CLOSE C1;
5796 
5797 EXCEPTION
5798 
5799     WHEN NO_DATA_FOUND THEN
5800 
5801         NULL;
5802 
5803     WHEN OTHERS THEN
5804 
5805         ROLLBACK;
5806         RETCODE := G_ERROR;
5807         FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
5808         ERRBUF := FND_MESSAGE.get;
5809         l_log_message := FND_MESSAGE.get;
5810         MRP_UTIL.MRP_LOG(l_log_message);
5811         l_log_message := 'Problem in report_update_WOD procedure';
5812         MRP_UTIL.MRP_LOG(l_log_message);
5813         l_log_message := 'Unexpected SQL Error: '||sqlerrm;
5814         MRP_UTIL.MRP_LOG(l_log_message);
5815 
5816 END report_update_WOD;
5817 
5818 PROCEDURE relieve_rolled_schedules(p_wip_entity_id IN NUMBER) IS
5819 BEGIN
5820 
5821   /*-------------------------------------------------------------------+
5822    | This procedure performs MPS relief to relieve flow schedules that |
5823    | were over-completed and rolled forward.                           |
5824    |                                                                   |
5825    | This is done because when the flow schedule is rolled forward     |
5826    | a new flow schedule quantity is created.  In order not to double  |
5827    | count the relief, we need to relieve the old quantity.            |
5828    +-------------------------------------------------------------------*/
5829 
5830       INSERT INTO mrp_relief_interface
5831                     (inventory_item_id,         -- NN
5832                      organization_id,           -- NN
5833                      last_update_date,          -- NN  sysdate
5834                      last_updated_by,           -- NN  :new.last_updated_by
5835                      creation_date,             -- NN  sysdate
5836                      created_by,                -- NN  :new.created_by
5837                      last_update_login,         --  N   -1
5838                      new_order_quantity,        -- NN
5839                      old_order_quantity,        --  N
5840                      new_order_date,            -- NN
5841                      old_order_date,            --  N
5842                      disposition_id,            -- NN  :new.wip_entity_id
5843                      planned_order_id,          --  N
5844                      relief_type,               -- NN  2
5845                      disposition_type,          -- NN  9
5846                      demand_class,              --  N
5847                      old_demand_class,          --  N
5848                      line_num,                  --  N  null
5849                      request_id,                --  N  null
5850                      program_application_id,    --  N  null
5851                      program_id,                --  N  null
5852                      program_update_date,       --  N  null
5853                      process_status,            -- NN  2
5854                      source_code,               --  N  'WIP'
5855                      source_line_id,            --  N  null
5856                      error_message,             --  N  null
5857                      transaction_id,            -- NN
5858                      project_id,
5859                      old_project_id,
5860                      task_id,
5861                      old_task_id
5862                     )
5863     SELECT primary_item_id,
5864                 organization_id,
5865                 sysdate,
5866                 1,
5867                 sysdate,
5868                 1,
5869                 -1,
5870                 greatest(planned_quantity, quantity_completed)
5871                         - (planned_quantity - quantity_completed),
5872                 greatest(planned_quantity, quantity_completed),
5873                 scheduled_completion_date,
5874                 scheduled_completion_date,
5875                 wip_entity_id,
5876                 DECODE(demand_source_type,100,
5877                         to_number(demand_source_line), NULL),
5878                 2,
5879                 9,
5880                 demand_class,
5881                 demand_class,
5882                 null,
5883                 null,
5884                 null,
5885                 null,
5886                 null,
5887                 2,
5888                 'WIP',
5889                 null,
5890                 null,
5891                 mrp_relief_interface_s.nextval,
5892                 project_id,
5893                 project_id,
5894                 task_id,
5895                 task_id
5896         FROM wip_flow_schedules
5897         WHERE wip_entity_id = p_wip_entity_id
5898           AND planned_quantity > quantity_completed;
5899 
5900 END relieve_rolled_schedules;
5901 
5902 BEGIN  --begin roll_flow_schedules
5903 
5904   flm_timezone.init_timezone(p_organization_id);--3827600
5905 
5906   -- Set the return code
5907   RETCODE := G_SUCCESS;
5908 
5909   --fix bug#3170105
5910   l_from_start_date := flm_timezone.client_to_server(
5911     fnd_date.canonical_to_date(p_from_start_date));
5912   l_from_end_date := flm_timezone.client_to_server(
5913     fnd_date.canonical_to_date(p_from_end_date));
5914   l_to_start_date := flm_timezone.client_to_server(
5915     fnd_date.canonical_to_date(p_to_start_date));
5916   l_to_end_date := flm_timezone.client_to_server(
5917     fnd_date.canonical_to_date(p_to_end_date));
5918   --end of fix bug#3170105
5919 
5920   --TZ BOM Calendar Bug 3832684
5921   l_to_start_time := to_char(l_to_start_date,'SSSSS');
5922   l_to_end_time := to_char(l_to_end_date,'SSSSS');
5923 
5924   -- Print the parameters
5925   FND_MESSAGE.set_name('MRP','EC_REPORT_PARAMETERS');
5926   l_log_message := FND_MESSAGE.get;
5927   MRP_UTIL.MRP_LOG(l_log_message);
5928 
5929   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5930   FND_MESSAGE.set_token('NUMBER','1');
5931   FND_MESSAGE.set_token('TOKEN','(ORGANIZATION_ID)');
5932   FND_MESSAGE.set_token('VALUE',to_char(p_organization_id));
5933   l_log_message := FND_MESSAGE.get;
5934   MRP_UTIL.MRP_LOG(l_log_message);
5935 
5936   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5937   FND_MESSAGE.set_token('NUMBER','2');
5938   FND_MESSAGE.set_token('TOKEN','(OUTPUT)');
5939   FND_MESSAGE.set_token('VALUE',to_char(p_output));
5940   l_log_message := FND_MESSAGE.get;
5941   MRP_UTIL.MRP_LOG(l_log_message);
5942 
5943   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5944   FND_MESSAGE.set_token('NUMBER','3');
5945   FND_MESSAGE.set_token('TOKEN','(FROM_START_DATE)');
5946   FND_MESSAGE.set_token('VALUE',to_char(l_from_start_date));  --fix bug#3170105
5947   l_log_message := FND_MESSAGE.get;
5948   MRP_UTIL.MRP_LOG(l_log_message);
5949 
5950   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5951   FND_MESSAGE.set_token('NUMBER','4');
5952   FND_MESSAGE.set_token('TOKEN','(FROM_END_DATE)');
5953   FND_MESSAGE.set_token('VALUE',to_char(l_from_end_date));  --fix bug#3170105
5954   l_log_message := FND_MESSAGE.get;
5955   MRP_UTIL.MRP_LOG(l_log_message);
5956 
5957   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5958   FND_MESSAGE.set_token('NUMBER','5');
5959   FND_MESSAGE.set_token('TOKEN','(TO_START_DATE)');
5960   FND_MESSAGE.set_token('VALUE',to_char(l_to_start_date));  --fix bug#3170105
5961   l_log_message := FND_MESSAGE.get;
5962   MRP_UTIL.MRP_LOG(l_log_message);
5963 
5964   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5965   FND_MESSAGE.set_token('NUMBER','6');
5966   FND_MESSAGE.set_token('TOKEN','(TO_END_DATE)');
5967   FND_MESSAGE.set_token('VALUE',to_char(l_to_end_date));  --fix bug#3170105
5968   l_log_message := FND_MESSAGE.get;
5969   MRP_UTIL.MRP_LOG(l_log_message);
5970 
5971   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5972   FND_MESSAGE.set_token('NUMBER','7');
5973   FND_MESSAGE.set_token('TOKEN','(FROM_LINE)');
5974   FND_MESSAGE.set_token('VALUE',p_from_line);
5975   l_log_message := FND_MESSAGE.get;
5976   MRP_UTIL.MRP_LOG(l_log_message);
5977 
5978   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5979   FND_MESSAGE.set_token('NUMBER','8');
5980   FND_MESSAGE.set_token('TOKEN','(TO_LINE)');
5981   FND_MESSAGE.set_token('VALUE',p_to_line);
5982   l_log_message := FND_MESSAGE.get;
5983   MRP_UTIL.MRP_LOG(l_log_message);
5984 
5985   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5986   FND_MESSAGE.set_token('NUMBER','9');
5987   FND_MESSAGE.set_token('TOKEN','(FROM_ITEM)');
5988   FND_MESSAGE.set_token('VALUE',p_from_item);
5989   l_log_message := FND_MESSAGE.get;
5990   MRP_UTIL.MRP_LOG(l_log_message);
5991 
5992   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
5993   FND_MESSAGE.set_token('NUMBER','10');
5994   FND_MESSAGE.set_token('TOKEN','(TO_ITEM)');
5995   FND_MESSAGE.set_token('VALUE',p_to_item);
5996   l_log_message := FND_MESSAGE.get;
5997   MRP_UTIL.MRP_LOG(l_log_message);
5998 
5999   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
6000   FND_MESSAGE.set_token('NUMBER','11');
6001   FND_MESSAGE.set_token('TOKEN','(CATEGORY_SET_ID)');
6002   FND_MESSAGE.set_token('VALUE',to_char(p_category_set_id));
6003   l_log_message := FND_MESSAGE.get;
6004   MRP_UTIL.MRP_LOG(l_log_message);
6005 
6006   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
6007   FND_MESSAGE.set_token('NUMBER','12');
6008   FND_MESSAGE.set_token('TOKEN','(CATEGORY_STRUCTURE_ID)');
6009   FND_MESSAGE.set_token('VALUE',to_char(p_category_structure_id));
6010   l_log_message := FND_MESSAGE.get;
6011   MRP_UTIL.MRP_LOG(l_log_message);
6012 
6013   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
6014   FND_MESSAGE.set_token('NUMBER','13');
6015   FND_MESSAGE.set_token('TOKEN','(FROM_CATEGORY)');
6016   FND_MESSAGE.set_token('VALUE',p_from_category);
6017   l_log_message := FND_MESSAGE.get;
6018   MRP_UTIL.MRP_LOG(l_log_message);
6019 
6020   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
6021   FND_MESSAGE.set_token('NUMBER','14');
6022   FND_MESSAGE.set_token('TOKEN','(TO_CATEGORY)');
6023   FND_MESSAGE.set_token('VALUE',p_to_category);
6024   l_log_message := FND_MESSAGE.get;
6025   MRP_UTIL.MRP_LOG(l_log_message);
6026 
6027   FND_MESSAGE.set_name('MRP','MRCONC-ARGS INFO');
6028   FND_MESSAGE.set_token('NUMBER','15');
6029   FND_MESSAGE.set_token('TOKEN','(SPREAD_QTY)');
6030   FND_MESSAGE.set_token('VALUE',to_char(p_spread_qty));
6031   l_log_message := FND_MESSAGE.get;
6032   MRP_UTIL.MRP_LOG(l_log_message);
6033 
6034   -- Check for mandatory parameters and issue an error message
6035   -- if NULL.  If line, item or category are null, assume all.
6036   IF p_organization_id IS NULL THEN
6037     FND_MESSAGE.set_name('MRP','MRP_ORG_ID_REQUIRED');
6038     l_log_message := FND_MESSAGE.get;
6039     MRP_UTIL.MRP_LOG(l_log_message);
6040     RAISE expected_error;
6041   END IF;
6042   IF (p_from_start_date IS NULL OR p_to_start_date IS NULL) AND
6043      (p_spread_qty <> 3)  THEN
6044     FND_MESSAGE.set_name('MRP','MRP_START_DATE_REQUIRED');
6045     l_log_message := FND_MESSAGE.get;
6046     MRP_UTIL.MRP_LOG(l_log_message);
6047     RAISE expected_error;
6048   END IF;
6049   IF p_from_end_date IS NULL AND (p_spread_qty <> 3)  THEN
6050     FND_MESSAGE.set_name('MRP','MRP_END_DATE_REQUIRED');
6051     l_log_message := FND_MESSAGE.get;
6052     MRP_UTIL.MRP_LOG(l_log_message);
6053     RAISE expected_error;
6054   END IF;
6055 
6056   IF p_to_end_date IS NULL AND (p_spread_qty = 1)  THEN
6057     FND_MESSAGE.set_name('MRP','MRP_END_DATE_REQUIRED');
6058     l_log_message := FND_MESSAGE.get;
6059     MRP_UTIL.MRP_LOG(l_log_message);
6060     RAISE expected_error;
6061   END IF;
6062 
6063   -- If either the from_end_date or the to_end_date are non-workdays
6064   -- then return the next work day and log a message.
6065 
6066   IF p_spread_qty <> 3 THEN
6067     -- Bug 2213859 no work day conversion required for FROM DATE ranges
6068     --fix bug#3170105 l_from_end_date := to_date(p_from_end_date, 'YYYY/MM/DD');
6069     null;
6070     /************** Commented - Bug 2213859 *********************
6071       l_from_end_date := mrp_calendar.next_work_day(p_organization_id,
6072         	1, to_date(p_from_end_date, 'YYYY/MM/DD'));
6073       IF to_date(p_from_end_date, 'YYYY/MM/DD') <> l_from_end_date THEN
6074         FND_MESSAGE.set_name('MRP','MRP_FROM_DATE_CHANGED');
6075         FND_MESSAGE.set_token('ORIG_DATE',p_from_end_date);
6076         FND_MESSAGE.set_token('NEW_DATE',l_from_end_date);
6077         l_log_message := FND_MESSAGE.get;
6078         MRP_UTIL.MRP_LOG(l_log_message);
6079       END IF;
6080     ******************** Comment ends ***********************/
6081   END IF;
6082 
6083   --fix bug#3170105
6084   IF p_spread_qty <> 3 THEN
6085     l_temp_date := mrp_calendar.next_work_day(p_organization_id,
6086         1, flm_timezone.server_to_calendar(l_to_start_date));
6087     --TZ BOM Calendar bug 3832684
6088     l_temp_date := flm_timezone.calendar_to_server(l_temp_date,l_to_start_time);
6089 
6090     /**
6091     Bug 2213859 - l_to_start_date is compared with to_date(p_to_start_date, 'YYYY/MM/DD')
6092     instead of l_to_end_date
6093     **/
6094     IF flm_timezone.server_to_calendar(l_temp_date) <> flm_timezone.server_to_calendar(l_to_start_date) AND
6095       (p_spread_qty = 2 ) THEN
6096       FND_MESSAGE.set_name('MRP','MRP_TO_DATE_CHANGED');
6097       FND_MESSAGE.set_token('ORIG_DATE',to_char(l_to_start_date));
6098       FND_MESSAGE.set_token('NEW_DATE',to_char(l_temp_date));
6099       l_log_message := FND_MESSAGE.get;
6100       MRP_UTIL.MRP_LOG(l_log_message);
6101     END IF;
6102 
6103     --bug 3832684: need it also for Spread Evenly wo Details
6104     l_to_start_date := l_temp_date;
6105 
6106   END IF;
6107   --end of fix bug#3170105
6108 
6109 /*******************************************************************************
6110    Bug 2213859 - l_to_end_date is calculated for both p_spread_qty = 1 and 2
6111    If p_to_end_date is NULL (possible for p_spread_qty = 2),
6112    then default with l_to_start_date calculated above
6113 ********************************************************************************/
6114 
6115   IF p_spread_qty <> 3 THEN
6116     IF p_to_end_date is NULL THEN
6117       l_to_end_date := l_to_start_date;
6118     ELSE
6119       --fix bug#3170105
6120       l_temp_date := mrp_calendar.next_work_day(p_organization_id,
6121         	1, flm_timezone.server_to_calendar(l_to_end_date));
6122       --TZ BOM Calendar bug 3832684
6123       l_temp_date := flm_timezone.calendar_to_server(l_temp_date,l_to_end_time);
6124 
6125       IF flm_timezone.server_to_calendar(l_temp_date) <> flm_timezone.server_to_calendar(l_to_end_date) THEN
6126         FND_MESSAGE.set_name('MRP','MRP_TO_DATE_CHANGED');
6127         FND_MESSAGE.set_token('ORIG_DATE',l_to_end_date);
6128         FND_MESSAGE.set_token('NEW_DATE',l_temp_date);
6129         l_log_message := FND_MESSAGE.get;
6130         l_to_end_date := l_temp_date;
6131         MRP_UTIL.MRP_LOG(l_log_message);
6132       END IF;
6133     --end of fix bug#3170105
6134 
6135       --bug 3832684: need it also for Spread Evenly wo Details
6136       l_to_end_date := l_temp_date;
6137 
6138     END IF;
6139   END IF;
6140 
6141   /**** Bug 2213859 - Code is moved up before to_end_date validation
6142   IF p_spread_qty <> 3 THEN
6143   l_to_start_date := mrp_calendar.next_work_day(p_organization_id,
6144 	1, to_date(p_to_start_date, 'YYYY/MM/DD'));
6145   IF to_date(p_to_start_date, 'YYYY/MM/DD') <> l_to_end_date AND
6146     (p_spread_qty = 2 ) THEN
6147     FND_MESSAGE.set_name('MRP','MRP_TO_DATE_CHANGED');
6148     FND_MESSAGE.set_token('ORIG_DATE',p_to_start_date);
6149     FND_MESSAGE.set_token('NEW_DATE',l_to_start_date);
6150     l_log_message := FND_MESSAGE.get;
6151     MRP_UTIL.MRP_LOG(l_log_message);
6152   END IF;
6153   END IF;
6154   ****************************************************************************/
6155 
6156   FND_MESSAGE.set_name('MRP','EC_DATE');
6157   l_trans_var1 := FND_MESSAGE.get;
6158   SELECT to_char(sysdate)
6159   INTO l_trans_var2
6160   FROM dual;
6161   l_out_message := l_trans_var1 || ':  ' || l_trans_var2;
6162   MRP_UTIL.MRP_OUT(l_out_message);
6163 
6164   FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_REPORT');
6165   l_out_message := FND_MESSAGE.get;
6166   MRP_UTIL.MRP_OUT('                                '||l_out_message);
6167 
6168   /*-----------------------------------------------------+
6169    | Do setup for report by inserting existing records   |
6170    | into mrp_form_query                                 |
6171    +-----------------------------------------------------*/
6172 
6173   /* this part of code is moved from the buttom of the procedure to here,
6174      because after the schedules got rolled, there would be no flow schedules
6175      to be queried to insert into mrp_relief_interface */
6176   IF p_output = 2 THEN
6177     l_cursor := Create_Relieve_Cursor(l_from_start_date,l_from_end_date);  --fix bug#317105
6178 
6179     IF l_cursor IS NULL THEN
6180       RAISE unexpected_error;
6181     END IF;
6182 
6183     LOOP
6184       l_rows := dbms_sql.fetch_rows(l_cursor);
6185       IF l_rows = 0 THEN
6186         EXIT;
6187       END IF;
6188       IF l_rows > 0 THEN
6189         dbms_sql.column_value(l_cursor, 1, l_wip_entity_id2);
6190       END IF;
6191       Relieve_Rolled_Schedules(l_wip_entity_id2);
6192     END LOOP;
6193   END IF;
6194 
6195   /*-----------------------------------------------------+
6196    | If spread quantities then distribute evenly over to |
6197    | timeframe  without details                          |
6198    +-----------------------------------------------------*/
6199   IF p_spread_qty = 1 THEN
6200     initialize_report_WOD(l_report_query_id,l_from_start_date,l_from_end_date,
6201                           l_to_start_date,l_to_end_date);  --fix bug#3170105
6202 
6203     l_cursor := Create_Cursor_WOD(l_from_start_date,l_from_end_date);  --fix bug#3170105
6204     IF l_cursor IS NULL THEN
6205       RAISE unexpected_error;
6206     END IF;
6207 
6208     LOOP
6209       l_rows := dbms_sql.fetch_rows(l_cursor);
6210       IF l_rows = 0 THEN
6211         EXIT;
6212       END IF;
6213       IF l_rows > 0 THEN
6214         dbms_sql.column_value(l_cursor, 1, fs_report_rec.line_id);
6215         dbms_sql.column_value(l_cursor, 2, fs_report_rec.line_code);
6216         dbms_sql.column_value(l_cursor, 3, fs_report_rec.primary_item_id);
6217         dbms_sql.column_value(l_cursor, 4, fs_report_rec.item);
6218         dbms_sql.column_value(l_cursor, 5, fs_report_rec.schedule_group_id);
6219         dbms_sql.column_value(l_cursor, 6, fs_report_rec.planned_quantity);
6220         dbms_sql.column_value(l_cursor, 7, fs_report_rec.quantity_completed);
6221       END IF;
6222 
6223       -- If there is a variance, then process record
6224       IF (fs_report_rec.planned_quantity
6225 	- fs_report_rec.quantity_completed) <> 0
6226       THEN
6227 
6228         l_variance := fs_report_rec.planned_quantity
6229 				- fs_report_rec.quantity_completed;
6230 
6231         OPEN C4(fs_report_rec.line_id, fs_report_rec.primary_item_id,
6232                 l_to_start_date, l_to_end_date);  --fix bug#3170105
6233 
6234         -- Get the rowcount and remainder
6235         FETCH C4 INTO l_row_count;
6236         IF l_row_count = 0 THEN
6237           EXIT;
6238         END IF;
6239 
6240         IF l_variance < 0 THEN
6241           l_daily_variance := ceil(l_variance/l_row_count);
6242         ELSE
6243           l_daily_variance := floor(l_variance/l_row_count);
6244         END IF;
6245         l_remainder := abs(mod(l_variance,l_row_count));
6246 
6247         CLOSE C4;
6248 
6249         l_old_completion_date := FND_API.G_MISS_DATE;
6250         OPEN C3(fs_report_rec.line_id, fs_report_rec.primary_item_id,
6251                 l_to_start_date, l_to_end_date);  --fix bug#3170105
6252 
6253         LOOP
6254           FETCH C3 INTO l_wip_entity_id, l_completion_date, l_planned_quantity,
6255           l_quantity_completed;
6256           EXIT WHEN C3%NOTFOUND;
6257 
6258           /*--------------------------------------------------------------+
6259            | We can have more than one schedule on a given date           |
6260            | The cursor is sorted descending so we get the last schedule  |
6261            | of the day.  If the day was already processed, we don't      |
6262            | enter the if unless the variance was negative and the        |
6263            | first schedule didn't have enough quantity to handle it.     |
6264            +--------------------------------------------------------------*/
6265           IF (l_completion_date <> l_old_completion_date) OR
6266 		(l_update_variance <> 0) THEN
6267             /*-------------------------------------------------------+
6268              | Add one to each until there is no remainder left.     |
6269              | l_update_variance will equal zero unless variance was |
6270              | negative and there is still some left after reducing  |
6271              | the last schedule                                     |
6272              | If the schedule is still on the same date, we want to |
6273              | carry over the variance that is left over from the    |
6274              | previous schedules (which is still on the same day).  |
6275              +-------------------------------------------------------*/
6276 
6277 
6278             IF l_completion_date <> l_old_completion_date THEN
6279               IF l_remainder > 0 THEN
6280                 IF l_variance < 0 THEN
6281                   l_update_variance := l_update_variance + l_daily_variance - 1;
6282                 ELSE
6283                   l_update_variance := l_update_variance + l_daily_variance + 1;
6284                 END IF;
6285                 l_remainder := l_remainder - 1;
6286               ELSE
6287                 l_update_variance := l_update_variance + l_daily_variance;
6288               END IF;
6289             END IF;
6290 
6291             /*-------------------------------------------------------+
6292              | If the variance is greater than zero, always create   |
6293              | a new schedule (call private procedure)               |
6294              +-------------------------------------------------------*/
6295 
6296             IF l_update_variance > 0 THEN
6297               l_flow_schedule_rec.operation := MRP_GLOBALS.G_OPR_CREATE;
6298               l_flow_schedule_rec.organization_id
6299 			:= p_organization_id;
6300               l_flow_schedule_rec.schedule_group_id
6301 			:= fs_report_rec.schedule_group_id;
6302               l_flow_schedule_rec.primary_item_id
6303 			:= fs_report_rec.primary_item_id;
6304               l_flow_schedule_rec.line_id
6305 			:= fs_report_rec.line_id;
6306               l_flow_schedule_rec.planned_quantity := l_update_variance;
6307               l_flow_schedule_rec.scheduled_completion_date
6308 			:= Time_Schedule(fs_report_rec.line_id,
6309                                          l_completion_date,l_update_variance);
6310 
6311               l_flow_schedule_rec.roll_forwarded_flag :=
6312               G_INTERMEDIATE_ROLL_FORWARDED;
6313               l_flow_schedule_rec.status := 1;
6314 
6315 
6316               -- Call procedure to update mrp_form_query for the report
6317               report_update_WOD(l_report_query_id,
6318 				fs_report_rec.line_id,
6319 				fs_report_rec.primary_item_id,
6320                                 fs_report_rec.schedule_group_id,
6321 				l_completion_date,
6322 				l_update_variance,
6323                                 l_from_start_date,
6324                                 l_from_end_date,
6325                                 l_to_start_date,
6326                                 l_to_end_date);
6327 
6328               MRP_Flow_Schedule_PVT.Process_Flow_Schedule
6329           	  ( 	p_api_version_number		=> 1.0,
6330 			x_return_status			=> l_return_status,
6331 			x_msg_count			=> l_msg_count,
6332 			x_msg_data			=> l_msg_data,
6333 			p_control_rec			=> l_control_rec,
6334 			p_old_flow_schedule_rec         => l_old_flow_schedule_rec,
6335 			p_flow_schedule_rec		=> l_flow_schedule_rec,
6336 			x_flow_schedule_rec		=> l_x_flow_schedule_rec
6337 	      );
6338 
6339               IF p_output = 2 THEN
6340                 -- Write either error or success message to log
6341                 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6342                   FND_MESSAGE.set_name('MRP','MRP_ROLL_CREATE');
6343                   FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6344                   FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6345                   FND_MESSAGE.set_token('COMP_DATE',l_x_flow_schedule_rec.scheduled_completion_date);
6346 	          FND_MESSAGE.set_token('QTY',l_x_flow_schedule_rec.planned_quantity);
6347                   l_log_message := FND_MESSAGE.get;
6348                   MRP_UTIL.MRP_LOG(l_log_message);
6349                 ELSE
6350                   IF l_msg_count > 0 THEN
6351                     FOR i in 1..l_msg_count LOOP
6352                       l_log_message := fnd_msg_pub.get(i,'F');
6353                       MRP_UTIL.MRP_LOG(l_log_message);
6354                     END LOOP;
6355                   END IF;
6356                 END IF;
6357               -- End if for p_output = 2 loop (report and update)
6358               END IF;
6359               l_update_variance := 0;
6360 
6361             /*------------------------------------------------------------+
6362              | If the variance is less than zero, then there are 3 cases: |
6363              |      - schedule planned quantity = 0                       |
6364              |          - carry variance to next schedule                 |
6365              |      - schedule planned quantity > variance                |
6366              |          - reduce schedule by variance                     |
6367              |      - schedule planned quantity < variance                |
6368              |          - delete schedule and carry remainder variance    |
6369              |            to next schedule                                |
6370              +------------------------------------------------------------*/
6371 
6372             ELSIF l_update_variance < 0 THEN
6373               IF l_planned_quantity = 0 THEN
6374                 /*---------------------------------------------+
6375                  | Store variance to be handled the next day   |
6376                  | Just don't zero out l_update_variance,      |
6377                  | nothing else needs to be done               |
6378                  +---------------------------------------------*/
6379                 NULL;
6380               ELSE
6381                 IF -(l_update_variance) < (l_planned_quantity -
6382                      l_quantity_completed) THEN
6383                    -- Call procedure to update mrp_form_query for the report
6384                    report_update_WOD(l_report_query_id,
6385 				fs_report_rec.line_id,
6386 				fs_report_rec.primary_item_id,
6387                                 fs_report_rec.schedule_group_id,
6388 				l_completion_date,
6389 				l_update_variance,
6390                                 l_from_start_date,
6391                                 l_from_end_date,
6392                                 l_to_start_date,
6393                                 l_to_end_date);
6394                  /*-----------------------------+
6395                   | Update existing schedule    |
6396                   +-----------------------------*/
6397                   Update_Quantity(l_wip_entity_id,
6398 				l_update_variance);
6399                   IF p_output = 2 THEN
6400                     FND_MESSAGE.set_name('MRP','MRP_ROLL_UPDATE');
6401                     FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6402                     FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6403                     FND_MESSAGE.set_token('COMP_DATE',l_completion_date);
6404                     FND_MESSAGE.set_token('OLD_QTY',l_planned_quantity);
6405                     FND_MESSAGE.set_token('NEW_QTY',
6406 			(l_planned_quantity + l_update_variance));
6407                     l_log_message := FND_MESSAGE.get;
6408                     MRP_UTIL.MRP_LOG(l_log_message);
6409                   END IF;
6410                   l_update_variance := 0;
6411                 ELSIF -(l_update_variance) >= (l_planned_quantity -
6412                         l_quantity_completed) THEN
6413                    -- Call procedure to update mrp_form_query for the report
6414                    report_update_WOD(l_report_query_id,
6415 				fs_report_rec.line_id,
6416 				fs_report_rec.primary_item_id,
6417                                 fs_report_rec.schedule_group_id,
6418 				l_completion_date,
6419 				-(l_planned_quantity - l_quantity_completed),
6420                                 l_from_start_date,
6421                                 l_from_end_date,
6422                                 l_to_start_date,
6423                                 l_to_end_date);
6424                   IF(l_planned_quantity = (l_planned_quantity -
6425                      l_quantity_completed )) THEN
6426                   /*------------------------------------------------------+
6427                   | Delete existing schedule and save remaining update   |
6428                   | variance for next schedule                           |
6429                   +------------------------------------------------------*/
6430                      Delete_Row(l_wip_entity_id);
6431                   ELSE
6432                  /*-----------------------------+
6433                   | Update existing schedule    |
6434                   +-----------------------------*/
6435                      Update_Quantity(l_wip_entity_id,
6436                                   - (l_planned_quantity-l_quantity_completed));
6437                      IF (NOT Close_Single_Schedule_WithID(l_wip_entity_id,
6438                        p_organization_id)) THEN
6439                        RAISE unexpected_error;
6440                      END IF;
6441 
6442                   END IF;
6443                   IF p_output = 2 THEN
6444                     FND_MESSAGE.set_name('MRP','MRP_ROLL_DELETE');
6445                     FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6446                     FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6447                     FND_MESSAGE.set_token('COMP_DATE',l_completion_date);
6448                     FND_MESSAGE.set_token('QTY',l_planned_quantity);
6449                     l_log_message := FND_MESSAGE.get;
6450                     MRP_UTIL.MRP_LOG(l_log_message);
6451                   END IF;
6452                   l_update_variance := l_update_variance +
6453                   (l_planned_quantity-l_quantity_completed);
6454                 END IF;
6455               END IF;
6456             END IF;
6457           END IF;
6458           l_old_completion_date := l_completion_date;
6459         END LOOP;
6460         CLOSE C3;
6461         /*---------------------------------------------------------+
6462          | After loop completes, check to see if we still have a   |
6463          | quantity in l_update_variance (from a negative variance |
6464          | that didn't have enough quantities to delete on the     |
6465          | right days).  This is a corner case but it is possible  |
6466          | that there will be other schedules in the timeframe     |
6467          | that we can delete from so we loop again.               |
6468          | e.g. Day 1 Qty = 5                                      |
6469          |      Day 2 Qty = 5                                      |
6470          |      Day 3 Qty = 2                                      |
6471          | If the daily update variance was -3, then after the     |
6472          | first loop we have:                                     |
6473          |      Day 1 Qty = 2                                      |
6474          |      Day 2 Qty = 2                                      |
6475          |      Day 3 Qty = 0                                      |
6476          | and a remainder variance of -1.  The second loop will   |
6477          | reduce the Day 1 Qty to 1.                              |
6478          | If we still have a remainder qty after the second loop  |
6479          | then generate an error message to the log               |
6480          +---------------------------------------------------------*/
6481         IF l_update_variance < 0 THEN
6482           -- Log what's going on
6483           FND_MESSAGE.set_name('MRP','MRP_ROLL_SECOND_LOOP');
6484           l_log_message := FND_MESSAGE.get;
6485           MRP_UTIL.MRP_LOG(l_log_message);
6486 
6487           OPEN C5(fs_report_rec.line_id, fs_report_rec.primary_item_id,
6488                   l_to_start_date, l_to_end_date);  --fix bug#3170105
6489           LOOP
6490             FETCH C5 INTO l_wip_entity_id, l_completion_date,
6491 				l_planned_quantity;
6492             EXIT WHEN C5%NOTFOUND;
6493             IF -(l_update_variance) < (l_planned_quantity -
6494                      l_quantity_completed) THEN
6495               -- Call procedure to update mrp_form_query for the report
6496               report_update_WOD(l_report_query_id,
6497 				fs_report_rec.line_id,
6498 				fs_report_rec.primary_item_id,
6499                                 fs_report_rec.schedule_group_id,
6500 				l_completion_date,
6501 				l_update_variance,
6502                                 l_from_start_date,
6503                                 l_from_end_date,
6504                                 l_to_start_date,
6505                                 l_to_end_date);
6506              /*-----------------------------+
6507               | Update existing schedule    |
6508               +-----------------------------*/
6509               Update_Quantity(l_wip_entity_id,
6510 			l_update_variance);
6511 
6512               IF p_output = 2 THEN
6513                 FND_MESSAGE.set_name('MRP','MRP_ROLL_UPDATE');
6514                 FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6515                 FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6516                 FND_MESSAGE.set_token('COMP_DATE',l_completion_date);
6517                 FND_MESSAGE.set_token('OLD_QTY',l_planned_quantity);
6518                 FND_MESSAGE.set_token('NEW_QTY',
6519 			(l_planned_quantity + l_update_variance));
6520                 l_log_message := FND_MESSAGE.get;
6521               END IF;
6522               l_update_variance := 0;
6523               ELSIF -(l_update_variance) >= (l_planned_quantity -
6524                         l_quantity_completed) THEN
6525               -- Call procedure to update mrp_form_query for the report
6526               report_update_WOD(l_report_query_id,
6527 				fs_report_rec.line_id,
6528 				fs_report_rec.primary_item_id,
6529                                 fs_report_rec.schedule_group_id,
6530 				l_completion_date,
6531 				-(l_planned_quantity- l_quantity_completed),
6532                                 l_from_start_date,
6533                                 l_from_end_date,
6534                                 l_to_start_date,
6535                                 l_to_end_date);
6536 
6537               IF(l_planned_quantity = (l_planned_quantity -
6538                  l_quantity_completed )) THEN
6539               /*------------------------------------------------------+
6540               | Delete existing schedule and save remaining update   |
6541               | variance for next schedule                           |
6542               +------------------------------------------------------*/
6543                  Delete_Row(l_wip_entity_id);
6544               ELSE
6545              /*-----------------------------+
6546               | Update existing schedule    |
6547               +-----------------------------*/
6548                  Update_Quantity(l_wip_entity_id,
6549                               - (l_planned_quantity-l_quantity_completed));
6550                  IF (NOT Close_Single_Schedule_WithID(l_wip_entity_id,
6551                    p_organization_id)) THEN
6552                    RAISE unexpected_error;
6553                  END IF;
6554               END IF;
6555 
6556               IF p_output = 2 THEN
6557                 FND_MESSAGE.set_name('MRP','MRP_ROLL_DELETE');
6558                 FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6559                 FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6560                 FND_MESSAGE.set_token('COMP_DATE',l_completion_date);
6561                 FND_MESSAGE.set_token('QTY',l_planned_quantity);
6562                 l_log_message := FND_MESSAGE.get;
6563                 MRP_UTIL.MRP_LOG(l_log_message);
6564               END IF;
6565               l_update_variance := l_update_variance +
6566               (l_planned_quantity-l_quantity_completed);
6567             END IF;
6568             EXIT WHEN l_update_variance = 0;
6569           END LOOP;
6570           CLOSE C5;
6571           /*-------------------------------------------------------+
6572            | If l_update_variance is still less than zero, print a |
6573            | message to the log.                                   |
6574            +-------------------------------------------------------*/
6575            IF l_update_variance < 0 THEN
6576              FND_MESSAGE.set_name('MRP','MRP_ROLL_QTY_REMAINDER');
6577              FND_MESSAGE.set_token('QTY',l_update_variance);
6578              l_log_message := FND_MESSAGE.get;
6579              MRP_UTIL.MRP_LOG(l_log_message);
6580              RETCODE := G_WARNING;
6581              l_update_variance := 0;
6582            END IF;
6583         END IF;
6584       END IF;
6585 
6586     END LOOP;
6587   UPDATE wip_flow_schedules set roll_forwarded_flag =
6588   G_ROLL_FORWARDED
6589   where roll_forwarded_flag =
6590   G_INTERMEDIATE_ROLL_FORWARDED;
6591   ELSIF p_spread_qty = 2 THEN
6592 
6593    initialize_report_WD(l_report_query_id,l_from_start_date,l_from_end_date,
6594                         l_to_start_date,l_to_end_date);  --fix bug#3170105
6595 
6596     l_cursor := Create_Cursor_WD(l_from_start_date,l_from_end_date);  --fix bug#3170105
6597 
6598     IF l_cursor IS NULL THEN
6599       RAISE unexpected_error;
6600     END IF;
6601 
6602     LOOP
6603       l_rows := dbms_sql.fetch_rows(l_cursor);
6604       IF l_rows > 0 THEN
6605         dbms_sql.column_value(l_cursor, 1, fs_report_rec.line_id);
6606         dbms_sql.column_value(l_cursor, 2, fs_report_rec.line_code);
6607         dbms_sql.column_value(l_cursor, 3, fs_report_rec.primary_item_id);
6608         dbms_sql.column_value(l_cursor, 4, fs_report_rec.schedule_group_id);
6609         dbms_sql.column_value(l_cursor, 5, fs_report_rec.schedule_number);
6610         dbms_sql.column_value(l_cursor, 6, fs_report_rec.build_sequence);
6611         dbms_sql.column_value(l_cursor, 7, fs_report_rec.
6612         demand_source_header_id);
6613         dbms_sql.column_value(l_cursor, 8, fs_report_rec.demand_source_line);
6614         dbms_sql.column_value(l_cursor, 9, fs_report_rec.
6615         demand_source_delivery);
6616         dbms_sql.column_value(l_cursor, 10, fs_report_rec.demand_source_type);
6617         dbms_sql.column_value(l_cursor, 11, fs_report_rec.demand_class);
6618         dbms_sql.column_value(l_cursor, 12, fs_report_rec.item);
6619         dbms_sql.column_value(l_cursor, 13, fs_report_rec.planned_quantity);
6620         dbms_sql.column_value(l_cursor, 14, fs_report_rec.quantity_completed);
6621 
6622         dbms_sql.column_value(l_cursor, 15, fs_report_rec.MPS_SCHEDULED_COMPLETION_DATE);
6623         dbms_sql.column_value(l_cursor, 16, fs_report_rec.MPS_NET_QUANTITY);
6624         dbms_sql.column_value(l_cursor, 17, fs_report_rec.BOM_REVISION);
6625         dbms_sql.column_value(l_cursor, 18, fs_report_rec.ROUTING_REVISION);
6626         dbms_sql.column_value(l_cursor, 19, fs_report_rec.BOM_REVISION_DATE);
6627         dbms_sql.column_value(l_cursor, 20,
6628           fs_report_rec.ROUTING_REVISION_DATE);
6629         dbms_sql.column_value(l_cursor, 21,
6630           fs_report_rec.ALTERNATE_BOM_DESIGNATOR);
6631         dbms_sql.column_value(l_cursor, 22,
6632           fs_report_rec.ALTERNATE_ROUTING_DESIGNATOR);
6633         dbms_sql.column_value(l_cursor, 23,
6634           fs_report_rec.COMPLETION_SUBINVENTORY);
6635         dbms_sql.column_value(l_cursor, 24,
6636           fs_report_rec.COMPLETION_LOCATOR_ID);
6637         dbms_sql.column_value(l_cursor, 25, fs_report_rec.MATERIAL_ACCOUNT);
6638         dbms_sql.column_value(l_cursor, 26,
6639           fs_report_rec.MATERIAL_OVERHEAD_ACCOUNT);
6640         dbms_sql.column_value(l_cursor, 27, fs_report_rec.RESOURCE_ACCOUNT);
6641         dbms_sql.column_value(l_cursor, 28,
6642           fs_report_rec.OUTSIDE_PROCESSING_ACCOUNT);
6643         dbms_sql.column_value(l_cursor, 29,
6644           fs_report_rec.MATERIAL_VARIANCE_ACCOUNT);
6645         dbms_sql.column_value(l_cursor, 30,
6646           fs_report_rec.RESOURCE_VARIANCE_ACCOUNT);
6647         dbms_sql.column_value(l_cursor, 31,
6648           fs_report_rec.OUTSIDE_PROC_VARIANCE_ACCOUNT);
6649         dbms_sql.column_value(l_cursor, 32,
6650           fs_report_rec.STD_COST_ADJUSTMENT_ACCOUNT);
6651         dbms_sql.column_value(l_cursor, 33, fs_report_rec.OVERHEAD_ACCOUNT);
6652         dbms_sql.column_value(l_cursor, 34,
6653           fs_report_rec.OVERHEAD_VARIANCE_ACCOUNT);
6654         dbms_sql.column_value(l_cursor, 35, fs_report_rec.PROJECT_ID);
6655         dbms_sql.column_value(l_cursor, 36, fs_report_rec.TASK_ID);
6656         dbms_sql.column_value(l_cursor, 37, fs_report_rec.ATTRIBUTE_CATEGORY);
6657         dbms_sql.column_value(l_cursor, 38, fs_report_rec.ATTRIBUTE1);
6658         dbms_sql.column_value(l_cursor, 39, fs_report_rec.ATTRIBUTE2);
6659         dbms_sql.column_value(l_cursor, 40, fs_report_rec.ATTRIBUTE3);
6660         dbms_sql.column_value(l_cursor, 41, fs_report_rec.ATTRIBUTE4);
6661         dbms_sql.column_value(l_cursor, 42, fs_report_rec.ATTRIBUTE5);
6662         dbms_sql.column_value(l_cursor, 43, fs_report_rec.ATTRIBUTE6);
6663         dbms_sql.column_value(l_cursor, 44, fs_report_rec.ATTRIBUTE7);
6664         dbms_sql.column_value(l_cursor, 45, fs_report_rec.ATTRIBUTE8);
6665         dbms_sql.column_value(l_cursor, 46, fs_report_rec.ATTRIBUTE9);
6666         dbms_sql.column_value(l_cursor, 47, fs_report_rec.ATTRIBUTE10);
6667         dbms_sql.column_value(l_cursor, 48, fs_report_rec.ATTRIBUTE11);
6668         dbms_sql.column_value(l_cursor, 49, fs_report_rec.ATTRIBUTE12);
6669         dbms_sql.column_value(l_cursor, 50, fs_report_rec.ATTRIBUTE13);
6670         dbms_sql.column_value(l_cursor, 51, fs_report_rec.ATTRIBUTE14);
6671         dbms_sql.column_value(l_cursor, 52, fs_report_rec.ATTRIBUTE15);
6672         dbms_sql.column_value(l_cursor, 53, fs_report_rec.KANBAN_CARD_ID);
6673         dbms_sql.column_value(l_cursor, 54, fs_report_rec.END_ITEM_UNIT_NUMBER);
6674         dbms_sql.column_value(l_cursor, 55, fs_report_rec.CURRENT_LINE_OPERATION);
6675         dbms_sql.column_value(l_cursor, 56, fs_report_rec.WIP_ENTITY_ID);
6676 
6677       END IF;
6678 
6679       /*---------------------------------------------------------+
6680        | After loop completes, check to see if we still have a   |
6681        | quantity in l_unprocessed_var then we add/subtract from |
6682        | last bucket and produce an error message otherwise      |
6683        +---------------------------------------------------------*/
6684 
6685       EXIT WHEN l_rows = 0;
6686 
6687       -- If the variance is positive(under completions) , then process record
6688       IF (fs_report_rec.planned_quantity
6689 	- fs_report_rec.quantity_completed) > 0
6690       THEN
6691 
6692         l_update_variance := fs_report_rec.planned_quantity
6693 				- fs_report_rec.quantity_completed;
6694 MRP_UTIL.MRP_LOG('quantity OK');
6695 
6696           /*--------------------------------------------------------------+
6697            | We can have more than one schedule on a given date           |
6698            | The cursor is sorted descending so we get the last schedule  |
6699            | of the day.                                                  |
6700            +--------------------------------------------------------------*/
6701 
6702           /*-------------------------------------------------------+
6703            | Since the variance is greater than zero, always create|
6704            | a new schedule (call private procedure)               |
6705            +-------------------------------------------------------*/
6706           l_flow_schedule_rec.operation := MRP_GLOBALS.G_OPR_CREATE;
6707           l_flow_schedule_rec.organization_id
6708 			:= p_organization_id;
6709           l_flow_schedule_rec.schedule_group_id
6710 			:= fs_report_rec.schedule_group_id;
6711           l_flow_schedule_rec.primary_item_id
6712 			:= fs_report_rec.primary_item_id;
6713           l_flow_schedule_rec.line_id
6714 			:= fs_report_rec.line_id;
6715           l_flow_schedule_rec.planned_quantity := l_update_variance;
6716 
6717           l_flow_schedule_rec.scheduled_completion_date
6718                         := Time_Schedule(fs_report_rec.line_id,
6719                            l_to_start_date,
6720                            l_update_variance);
6721                            --l_to_end_date,l_update_variance);
6722                            --p_to_end_date,l_update_variance);
6723 
6724           -- Bug 2213859
6725           -- Commented l_flow_schedule_rec.build_sequence:= fs_report_rec.build_sequence;
6726           /*-----------------------------------------------------------------+
6727            | Set the build sequence for newly forwarded schedules            |
6728 	   | Start with a BASE NUMBER and keep incrementing it               |
6729            | Keep separate counter linewise                                  |
6730            | Keep NULL build sequence as NULL (manual)                       |
6731            +-----------------------------------------------------------------*/
6732           MRP_UTIL.MRP_LOG('Creating new build sequence for line='||fs_report_rec.line_id);
6733 	  if (fs_report_rec.build_sequence is not null) then
6734 	    if ( not l_build_seq_counter.exists(fs_report_rec.line_id) ) then
6735 	      -- Initialization of the Seq Counter table
6736 	      MRP_UTIL.MRP_LOG('Initialize the counter for line='||fs_report_rec.line_id);
6737 	      l_build_seq_counter(fs_report_rec.line_id).base_number
6738 	                   := Get_Base_Number(fs_report_rec.line_id,
6739 	        flm_timezone.client00_in_server(l_flow_schedule_rec.scheduled_completion_date),
6740                                               l_from_start_date, l_from_end_date);  --fix bug#3170105
6741 	      MRP_UTIL.MRP_LOG('Initialized base number='||
6742 	                        l_build_seq_counter(fs_report_rec.line_id).base_number);
6743 	      l_build_seq_counter(fs_report_rec.line_id).current_build_seq :=
6744 	                     l_build_seq_counter(fs_report_rec.line_id).base_number + 1;
6745 	      MRP_UTIL.MRP_LOG('Initialized current build Seq number='||
6746 	                        l_build_seq_counter(fs_report_rec.line_id).current_build_seq);
6747 	    else
6748 	      MRP_UTIL.MRP_LOG('Increment the counter for line='||fs_report_rec.line_id);
6749 	      l_build_seq_counter(fs_report_rec.line_id).current_build_seq :=
6750 	            l_build_seq_counter(fs_report_rec.line_id).current_build_seq + 1;
6751 	    end if;
6752 	      l_temp_build_sequence := l_build_seq_counter(fs_report_rec.line_id).current_build_seq;
6753 	  else
6754 	    MRP_UTIL.MRP_LOG('Build Seq Counter is NULL for line='||fs_report_rec.line_id);
6755 	    l_temp_build_sequence := null;
6756             l_build_seq_counter(fs_report_rec.line_id).current_build_seq := NULL;
6757 	  end if;
6758 	  MRP_UTIL.MRP_LOG('Resultant Build Seq Counter is ='||l_temp_build_sequence);
6759 
6760 	  l_flow_schedule_rec.build_sequence:= l_temp_build_sequence;
6761 
6762           -- Bug 2213859
6763 
6764           l_flow_schedule_rec.demand_source_header_id :=
6765           fs_report_rec.demand_source_header_id;
6766 
6767           l_flow_schedule_rec.demand_source_line :=
6768           fs_report_rec.demand_source_line;
6769           l_flow_schedule_rec.demand_source_delivery :=
6770           fs_report_rec.demand_source_delivery;
6771           l_flow_schedule_rec.demand_source_type :=
6772           fs_report_rec.demand_source_type;
6773           l_flow_schedule_rec.demand_class :=
6774           fs_report_rec.demand_class;
6775 
6776           l_flow_schedule_rec.roll_forwarded_flag :=
6777           G_INTERMEDIATE_ROLL_FORWARDED;
6778           l_flow_schedule_rec.status := 1;
6779 
6780           l_flow_schedule_rec.mps_scheduled_comp_date :=
6781           fs_report_rec.MPS_SCHEDULED_COMPLETION_DATE;
6782           l_flow_schedule_rec.mps_net_quantity:=
6783           fs_report_rec.MPS_NET_QUANTITY;
6784           l_flow_schedule_rec.bom_revision:=
6785           fs_report_rec.BOM_REVISION;
6786           l_flow_schedule_rec.routing_revision:=
6787           fs_report_rec.ROUTING_REVISION;
6788           l_flow_schedule_rec.bom_revision_date:=
6789           fs_report_rec.BOM_REVISION_DATE;
6790           l_flow_schedule_rec.routing_revision_date:=
6791           fs_report_rec.ROUTING_REVISION_DATE;
6792           l_flow_schedule_rec.alternate_bom_designator:=
6793           fs_report_rec.ALTERNATE_BOM_DESIGNATOR;
6794           l_flow_schedule_rec.alternate_routing_desig:=
6795           fs_report_rec.ALTERNATE_ROUTING_DESIGNATOR;
6796           l_flow_schedule_rec.completion_subinventory:=
6797           fs_report_rec.COMPLETION_SUBINVENTORY;
6798           l_flow_schedule_rec.completion_locator_id:=
6799           fs_report_rec.COMPLETION_LOCATOR_ID;
6800           l_flow_schedule_rec.material_account:=
6801           fs_report_rec.MATERIAL_ACCOUNT;
6802           l_flow_schedule_rec.material_overhead_account:=
6803           fs_report_rec.MATERIAL_OVERHEAD_ACCOUNT;
6804           l_flow_schedule_rec.resource_account:=
6805           fs_report_rec.RESOURCE_ACCOUNT;
6806           l_flow_schedule_rec.outside_processing_acct:=
6807           fs_report_rec.OUTSIDE_PROCESSING_ACCOUNT;
6808           l_flow_schedule_rec.material_variance_account:=
6809           fs_report_rec.MATERIAL_VARIANCE_ACCOUNT;
6810           l_flow_schedule_rec.resource_variance_account:=
6811           fs_report_rec.RESOURCE_VARIANCE_ACCOUNT;
6812           l_flow_schedule_rec.outside_proc_var_acct:=
6813           fs_report_rec.OUTSIDE_PROC_VARIANCE_ACCOUNT;
6814           l_flow_schedule_rec.std_cost_adjustment_acct:=
6815           fs_report_rec.STD_COST_ADJUSTMENT_ACCOUNT;
6816           l_flow_schedule_rec.overhead_account:=
6817           fs_report_rec.OVERHEAD_ACCOUNT;
6818           l_flow_schedule_rec.overhead_variance_account:=
6819           fs_report_rec.OVERHEAD_VARIANCE_ACCOUNT;
6820           l_flow_schedule_rec.project_id:=
6821           fs_report_rec.PROJECT_ID;
6822           l_flow_schedule_rec.task_id:=
6823           fs_report_rec.TASK_ID;
6824           l_flow_schedule_rec.attribute_category :=
6825           fs_report_rec.ATTRIBUTE_CATEGORY;
6826           l_flow_schedule_rec.attribute1:=
6827           fs_report_rec.ATTRIBUTE1;
6828           l_flow_schedule_rec.attribute2:=
6829           fs_report_rec.ATTRIBUTE2;
6830           l_flow_schedule_rec.attribute3:=
6831           fs_report_rec.ATTRIBUTE3;
6832           l_flow_schedule_rec.attribute4:=
6833           fs_report_rec.ATTRIBUTE4;
6834           l_flow_schedule_rec.attribute5:=
6835           fs_report_rec.ATTRIBUTE5;
6836           l_flow_schedule_rec.attribute6:=
6837           fs_report_rec.ATTRIBUTE6;
6838           l_flow_schedule_rec.attribute7:=
6839           fs_report_rec.ATTRIBUTE7;
6840           l_flow_schedule_rec.attribute8:=
6841           fs_report_rec.ATTRIBUTE8;
6842           l_flow_schedule_rec.attribute9:=
6843           fs_report_rec.ATTRIBUTE9;
6844           l_flow_schedule_rec.attribute10:=
6845           fs_report_rec.ATTRIBUTE10;
6846           l_flow_schedule_rec.attribute11:=
6847           fs_report_rec.ATTRIBUTE11;
6848           l_flow_schedule_rec.attribute12:=
6849           fs_report_rec.ATTRIBUTE12;
6850           l_flow_schedule_rec.attribute13:=
6851           fs_report_rec.ATTRIBUTE13;
6852           l_flow_schedule_rec.attribute14:=
6853           fs_report_rec.ATTRIBUTE14;
6854           l_flow_schedule_rec.attribute15:=
6855           fs_report_rec.ATTRIBUTE15;
6856           l_flow_schedule_rec.kanban_card_id:=
6857           fs_report_rec.KANBAN_CARD_ID;
6858           l_flow_schedule_rec.end_item_unit_number:=
6859           fs_report_rec.END_ITEM_UNIT_NUMBER;
6860           l_flow_schedule_rec.current_line_operation:=
6861           fs_report_rec.CURRENT_LINE_OPERATION;
6862 
6863           IF (NOT Close_Single_Schedule(fs_report_rec.schedule_number,
6864           p_organization_id)) THEN
6865             RAISE unexpected_error;
6866          END IF;
6867 
6868           -- Call procedure to update mrp_form_query for the report
6869 	  /** Bug 2558664 - passed old build sequence as report goes haywire
6870 	      if modified build sequence is passed **/
6871           report_update_WD(l_report_query_id,
6872 				fs_report_rec.line_id,
6873 				fs_report_rec.primary_item_id,
6874                                 fs_report_rec.schedule_group_id,
6875 				l_flow_schedule_rec.scheduled_completion_date,
6876                                 fs_report_rec.build_sequence, /* Bug 2558664 */
6877 				l_update_variance,
6878                                 l_from_start_date,
6879                                 l_from_end_date,
6880                                 l_to_start_date,
6881                                 l_to_end_date);
6882 
6883          -- Bug 2213859
6884            MRP_UTIL.MRP_LOG('Calling  MRP_Flow_Schedule_PVT.Process_Flow_Schedule');
6885          -- Bug 2213859
6886 
6887           MRP_Flow_Schedule_PVT.Process_Flow_Schedule
6888        		( 	p_api_version_number		=> 1.0,
6889 			x_return_status			=> l_return_status,
6890 			x_msg_count			=> l_msg_count,
6891 			x_msg_data			=> l_msg_data,
6892 			p_control_rec			=> l_control_rec,
6893 			p_old_flow_schedule_rec         => l_old_flow_schedule_rec,
6894 			p_flow_schedule_rec		=> l_flow_schedule_rec,
6895 			x_flow_schedule_rec		=> l_x_flow_schedule_rec
6896 		);
6897 
6898           /* Added for Enhancement #2829204 */
6899 	  IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6900 	    SELECT auto_replenish,
6901 	           wip_entity_id
6902 	      INTO l_auto_replenish,
6903 	           l_wip_entity_id
6904 	      FROM wip_flow_schedules
6905 	     WHERE schedule_number = fs_report_rec.schedule_number
6906 	       AND organization_id = p_organization_id;
6907 
6908 	    /* Update the auto_replenish flag of new schedules with the old value,
6909 	       if auto_replenish is not null for old flow schedule */
6910 	    IF l_auto_replenish IS NOT NULL THEN
6911 	      UPDATE wip_flow_schedules
6912 	         SET auto_replenish = l_auto_replenish
6913 	       WHERE schedule_number = l_x_flow_schedule_rec.schedule_number
6914 	         AND organization_id = p_organization_id;
6915 
6916 	      /* Update the Kanban Cards to reference the new flow schedule */
6917 	      IF (nvl(l_auto_replenish, 'N') = 'Y') THEN
6918 	        FOR l_kanban_card_activity_csr IN kanban_card_activity_csr(l_wip_entity_id)
6919                 LOOP
6920                   l_kanban_activity_id := l_kanban_card_activity_csr.kanban_activity_id;
6921 
6922                   UPDATE mtl_kanban_card_activity
6923                      SET source_wip_entity_id = l_x_flow_schedule_rec.wip_entity_id
6924                    WHERE kanban_activity_id = l_kanban_activity_id;
6925 
6926                 END LOOP; /* end of for loop cursor */
6927               END IF; /* end of if for nvl(l_auto_replenish,'N') */
6928             END IF; /* end of if for l_auto_replenish is not null */
6929 
6930   -- Added for project 'Roll Flow Schedules: Maintain Schedule Number'
6931   -- Store the old/new values of schedule_number and wip_entity_id
6932             l_loop_count:=l_loop_count+1;
6933             oldFSSchNum(l_loop_count) := fs_report_rec.schedule_number;
6934 	    newFSSchNum(l_loop_count) := l_x_flow_schedule_rec.schedule_number;
6935             oldFSWipId(l_loop_count) := fs_report_rec.wip_entity_id;
6936 	    newFSWipId(l_loop_count) := l_x_flow_schedule_rec.wip_entity_id;
6937 
6938 	  END IF; /* end of if for l_return_status */
6939 
6940           IF p_output = 2  THEN
6941             -- Write either error or success message to log
6942             IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6943               FND_MESSAGE.set_name('MRP','MRP_ROLL_CREATE');
6944               FND_MESSAGE.set_token('LINE',fs_report_rec.line_code);
6945               FND_MESSAGE.set_token('ITEM',fs_report_rec.item);
6946               FND_MESSAGE.set_token('COMP_DATE',l_x_flow_schedule_rec.scheduled_completion_date);
6947               FND_MESSAGE.set_token('QTY',l_x_flow_schedule_rec.planned_quantity);
6948               l_log_message := FND_MESSAGE.get;
6949               MRP_UTIL.MRP_LOG(l_log_message);
6950             ELSE
6951               IF l_msg_count > 0 THEN
6952                 FOR i in 1..l_msg_count LOOP
6953                   l_log_message := fnd_msg_pub.get(i,'F');
6954                   MRP_UTIL.MRP_LOG(l_log_message);
6955                 END LOOP;
6956               END IF;
6957             END IF;
6958           -- end if for p_output = 2
6959           END IF;
6960           l_update_variance := 0;
6961       END IF;
6962 
6963 
6964       l_old_line_id := fs_report_rec.line_id;
6965       l_old_line_code := fs_report_rec.line_code;
6966       l_old_item_id := fs_report_rec.primary_item_id;
6967       l_old_item := fs_report_rec.item;
6968       l_old_sg_id := fs_report_rec.schedule_group_id;
6969       MRP_UTIL.MRP_LOG('item = '||to_char(l_old_item_id)||' var = '||to_char(l_unprocessed_var));
6970     END LOOP;
6971 
6972     -- Bug 2213859
6973           /*-----------------------------------------------------------------+
6974            | After the LOOP completes, all the schedules on the destination  |
6975            | day are shifted with the count per line which has been newly    |
6976            | forwarded to avoid bumping;                                     |
6977            +-----------------------------------------------------------------*/
6978 
6979   /******************* Commented ********************
6980   UPDATE wip_flow_schedules set roll_forwarded_flag =
6981   G_ROLL_FORWARDED
6982   where roll_forwarded_flag =
6983   G_INTERMEDIATE_ROLL_FORWARDED;
6984   **************************************************/
6985 
6986     MRP_UTIL.MRP_LOG('Shift build sequences of existing schedules on destination day');
6987     -- Bug 2558664 handled NULL build sequence counter gracefully
6988     if (l_build_seq_counter.count > 0) then
6989       l_index := l_build_seq_counter.first;
6990       loop
6991 	if (l_build_seq_counter.exists(l_index)) then
6992           MRP_UTIL.MRP_LOG('Proccessing for line='||l_index);
6993           l_base_number := nvl(l_build_seq_counter(l_index).base_number,0);
6994           l_total_count := nvl(l_build_seq_counter(l_index).current_build_seq,0) - l_base_number;
6995           MRP_UTIL.MRP_LOG('Shift each BUILD_SEQ of existing eligible schedules by '||l_total_count);
6996 
6997           UPDATE wip_flow_schedules
6998              set BUILD_SEQUENCE = BUILD_SEQUENCE + l_total_count
6999            WHERE organization_id = p_organization_id
7000              AND line_id = l_index
7001              AND nvl(planned_quantity,0) > nvl(quantity_completed,0)
7002              AND scheduled_completion_date  --fix bug#3170105
7003                  BETWEEN l_to_start_date AND l_to_end_date+1-1/(24*60*60)
7004              AND (ROLL_FORWARDED_FLAG <> G_INTERMEDIATE_ROLL_FORWARDED OR
7005                   ROLL_FORWARDED_FLAG IS NULL); /*Bug 3019639*/
7006 
7007            /*-----------------------------------------------------------------+
7008             | Update the newly forwarded schedules as ROLL FORWARDED;         |
7009             | Deduct the base number from the build_sequence                  |
7010             +-----------------------------------------------------------------*/
7011 
7012           UPDATE wip_flow_schedules set
7013           roll_forwarded_flag = G_ROLL_FORWARDED,
7014           build_sequence = build_sequence - l_base_number
7015           where roll_forwarded_flag = G_INTERMEDIATE_ROLL_FORWARDED
7016             and line_id = l_index
7017 	    --bug 3749052:
7018 	    and scheduled_completion_date
7019 	        BETWEEN l_to_start_date AND l_to_end_date+1-1/(24*60*60);
7020 
7021 	  exit when ( l_index is NULL or l_index = l_build_seq_counter.last );
7022 
7023           l_index := l_build_seq_counter.next(l_index);
7024 	end if; /** END OF if (l_build_seq_counter.exists(l_index)) then **/
7025       end loop;
7026     end if;  /** END OF if (l_build_seq_counter.count > 0) then **/
7027 
7028 -- Bug 2213859
7029 
7030 /* Added for project 'Roll Flow Schedules: Maintain Schedule Number'
7031    Logic to swap the new schedule number with old schedule number. */
7032     --First step is to change the schedule number of the rolled FS
7033     --to a temporaryones to avoid violating the unique contraints
7034     --on Schedule Number and Org ID and this is done for WIP_FLOW_SCHEDULES
7035     FORALL i IN 1..l_loop_count
7036        UPDATE wip_flow_schedules
7037          SET schedule_number=('?*?'||oldFSSchNum(i))
7038 	 WHERE wip_entity_id=oldFSWipId(i)
7039 	 AND organization_id=p_organization_id;
7040 
7041     --Second Step is to Update the New FS created to use the old rolled FS
7042     --Schedule Number. This is need to be done for WIP_FLOW_SCHEDULES
7043     FORALL i IN 1..l_loop_count
7044        UPDATE wip_flow_schedules
7045          SET schedule_number=oldFSSchNum(i)
7046 	 WHERE wip_entity_id=newFSWipId(i)
7047 	 AND organization_id=p_organization_id;
7048 
7049     --Third Step is to Update the Old rolled FS to use the Newly created FS
7050     --Schedule Number. This is need to be done for WIP_FLOW_SCHEDULES
7051     FORALL i IN 1..l_loop_count
7052        UPDATE wip_flow_schedules
7053          SET schedule_number=newFSSchNum(i)
7054 	 WHERE wip_entity_id=oldFSWipId(i)
7055 	 AND organization_id=p_organization_id;
7056 
7057     --Update the detail record in execution to point to new schedule number.
7058     FORALL i IN 1..l_loop_count
7059        UPDATE flm_exe_operations
7060          SET wip_entity_id=newFSWipId(i)
7061 	 WHERE wip_entity_id=oldFSWipId(i)
7062 	 AND organization_id=p_organization_id;
7063     FORALL i IN 1..l_loop_count
7064        UPDATE flm_exe_req_operations
7065          SET wip_entity_id=newFSWipId(i)
7066 	 WHERE wip_entity_id=oldFSWipId(i)
7067 	 AND organization_id=p_organization_id;
7068     FORALL i IN 1..l_loop_count
7069        UPDATE flm_exe_lot_numbers
7070          SET wip_entity_id=newFSWipId(i)
7071 	 WHERE wip_entity_id=oldFSWipId(i)
7072 	 AND organization_id=p_organization_id;
7073     FORALL i IN 1..l_loop_count
7074        UPDATE flm_exe_serial_numbers
7075          SET wip_entity_id=newFSWipId(i)
7076 	 WHERE wip_entity_id=oldFSWipId(i)
7077 	 AND organization_id=p_organization_id;
7078 
7079 
7080   ELSIF p_spread_qty = 3 THEN
7081   /* this means close all the past schedules */
7082 
7083     l_cursor := Close_All_Past_Schedules;
7084     IF l_cursor IS NULL THEN
7085       RAISE unexpected_error;
7086     END IF;
7087 
7088     LOOP
7089       l_rows := dbms_sql.fetch_rows(l_cursor);
7090       IF l_rows > 0 THEN
7091         dbms_sql.column_value(l_cursor, 1, l_flow_schedule_rec.wip_entity_id);
7092       END IF;
7093       EXIT WHEN l_rows = 0;
7094       UPDATE wip_flow_schedules SET status = 2,
7095              date_closed = flm_timezone.sysdate00_in_server  --fix bug#3170105
7096       WHERE wip_entity_id = l_flow_schedule_rec.wip_entity_id;
7097       MRP_UTIL.MRP_LOG('Closed Schedule with wip_entity_id:'||to_char(
7098       l_flow_schedule_rec.wip_entity_id));
7099     END LOOP;
7100   END IF;
7101 
7102   IF (dbms_sql.is_open(l_cursor)) THEN
7103     dbms_sql.close_cursor(l_cursor);
7104   END IF;
7105   IF p_spread_qty = 3 THEN
7106     RETURN;
7107   END IF;
7108   FND_MESSAGE.set_name('MRP','EC_FROM');
7109   l_trans_var1 := FND_MESSAGE.get;
7110   FND_MESSAGE.set_name('MRP','EC_TO');
7111   l_trans_var2 := FND_MESSAGE.get;
7112   FND_MESSAGE.set_name('MRP','EC_ORIGINAL');
7113   l_trans_var3 := FND_MESSAGE.get;
7114   FND_MESSAGE.set_name('MRP','EC_ADJUSTED');
7115   l_trans_var4 := FND_MESSAGE.get;
7116 
7117   l_out_message := '                                   ' ||
7118 	rpad(substr(l_trans_var1,1,8),38) || ' ' ||
7119     	rpad(substr(l_trans_var2,1,9),9) || ' ' ||
7120     	rpad(substr(l_trans_var3,1,8),8) || ' ' ||
7121         rpad(substr(l_trans_var4,1,8),8);
7122   MRP_UTIL.MRP_OUT(l_out_message);
7123 
7124   FND_MESSAGE.set_name('MRP','EC_SCHEDULE');
7125   l_trans_var1 := FND_MESSAGE.get;
7126   FND_MESSAGE.set_name('MRP','EC_SCHEDULED');
7127   l_trans_var2 := FND_MESSAGE.get;
7128   FND_MESSAGE.set_name('MRP','EC_COMPLETED');
7129   l_trans_var3 := FND_MESSAGE.get;
7130   FND_MESSAGE.set_name('MRP','EC_ADJUSTED');
7131   l_trans_var4 := FND_MESSAGE.get;
7132 
7133   l_out_message := '                          ' ||
7134 	rpad(substr(l_trans_var1,1,8),8) || ' ' ||
7135 	rpad(substr(l_trans_var1,1,9),9) || ' ' ||
7136         rpad(substr(l_trans_var2,1,9),9) || ' ' ||
7137         rpad(substr(l_trans_var3,1,9),18) || ' ' ||
7138 	rpad(substr(l_trans_var1,1,9),9) || ' ' ||
7139 	rpad(substr(l_trans_var1,1,8),8) || ' ' ||
7140 	rpad(substr(l_trans_var1,1,8),8) || ' ' ||
7141 	rpad(substr(l_trans_var4,1,8),8);
7142 
7143   MRP_UTIL.MRP_OUT(l_out_message);
7144 
7145   FND_MESSAGE.set_name('MRP','EC_LINE');
7146   l_trans_var1 := FND_MESSAGE.get;
7147   FND_MESSAGE.set_name('MRP','EC_ITEM');
7148   l_trans_var2 := FND_MESSAGE.get;
7149   FND_MESSAGE.set_name('MRP','EC_GROUP');
7150   l_trans_var3 := FND_MESSAGE.get;
7151   FND_MESSAGE.set_name('MRP','EC_DATE');
7152   l_trans_var4 := FND_MESSAGE.get;
7153   FND_MESSAGE.set_name('MRP','EC_QUANTITY');
7154   l_trans_var5 := FND_MESSAGE.get;
7155   FND_MESSAGE.set_name('MRP','EC_VARIANCE');
7156   l_trans_var6 := FND_MESSAGE.get;
7157 
7158   l_out_message := rpad(substr(l_trans_var1,1,10),10) || ' ' ||
7159 	rpad(substr(l_trans_var2,1,14),14) || ' ' ||
7160 	rpad(substr(l_trans_var3,1,8),8) || ' ' ||
7161 	rpad(substr(l_trans_var4,1,9),9) || ' ' ||
7162 	rpad(substr(l_trans_var5,1,9),9) || ' ' ||
7163 	rpad(substr(l_trans_var5,1,9),9) || ' ' ||
7164 	rpad(substr(l_trans_var6,1,8),8) || ' ' ||
7165 	rpad(substr(l_trans_var4,1,9),9) || ' ' ||
7166 	rpad(substr(l_trans_var5,1,8),8) || ' ' ||
7167 	rpad(substr(l_trans_var5,1,8),8) || ' ' ||
7168 	rpad(substr(l_trans_var5,1,8),8);
7169   MRP_UTIL.MRP_OUT(l_out_message);
7170   l_out_message := '---------- -------------- -------- --------- --------- --------- -------- --------- -------- -------- --------';
7171   MRP_UTIL.MRP_OUT(l_out_message);
7172 
7173   -- Reinitialize values
7174   l_old_line_id := -1;
7175   l_old_item_id := -1;
7176   l_old_sg_id := -1;
7177 
7178   OPEN REPORT_CURSOR(l_report_query_id);
7179 
7180   LOOP
7181 
7182       FETCH REPORT_CURSOR INTO
7183         fs_report_rec.line_code,
7184         fs_report_rec.line_id,
7185 	fs_report_rec.item,
7186         fs_report_rec.primary_item_id,
7187 	fs_report_rec.schedule_group,
7188         fs_report_rec.schedule_group_id,
7189 	fs_report_rec.completion_date,
7190 	fs_report_rec.planned_quantity,
7191 	fs_report_rec.quantity_completed,
7192  	fs_report_rec.variance1,
7193 	fs_report_rec.to_completion_date,
7194 	fs_report_rec.to_scheduled_qty,
7195 	fs_report_rec.to_adjusted_qty,
7196 	fs_report_rec.variance2;
7197 
7198       IF REPORT_CURSOR%NOTFOUND THEN
7199          fs_report_rec.primary_item_id := -1;
7200       END IF;
7201 
7202       IF (NVL(fs_report_rec.schedule_group_id,-1) <> NVL(l_old_sg_id,-1)
7203            AND l_old_sg_id <> -1) OR
7204 	   (fs_report_rec.primary_item_id <> l_old_item_id
7205 	   AND l_old_item_id <> -1) OR
7206            (fs_report_rec.line_id <> l_old_line_id
7207            AND l_old_line_id <> -1)
7208       THEN
7209           OPEN REPORT_TOTALS(l_report_query_id, l_old_line_id,
7210 		l_old_item_id, l_old_sg_id);
7211 
7212           FETCH REPORT_TOTALS INTO
7213 		l_planned_total,
7214 		l_completed_total,
7215 		l_variance1_total,
7216 		l_scheduled_total,
7217 		l_adjusted_total,
7218 		l_variance2_total;
7219 
7220           CLOSE REPORT_TOTALS;
7221 
7222           l_out_message := '-------------------------------------------- --------- --------- -------- --------- -------- -------- --------';
7223           MRP_UTIL.MRP_OUT(l_out_message);
7224 
7225           FND_MESSAGE.set_name('MRP','EC_TOTAL');
7226           l_out_message := FND_MESSAGE.get;
7227 
7228           l_out_message := rpad(substr(l_out_message,1,8),8) || '                                     '||
7229 			lpad(l_planned_total,9) || ' ' ||
7230 			lpad(l_completed_total,9) || ' ' || lpad(l_variance1_total,8) ||
7231 			'           ' ||
7232 			lpad(l_scheduled_total,8) || ' ' || lpad(l_adjusted_total,8) || ' ' ||
7233  			lpad(l_variance2_total,8);
7234 
7235           MRP_UTIL.MRP_OUT(l_out_message);
7236 
7237           l_out_message := ' ';
7238           MRP_UTIL.MRP_OUT(l_out_message);
7239       END IF;
7240 
7241       IF REPORT_CURSOR%NOTFOUND THEN
7242         FND_MESSAGE.set_name('MRP','EC_END_OF_REPORT');
7243         l_out_message := FND_MESSAGE.get;
7244         MRP_UTIL.MRP_OUT(l_out_message);
7245         EXIT;
7246       END IF;
7247 
7248       l_out_message := fs_report_rec.line_code || ' ' ||
7249 	fs_report_rec.item || ' ' ||
7250 	fs_report_rec.schedule_group || ' ' ||
7251 	fs_report_rec.completion_date || ' ' ||
7252 	lpad(fs_report_rec.planned_quantity,9) || ' ' ||
7253 	lpad(fs_report_rec.quantity_completed,9) || ' ' ||
7254  	lpad(fs_report_rec.variance1,8) || ' ' ||
7255 	fs_report_rec.to_completion_date || ' ' ||
7256 	lpad(fs_report_rec.to_scheduled_qty,8) || ' ' ||
7257 	lpad(fs_report_rec.to_adjusted_qty,8) || ' ' ||
7258 	lpad(fs_report_rec.variance2,8);
7259 
7260       MRP_UTIL.MRP_OUT(l_out_message);
7261 
7262       l_old_sg_id := fs_report_rec.schedule_group_id;
7263       l_old_item_id := fs_report_rec.primary_item_id;
7264       l_old_line_id := fs_report_rec.line_id;
7265   END LOOP;
7266 
7267   CLOSE REPORT_CURSOR;
7268 
7269   -- Rollback if haven't selected update
7270   IF p_output <> 2 THEN
7271     ROLLBACK;
7272   END IF;
7273 
7274 EXCEPTION
7275   WHEN NO_DATA_FOUND THEN
7276     NULL;
7277 
7278   WHEN expected_error THEN
7279     ROLLBACK;
7280     IF RETCODE <> 1 THEN
7281       RETCODE := G_ERROR;
7282     END IF;
7283     FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
7284     ERRBUF := FND_MESSAGE.get;
7285     l_log_message := FND_MESSAGE.get;
7286     MRP_UTIL.MRP_LOG(l_log_message);
7287     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
7288     MRP_UTIL.MRP_LOG(l_log_message);
7289 
7290   WHEN unexpected_error THEN
7291     ROLLBACK;
7292     RETCODE := G_ERROR;
7293     FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
7294     ERRBUF := FND_MESSAGE.get;
7295     l_log_message := FND_MESSAGE.get;
7296     MRP_UTIL.MRP_LOG(l_log_message);
7297     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
7298     MRP_UTIL.MRP_LOG(l_log_message);
7299 
7300   WHEN OTHERS THEN
7301     ROLLBACK;
7302     RETCODE := G_ERROR;
7303     FND_MESSAGE.set_name('MRP','MRP_ROLL_FLOW_ERROR');
7304     ERRBUF := FND_MESSAGE.get;
7305     l_log_message := FND_MESSAGE.get;
7306     MRP_UTIL.MRP_LOG(l_log_message);
7307     l_log_message := 'Unexpected SQL Error: '||sqlerrm;
7308     MRP_UTIL.MRP_LOG(l_log_message);
7309 
7310 END Roll_Flow_Schedules;
7311 
7312 -- ========================================================================
7313 --  This function builds the where clause for the item range specified
7314 --  Function accepts system items as delimited strings and build the where
7315 --  clause. It expects proper escaping, if 'delimiter' itself a valid
7316 --  character within the segment values.
7317 --  Delimiter is ignored if only ONE segment is enabled.
7318 -- ========================================================================
7319 /** Bug 2558664 - modified Item_Where_Clause to use fnd_flex_server.parse_flex_values
7320                   which handles 'delimiter' more gracefully **/
7321 /** don't use this method!!! */
7322 /* this method is moved to package FLM_UTIL */
7323 FUNCTION Item_Where_Clause( p_item_lo          IN      VARCHAR2,
7324                             p_item_hi          IN      VARCHAR2,
7325                             p_table_name       IN      VARCHAR2,
7326                             x_where            OUT     NOCOPY	VARCHAR2,
7327                             x_err_buf          OUT     NOCOPY	VARCHAR2)
7328 RETURN BOOLEAN IS
7329 
7330 BEGIN
7331 
7332   x_where := ' ';
7333   x_err_buf := ' ';
7334 
7335   RETURN TRUE;
7336 
7337 END Item_Where_Clause;
7338 
7339 -- ========================================================================
7340 --  This function builds the where clause for the category range specified
7341 -- ========================================================================
7342 /** don't use this method!!! */
7343 /* this method is moved to package FLM_UTIL */
7344 FUNCTION Category_Where_Clause (  p_cat_lo      IN      VARCHAR2,
7345                                   p_cat_hi      IN      VARCHAR2,
7346                                   p_table_name  IN      VARCHAR2,
7347                                   p_cat_struct_id IN    NUMBER,
7348                                   p_where       OUT     NOCOPY	VARCHAR2,
7349                                   x_err_buf     OUT     NOCOPY	VARCHAR2 )
7350 RETURN BOOLEAN IS
7351 
7352 BEGIN
7353   p_where := ' ';
7354   x_err_buf := ' ';
7355 
7356   RETURN TRUE;
7357 
7358 END Category_Where_Clause;
7359 
7360 
7361 PROCEDURE Line_Schedule (       p_rule_id               IN NUMBER,
7362                                 p_line_id               IN NUMBER,
7363                                 p_org_id                IN NUMBER,
7364                                 p_sched_start_date      IN DATE,
7365                                 p_sched_end_date        IN DATE,
7366                                 p_update                IN NUMBER,
7367                                 p_flex_tolerance        IN NUMBER,
7368                                 x_return_status         OUT NOCOPY	VARCHAR2,
7369                                 x_msg_count             OUT NOCOPY	NUMBER,
7370                                 x_msg_data              OUT NOCOPY	VARCHAR2) IS
7371 
7372   CURSOR RULE_CURSOR IS
7373   SELECT distinct user_defined
7374   FROM mrp_scheduling_rules
7375   WHERE rule_id = p_rule_id;
7376 
7377   l_api_version_number		CONSTANT NUMBER := 1.0;
7378   l_api_name			CONSTANT VARCHAR2(30) := 'Line_Schedule';
7379   l_user_defined		NUMBER;
7380 
7381   l_return_status		VARCHAR2(1);
7382   l_msg_count			NUMBER;
7383   l_msg_data			VARCHAR2(2000);
7384 
7385 BEGIN
7386 
7387     OPEN RULE_CURSOR;
7388     FETCH RULE_CURSOR into l_user_defined;
7389     CLOSE RULE_CURSOR;
7390 
7391     IF p_rule_id <> -1 THEN
7392       IF l_user_defined = 1 THEN
7393         MRP_CUSTOM_LINE_SCHEDULE.Custom_Schedule(
7394                 l_api_version_number,
7395 		p_rule_id,
7396 		p_line_id,
7397 		p_org_id,
7398                 p_flex_tolerance, /* Added in the bug 1949098*/
7399 		p_sched_start_date,
7400 		p_sched_end_date,
7401 		x_return_status,
7402 		x_msg_count,
7403 		x_msg_data);
7404       ELSE
7405         MRP_LINE_SCHEDULE_ALGORITHM.Schedule(
7406 		p_rule_id,
7407 		p_line_id,
7408 		p_org_id,
7409 		p_sched_start_date,
7410 		p_sched_end_date,
7411                 p_flex_tolerance,
7412 		x_return_status,
7413 		x_msg_count,
7414 		x_msg_data);
7415       END IF;
7416     END IF;
7417 
7418     IF p_update = 1 THEN
7419         Post_Schedule_Update (p_org_id);
7420     END IF;
7421 
7422 EXCEPTION
7423 
7424     WHEN FND_API.G_EXC_ERROR THEN
7425 
7426         x_return_status := FND_API.G_RET_STS_ERROR;
7427 
7428         --  Get message count and data
7429 
7430         FND_MSG_PUB.Count_And_Get
7431         (   p_count                       => x_msg_count
7432         ,   p_data                        => x_msg_data
7433         );
7434 
7435     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7436 
7437         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7438 
7439         --  Get message count and data
7440 
7441         FND_MSG_PUB.Count_And_Get
7442         (   p_count                       => x_msg_count
7443         ,   p_data                        => x_msg_data
7444         );
7445 
7446     WHEN OTHERS THEN
7447 
7448         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7449 
7450         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7451         THEN
7452             FND_MSG_PUB.Add_Exc_Msg
7453             (   G_PKG_NAME
7454             ,   'Line_Schedule'
7455             );
7456         END IF;
7457 
7458         --  Get message count and data
7459 
7460         FND_MSG_PUB.Count_And_Get
7461         (   p_count                       => x_msg_count
7462         ,   p_data                        => x_msg_data
7463         );
7464 
7465 END Line_Schedule;
7466 
7467 PROCEDURE Post_Schedule_Update (p_org_id IN NUMBER)
7468 IS
7469 
7470   CURSOR C1 IS
7471   SELECT wip_entity_id, schedule_number
7472   FROM wip_flow_schedules
7473   WHERE request_id = USERENV( 'SESSIONID' );
7474 
7475   CURSOR C2 IS
7476   SELECT sum(planned_quantity), demand_source_line
7477   FROM wip_flow_schedules
7478   WHERE organization_id = p_org_id
7479   AND demand_source_header_id IS NULL
7480   AND request_id = USERENV('SESSIONID')
7481   GROUP BY demand_source_line;
7482 
7483   l_wip_entity_id NUMBER;
7484   l_schedule_number       VARCHAR2(30);
7485   l_schedule_number_out VARCHAR2(30);
7486   l_error         NUMBER;
7487   l_quantity              NUMBER;
7488   l_trans_id              NUMBER;
7489 
7490 BEGIN
7491 
7492   OPEN C1;
7493   LOOP
7494     FETCH C1 INTO l_wip_entity_id, l_schedule_number;
7495     EXIT WHEN C1%NOTFOUND;
7496 
7497     --Bug 6122344
7498     IF l_schedule_number =
7499         --(nvl(substr(FND_PROFILE.value('WIP_JOB_PREFIX'),1,20),'X')
7500         --        || to_char(l_wip_entity_id))
7501         'FLM-INTERNAL' || (to_char(l_wip_entity_id))
7502 
7503     THEN
7504       l_schedule_number_out := NULL;
7505       l_error := WIP_FLOW_DERIVE.schedule_number(l_schedule_number_out);
7506       IF l_error = 1 THEN
7507         UPDATE wip_flow_schedules
7508         SET schedule_number = l_schedule_number_out
7509         WHERE wip_entity_id = l_wip_entity_id;
7510 
7511         UPDATE wip_entities
7512         SET wip_entity_name = l_schedule_number_out
7513         WHERE wip_entity_id = l_wip_entity_id;
7514       ELSE
7515         RAISE FND_API.G_EXC_ERROR;
7516       END IF;
7517     END IF;
7518   END LOOP;
7519   CLOSE C1;
7520 
7521   Explode_New_Items;
7522 
7523   OPEN C2;
7524   LOOP
7525     FETCH C2 into l_quantity, l_trans_id;
7526     EXIT WHEN C2%NOTFOUND;
7527 
7528     UPDATE mrp_recommendations
7529     SET quantity_in_process = nvl(quantity_in_process,0) + l_quantity
7530     WHERE transaction_id = l_trans_id;
7531   END LOOP;
7532   CLOSE C2;
7533 
7534   UPDATE wip_flow_schedules
7535   SET request_id = NULL,
7536 	scheduled_flag = 1
7537   WHERE request_id = USERENV('SESSIONID');
7538 
7539 END Post_Schedule_Update;
7540 
7541 PROCEDURE Explode_New_Items
7542 IS
7543   CURSOR C1 IS
7544   SELECT distinct primary_item_id, organization_id, alternate_bom_designator
7545   FROM wip_flow_schedules
7546   WHERE request_id = USERENV('SESSIONID');
7547 
7548   l_item_id		NUMBER;
7549   l_org_id		NUMBER;
7550   l_alt_bom		VARCHAR2(10);
7551   l_error_msg		VARCHAR2(2000);
7552   l_error_code		NUMBER;
7553 
7554 BEGIN
7555 
7556   OPEN C1;
7557 
7558   LOOP
7559     FETCH C1 INTO l_item_id, l_org_id, l_alt_bom;
7560     EXIT WHEN C1%NOTFOUND;
7561 
7562     BOM_OE_EXPLODER_PKG.be_exploder(
7563         arg_org_id => l_org_id,
7564         arg_starting_rev_date => sysdate - 3,
7565         arg_expl_type => 'ALL',
7566         arg_order_by => 1,
7567         arg_levels_to_explode => 20,
7568         arg_item_id => l_item_id,
7569         arg_comp_code => '',
7570         arg_user_id => 0,
7571         arg_err_msg => l_error_msg,
7572         arg_error_code => l_error_code,
7573 	arg_alt_bom_desig => l_alt_bom
7574     );
7575 
7576     IF l_error_code = 9998 THEN
7577       -- Do nothing, there was just no bill to explode
7578       NULL;
7579     ELSIF l_error_code <> 0 THEN
7580       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
7581         FND_MESSAGE.SET_NAME('BOM',l_error_msg);
7582         FND_MSG_PUB.Add;
7583       END IF;
7584       RAISE FND_API.G_EXC_ERROR;
7585     END IF;
7586 
7587   END LOOP;
7588 
7589   CLOSE C1;
7590 
7591 END Explode_New_Items;
7592 
7593 
7594 /** Bug 2906437 -- Calculate_Needed--
7595       all right hand side expressions are nvl-ed
7596       and weeded out old commented code
7597 **/
7598 PROCEDURE calculate_needed(i_root	IN	NUMBER) IS
7599   l_index	NUMBER;
7600 BEGIN
7601   IF l_lines.COUNT <= 0 THEN
7602     RETURN;
7603   END IF;
7604   IF l_lines(i_root).first_child IS NOT NULL THEN  -- Not a Leaf
7605     l_lines(i_root).needed_quantity := 0;
7606     l_index := l_lines(i_root).first_child;
7607     LOOP
7608       calculate_needed(l_index);
7609       l_lines(i_root).needed_quantity := nvl(l_lines(i_root).needed_quantity,0) +
7610 	                                 nvl(l_lines(l_index).needed_quantity,0);
7611       EXIT WHEN l_lines(l_index).next_brother IS NULL;
7612       l_index := l_lines(l_index).next_brother;
7613     END LOOP;
7614     l_lines(i_root).needed_quantity := nvl(l_lines(i_root).needed_quantity,0) +
7615 	nvl(l_lines(i_root).order_quantity,0) - nvl(l_lines(i_root).fs_quantity,0);
7616     IF l_lines(i_root).needed_quantity < 0 THEN
7617       l_lines(i_root).needed_quantity := 0;
7618     END IF;
7619   ELSE  -- Leaf
7620     -- calculate needed_quantity
7621     l_lines(i_root).needed_quantity :=
7622 	greatest(nvl(l_lines(i_root).order_quantity,0) - nvl(l_lines(i_root).fs_quantity,0),
7623 		 0);
7624   END IF;
7625 END calculate_needed;
7626 
7627 
7628 PROCEDURE distribute_quantity(i_root	IN	NUMBER) IS
7629   l_index	NUMBER;
7630   l_index1      NUMBER; -- Bug 3039782
7631   l_index2      NUMBER; -- Bug 3039782
7632   l_overquantity	NUMBER;
7633   l_flag    BOOLEAN := TRUE;  -- Bug 3267542
7634 BEGIN
7635   IF l_lines.COUNT <= 0 THEN
7636     RETURN;
7637   END IF;
7638   IF l_lines(i_root).first_child IS NOT NULL THEN  -- Not a Leaf
7639     l_overquantity := l_lines(i_root).fs_quantity +
7640 			l_lines(i_root).distributed_quantity -
7641 			l_lines(i_root).order_quantity;
7642     IF l_overquantity <= 0 THEN
7643   /* Bug 3039782 -- Code additition starts */
7644 /***************************************************
7645      Removed code added in fix for bug 2906437
7646      and added the following
7647 *****************************************************/
7648         l_index2 := l_lines(i_root).first_child;
7649         loop
7650           l_lines(l_index2).distributed_quantity := 0;
7651           distribute_quantity(l_index2);
7652           EXIT WHEN l_lines(l_index2).next_brother IS NULL;
7653           l_index2 := l_lines(l_index2).next_brother;
7654         end loop;
7655   /* Bug 3039782 -- Code additition ends */
7656       l_lines(i_root).needed_quantity := 0 - l_overquantity;
7657       RETURN;
7658     ELSE
7659     /*************************************************************************
7660      Bug 2536351-
7661      Whole logic of filling up overquantity is changed, rather made opposite.
7662      Now, any 'overqunatity' obtained from parent is being filled up starting
7663      from last child to first child browsing through previous brothers
7664     **************************************************************************/
7665       l_lines(i_root).needed_quantity := 0;
7666       l_index := l_lines(i_root).last_child;
7667       LOOP
7668         IF l_lines(l_index).needed_quantity > 0 THEN
7669           IF l_lines(l_index).needed_quantity > l_overquantity THEN
7670 	    l_lines(l_index).distributed_quantity := l_overquantity;
7671 	    l_overquantity := 0;
7672           ELSE
7673 	    l_lines(l_index).distributed_quantity := l_lines(l_index).needed_quantity;
7674 	    l_overquantity := l_overquantity - l_lines(l_index).needed_quantity;
7675           END IF;
7676 	  distribute_quantity(l_index);
7677         END IF;
7678         /*Bug 3267542 -
7679         EXIT WHEN l_lines(l_index).previous_brother IS NULL or l_overquantity <= 0;
7680         Commented the above line and added the following to set l_flag */
7681         IF l_lines(l_index).previous_brother IS NULL or l_overquantity <= 0 THEN
7682           IF l_lines(l_index).previous_brother IS NULL THEN
7683             l_flag := FALSE;
7684           ELSE
7685             l_flag := TRUE;
7686             l_index1 := l_lines(l_index).previous_brother;
7687           END IF;
7688           EXIT;
7689         END IF;
7690         /*Bug 3267542 - addition for bug ends */
7691         l_index := l_lines(l_index).previous_brother;
7692 	/** Modification for Bug 2536351 **/
7693       END LOOP; -- All Children
7694     END IF; -- Overquantity > 0
7695   /* Bug 3039782 -- Code additition starts */
7696 /***************************************************
7697      Removed code added in fix for bug 2906437
7698      and added the following
7699 *****************************************************/
7700      /*Bug 3267542 - modification starts. Call distribute_quantity util no prev. brother, if l_flag is set*/
7701      if l_flag then
7702        loop
7703          distribute_quantity(l_index1);
7704          EXIT WHEN l_lines(l_index1).previous_brother IS NULL;
7705          l_index1 := l_lines(l_index1).previous_brother;
7706        end loop;
7707      end if;
7708      /*Bug 3267542 - modification ends*/
7709   /* Bug 3039782 -- Code additition ends */
7710   ELSE
7711     -- nothing to distribute
7712     l_lines(i_root).needed_quantity :=
7713 	greatest(l_lines(i_root).needed_quantity -
7714 		 l_lines(i_root).distributed_quantity,
7715 		 0);
7716   END IF;
7717 END distribute_quantity;
7718 
7719 /*Bug 3042045 - new parameter p_use_open_quantity added*/
7720 FUNCTION get_flow_quantity_split(p_demand_source_line	  IN	VARCHAR2,
7721 				 p_demand_source_type     IN 	NUMBER,
7722 				 p_demand_source_delivery IN    VARCHAR2,
7723                                  p_use_open_quantity      IN    VARCHAR2 )
7724 RETURN NUMBER
7725 IS
7726 
7727 --
7728 -- Local Variables and Cursors
7729 --
7730   l_header_id	number;
7731   l_item_id	number;
7732 
7733 /*Bug 3042045*/
7734   CURSOR all_lines(i_header_id number, i_item_id number) IS
7735     SELECT line_id,
7736            --fix bug#3417588
7737 	   decode(nvl(p_use_open_quantity, 'N'), 'Y',
7738 	     decode(SL.SHIPPED_QUANTITY, NULL,
7739                greatest(INV_DECIMALS_PUB.GET_PRIMARY_QUANTITY(SL.SHIP_FROM_ORG_ID,
7740  			SL.INVENTORY_ITEM_ID,
7741 			SL.ORDER_QUANTITY_UOM,
7742 			SL.ORDERED_QUANTITY)
7743 		    - MRP_FLOW_SCHEDULE_UTIL.GET_RESERVATION_QUANTITY(
7744 			SL.SHIP_FROM_ORG_ID,
7745 			SL.INVENTORY_ITEM_ID,
7746 			SL.LINE_ID,
7747 			p_use_open_quantity), 0),
7748                0),
7749              greatest(INV_DECIMALS_PUB.GET_PRIMARY_QUANTITY(SL.SHIP_FROM_ORG_ID,
7750  			SL.INVENTORY_ITEM_ID,
7751 			SL.ORDER_QUANTITY_UOM,
7752 			SL.ORDERED_QUANTITY)
7753 		    - MRP_FLOW_SCHEDULE_UTIL.GET_RESERVATION_QUANTITY(
7754 			SL.SHIP_FROM_ORG_ID,
7755 			SL.INVENTORY_ITEM_ID,
7756 			SL.LINE_ID,
7757 			p_use_open_quantity), 0))
7758              order_quantity,
7759              --end of fix bug#3417588
7760 	   split_from_line_id parent_line_id
7761     FROM oe_order_lines_all sl
7762     WHERE header_id = i_header_id
7763       AND inventory_item_id = i_item_id
7764     ORDER BY sl.line_id;
7765 
7766   l_root_id	NUMBER;
7767   l_this_root	NUMBER;
7768   l_index	NUMBER;
7769   l_index_temp	NUMBER;
7770 
7771 BEGIN
7772   -- get the header and item id
7773   SELECT header_id, inventory_item_id
7774   INTO l_header_id, l_item_id
7775   FROM oe_order_lines_all
7776   WHERE line_id = to_number(p_demand_source_line);
7777 
7778   -- get all potentially relevant lines
7779   l_lines.DELETE;
7780   FOR line_rec IN all_lines(l_header_id, l_item_id) LOOP
7781     -- fetch line_id, order_quantity, parent_line_id
7782     l_lines(line_rec.line_id).line_id := line_rec.line_id;
7783     l_lines(line_rec.line_id).order_quantity := line_rec.order_quantity;
7784     l_lines(line_rec.line_id).parent_line_id := line_rec.parent_line_id;
7785   END LOOP;
7786 
7787   -- this shouldn't happen
7788   IF l_lines.COUNT <= 0 THEN
7789     RETURN 0;
7790   END IF;
7791 
7792   --
7793   -- Build Tree
7794   --
7795   -- find root
7796   l_root_id := to_number(p_demand_source_line);
7797   WHILE l_lines(l_root_id).parent_line_id IS NOT NULL LOOP
7798     l_root_id := l_lines(l_root_id).parent_line_id;
7799   END LOOP;
7800   -- delete un-relevant lines
7801   l_index := l_lines.FIRST;
7802   LOOP
7803     -- Find the root for this line
7804     l_this_root := l_lines(l_index).line_id;
7805     WHILE l_lines(l_this_root).parent_line_id IS NOT NULL LOOP
7806       l_this_root := l_lines(l_this_root).parent_line_id;
7807       IF NOT l_lines.EXISTS(l_this_root) THEN
7808         EXIT;
7809       END IF;
7810     END LOOP;
7811     -- If a different root, then delete
7812     IF l_this_root <> l_root_id THEN
7813       l_index_temp := l_index;
7814       IF l_index = l_lines.LAST THEN
7815         l_lines.DELETE(l_index_temp);
7816         EXIT;
7817       ELSE
7818         l_index := l_lines.NEXT(l_index);
7819         l_lines.DELETE(l_index_temp);
7820       END IF;
7821     ELSE  -- If in the same root, plug into the tree
7822       IF l_lines(l_index).parent_line_id IS NOT NULL THEN
7823         IF l_lines(l_lines(l_index).parent_line_id).first_child IS NULL THEN
7824           l_lines(l_lines(l_index).parent_line_id).first_child := l_index;
7825           l_lines(l_lines(l_index).parent_line_id).last_child := l_index;
7826         ELSE
7827           l_lines(l_lines(l_lines(l_index).parent_line_id).last_child).next_brother := l_index;
7828           l_lines(l_lines(l_index).parent_line_id).last_child := l_index;
7829         END IF;
7830       END IF;
7831       EXIT WHEN l_index = l_lines.LAST;
7832       l_index := l_lines.NEXT(l_index);
7833     END IF;
7834   END LOOP;
7835 
7836 /** Bug 2536351 - update previous_brother of each child node **/
7837   for i in l_lines.FIRST..l_lines.LAST
7838   LOOP
7839     if (l_lines.exists(i)) then
7840       if (l_lines(i).next_brother is NOT NULL) THEN
7841         l_lines(l_lines(i).next_brother).previous_brother := i;
7842       END IF;
7843     end if;
7844   END LOOP;
7845 /** Bug 2536351 - update previous_brother ends ****************/
7846 
7847   -- query flow quantity
7848   l_index := l_lines.FIRST;
7849   LOOP
7850 /*Bug 3042045 - modified decode statement
7851     if 'Use Open Quantity' = 'Y'         - if 'closed schedule' return 0,
7852                                              else return (planned_quantity minus quantity_completed)
7853     if 'Use Open Quantity' = 'N' or NULL - if 'closed schedule' return quantity_completed,
7854                                              else return planned_quantity
7855 */
7856     SELECT nvl(sum(decode(nvl(p_use_open_quantity,'N'),'Y',decode(status,2,0,
7857                                                                           (planned_quantity-quantity_completed)),
7858                                                            decode(status,2,quantity_completed,
7859  	 		                                                   planned_quantity))),0)
7860     INTO l_lines(l_index).fs_quantity
7861     FROM wip_flow_schedules
7862     WHERE primary_item_id = l_item_id
7863       AND demand_source_line = to_char(l_lines(l_index).line_id)
7864       AND demand_source_type = p_demand_source_type
7865       AND ((demand_source_delivery IS NULL) or
7866 	   (demand_source_delivery = p_demand_source_delivery));
7867     l_lines(l_index).distributed_quantity := 0;
7868     EXIT WHEN l_index = l_lines.LAST;
7869     l_index := l_lines.NEXT(l_index);
7870   END LOOP;
7871 
7872   -- calculate needed quantity
7873   calculate_needed(l_root_id);
7874   -- distribute quantity
7875   distribute_quantity(l_root_id);
7876   --return l_lines(to_number(p_demand_source_line)).fs_quantity;
7877   /** Bug 2536351 **/
7878   RETURN greatest(l_lines(to_number(p_demand_source_line)).order_quantity -
7879 	          l_lines(to_number(p_demand_source_line)).needed_quantity,0);
7880 EXCEPTION
7881   WHEN OTHERS THEN
7882     RETURN 0;
7883 END get_flow_quantity_split;
7884 
7885 /*Bug 3042045 - new parameter p_use_open_quantity added*/
7886 FUNCTION Get_Flow_Quantity(	p_demand_source_line	 IN	VARCHAR2,
7887 				p_demand_source_type 	 IN 	NUMBER,
7888 				p_demand_source_delivery IN     VARCHAR2,
7889 				p_use_open_quantity      IN     VARCHAR2 )
7890 RETURN NUMBER
7891 IS
7892 
7893 /*Bug 3042045 - modified decode statement
7894     if 'Use Open Quantity' = 'Y'         - if 'closed schedule' return 0,
7895                                              else return (planned_quantity minus quantity_completed)
7896     if 'Use Open Quantity' = 'N' or NULL - if 'closed schedule' return quantity_completed,
7897                                              else return planned_quantity
7898 */
7899   CURSOR FLOW_QUANTITY IS
7900   SELECT nvl(sum(decode(nvl(p_use_open_quantity,'N'),'Y',decode(status,2,0,
7901                                                                         (planned_quantity-quantity_completed)),
7902                                                          decode(status,2,quantity_completed,
7903   		                                                         planned_quantity))),0)
7904   FROM wip_flow_schedules
7905   WHERE demand_source_line = p_demand_source_line
7906   AND demand_source_type = p_demand_source_type
7907   AND ((demand_source_delivery IS NULL)or(demand_source_delivery = p_demand_source_delivery));
7908 
7909   l_quantity	NUMBER := 0;
7910   l_split_from_line	NUMBER := NULL;
7911 BEGIN
7912   IF p_demand_source_type = 2 THEN
7913     SELECT split_from_line_id
7914     INTO l_split_from_line
7915     FROM oe_order_lines_all
7916     WHERE line_id = to_number(p_demand_source_line);
7917   END IF;
7918 
7919   IF l_split_from_line IS NOT NULL THEN
7920     return get_flow_quantity_split(p_demand_source_line,
7921 				   p_demand_source_type,
7922 				   p_demand_source_delivery,
7923 				   p_use_open_quantity);                  /*Bug 3042045*/
7924   ELSE
7925     OPEN FLOW_QUANTITY;
7926     FETCH FLOW_QUANTITY INTO l_quantity;
7927     CLOSE FLOW_QUANTITY;
7928 
7929     RETURN l_quantity;
7930   END IF;
7931 EXCEPTION
7932 
7933   WHEN NO_DATA_FOUND THEN
7934 
7935     RETURN 0;
7936 
7937 END Get_Flow_Quantity;
7938 
7939 FUNCTION Get_Demand_Project(	p_demand_id 	IN 	NUMBER,
7940 				p_type		IN	NUMBER )
7941 RETURN NUMBER
7942 IS
7943 
7944   CURSOR DEMAND_PROJECT IS
7945   SELECT project_id, task_id
7946   FROM pjm_project_demand_v
7947   WHERE demand_id = p_demand_id;
7948 
7949   l_project_id	NUMBER;
7950   l_task_id	NUMBER;
7951 
7952 BEGIN
7953 
7954   OPEN DEMAND_PROJECT;
7955   FETCH DEMAND_PROJECT INTO l_project_id, l_task_id;
7956   CLOSE DEMAND_PROJECT;
7957 
7958   IF p_type = 1 THEN
7959     RETURN l_project_id;
7960   ELSIF p_type = 2 THEN
7961     RETURN l_task_id;
7962   END IF;
7963 
7964 EXCEPTION
7965 
7966   WHEN NO_DATA_FOUND THEN
7967 
7968     RETURN NULL;
7969 
7970 END Get_Demand_Project;
7971 
7972 FUNCTION check_ato_holds(p_line_id      IN      NUMBER,
7973                         p_header_id     IN      NUMBER,
7974                         p_action_id     IN      NUMBER)
7975 RETURN NUMBER IS
7976 
7977   l_check_holds_result     VARCHAR2(30);
7978   l_return_status          VARCHAR2(30);
7979   l_msg_count              NUMBER;
7980   l_msg_data               VARCHAR2(2000);
7981   l_return NUMBER;
7982 
7983 BEGIN
7984      OE_HOLDS_PUB.Check_Holds
7985           (p_api_version      => 1.0
7986           ,p_header_id        => p_header_id
7987           ,p_line_id          => p_line_id
7988           ,x_result_out       => l_check_holds_result
7989           ,x_return_status    => l_return_status
7990           ,x_msg_count        => l_msg_count
7991           ,x_msg_data         => l_msg_data
7992      );
7993 
7994      l_return := 1;
7995      IF ( l_return_status = FND_API.G_RET_STS_SUCCESS AND
7996           l_check_holds_result = FND_API.G_FALSE ) THEN
7997              l_return := 0;
7998      END IF;
7999 
8000      return l_return;
8001 
8002 EXCEPTION
8003  WHEN OTHERS THEN
8004   mrp_util.mrp_log('Excpetion during checking holds ' || sqlerrm );
8005   return 1;
8006 
8007 END Check_ATO_Holds;
8008 
8009 /*Bug 3042045 - new parameter p_use_open_quantity added*/
8010 FUNCTION Get_Reservation_Quantity ( p_org_id   IN NUMBER,
8011                                     p_item_id  IN NUMBER,
8012                                     p_line_id  IN NUMBER,
8013                                     p_use_open_quantity IN VARCHAR2 )
8014 RETURN NUMBER IS
8015 
8016   l_reserved_qty        NUMBER := 0;
8017   l_wip_state_qty       NUMBER := 0;
8018 
8019 BEGIN
8020 
8021    /* Fix bug 2466429, do UOM conversion. */
8022 
8023    /*fix bug#3294125: Added 'demand_source_line = nvl (p_line_id,-1)'.
8024     *This would allow the reservation qty to be taken into account
8025     *whenever the order source is inconsistent with the corresponding
8026     *flow schedule.
8027     */
8028    SELECT nvl(sum(INV_DECIMALS_PUB.GET_PRIMARY_QUANTITY(P_ORG_ID,
8029 						       P_ITEM_ID,
8030 						       RESERVATION_UOM_CODE,
8031 						       RESERVATION_QUANTITY)), 0)
8032    INTO l_reserved_qty
8033    FROM mtl_reservations
8034    WHERE organization_id = p_org_id
8035      AND inventory_item_id = p_item_id
8036      AND demand_source_line_id = p_line_id
8037      AND ( nvl(p_use_open_quantity,'N') = 'N'
8038            and (supply_source_header_id is NULL
8039                 or not exists (select wip_entity_id
8040                                from wip_flow_schedules
8041 		               where wip_entity_id = supply_source_header_id
8042                                  and demand_source_line = nvl(p_line_id,-1))
8043                 )
8044            or nvl(p_use_open_quantity,'N') = 'Y') ;  /*Bug 3042045 - do not check supply source for ATO items*/
8045 
8046   if p_use_open_quantity = 'Y' then
8047      SELECT nvl(SUM(mtrl.primary_quantity),0)
8048      INTO l_wip_state_qty
8049      FROM mtl_txn_request_lines mtrl, wms_license_plate_numbers wlpn, wip_lpn_completions wlc
8050      WHERE mtrl.organization_id = p_org_id
8051        AND mtrl.inventory_item_id = p_item_id
8052        AND NVL(mtrl.quantity_delivered, 0) = 0
8053        AND mtrl.line_status <> inv_globals.g_to_status_closed
8054        AND mtrl.lpn_id = wlpn.lpn_id
8055        AND wlpn.lpn_context = 2 -- WIP
8056        AND wlc.header_id = mtrl.reference_id
8057        AND wlc.wip_entity_id = mtrl.txn_source_id
8058        AND wlc.lpn_id = mtrl.lpn_id
8059        AND wlc.inventory_item_id = mtrl.inventory_item_id
8060        AND wlc.organization_id = mtrl.organization_id
8061        AND wlc.demand_source_line = p_line_id
8062        AND wlc.wip_entity_type = 4;
8063 
8064      l_reserved_qty := l_reserved_qty + l_wip_state_qty;
8065   end if;
8066 
8067   RETURN l_reserved_qty;
8068 
8069 END Get_Reservation_Quantity;
8070 
8071 FUNCTION check_std_holds(p_line_id  IN NUMBER) return NUMBER
8072 IS
8073   CURSOR OM_LINE_STD_HOLDS IS
8074     SELECT count(*)
8075     FROM   oe_hold_sources_all hs,
8076            oe_order_holds_all oh,
8077            oe_hold_definitions hd
8078     WHERE  oh.hold_source_id = hs.hold_source_id
8079     AND    oh.line_id = p_line_id
8080     AND    oh.hold_release_id IS NULL
8081     AND    hd.item_type = 'OEOL'
8082     AND    hd.activity_name = 'LINE_SCHEDULING'
8083     AND    hd.hold_id = hs.hold_id;
8084 
8085   l_cnt NUMBER;
8086   l_return NUMBER;
8087 BEGIN
8088    OPEN OM_LINE_STD_HOLDS;
8089    FETCH OM_LINE_STD_HOLDS INTO l_cnt;
8090    CLOSE OM_LINE_STD_HOLDS;
8091    if( l_cnt > 0) then
8092       l_return := 1;
8093     else
8094       l_return := 0;
8095     end if;
8096 
8097     return l_return;
8098 EXCEPTION WHEN OTHERS THEN
8099   return 0;
8100 
8101 END check_std_holds;
8102 
8103 /*
8104  * Check holds on order header/line
8105  * if p_wf_item and p_wf_activity both are null
8106  * then only check generic holds. Otherwise
8107  * check for both generic and the specifid activity holds
8108  *
8109  */
8110 FUNCTION Check_Holds(
8111         p_header_id     IN NUMBER,
8112         p_line_id       IN NUMBER ,
8113         p_wf_item       IN VARCHAR2,
8114         p_wf_activity   IN VARCHAR2)
8115 return number
8116 IS
8117   l_check_holds_result     VARCHAR2(30);
8118   l_return_status          VARCHAR2(30);
8119   l_msg_count              NUMBER;
8120   l_msg_data               VARCHAR2(2000);
8121   l_return NUMBER;
8122 
8123 BEGIN
8124      OE_HOLDS_PUB.Check_Holds
8125           (p_api_version      => 1.0
8126           ,p_header_id        => p_header_id
8127           ,p_line_id          => p_line_id
8128           ,p_wf_item          => p_wf_item
8129           ,p_wf_activity      => p_wf_activity
8130           ,x_result_out       => l_check_holds_result
8131           ,x_return_status    => l_return_status
8132           ,x_msg_count        => l_msg_count
8133           ,x_msg_data         => l_msg_data
8134      );
8135 
8136      l_return := 1;
8137      IF ( l_return_status = FND_API.G_RET_STS_SUCCESS AND
8138           l_check_holds_result = FND_API.G_FALSE ) THEN
8139              l_return := 0;
8140      END IF;
8141 
8142      return l_return;
8143 EXCEPTION
8144  WHEN OTHERS THEN
8145   mrp_util.mrp_log('Excpetion during checking holds ' || sqlerrm );
8146   return 1;
8147 END Check_Holds;
8148 
8149 FUNCTION get_routing_designator(
8150         p_item_id IN NUMBER,
8151         p_organization_id IN NUMBER,
8152         p_line_id IN NUMBER)
8153 RETURN VARCHAR2 IS
8154 
8155   CURSOR C_ALT IS
8156   SELECT alternate_routing_designator
8157   FROM bom_operational_routings
8158   WHERE line_id = p_line_id
8159   AND assembly_item_id = p_item_id
8160   AND organization_id = p_organization_id
8161   AND cfm_routing_flag = 1
8162   ORDER BY alternate_routing_designator desc;
8163 
8164   l_alt_rtg_desig VARCHAR2(10) := null;
8165 BEGIN
8166    OPEN C_ALT;
8167    LOOP
8168      FETCH C_ALT into l_alt_rtg_desig;
8169      /* We just want one row so exit */
8170      EXIT;
8171    END LOOP;
8172    CLOSE C_ALT;
8173 
8174    RETURN l_alt_rtg_desig;
8175 
8176 END get_routing_designator;
8177 
8178 
8179 END MRP_Flow_Schedule_Util;