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