DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_PP_MATERIALS_PVT

Source


1 PACKAGE BODY AHL_PP_MATERIALS_PVT AS
2 /* $Header: AHLVPPMB.pls 120.25.12020000.2 2012/12/07 11:33:38 sareepar ship $*/
3 --
4 -----------------------
5 -- Declare Constants --
6 -----------------------
7 G_PKG_NAME  VARCHAR2(30)  := 'AHL_PP_MATERIALS_PVT';
8 G_DEBUG     VARCHAR2(1)   := AHL_DEBUG_PUB.is_log_enabled;
9 -------------------------------------------------
10 -- Declare Locally used Record and Table Types --
11 -------------------------------------------------
12 ------------------------------
13 -- Declare Local Procedures --
14 ------------------------------
15   -- Procedure to get organization ID
16 PROCEDURE Check_org_name_Or_Id
17    (p_organization_id     IN NUMBER,
18     p_org_name            IN VARCHAR2,
19     x_organization_id     OUT NOCOPY NUMBER,
20     x_return_status       OUT NOCOPY VARCHAR2,
21     x_error_msg_code      OUT NOCOPY VARCHAR2
22     );
23  -- Procedure to get department ID
24 PROCEDURE Check_dept_desc_Or_Id
25    (p_organization_id     IN NUMBER,
26     p_org_name            IN VARCHAR2,
27     p_department_id       IN NUMBER,
28     p_dept_description    IN VARCHAR2,
29     x_department_id       OUT NOCOPY NUMBER,
30     x_return_status       OUT NOCOPY VARCHAR2,
31     x_error_msg_code      OUT NOCOPY VARCHAR2
32      );
33  -- Procedure to get visit task ID
34 PROCEDURE Get_visit_task_Id
35    (p_workorder_id        IN NUMBER,
36     x_visit_task_id       OUT NOCOPY NUMBER,
37     x_return_status       OUT NOCOPY VARCHAR2,
38     x_error_msg_code      OUT NOCOPY VARCHAR2
39      );
40 -- Procedure to get inventory item ID
41 PROCEDURE Get_inventory_item_Id
42    (p_inventory_item_id       IN  NUMBER,
43     p_concatenated_segments   IN  VARCHAR2,
44     p_organization_id         IN  NUMBER,
45     x_inventory_item_id       OUT NOCOPY NUMBER,
46     x_return_status           OUT NOCOPY VARCHAR2,
47     x_error_msg_code          OUT NOCOPY VARCHAR2
48    );
49 -- Procedure to get visit task details
50 PROCEDURE Get_visit_task_details
51     ( p_visit_task_id       IN NUMBER,
52       x_visit_id            OUT NOCOPY NUMBER,
53       x_organization_id     OUT NOCOPY NUMBER,
54       x_department_id       OUT NOCOPY NUMBER,
55       x_project_task_id     OUT NOCOPY NUMBER,
56       x_project_id          OUT NOCOPY NUMBER
57     );
58 PROCEDURE Get_workorder_Id
59    (p_workorder_id        IN  NUMBER,
60     p_job_number          IN VARCHAR2,
61     x_workorder_id        OUT NOCOPY NUMBER,
62     x_return_status       OUT NOCOPY VARCHAR2,
63     x_error_msg_code      OUT NOCOPY VARCHAR2
64    );
65 PROCEDURE Get_workorder_operation_Id
66    (p_workorder_id        IN  NUMBER,
67     p_operation_sequence  IN  NUMBER,
68     x_workorder_operation_id  OUT NOCOPY NUMBER,
69     x_return_status       OUT NOCOPY VARCHAR2,
70     x_error_msg_code      OUT NOCOPY VARCHAR2
71    );
72 TYPE dff_default_values_type IS RECORD
73 (
74   ATTRIBUTE_CATEGORY        VARCHAR2(30),
75   ATTRIBUTE1                VARCHAR2(150),
76   ATTRIBUTE2                VARCHAR2(150),
77   ATTRIBUTE3                VARCHAR2(150),
78   ATTRIBUTE4                VARCHAR2(150),
79   ATTRIBUTE5                VARCHAR2(150),
80   ATTRIBUTE6                VARCHAR2(150),
81   ATTRIBUTE7                VARCHAR2(150),
82   ATTRIBUTE8                VARCHAR2(150),
83   ATTRIBUTE9                VARCHAR2(150),
84   ATTRIBUTE10               VARCHAR2(150),
85   ATTRIBUTE11               VARCHAR2(150),
86   ATTRIBUTE12               VARCHAR2(150),
87   ATTRIBUTE13               VARCHAR2(150),
88   ATTRIBUTE14               VARCHAR2(150),
89   ATTRIBUTE15               VARCHAR2(150)
90 );
91 PROCEDURE get_dff_default_values
92 (
93    p_req_material_rec       IN REQ_MATERIAL_REC_TYPE,
94    flex_fields_defaults     OUT NOCOPY dff_default_values_type
95 );
96 --sukhwsin: procedure declaration for SB Effectivity - starts
97 PROCEDURE Get_mc_header_id
98    (p_mc_header_id       IN  NUMBER,
99     p_mc_name            IN  VARCHAR2,
100     p_workorder_id       IN  NUMBER,
101     x_mc_header_id       OUT NOCOPY NUMBER,
102     x_return_status      OUT NOCOPY VARCHAR2,
103     x_msg_data           OUT NOCOPY VARCHAR2
104    );
105 PROCEDURE Get_mc_position_key
106    (p_mc_header_id       IN  NUMBER,
107     p_mc_position        IN  VARCHAR2,
108     p_mc_position_key    IN  NUMBER,
109     x_mc_position_key    OUT NOCOPY NUMBER,
110     x_relationship_id    OUT NOCOPY NUMBER,
111     x_return_status      OUT NOCOPY VARCHAR2,
112     x_msg_data           OUT NOCOPY VARCHAR2
113    );
114 PROCEDURE Get_item_group_id
115    (p_item_group_name  IN  VARCHAR2,
116     p_item_group_id    IN  NUMBER,
117     x_item_group_id    OUT NOCOPY NUMBER,
118     x_return_status    OUT NOCOPY VARCHAR2,
119     x_msg_data         OUT NOCOPY VARCHAR2
120    );
121 PROCEDURE Get_item_Id_from_item_group
122    (p_item_group_id         IN  NUMBER,
123     p_inventory_item_id     IN  NUMBER,
124     p_concatenated_segments IN  VARCHAR2,
125     p_organization_id       IN  NUMBER,
126     x_inventory_item_id     OUT NOCOPY NUMBER,
127     x_return_status         OUT NOCOPY VARCHAR2,
128     x_msg_data              OUT NOCOPY VARCHAR2
129    );
130 PROCEDURE Get_item_Id_from_mc_pos
131    (p_relationship_id       IN NUMBER,
132     p_inventory_item_id     IN NUMBER,
133     p_concatenated_segments IN VARCHAR2,
134     p_organization_id       IN NUMBER,
135     x_inventory_item_id     OUT NOCOPY NUMBER,
136     x_return_status         OUT NOCOPY VARCHAR2,
137     x_msg_data              OUT NOCOPY VARCHAR2
138    );
139 PROCEDURE Validate_mat_req_record
140     ( p_mc_header_id        IN  NUMBER,
141       p_mc_position_key     IN  NUMBER,
142       p_item_group_id       IN  NUMBER,
143       p_inventory_item_id   IN  NUMBER,
144       x_return_status       OUT NOCOPY VARCHAR2,
145       x_msg_data            OUT NOCOPY VARCHAR2
146    );
147 --sukhwsin: procedure declaration for SB Effectivity - ends
148 -------------------------------------
149 -- End Local Procedures Declaration--
150 -------------------------------------
151 PROCEDURE Check_org_name_Or_Id
152     (p_organization_id     IN NUMBER,
153      p_org_name            IN VARCHAR2,
154      x_organization_id     OUT NOCOPY NUMBER,
155      x_return_status       OUT NOCOPY VARCHAR2,
156      x_error_msg_code      OUT NOCOPY VARCHAR2
157      )
158    IS
159 BEGIN
160       IF (p_organization_id IS NOT NULL AND
161           p_organization_id <> FND_API.G_MISS_NUM)
162        THEN
163           SELECT organization_id
164               INTO x_organization_id
165             FROM HR_ALL_ORGANIZATION_UNITS
166           WHERE organization_id   = p_organization_id;
167       ELSE
168           SELECT organization_id
169               INTO x_organization_id
170             FROM HR_ALL_ORGANIZATION_UNITS
171           WHERE NAME  = p_org_name;
172       END IF;
173       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
174 EXCEPTION
175        WHEN NO_DATA_FOUND THEN
176          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
177          x_error_msg_code:= 'AHL_PP_ORG_ID_NOT_EXISTS';
178        WHEN TOO_MANY_ROWS THEN
179          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
180          x_error_msg_code:= 'AHL_PP_ORG_ID_NOT_EXISTS';
181        WHEN OTHERS THEN
182          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
183          RAISE;
184 END Check_org_name_Or_Id;
185 --
186 PROCEDURE Check_dept_desc_Or_Id
187     (p_organization_id     IN NUMBER,
188      p_org_name            IN VARCHAR2,
189      p_department_id       IN NUMBER,
190      p_dept_description    IN VARCHAR2,
191      x_department_id       OUT NOCOPY NUMBER,
192      x_return_status       OUT NOCOPY VARCHAR2,
193      x_error_msg_code      OUT NOCOPY VARCHAR2
194      )
195    IS
196 BEGIN
197       IF (p_department_id IS NOT NULL AND
198           p_department_id <> FND_API.G_MISS_NUM)
199        THEN
200           SELECT department_id
201              INTO x_department_id
202             FROM BOM_DEPARTMENTS
203           WHERE organization_id = p_organization_id
204             AND department_id   = p_department_id;
205      ELSE
206       --
207           SELECT department_id
208              INTO x_department_id
209            FROM BOM_DEPARTMENTS
210           WHERE organization_id =  p_organization_id
211             AND description = p_dept_description;
212       END IF;
213       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
214 EXCEPTION
215        WHEN NO_DATA_FOUND THEN
216          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
217          x_error_msg_code:= 'AHL_PP_DEPT_ID_NOT_EXIST';
218        WHEN TOO_MANY_ROWS THEN
219          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
220          x_error_msg_code:= 'AHL_PP_DEPT_ID_NOT_EXIST';
221        WHEN OTHERS THEN
222          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
223          RAISE;
224 END Check_dept_desc_Or_Id;
225 --
226 PROCEDURE Get_visit_task_Id
227    (p_workorder_id        IN  NUMBER,
228     x_visit_task_id       OUT NOCOPY NUMBER,
229     x_return_status       OUT NOCOPY VARCHAR2,
230     x_error_msg_code      OUT NOCOPY VARCHAR2
231    ) IS
232  BEGIN
233     IF (p_workorder_id IS NOT NULL AND
234         p_workorder_id <> FND_API.G_MISS_NUM) THEN
235         SELECT visit_task_id INTO x_visit_task_id
236                FROM AHL_WORKORDERS
237             WHERE workorder_id = p_workorder_id;
238       END IF;
239              x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
240    IF G_DEBUG='Y' THEN
241       AHL_DEBUG_PUB.debug( 'XVISITTASK:'|| x_visit_task_id);
242    END IF;
243 EXCEPTION
244        WHEN NO_DATA_FOUND THEN
245          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
246          x_error_msg_code:= 'AHL_PP_TASK_ID_NOT_EXIST';
247        WHEN TOO_MANY_ROWS THEN
248          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
249          x_error_msg_code:= 'AHL_PP_TASK_ID_NOT_EXIST';
250        WHEN OTHERS THEN
251          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
252          RAISE;
253 END Get_visit_task_Id;
254 --
255 PROCEDURE Get_workorder_Id
256    (p_workorder_id        IN  NUMBER,
257     p_job_number          IN VARCHAR2,
258     x_workorder_id        OUT NOCOPY NUMBER,
259     x_return_status       OUT NOCOPY VARCHAR2,
260     x_error_msg_code      OUT NOCOPY VARCHAR2
261    ) IS
262   --
263  BEGIN
264    --
265     IF p_workorder_id IS NOT NULL THEN
266     --
267         SELECT workorder_id INTO x_workorder_id
268                FROM AHL_WORKORDERS
269             WHERE workorder_id = p_workorder_id;
270     ELSE
271      --
272           SELECT workorder_id INTO x_workorder_id
273                  FROM AHL_WORKORDERS
274                 WHERE workorder_name = p_job_number;
275       END IF;
276              x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
277    IF G_DEBUG='Y' THEN
278       AHL_DEBUG_PUB.debug( 'XWOID:'|| x_workorder_id);
279     END IF;
280 EXCEPTION
281        WHEN NO_DATA_FOUND THEN
282          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
283          x_error_msg_code:= 'AHL_PP_WO_ID_NOT_EXIST';
284        WHEN TOO_MANY_ROWS THEN
285          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
286          x_error_msg_code:= 'AHL_PP_WO_ID_NOT_EXIST';
287        WHEN OTHERS THEN
288          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
289          RAISE;
290 END Get_workorder_Id;
291 --
292 PROCEDURE Get_workorder_operation_Id
293    (p_workorder_id        IN  NUMBER,
294     p_operation_sequence  IN  NUMBER,
295     x_workorder_operation_id  OUT NOCOPY NUMBER,
296     x_return_status       OUT NOCOPY VARCHAR2,
297     x_error_msg_code      OUT NOCOPY VARCHAR2
298    ) IS
299  BEGIN
300     IF (p_workorder_id IS NOT NULL AND
301          p_operation_sequence IS NOT NULL) THEN
302        --
303         SELECT workorder_operation_id INTO x_workorder_operation_id
304                FROM AHL_WORKORDER_OPERATIONS
305             WHERE workorder_id = p_workorder_id
306              AND operation_sequence_num = p_operation_sequence;
307         --
308      END IF;
309              x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
310 EXCEPTION
311        WHEN NO_DATA_FOUND THEN
312          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
313          x_error_msg_code:= 'AHL_PP_WO_OP_ID_NOT_EXIST';
314        WHEN TOO_MANY_ROWS THEN
315          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
316          x_error_msg_code:= 'AHL_PP_WO_OP_ID_NOT_EXIST';
317        WHEN OTHERS THEN
318          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
319          RAISE;
320 END Get_workorder_operation_Id;
321 --
322 PROCEDURE Get_inventory_item_Id
323    (p_inventory_item_id       IN  NUMBER,
324     p_concatenated_segments   IN  VARCHAR2,
325     p_organization_id         IN  NUMBER,
326     x_inventory_item_id       OUT NOCOPY NUMBER,
327     x_return_status           OUT NOCOPY VARCHAR2,
328     x_error_msg_code          OUT NOCOPY VARCHAR2
329    ) IS
330  BEGIN
331     IF (p_inventory_item_id IS NOT NULL AND
332         p_inventory_item_id <> FND_API.G_MISS_NUM) THEN
333         --
334         SELECT inventory_item_id INTO x_inventory_item_id
335         FROM MTL_SYSTEM_ITEMS_KFV
336         WHERE inventory_item_id = p_inventory_item_id
337         AND organization_id = p_organization_id
338         AND inventory_item_flag = 'Y'
339         AND stock_enabled_flag = 'Y'
340         AND mtl_transactions_enabled_flag = 'Y'
341         AND nvl(enabled_flag,'N') = 'Y'
342         AND trunc(sysdate) between trunc(nvl(start_date_active, sysdate)) and trunc(nvl(end_date_active, sysdate));
343      ELSE
344         --
345         SELECT inventory_item_id INTO x_inventory_item_id
346         FROM MTL_SYSTEM_ITEMS_KFV
347         WHERE concatenated_segments = p_concatenated_segments
348         AND organization_id = p_organization_id
349         AND inventory_item_flag = 'Y'
350         AND stock_enabled_flag = 'Y'
351         AND mtl_transactions_enabled_flag = 'Y'
352         AND nvl(enabled_flag,'N') = 'Y'
353         AND trunc(sysdate) between trunc(nvl(start_date_active, sysdate)) and trunc(nvl(end_date_active, sysdate));
354      END IF;
355              x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
356 EXCEPTION
357        WHEN NO_DATA_FOUND THEN
358          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
359          x_error_msg_code:= 'AHL_PP_INVALID_ITEM';
360        WHEN OTHERS THEN
361          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
362          RAISE;
363 END Get_inventory_item_Id;
364 --
365 PROCEDURE Get_visit_task_details
366     ( p_visit_task_id       IN  NUMBER,
367       x_visit_id            OUT NOCOPY NUMBER,
368       x_organization_id     OUT NOCOPY NUMBER,
369       x_department_id       OUT NOCOPY NUMBER,
370       x_project_task_id     OUT NOCOPY NUMBER,
371       x_project_id          OUT NOCOPY NUMBER
372     )
373  IS
374    CURSOR get_visit_task_cur (c_visit_task_id IN NUMBER)
375      IS
376        SELECT visit_id,
377               department_id,project_task_id
378          FROM ahl_visit_tasks_b
379       WHERE visit_task_id = c_visit_task_id;
380   --
381   CURSOR get_org_details_cur(c_visit_id IN NUMBER)
382   IS
383      SELECT organization_id,department_id,
384             project_id
385         FROM ahl_visits_b
386       WHERE visit_id = c_visit_id;
387   --
388   l_visit_id        NUMBER;
389   l_department_id   NUMBER;
390   l_vdepartment_id  NUMBER;
391   l_project_task_id NUMBER;
392   l_project_id      NUMBER;
393   l_organization_id NUMBER;
394   l_schedule_designator VARCHAR2(10);
395   --
396  BEGIN
397     OPEN get_visit_task_cur(p_visit_task_id);
398     FETCH get_visit_task_cur INTO l_visit_id,l_department_id,l_project_task_id;
399     CLOSE get_visit_task_cur;
400     IF l_visit_id IS NOT NULL THEN
401        OPEN get_org_details_cur (l_visit_id);
402        FETCH get_org_details_cur INTO l_organization_id, l_vdepartment_id,
403                                       l_project_id;
404        CLOSE get_org_details_cur;
405     END IF;
406     --Assign
407       x_organization_id := l_organization_id;
408       x_department_id   := nvl(l_department_id,l_vdepartment_id);
409       x_visit_id        := l_visit_id;
410       x_project_task_id := l_project_task_id;
411       x_project_id       := l_project_id;
412  END Get_visit_task_details;
413 -- Insert procedure to create record in to schedule materials
414 PROCEDURE Insert_Row (
415   X_SCHEDULED_MATERIAL_ID IN NUMBER,
416   X_OBJECT_VERSION_NUMBER IN NUMBER,
417   X_INVENTORY_ITEM_ID IN VARCHAR2,
418   X_SCHEDULE_DESIGNATOR IN VARCHAR2,
419   X_VISIT_ID IN NUMBER,
420   X_VISIT_START_DATE IN DATE,
421   X_VISIT_TASK_ID IN NUMBER,
422   X_ORGANIZATION_ID IN NUMBER,
423   X_SCHEDULED_DATE IN DATE,
424   X_REQUEST_ID IN NUMBER,
425   X_REQUESTED_DATE IN DATE,
426   X_SCHEDULED_QUANTITY IN NUMBER,
427   X_PROCESS_STATUS IN NUMBER,
428   X_ERROR_MESSAGE IN VARCHAR2,
429   X_TRANSACTION_ID IN NUMBER,
430   X_UOM    IN VARCHAR2,
431   X_RT_OPER_MATERIAL_ID IN NUMBER,
432   X_OPERATION_CODE IN VARCHAR2,
433   X_OPERATION_SEQUENCE IN NUMBER,
434   X_ITEM_GROUP_ID IN NUMBER,
435   X_REQUESTED_QUANTITY IN NUMBER,
436   X_PROGRAM_ID   IN NUMBER,
437   X_PROGRAM_UPDATE_DATE  IN DATE,
438   X_LAST_UPDATED_DATE IN DATE,
439   X_WORKORDER_OPERATION_ID IN NUMBER,
440   X_MATERIAL_REQUEST_TYPE IN VARCHAR2,
441   X_STATUS  IN VARCHAR2,
442   X_ATTRIBUTE_CATEGORY IN VARCHAR2,
443   X_ATTRIBUTE1 IN VARCHAR2,
444   X_ATTRIBUTE2 IN VARCHAR2,
445   X_ATTRIBUTE3 IN VARCHAR2,
446   X_ATTRIBUTE4 IN VARCHAR2,
447   X_ATTRIBUTE5 IN VARCHAR2,
448   X_ATTRIBUTE6 IN VARCHAR2,
449   X_ATTRIBUTE7 IN VARCHAR2,
450   X_ATTRIBUTE8 IN VARCHAR2,
451   X_ATTRIBUTE9 IN VARCHAR2,
452   X_ATTRIBUTE10 IN VARCHAR2,
453   X_ATTRIBUTE11 IN VARCHAR2,
454   X_ATTRIBUTE12 IN VARCHAR2,
455   X_ATTRIBUTE13 IN VARCHAR2,
456   X_ATTRIBUTE14 IN VARCHAR2,
457   X_ATTRIBUTE15 IN VARCHAR2,
458   X_CREATION_DATE IN DATE,
459   X_CREATED_BY IN NUMBER,
460   X_LAST_UPDATE_DATE IN DATE,
461   X_LAST_UPDATED_BY IN NUMBER,
462   X_LAST_UPDATE_LOGIN IN NUMBER,
463   --sukhwsin: SB Effectivity Code changes -  starts
464   X_MC_HEADER_ID IN NUMBER,
465   X_POSITION_KEY IN NUMBER,
466   X_RELATIONSHIP_ID IN NUMBER,
467   --sukhwsin: SB Effectivity Code changes -  ends
468   --debadey: Marshalling FDD sction 5.15 - AOG flag addition
469   X_AOG_FLAG IN VARCHAR2
470 ) IS
471 BEGIN
472   INSERT INTO AHL_SCHEDULE_MATERIALS (
473     SCHEDULED_MATERIAL_ID,
474     OBJECT_VERSION_NUMBER,
475     LAST_UPDATE_DATE,
476     LAST_UPDATED_BY,
477     CREATION_DATE,
478     CREATED_BY,
479     LAST_UPDATE_LOGIN,
480     INVENTORY_ITEM_ID,
481     SCHEDULE_DESIGNATOR,
482     VISIT_ID,
483     VISIT_START_DATE,
484     VISIT_TASK_ID,
485     ORGANIZATION_ID,
486     SCHEDULED_DATE,
487     REQUEST_ID,
488     REQUESTED_DATE,
489     SCHEDULED_QUANTITY,
490     PROCESS_STATUS,
491     ERROR_MESSAGE,
492     TRANSACTION_ID,
493     UOM,
494     RT_OPER_MATERIAL_ID,
495     OPERATION_CODE,
496     OPERATION_SEQUENCE,
497     ITEM_GROUP_ID,
498     REQUESTED_QUANTITY,
499     PROGRAM_ID,
500     PROGRAM_UPDATE_DATE,
501     LAST_UPDATED_DATE,
502     WORKORDER_OPERATION_ID,
503     MATERIAL_REQUEST_TYPE,
504     STATUS,
505     ATTRIBUTE_CATEGORY,
506     ATTRIBUTE1,
507     ATTRIBUTE2,
508     ATTRIBUTE3,
509     ATTRIBUTE4,
510     ATTRIBUTE5,
511     ATTRIBUTE6,
512     ATTRIBUTE7,
513     ATTRIBUTE8,
514     ATTRIBUTE9,
515     ATTRIBUTE10,
516     ATTRIBUTE11,
517     ATTRIBUTE12,
518     ATTRIBUTE13,
519     ATTRIBUTE14,
520     ATTRIBUTE15,
521     --sukhwsin: SB Effectivity Code changes - starts
522     MC_HEADER_ID,
523     POSITION_KEY,
524         RELATIONSHIP_ID,
525     --sukhwsin: SB Effectivity Code changes - ends
526     --debadey: Marshalling FDD sction 5.15 - AOG flag addition
527     AOG_FLAG
528   )
529   VALUES(
530     X_SCHEDULED_MATERIAL_ID,
531     X_OBJECT_VERSION_NUMBER,
532     X_LAST_UPDATE_DATE,
533     X_LAST_UPDATED_BY,
534     X_CREATION_DATE,
535     X_CREATED_BY,
536     X_LAST_UPDATE_LOGIN,
537     X_INVENTORY_ITEM_ID,
538     X_SCHEDULE_DESIGNATOR,
539     X_VISIT_ID,
540     X_VISIT_START_DATE,
541     X_VISIT_TASK_ID,
542     X_ORGANIZATION_ID,
543     X_SCHEDULED_DATE,
544     X_REQUEST_ID,
545     -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
546     trunc(X_REQUESTED_DATE),
547     X_SCHEDULED_QUANTITY,
548     X_PROCESS_STATUS,
549     X_ERROR_MESSAGE,
550     X_TRANSACTION_ID,
551     X_UOM,
552     X_RT_OPER_MATERIAL_ID,
553     X_OPERATION_CODE,
554     X_OPERATION_SEQUENCE,
555     X_ITEM_GROUP_ID,
556     X_REQUESTED_QUANTITY,
557     X_PROGRAM_ID,
558     X_PROGRAM_UPDATE_DATE,
559     X_LAST_UPDATED_DATE,
560     X_WORKORDER_OPERATION_ID,
561     X_MATERIAL_REQUEST_TYPE,
562     X_STATUS,
563     X_ATTRIBUTE_CATEGORY,
564     X_ATTRIBUTE1,
565     X_ATTRIBUTE2,
566     X_ATTRIBUTE3,
567     X_ATTRIBUTE4,
568     X_ATTRIBUTE5,
569     X_ATTRIBUTE6,
570     X_ATTRIBUTE7,
571     X_ATTRIBUTE8,
572     X_ATTRIBUTE9,
573     X_ATTRIBUTE10,
574     X_ATTRIBUTE11,
575     X_ATTRIBUTE12,
576     X_ATTRIBUTE13,
577     X_ATTRIBUTE14,
578     X_ATTRIBUTE15,
579     --sukhwsin: SB Effectivity Code changes - starts
580     X_MC_HEADER_ID,
581     X_POSITION_KEY,
582         X_RELATIONSHIP_ID,
583     --sukhwsin: SB Effectivity Code changes - ends
584     --debadey: Marshalling FDD sction 5.15 - AOG flag addition
585     X_AOG_FLAG
586     );
587    --
588 END Insert_Row;
589 --Update procedure to update record in schedule materials entity
590 PROCEDURE UPDATE_ROW (
591   X_SCHEDULED_MATERIAL_ID IN NUMBER,
592   X_OBJECT_VERSION_NUMBER IN NUMBER,
593   X_INVENTORY_ITEM_ID IN VARCHAR2,
594   X_SCHEDULE_DESIGNATOR IN VARCHAR2,
595   X_VISIT_ID IN NUMBER,
596   X_VISIT_START_DATE IN DATE,
597   X_VISIT_TASK_ID IN NUMBER,
598   X_ORGANIZATION_ID IN NUMBER,
599   X_SCHEDULED_DATE IN DATE,
600   X_REQUEST_ID IN NUMBER,
601   X_REQUESTED_DATE IN DATE,
602   X_SCHEDULED_QUANTITY IN NUMBER,
603   X_PROCESS_STATUS IN NUMBER,
604   X_ERROR_MESSAGE IN VARCHAR2,
605   X_TRANSACTION_ID IN NUMBER,
606   X_UOM    IN VARCHAR2,
607   X_RT_OPER_MATERIAL_ID IN NUMBER,
608   X_OPERATION_CODE IN VARCHAR2,
609   X_OPERATION_SEQUENCE IN NUMBER,
610   X_ITEM_GROUP_ID IN NUMBER,
611   X_REQUESTED_QUANTITY IN NUMBER,
612   X_PROGRAM_ID   IN NUMBER,
613   X_PROGRAM_UPDATE_DATE  IN DATE,
614   X_LAST_UPDATED_DATE IN DATE,
615   X_ATTRIBUTE_CATEGORY IN VARCHAR2,
616   X_ATTRIBUTE1 IN VARCHAR2,
617   X_ATTRIBUTE2 IN VARCHAR2,
618   X_ATTRIBUTE3 IN VARCHAR2,
619   X_ATTRIBUTE4 IN VARCHAR2,
620   X_ATTRIBUTE5 IN VARCHAR2,
621   X_ATTRIBUTE6 IN VARCHAR2,
622   X_ATTRIBUTE7 IN VARCHAR2,
623   X_ATTRIBUTE8 IN VARCHAR2,
624   X_ATTRIBUTE9 IN VARCHAR2,
625   X_ATTRIBUTE10 IN VARCHAR2,
626   X_ATTRIBUTE11 IN VARCHAR2,
627   X_ATTRIBUTE12 IN VARCHAR2,
628   X_ATTRIBUTE13 IN VARCHAR2,
629   X_ATTRIBUTE14 IN VARCHAR2,
630   X_ATTRIBUTE15 IN VARCHAR2,
631   X_CREATION_DATE IN DATE,
632   X_CREATED_BY IN NUMBER,
633   X_LAST_UPDATE_DATE IN DATE,
634   X_LAST_UPDATED_BY IN NUMBER,
635   X_LAST_UPDATE_LOGIN IN NUMBER,
636   --debadey: Marshalling FDD sction 5.15 - AOG flag addition
637   X_AOG_FLAG IN VARCHAR2
638 ) IS
639 BEGIN
640   UPDATE AHL_SCHEDULE_MATERIALS SET
641     OBJECT_VERSION_NUMBER = X_OBJECT_VERSION_NUMBER + 1,
642     INVENTORY_ITEM_ID = X_INVENTORY_ITEM_ID,
643     SCHEDULE_DESIGNATOR = X_SCHEDULE_DESIGNATOR,
644     VISIT_ID = X_VISIT_ID,
645     VISIT_START_DATE = X_VISIT_START_DATE,
646     VISIT_TASK_ID = X_VISIT_TASK_ID,
647     ORGANIZATION_ID = X_ORGANIZATION_ID,
648     SCHEDULED_DATE = X_SCHEDULED_DATE,
649     REQUEST_ID = X_REQUEST_ID,
650     -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
651     REQUESTED_DATE = trunc(X_REQUESTED_DATE),
652     SCHEDULED_QUANTITY = X_SCHEDULED_QUANTITY,
653     PROCESS_STATUS = X_PROCESS_STATUS,
654     ERROR_MESSAGE = X_ERROR_MESSAGE,
655     TRANSACTION_ID = X_TRANSACTION_ID,
656     UOM = X_UOM,
657     RT_OPER_MATERIAL_ID = X_RT_OPER_MATERIAL_ID,
658     OPERATION_CODE = X_OPERATION_CODE,
659     OPERATION_SEQUENCE = X_OPERATION_SEQUENCE,
660     ITEM_GROUP_ID = X_ITEM_GROUP_ID,
661     REQUESTED_QUANTITY = X_REQUESTED_QUANTITY,
662     PROGRAM_ID = X_PROGRAM_ID,
663     PROGRAM_UPDATE_DATE = X_PROGRAM_UPDATE_DATE,
664     LAST_UPDATED_DATE = X_LAST_UPDATED_DATE,
665     ATTRIBUTE_CATEGORY = X_ATTRIBUTE_CATEGORY,
666     ATTRIBUTE1 = X_ATTRIBUTE1,
667     ATTRIBUTE2 = X_ATTRIBUTE2,
668     ATTRIBUTE3 = X_ATTRIBUTE3,
669     ATTRIBUTE4 = X_ATTRIBUTE4,
670     ATTRIBUTE5 = X_ATTRIBUTE5,
671     ATTRIBUTE6 = X_ATTRIBUTE6,
672     ATTRIBUTE7 = X_ATTRIBUTE7,
673     ATTRIBUTE8 = X_ATTRIBUTE8,
674     ATTRIBUTE9 = X_ATTRIBUTE9,
675     ATTRIBUTE10 = X_ATTRIBUTE10,
676     ATTRIBUTE11 = X_ATTRIBUTE11,
677     ATTRIBUTE12 = X_ATTRIBUTE12,
678     ATTRIBUTE13 = X_ATTRIBUTE13,
679     ATTRIBUTE14 = X_ATTRIBUTE14,
680     ATTRIBUTE15 = X_ATTRIBUTE15,
681     LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
682     LAST_UPDATED_BY = X_LAST_UPDATED_BY,
683     LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
684         --debadey: Marshalling FDD sction 5.15 - AOG flag addition
685           AOG_FLAG = X_AOG_FLAG
686     WHERE SCHEDULED_MATERIAL_ID = X_SCHEDULED_MATERIAL_ID
687     AND   OBJECT_VERSION_NUMBER=X_OBJECT_VERSION_NUMBER;
688   IF SQL%rowcount=0 THEN
689            Fnd_Message.SET_NAME('AHL','AHL_COM_RECORD_CHANGED');
690            Fnd_Msg_Pub.ADD;
691   END IF;
692 END UPDATE_ROW;
693 -- Delete procedure to remove record from schedule materials
694 PROCEDURE DELETE_ROW (
695   X_SCHEDULED_MATERIAL_ID IN NUMBER
696 ) IS
697 BEGIN
698   DELETE FROM AHL_SCHEDULE_MATERIALS
699   WHERE SCHEDULED_MATERIAL_ID = X_SCHEDULED_MATERIAL_ID;
700 END DELETE_ROW;
701 --sukhwsin: procedures added for SB Effectivity - starts
702 --Procedure to get mc_header_id from id or value
703 PROCEDURE Get_mc_header_id
704    (p_mc_header_id       IN  NUMBER,
705     p_mc_name            IN  VARCHAR2,
706     p_workorder_id       IN  NUMBER,
707     x_mc_header_id       OUT NOCOPY NUMBER,
708     x_return_status      OUT NOCOPY VARCHAR2,
709     x_msg_data           OUT NOCOPY VARCHAR2
710    ) IS
711     --Get unit name cursor
712     CURSOR Get_Wo_Unit_Name_cur(c_workorder_id IN NUMBER)
713     IS
714     SELECT unit_name
715     FROM AHL_WORKORDER_TASKS_V
716     WHERE workorder_id = c_workorder_id and rownum =1;
717     CURSOR Get_rec_from_id (c_unit_name VARCHAR2, c_mc_header_id NUMBER)
718     IS
719     SELECT DISTINCT
720     AMH.MC_HEADER_ID
721     FROM
722     AHL_MC_HEADERS_VL AMH,
723     AHL_UNIT_CONFIG_HEADERS AUCH
724     WHERE
725     AMH.MC_HEADER_ID = AUCH.MASTER_CONFIG_ID AND
726     AUCH.CSI_ITEM_INSTANCE_ID IN (
727     SELECT SUBJECT_ID /* INSTANCE_ID OF ALL CHILD NODES (INCLUDING RECURSIVE NODES FROM SUB-CONFIG.) */
728     FROM CSI_II_RELATIONSHIPS
729     WHERE NVL(ACTIVE_END_DATE,SYSDATE + 1) > SYSDATE
730     START WITH OBJECT_ID IN
731     (SELECT CSI_ITEM_INSTANCE_ID /*PARENT NODE INSTANCEID */
732     FROM AHL_UNIT_CONFIG_HEADERS
733     WHERE NAME = c_unit_name) /*:UC_NAME */
734     CONNECT BY PRIOR SUBJECT_ID = OBJECT_ID
735     UNION
736     SELECT /*PARENT NODE INSTANCEID */
737     CSI_ITEM_INSTANCE_ID
738     FROM
739     AHL_UNIT_CONFIG_HEADERS
740     WHERE
741     NAME = c_unit_name ) AND
742     AMH.MC_HEADER_ID = c_mc_header_id ;
743     CURSOR Get_rec_from_value (c_unit_name VARCHAR2, c_mc_name VARCHAR2)
744     IS
745     SELECT DISTINCT
746     AMH.MC_HEADER_ID
747     FROM
748     AHL_MC_HEADERS_VL AMH,
749     AHL_UNIT_CONFIG_HEADERS AUCH
750     WHERE
751     AMH.MC_HEADER_ID = AUCH.MASTER_CONFIG_ID AND
752     AUCH.CSI_ITEM_INSTANCE_ID IN (
753     SELECT SUBJECT_ID /* INSTANCE_ID OF ALL CHILD NODES (INCLUDING RECURSIVE NODES FROM SUB-CONFIG.) */
754     FROM CSI_II_RELATIONSHIPS
755     WHERE NVL(ACTIVE_END_DATE,SYSDATE + 1) > SYSDATE
756     START WITH OBJECT_ID IN
757     (SELECT CSI_ITEM_INSTANCE_ID /*PARENT NODE INSTANCEID */
758     FROM AHL_UNIT_CONFIG_HEADERS
759     WHERE NAME = c_unit_name) /*:UC_NAME */
760     CONNECT BY PRIOR SUBJECT_ID = OBJECT_ID
761     UNION
762     SELECT /*PARENT NODE INSTANCEID */
763     CSI_ITEM_INSTANCE_ID
764     FROM
765     AHL_UNIT_CONFIG_HEADERS
766     WHERE
767     NAME = c_unit_name ) AND
768     AMH.NAME = c_mc_name ;
769     l_unit_name VARCHAR2(80);
770  BEGIN
771      x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
772      --Get unit name
773      OPEN Get_Wo_Unit_Name_cur(p_workorder_id);
774      FETCH Get_Wo_Unit_Name_cur INTO l_unit_name;
775      IF Get_Wo_Unit_Name_cur%NOTFOUND THEN
776         l_unit_name := null;
777      END IF;
778      CLOSE Get_Wo_Unit_Name_cur;
779     IF (p_mc_header_id IS NOT NULL AND
780         p_mc_header_id <> FND_API.G_MISS_NUM) THEN
781         --
782         OPEN Get_rec_from_id(l_unit_name, p_mc_header_id );
783         FETCH Get_rec_from_id INTO
784           x_mc_header_id;
785         IF Get_rec_from_id%NOTFOUND THEN
786           x_return_status := FND_API.G_RET_STS_ERROR;
787           x_msg_data := 'AHL_PP_INVALID_MC';
788         END IF;
789         CLOSE Get_rec_from_id;
790         RETURN;
791      ELSE
792         --
793         OPEN Get_rec_from_value( l_unit_name, p_mc_name );
794         LOOP
795           FETCH get_rec_from_value INTO x_mc_header_id;
796           EXIT WHEN get_rec_from_value%NOTFOUND;
797         END LOOP;
798         IF ( get_rec_from_value%ROWCOUNT = 0 ) THEN
799           x_return_status := FND_API.G_RET_STS_ERROR;
800           x_msg_data := 'AHL_PP_INVALID_MC';
801         ELSIF ( get_rec_from_value%ROWCOUNT = 1 ) THEN
802           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
803         ELSE
804           x_return_status := FND_API.G_RET_STS_ERROR;
805           x_msg_data := 'AHL_PP_TOO_MANY_MC';
806           x_mc_header_id := NULL;
807         END IF;
808         CLOSE get_rec_from_value;
809         RETURN;
810      END IF;
811 EXCEPTION
812        WHEN OTHERS THEN
813          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
814          RAISE;
815 END Get_mc_header_id;
816 --Procedure to get mc_position_key from id or value
817 PROCEDURE Get_mc_position_key
818    (p_mc_header_id       IN  NUMBER,
819     p_mc_position        IN  VARCHAR2,
820     p_mc_position_key    IN  NUMBER,
821     x_mc_position_key    OUT NOCOPY NUMBER,
822     x_relationship_id    OUT NOCOPY NUMBER,
823     x_return_status      OUT NOCOPY VARCHAR2,
824     x_msg_data           OUT NOCOPY VARCHAR2
825    ) IS
826     CURSOR Get_rec_from_id (c_mc_header_id NUMBER, c_mc_position_key NUMBER)
827     IS
828     SELECT DISTINCT
829     AMR.POSITION_KEY, AMR.RELATIONSHIP_ID
830     FROM
831     AHL_MC_RELATIONSHIPS AMR,
832     FND_LOOKUP_VALUES_VL FLV
833     WHERE
834     AMR.POSITION_REF_CODE = FLV.LOOKUP_CODE AND
835     NVL(AMR.ACTIVE_END_DATE,SYSDATE +1 ) > SYSDATE AND
836     FLV.LOOKUP_TYPE = 'AHL_POSITION_REFERENCE' AND
837     FLV.ENABLED_FLAG = 'Y' AND
838     TRUNC(NVL(FLV.END_DATE_ACTIVE,SYSDATE)) >= TRUNC(SYSDATE) AND
839     AMR.MC_HEADER_ID = c_mc_header_id AND
840     AMR.POSITION_KEY = c_mc_position_key;
841     CURSOR Get_rec_from_value (c_mc_header_id NUMBER, c_mc_position VARCHAR2)
842     IS
843     SELECT DISTINCT
844     AMR.POSITION_KEY, AMR.RELATIONSHIP_ID
845     FROM
846     AHL_MC_RELATIONSHIPS AMR,
847     FND_LOOKUP_VALUES_VL FLV
848     WHERE
849     AMR.POSITION_REF_CODE = FLV.LOOKUP_CODE AND
850     NVL(AMR.ACTIVE_END_DATE,SYSDATE +1 ) > SYSDATE AND
851     FLV.LOOKUP_TYPE = 'AHL_POSITION_REFERENCE' AND
852     FLV.ENABLED_FLAG = 'Y' AND
853     TRUNC(NVL(FLV.END_DATE_ACTIVE,SYSDATE)) >= TRUNC(SYSDATE) AND
854     AMR.MC_HEADER_ID = c_mc_header_id AND
855     FLV.MEANING = c_mc_position;
856 
857  BEGIN
858      x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
859     IF (p_mc_position_key IS NOT NULL AND
860         p_mc_position_key <> FND_API.G_MISS_NUM) THEN
861         --
862         OPEN Get_rec_from_id(p_mc_header_id, p_mc_position_key );
863         FETCH Get_rec_from_id INTO x_mc_position_key, x_relationship_id;
864         IF Get_rec_from_id%NOTFOUND THEN
865           x_return_status := FND_API.G_RET_STS_ERROR;
866           x_msg_data := 'AHL_PP_INVALID_MC_POS';
867         END IF;
868         CLOSE Get_rec_from_id;
869         RETURN;
870      ELSE
871         --
872         OPEN Get_rec_from_value( p_mc_header_id, p_mc_position );
873         LOOP
874           FETCH get_rec_from_value INTO x_mc_position_key, x_relationship_id;
875           EXIT WHEN get_rec_from_value%NOTFOUND;
876         END LOOP;
877         IF ( get_rec_from_value%ROWCOUNT = 0 ) THEN
878           x_return_status := FND_API.G_RET_STS_ERROR;
879           x_msg_data := 'AHL_PP_INVALID_MC_POS';
880         ELSIF ( get_rec_from_value%ROWCOUNT = 1 ) THEN
881           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
882         ELSE
883           x_return_status := FND_API.G_RET_STS_ERROR;
884           x_msg_data := 'AHL_PP_TOO_MANY_MC_POS';
885           x_mc_position_key := NULL;
886       x_relationship_id := NULL;
887         END IF;
888         CLOSE get_rec_from_value;
889         RETURN;
890      END IF;
891 EXCEPTION
892        WHEN OTHERS THEN
893          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
894          RAISE;
895 END Get_mc_position_key;
896 --Procedure to get mc_item_group_id from id or value
897 PROCEDURE Get_item_group_id
898    (p_item_group_name  IN  VARCHAR2,
899     p_item_group_id    IN  NUMBER,
900     x_item_group_id    OUT NOCOPY NUMBER,
901     x_return_status    OUT NOCOPY VARCHAR2,
902     x_msg_data         OUT NOCOPY VARCHAR2
903    ) IS
904 
905     CURSOR Get_rec_from_id (c_item_group_id NUMBER)
906     IS
907     SELECT ITMGRP.ITEM_GROUP_ID ITEM_GROUP_ID
908     FROM
909     AHL_ITEM_GROUPS_VL ITMGRP
910     WHERE
911     ITMGRP.STATUS_CODE = 'COMPLETE'AND
912     ITMGRP.ITEM_GROUP_ID = c_item_group_id;
913 
914     CURSOR Get_rec_from_value (c_item_group_name VARCHAR2)
915     IS
916     SELECT DISTINCT ITMGRP.ITEM_GROUP_ID ITEM_GROUP_ID
917     FROM
918     AHL_ITEM_GROUPS_VL ITMGRP
919     WHERE
920     ITMGRP.STATUS_CODE = 'COMPLETE'AND
921     ITMGRP.NAME = c_item_group_name;
922 
923  BEGIN
924      x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
925 
926     IF (p_item_group_id IS NOT NULL AND
927         p_item_group_id <> FND_API.G_MISS_NUM) THEN
928         --
929         OPEN Get_rec_from_id(p_item_group_id );
930         FETCH Get_rec_from_id INTO x_item_group_id;
931         IF Get_rec_from_id%NOTFOUND THEN
932           x_return_status := FND_API.G_RET_STS_ERROR;
933           x_msg_data := 'AHL_PP_INVALID_MC_ITM_GRP';
934         END IF;
935         CLOSE Get_rec_from_id;
936         RETURN;
937      ELSE
938         --
939         OPEN Get_rec_from_value( p_item_group_name );
940         LOOP
941           FETCH get_rec_from_value INTO x_item_group_id;
942           EXIT WHEN get_rec_from_value%NOTFOUND;
943         END LOOP;
944         IF ( get_rec_from_value%ROWCOUNT = 0 ) THEN
945           x_return_status := FND_API.G_RET_STS_ERROR;
946           x_msg_data := 'AHL_PP_INVALID_MC_ITM_GRP';
947         ELSIF ( get_rec_from_value%ROWCOUNT = 1 ) THEN
948           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
949         ELSE
950           x_return_status := FND_API.G_RET_STS_ERROR;
951           x_msg_data := 'AHL_PP_TOO_MANY_MC_ITM_GRP';
952           x_item_group_id := NULL;
953         END IF;
954         CLOSE get_rec_from_value;
955         RETURN;
956      END IF;
957 EXCEPTION
958        WHEN OTHERS THEN
959          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
960          RAISE;
961 END Get_item_group_id;
962 --Procedure to get inventory_item_id from id or value based item group
963 PROCEDURE Get_item_Id_from_item_group
964    (p_item_group_id         IN  NUMBER,
965     p_inventory_item_id     IN  NUMBER,
966     p_concatenated_segments IN  VARCHAR2,
967     p_organization_id       IN  NUMBER,
968     x_inventory_item_id     OUT NOCOPY NUMBER,
969     x_return_status         OUT NOCOPY VARCHAR2,
970     x_msg_data              OUT NOCOPY VARCHAR2
971    ) IS
972     CURSOR Get_rec_from_id (c_inventory_item_id NUMBER, c_item_group_id NUMBER, c_organization_id NUMBER)
973     IS
974     SELECT DISTINCT mtl.inventory_item_id
975       FROM mtl_system_items_kfv mtl,
976            ahl_item_groups_vl aig,
977            ahl_item_associations_b ais
978      WHERE mtl.organization_id = c_organization_id --org.organization_id
979        AND nvl(mtl.enabled_flag,'N') = 'Y'
980        AND mtl.inventory_item_flag = 'Y'
981        AND mtl.stock_enabled_flag = 'Y'
982        AND mtl.mtl_transactions_enabled_flag = 'Y'
983        AND trunc(sysdate) BETWEEN trunc(nvl(mtl.start_date_active, sysdate))
984        AND trunc(nvl(mtl.end_date_active, sysdate))
985        AND aig.item_group_id = c_item_group_id
986        AND ais.item_group_id = aig.item_group_id
987        AND mtl.inventory_item_id = ais.inventory_item_id
988        AND mtl.inventory_item_id = c_inventory_item_id;
989     CURSOR Get_rec_from_value (c_concatenated_segments VARCHAR2, c_item_group_id NUMBER, c_organization_id NUMBER)
990     IS
991     SELECT DISTINCT mtl.inventory_item_id
992       FROM mtl_system_items_kfv mtl,
993            ahl_item_groups_vl aig,
994            ahl_item_associations_b ais
995      WHERE mtl.organization_id = c_organization_id --org.organization_id
996        AND nvl(mtl.enabled_flag,'N') = 'Y'
997        AND mtl.inventory_item_flag = 'Y'
998        AND mtl.stock_enabled_flag = 'Y'
999        AND mtl.mtl_transactions_enabled_flag = 'Y'
1000        AND trunc(sysdate) BETWEEN trunc(nvl(mtl.start_date_active, sysdate))
1001        AND trunc(nvl(mtl.end_date_active, sysdate))
1002        AND aig.item_group_id = c_item_group_id
1003        AND ais.item_group_id = aig.item_group_id
1004        AND mtl.inventory_item_id = ais.inventory_item_id
1005        AND mtl.concatenated_segments = c_concatenated_segments;
1006  BEGIN
1007      x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1008     IF (p_inventory_item_id IS NOT NULL AND
1009         p_inventory_item_id <> FND_API.G_MISS_NUM) THEN
1010         --
1011         OPEN Get_rec_from_id(p_inventory_item_id, p_item_group_id, p_organization_id );
1012         FETCH Get_rec_from_id INTO
1013           x_inventory_item_id;
1014         IF Get_rec_from_id%NOTFOUND THEN
1015           x_return_status := FND_API.G_RET_STS_ERROR;
1016           x_msg_data := 'AHL_PP_INVALID_MC_GRP_ITEM';
1017         END IF;
1018         CLOSE Get_rec_from_id;
1019         RETURN;
1020      ELSE
1021         --
1022         OPEN Get_rec_from_value(p_concatenated_segments, p_item_group_id, p_organization_id );
1023         LOOP
1024           FETCH get_rec_from_value INTO x_inventory_item_id;
1025           EXIT WHEN get_rec_from_value%NOTFOUND;
1026         END LOOP;
1027         IF ( get_rec_from_value%ROWCOUNT = 0 ) THEN
1028           x_return_status := FND_API.G_RET_STS_ERROR;
1029           x_msg_data := 'AHL_PP_INVALID_MC_GRP_ITEM';
1030         ELSIF ( get_rec_from_value%ROWCOUNT = 1 ) THEN
1031           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1032         ELSE
1033           x_return_status := FND_API.G_RET_STS_ERROR;
1034           x_msg_data := 'AHL_PP_TOO_MANY_MC_GRP_ITEM';
1035           x_inventory_item_id := NULL;
1036         END IF;
1037         CLOSE get_rec_from_value;
1038         RETURN;
1039      END IF;
1040 EXCEPTION
1041        WHEN OTHERS THEN
1042          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
1043          RAISE;
1044 END Get_item_Id_from_item_group;
1045 
1046 PROCEDURE Get_item_Id_from_mc_pos
1047    (p_relationship_id       IN NUMBER,
1048     p_inventory_item_id     IN NUMBER,
1049     p_concatenated_segments IN VARCHAR2,
1050     p_organization_id       IN NUMBER,
1051     x_inventory_item_id     OUT NOCOPY NUMBER,
1052     x_return_status         OUT NOCOPY VARCHAR2,
1053     x_msg_data              OUT NOCOPY VARCHAR2
1054    )
1055 IS
1056     CURSOR Get_rec_from_id (c_inventory_item_id NUMBER, c_relationship_id NUMBER, c_organization_id NUMBER)
1057     IS
1058     SELECT DISTINCT MSI.INVENTORY_ITEM_ID
1059     FROM
1060     (SELECT RELATIONSHIP_ID PARENT_REL_ID,RELATIONSHIP_ID CHILD_REL_ID, MC_HEADER_ID MC_HEADER_ID,
1061     ITEM_GROUP_ID, POSITION_REF_CODE, POSITION_KEY
1062     FROM
1063     AHL_MC_RELATIONSHIPS
1064     WHERE RELATIONSHIP_ID = c_relationship_id
1065     UNION
1066     SELECT AMCR.RELATIONSHIP_ID PARENT_REL_ID, AMR.RELATIONSHIP_ID CHILD_REL_ID,
1067     AMCR.MC_HEADER_ID MC_HEADER_ID,
1068     AMR.ITEM_GROUP_ID CHILD_ITEM_GROUP_ID,AMR.POSITION_REF_CODE,AMR.POSITION_KEY
1069     FROM AHL_MC_RELATIONSHIPS AMR, AHL_MC_CONFIG_RELATIONS AMCR
1070     WHERE
1071     AMR.MC_HEADER_ID = AMCR.MC_HEADER_ID AND
1072     NVL(AMCR.ACTIVE_END_DATE,SYSDATE + 1) > SYSDATE AND
1073     AMR.PARENT_RELATIONSHIP_ID IS NULL AND
1074     AMCR.RELATIONSHIP_ID = c_relationship_id
1075     ) MC_REL, AHL_ITEM_GROUPS_VL AIG, MTL_SYSTEM_ITEMS_KFV MSI,
1076     AHL_ITEM_ASSOCIATIONS_B AIS
1077     WHERE
1078     AIG.STATUS_CODE = 'COMPLETE' AND
1079     MC_REL.ITEM_GROUP_ID = AIG.ITEM_GROUP_ID AND
1080     AIS.ITEM_GROUP_ID = AIG.ITEM_GROUP_ID AND
1081     AIS.INVENTORY_ITEM_ID = MSI.INVENTORY_ITEM_ID AND
1082     NVL(MSI.ENABLED_FLAG,'N') = 'Y' AND
1083     NVL(MSI.INVENTORY_ITEM_FLAG,'N') = 'Y' AND
1084     NVL(MSI.STOCK_ENABLED_FLAG, 'N') = 'Y' AND
1085     NVL(MSI.MTL_TRANSACTIONS_ENABLED_FLAG,'N') = 'Y' AND
1086     TRUNC(SYSDATE) BETWEEN TRUNC(NVL(MSI.START_DATE_ACTIVE, SYSDATE)) AND
1087     TRUNC(NVL(MSI.END_DATE_ACTIVE, SYSDATE)) AND
1088     MSI.ORGANIZATION_ID = c_organization_id AND
1089     MSI.INVENTORY_ITEM_ID = c_inventory_item_id;
1090 
1091     CURSOR Get_rec_from_value (c_concatenated_segments VARCHAR2, c_relationship_id NUMBER, c_organization_id NUMBER)
1092     IS
1093     SELECT DISTINCT MSI.INVENTORY_ITEM_ID
1094     FROM
1095     (SELECT RELATIONSHIP_ID PARENT_REL_ID,RELATIONSHIP_ID CHILD_REL_ID, MC_HEADER_ID MC_HEADER_ID,
1096     ITEM_GROUP_ID, POSITION_REF_CODE, POSITION_KEY
1097     FROM
1098     AHL_MC_RELATIONSHIPS
1099     WHERE RELATIONSHIP_ID = c_relationship_id
1100     UNION
1101     SELECT AMCR.RELATIONSHIP_ID PARENT_REL_ID, AMR.RELATIONSHIP_ID CHILD_REL_ID,
1102     AMCR.MC_HEADER_ID MC_HEADER_ID,
1103     AMR.ITEM_GROUP_ID CHILD_ITEM_GROUP_ID,AMR.POSITION_REF_CODE,AMR.POSITION_KEY
1104     FROM AHL_MC_RELATIONSHIPS AMR, AHL_MC_CONFIG_RELATIONS AMCR
1105     WHERE
1106     AMR.MC_HEADER_ID = AMCR.MC_HEADER_ID AND
1107     NVL(AMCR.ACTIVE_END_DATE,SYSDATE + 1) > SYSDATE AND
1108     AMR.PARENT_RELATIONSHIP_ID IS NULL AND
1109     AMCR.RELATIONSHIP_ID = c_relationship_id
1110     ) MC_REL, AHL_ITEM_GROUPS_VL AIG, MTL_SYSTEM_ITEMS_KFV MSI,
1111     AHL_ITEM_ASSOCIATIONS_B AIS
1112     WHERE
1113     AIG.STATUS_CODE = 'COMPLETE' AND
1114     MC_REL.ITEM_GROUP_ID = AIG.ITEM_GROUP_ID AND
1115     AIS.ITEM_GROUP_ID = AIG.ITEM_GROUP_ID AND
1116     AIS.INVENTORY_ITEM_ID = MSI.INVENTORY_ITEM_ID AND
1117     NVL(MSI.ENABLED_FLAG,'N') = 'Y' AND
1118     NVL(MSI.INVENTORY_ITEM_FLAG,'N') = 'Y' AND
1119     NVL(MSI.STOCK_ENABLED_FLAG, 'N') = 'Y' AND
1120     NVL(MSI.MTL_TRANSACTIONS_ENABLED_FLAG,'N') = 'Y' AND
1121     TRUNC(SYSDATE) BETWEEN TRUNC(NVL(MSI.START_DATE_ACTIVE, SYSDATE)) AND
1122     TRUNC(NVL(MSI.END_DATE_ACTIVE, SYSDATE)) AND
1123     MSI.ORGANIZATION_ID = c_organization_id AND
1124     MSI.CONCATENATED_SEGMENTS = c_concatenated_segments;
1125  BEGIN
1126      x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1127     IF (p_inventory_item_id IS NOT NULL AND
1128         p_inventory_item_id <> FND_API.G_MISS_NUM) THEN
1129         --
1130         OPEN Get_rec_from_id(p_inventory_item_id, p_relationship_id, p_organization_id );
1131         FETCH Get_rec_from_id INTO
1132           x_inventory_item_id;
1133         IF Get_rec_from_id%NOTFOUND THEN
1134           x_return_status := FND_API.G_RET_STS_ERROR;
1135           x_msg_data := 'AHL_PP_INVALID_MC_GRP_ITEM';
1136         END IF;
1137         CLOSE Get_rec_from_id;
1138         RETURN;
1139      ELSE
1140         --
1141         OPEN Get_rec_from_value(p_concatenated_segments, p_relationship_id, p_organization_id );
1142         LOOP
1143           FETCH get_rec_from_value INTO x_inventory_item_id;
1144           EXIT WHEN get_rec_from_value%NOTFOUND;
1145         END LOOP;
1146         IF ( get_rec_from_value%ROWCOUNT = 0 ) THEN
1147           x_return_status := FND_API.G_RET_STS_ERROR;
1148           x_msg_data := 'AHL_PP_INVALID_MC_GRP_ITEM';
1149         ELSIF ( get_rec_from_value%ROWCOUNT = 1 ) THEN
1150           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1151         ELSE
1152           x_return_status := FND_API.G_RET_STS_ERROR;
1153           x_msg_data := 'AHL_PP_TOO_MANY_MC_GRP_ITEM';
1154           x_inventory_item_id := NULL;
1155         END IF;
1156         CLOSE get_rec_from_value;
1157         RETURN;
1158      END IF;
1159 EXCEPTION
1160        WHEN OTHERS THEN
1161          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
1162          RAISE;
1163 END Get_item_Id_from_mc_pos;
1164 
1165 PROCEDURE Validate_mat_req_record( p_mc_header_id   IN  NUMBER,
1166                          p_mc_position_key          IN  NUMBER,
1167                          p_item_group_id            IN  NUMBER,
1168                          p_inventory_item_id        IN  NUMBER,
1169                          x_return_status            OUT NOCOPY VARCHAR2,
1170                          x_msg_data                 OUT NOCOPY VARCHAR2
1171                        )
1172 IS
1173 BEGIN
1174     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1175     IF ( (p_mc_header_id IS NOT NULL AND p_mc_header_id <> Fnd_Api.G_MISS_NUM) OR
1176          (p_mc_position_key IS NOT NULL AND p_mc_position_key <> Fnd_Api.G_MISS_NUM)) THEN
1177       --for position based mat. req. mc-pos and item must be present.
1178         IF ((p_mc_header_id IS NULL OR p_mc_header_id = Fnd_Api.G_MISS_NUM) OR
1179             (p_mc_position_key IS NULL OR p_mc_position_key = Fnd_Api.G_MISS_NUM) OR
1180             (p_item_group_id IS NOT NULL AND p_item_group_id <> Fnd_Api.G_MISS_NUM) OR
1181             (p_inventory_item_id IS NULL OR p_inventory_item_id = Fnd_Api.G_MISS_NUM)) THEN
1182             x_return_status := Fnd_Api.G_RET_STS_ERROR;
1183             x_msg_data := 'AHL_PP_INVLD_MAT_REQ_COMB';
1184         END IF;
1185     END IF;
1186 END Validate_mat_req_record;
1187 --sukhwsin: procedures added for SB Effectivity - ends
1188 --
1189 -- Start of Comments --
1190 --  Procedure name    : Create_Material_Reqst
1191 --  Type              : Private
1192 --  Function          : Validates Material Information and inserts records into
1193 --                      Schedule Material table for non routine jobs Calls AHL_WIP_JOB_PVT.
1194 --                      update_wip_job api
1195 --  Pre-reqs    :
1196 --  Parameters  :
1197 --
1198 --  Standard IN  Parameters :
1199 --      p_api_version                   IN      NUMBER       Required
1200 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
1201 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
1202 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
1203 --      p_module_type                   IN      VARCHAR2     Default  NULL
1204 --      p_interface_flag                IN      VARCHAR2,
1205 --
1206 --  Standard OUT Parameters :
1207 --      x_return_status                 OUT     VARCHAR2               Required
1208 --      x_msg_count                     OUT     NUMBER                 Required
1209 --      x_msg_data                      OUT     VARCHAR2               Required
1210 --
1211 --  Create Material Request Parameters:
1212 --       p_x_req_material_tbl     IN OUT NOCOPY Req_Material_Tbl_Type,
1213 --         Contains material information to perform material reservation
1214 --
1215 --  Version :
1216 --      Initial Version   1.0
1217 --      MANESING::NR Analysis, 03-Jun-2011, modified API signature to include IN parameter p_module_type
1218 --
1219 --  End of Comments.
1220 PROCEDURE Create_Material_Reqst (
1221     p_api_version            IN            NUMBER,
1222     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
1223     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
1224     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
1225     p_module_type            IN            VARCHAR2  := NULL,
1226     p_interface_flag         IN            VARCHAR2   ,
1227     p_x_req_material_tbl     IN OUT NOCOPY Req_Material_Tbl_Type,
1228     x_job_return_status         OUT  NOCOPY       VARCHAR2,
1229     x_return_status             OUT  NOCOPY       VARCHAR2,
1230     x_msg_count                 OUT  NOCOPY       NUMBER,
1231     x_msg_data                  OUT  NOCOPY       VARCHAR2
1232   )
1233  IS
1234  --Check for unique constraint
1235  CURSOR Check_unique_cur(c_item_id      IN NUMBER,
1236                          c_operation_id IN NUMBER,
1237                          c_org_id       IN NUMBER,
1238                          c_sequence_id  IN NUMBER)
1239   IS
1240   SELECT 1
1241    FROM  AHL_SCHEDULE_MATERIALS
1242  WHERE inventory_item_id = c_item_id
1243   AND  workorder_operation_id = c_operation_id
1244   AND  organization_id = c_org_id
1245   AND  operation_sequence = c_sequence_id
1246   AND requested_quantity <> 0
1247   AND status IN ('ACTIVE','IN-SERVICE');
1248   -- Get job number details
1249   CURSOR Get_job_number(c_workorder_id IN NUMBER)
1250     IS
1251     SELECT workorder_name job_number,
1252              wip_entity_id
1253       FROM ahl_workorders
1254     WHERE workorder_id = c_workorder_id;
1255    -- Fix for bug# 6594189. Allow for statuses all statuses other than closed,
1256    -- cancelled, parts hold etc.
1257    --Check for status
1258    CURSOR Check_wo_status_cur(c_workorder_id IN NUMBER)
1259    IS
1260     SELECT 1 FROM ahl_workorders
1261      WHERE workorder_id = c_workorder_id
1262       /*
1263        AND  (status_code = 3 or
1264              status_code = 1);
1265       */
1266       AND status_code NOT IN ('12','5','6','7','17','22','19');
1267 
1268    /* MANESING::NR Analysis, 03-Jun-2011,
1269     * Cursor for checking whether the workorder is a Stage workorder and is in Draft status.
1270     */
1271    CURSOR Check_stg_workorder_csr (c_workorder_id  NUMBER)
1272    IS
1273    SELECT 1
1274    FROM   AHL_WORKORDERS    AHLW,
1275           AHL_VISIT_TASKS_B AVTB
1276 
1277    WHERE  AHLW.workorder_id = c_workorder_id
1278           AND AHLW.status_code = '17'
1279           AND AHLW.visit_task_id = AVTB.visit_task_id
1280           AND AVTB.task_type_code = 'STAGE';
1281 
1282    --Check for Route item
1283    CURSOR Get_rt_mat_cur (c_visit_task_id  IN NUMBER,
1284                           c_rt_oper_mat_id IN NUMBER,
1285                           --sukhwsin::SB Effectivity - control position change
1286                           c_mc_position_key IN NUMBER)
1287    IS
1288    SELECT  *
1289      FROM ahl_schedule_materials
1290    WHERE rt_oper_material_id = c_rt_oper_mat_id
1291    AND visit_task_id = c_visit_task_id
1292    --sukhwsin::SB Effectivity - control position change
1293    AND nvl(position_key,-1) = nvl(c_mc_position_key,-1)
1294    AND requested_quantity <> 0
1295    AND status IN ('ACTIVE','IN-SERVICE');
1296   --Check to calidate for dates
1297   CURSOR Get_sch_dates_cur(c_wo_operation_id IN NUMBER,
1298                             c_req_date   IN DATE)
1299    IS
1300     SELECT 1
1301       FROM ahl_workorder_operations_v
1302     WHERE workorder_operation_id = c_wo_operation_id
1303      AND c_req_date between trunc(scheduled_start_date)
1304      and trunc(scheduled_end_date) ;
1305   -- TO Get uom code for meaning
1306    CURSOR Uom_cur (uom_mean IN VARCHAR2) IS
1307     SELECT UOM_CODE
1308       FROM MTL_UNITS_OF_MEASURE
1309     WHERE UNIT_OF_MEASURE = uom_mean;
1310    -- Get Primary Uom Code
1311    CURSOR Primary_Uom_cur (c_item_id IN NUMBER,
1312                            c_org_id  IN NUMBER) IS
1313     SELECT primary_uom_code
1314       FROM MTL_SYSTEM_ITEMS_VL
1315     WHERE inventory_item_id = c_item_id
1316       AND organization_id = c_org_id;
1317    --Get operation sequnece
1318    CURSOR Get_Operation_Seq_cur(c_operation_id IN NUMBER)
1319     IS
1320    SELECT operation_sequence_num
1321      FROM ahl_workorder_operations
1322    WHERE workorder_operation_id = c_operation_id;
1323    -- sracha: added for bug# 6802777.
1324    -- derive dept. from wip-operations.
1325    CURSOR get_oper_dept(c_wip_entity_id IN NUMBER,
1326                         c_oper_seq_num  IN NUMBER)
1327    IS
1328    SELECT wo.department_id
1329    FROM WIP_OPERATIONS WO
1330    WHERE wo.wip_entity_id = c_wip_entity_id
1331      AND wo.operation_seq_num = c_oper_seq_num;
1332 --sukhwsin: SB Effectivity -  Added Cursor to get uc_header_id
1333    CURSOR Get_Wo_Uc_Header_Id(c_workorder_id IN NUMBER)
1334    IS
1335    SELECT uc_header_id
1336    FROM AHL_WORKORDER_TASKS_V
1337    WHERE workorder_id = c_workorder_id;
1338 
1339 -- pdoki modified the query to check for position based material reqs along with item group based reqs
1340 -- sukhwsin::VCP Integration - Added cursor to get material req count that contains item group
1341   CURSOR Get_Alt_Mat_Requirment_Count(c_workorder_id IN NUMBER)
1342   IS
1343   SELECT COUNT(scheduled_material_id)
1344   FROM   AHL_SCHEDULE_MATERIALS MAT,
1345          AHL_WORKORDERS WO
1346   WHERE  WO.WORKORDER_ID = c_workorder_id
1347   AND    WO.VISIT_TASK_ID          = MAT.VISIT_TASK_ID
1348   AND    NVL(MAT.STATUS,'NOTDEL') <> 'DELETED'
1349   AND
1350          (
1351                 (
1352                        MAT.ITEM_GROUP_ID     IS NOT NULL
1353                 AND    MAT.INVENTORY_ITEM_ID IS NOT NULL
1354                 )
1355          OR
1356                 (
1357                        MAT.MC_HEADER_ID IS NOT NULL
1358                 AND    MAT.POSITION_KEY IS NOT NULL
1359                 )
1360          );
1361 
1362  l_api_name        CONSTANT VARCHAR2(30) := 'CREATE_MATERIAL_REQST';
1363  l_api_version     CONSTANT NUMBER       := 1.0;
1364  l_msg_count                NUMBER;
1365  l_return_status            VARCHAR2(1);
1366  l_msg_data                 VARCHAR2(2000);
1367  l_dummy                    NUMBER;
1368  l_junk                     NUMBER;
1369  l_return_staus             VARCHAR2(1);
1370  --
1371  l_visit_task_id            NUMBER;
1372  l_inventory_item_id        NUMBER;
1373  l_visit_id                 NUMBER;
1374  l_organization_id          NUMBER;
1375  l_department_id            NUMBER;
1376  l_project_task_id          NUMBER;
1377  l_project_id               NUMBER;
1378  l_schedule_material_id     NUMBER;
1379  l_schedule_designator      VARCHAR2(10);
1380  l_workorder_id             NUMBER;
1381  l_workorder_name           VARCHAR2(80);
1382  l_wip_entity_id            NUMBER;
1383  l_workorder_operation_id   NUMBER;
1384  l_wo_organization_id       NUMBER;
1385  l_object_version_number    NUMBER;
1386  l_init_msg_list            VARCHAR2(1) := FND_API.G_TRUE;
1387  l_Req_Material_Tbl         Req_Material_Tbl_Type;
1388  l_default                  VARCHAR2(30);
1389  l_wo_operation_txn_id   NUMBER;
1390  l_schedule_start_date  DATE;
1391  l_schedule_end_date    DATE;
1392  --
1393  l_record_loaded        VARCHAR2(1);
1394  l_transaction_id       NUMBER;
1395  l_module_type          VARCHAR2(10);
1396  l_material_rec        Get_rt_mat_cur%ROWTYPE;
1397  j   NUMBER;
1398  l_mrp_net_flag        NUMBER;
1399  dff_default_values dff_default_values_type;
1400 --sukhwsin: Added variables for SB Effectivity changes - starts
1401  l_mc_header_id         NUMBER;
1402  l_mc_position_key         NUMBER;
1403  l_item_group_id        NUMBER;
1404  l_uc_header_id     NUMBER;
1405  Type Num_Tab_Ty IS Table of Number index by binary_integer;
1406  l_relationship_tbl Num_Tab_Ty;
1407  --sukhwsin: Added variables for SB Effectivity changes - ends
1408  --sukhwsin::VCP Integration variable declaration - starts
1409   l_WorkOrders_Table Num_Tab_Ty;
1410   l_WO_found VARCHAR2(1);
1411   l_alt_mat_req_count NUMBER;
1412  --sukhwsin::VCP Integration variable declaration - end
1413   l_error_flag        BOOLEAN := TRUE;
1414  BEGIN
1415    --------------------Initialize ----------------------------------
1416   -- Standard Start of API savepoint
1417   SAVEPOINT create_material_reqst;
1418    -- Check if API is called in debug mode. If yes, enable debug.
1419    IF G_DEBUG='Y' THEN
1420    AHL_DEBUG_PUB.enable_debug;
1421    END IF;
1422    -- Debug info.
1423    IF G_DEBUG='Y' THEN
1424    AHL_DEBUG_PUB.debug( 'enter ahl_pp_materias_pvt. create material  reqst','+PPMRP+');
1425    AHL_DEBUG_PUB.debug( 'INTERAFCE FALG'||p_interface_flag);
1426    AHL_DEBUG_PUB.debug( 'Total Number Records:'||p_x_req_material_tbl.COUNT);
1427    END IF;
1428    -- Standard call to check for call compatibility.
1429    IF FND_API.to_boolean(l_init_msg_list)
1430    THEN
1431      FND_MSG_PUB.initialize;
1432    END IF;
1433     --  Initialize API return status to success
1434     x_return_status := FND_API.G_RET_STS_SUCCESS;
1435    -- Initialize message list if p_init_msg_list is set to TRUE.
1436    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
1437                                       p_api_version,
1438                                       l_api_name,G_PKG_NAME)
1439    THEN
1440        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1441    END IF;
1442    --------------------Start of API Body-----------------------------------
1443  IF p_x_req_material_tbl.COUNT > 0 THEN
1444       FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
1445         LOOP
1446      -- Value to ID Conversion
1447      IF G_DEBUG='Y' THEN
1448      AHL_DEBUG_PUB.debug( 'WOID 1:'||p_x_req_material_tbl(i).workorder_id);
1449      AHL_DEBUG_PUB.debug( 'OPFLAG 1:'||p_x_req_material_tbl(i).operation_flag);
1450      AHL_DEBUG_PUB.debug( 'ITEM:'||i||'-'||p_x_req_material_tbl(i).concatenated_segments);
1451      END IF;
1452     IF ( ( p_x_req_material_tbl(i).workorder_id IS NOT NULL AND
1453            p_x_req_material_tbl(i).workorder_id <> FND_API.G_MISS_NUM ) OR
1454         ( p_x_req_material_tbl(i).job_number IS NOT NULL AND
1455           p_x_req_material_tbl(i).job_number <> FND_API.G_MISS_CHAR ) )
1456   THEN
1457      --
1458      IF G_DEBUG='Y' THEN
1459      AHL_DEBUG_PUB.debug( 'WOID 2:'||p_x_req_material_tbl(i).workorder_id);
1460        END IF;
1461      --
1462       Get_workorder_id
1463              (p_workorder_id      => p_x_req_material_tbl(i).workorder_id,
1464               p_job_number        => p_x_req_material_tbl(i).job_number,
1465               x_workorder_id      => l_workorder_id,
1466               x_return_status     => l_return_status,
1467               x_error_msg_code    => l_msg_data);
1468             IF NVL(l_return_status,'x') <> 'S'
1469             THEN
1470                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_NOT_EXISTS');
1471                 Fnd_Msg_Pub.ADD;
1472             END IF;
1473      --
1474      END IF;
1475      -- rroy
1476      -- ACL Changes
1477      --Get Job Number
1478      OPEN Get_job_number(p_x_req_material_tbl(i).workorder_id);
1479      FETCH Get_job_number INTO l_workorder_name,l_wip_entity_id;
1480      CLOSE Get_job_number;
1481      l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked
1482                         (
1483                           p_workorder_id => nvl(p_x_req_material_tbl(i).workorder_id,l_workorder_id),
1484                           p_ue_id => NULL,
1485                           p_visit_id => NULL,
1486                           p_item_instance_id => NULL
1487                         );
1488     IF l_return_status = FND_API.G_TRUE THEN
1489        FND_MESSAGE.Set_Name('AHL', 'AHL_PP_CRT_MTL_UNTLCKD');
1490        FND_MESSAGE.Set_Token('WO_NAME', l_workorder_name);
1491        FND_MSG_PUB.ADD;
1492        RAISE FND_API.G_EXC_ERROR;
1493     END IF;
1494     -- rroy
1495     -- ACL Changes
1496     --
1497     p_x_req_material_tbl(i).workorder_id  := nvl(p_x_req_material_tbl(i).workorder_id,l_workorder_id);
1498     --Get visit task id
1499     IF (p_x_req_material_tbl(i).workorder_id IS NOT NULL AND
1500         p_x_req_material_tbl(i).workorder_id <> Fnd_Api.G_MISS_NUM )
1501     THEN
1502           Get_visit_task_Id
1503              (p_workorder_id      => p_x_req_material_tbl(i).workorder_id,
1504               x_visit_task_id     => l_visit_task_id,
1505               x_return_status     => l_return_status,
1506               x_error_msg_code    => l_msg_data);
1507             IF NVL(l_return_status,'x') <> 'S'
1508             THEN
1509                 Fnd_Message.SET_NAME('AHL','AHL_PP_VISIT_TASK_NOT_EXIST');
1510                 Fnd_Msg_Pub.ADD;
1511             END IF;
1512     END IF;
1513     -- Assign
1514     p_x_req_material_tbl(i).visit_task_id := l_visit_task_id;
1515     IF G_DEBUG='Y' THEN
1516        AHL_DEBUG_PUB.debug( 'VTID'||p_x_req_material_tbl(i).visit_task_id);
1517        AHL_DEBUG_PUB.debug( 'Job Number:'||p_x_req_material_tbl(i).job_number);
1518     END IF;
1519     -- Validate for organization,department,project_task_id
1520     Get_visit_task_details
1521              ( p_visit_task_id       => l_visit_task_id,
1522                x_visit_id            => l_visit_id,
1523                x_organization_id     => l_organization_id,
1524                x_department_id       => l_department_id,
1525                x_project_task_id     => l_project_task_id,
1526                x_project_id          => l_project_id
1527               );
1528     -- Validate for organization
1529     IF l_organization_id IS NULL THEN
1530         Fnd_Message.SET_NAME('AHL','AHL_PP_ORG_ID_NOT_EXISTS');
1531         Fnd_Msg_Pub.ADD;
1532     END IF;
1533     -- rroy
1534     -- ACL Changes
1535     /*--Get Job Number
1536     OPEN Get_job_number(p_x_req_material_tbl(i).workorder_id);
1537     FETCH Get_job_number INTO l_workorder_name,l_wip_entity_id;
1538     CLOSE Get_job_number;
1539     */
1540     -- rroy
1541     -- ACL Changes
1542     --Assign
1543     p_x_req_material_tbl(i).job_number := l_workorder_name;
1544     -- Validate for project task
1545     IF (p_interface_flag = 'Y'OR p_interface_flag IS NULL) THEN
1546         --Check for workorder status
1547         --
1548         OPEN Check_wo_status_cur(p_x_req_material_tbl(i).workorder_id);
1549         FETCH Check_wo_status_cur INTO l_dummy;
1550         IF Check_wo_status_cur%NOTFOUND THEN
1551         --
1552           /* MANESING::NR Analysis, 03-Jun-2011,
1553            * With the introduction of the concept of Stage workorders,
1554            * Material Requirements can be created for these workorders even when they are in the Draft ('17') status.
1555            * But this is allowed only if this API is called from the VWP flow.
1556            */
1557           IF ( p_module_type = 'VWP' ) THEN
1558             OPEN  Check_stg_workorder_csr (p_x_req_material_tbl(i).workorder_id);
1559             FETCH Check_stg_workorder_csr INTO l_dummy;
1560             IF ( Check_stg_workorder_csr%FOUND ) THEN
1561               l_error_flag := FALSE;
1562             END IF;
1563             CLOSE Check_stg_workorder_csr;
1564           END IF;
1565 
1566           IF ( l_error_flag ) THEN
1567             Fnd_Message.SET_NAME('AHL','AHL_PP_WO_STATUS_INVALID');
1568             Fnd_Msg_Pub.ADD;
1569           END IF;
1570         END IF;
1571         --
1572         CLOSE Check_wo_status_cur;
1573             --
1574     END IF;--Condition for interface flag
1575         --
1576         p_x_req_material_tbl(i).organization_id := l_organization_id;
1577         p_x_req_material_tbl(i).department_id   := l_department_id;
1578         p_x_req_material_tbl(i).visit_id        := l_visit_id;
1579         p_x_req_material_tbl(i).project_task_id := l_project_task_id;
1580         p_x_req_material_tbl(i).project_id := l_project_id;
1581         --
1582     IF G_DEBUG='Y' THEN
1583        AHL_DEBUG_PUB.debug( 'ORID'||p_x_req_material_tbl(i).organization_id);
1584        AHL_DEBUG_PUB.debug( 'DEID'||p_x_req_material_tbl(i).department_id);
1585        AHL_DEBUG_PUB.debug( 'PTID'||p_x_req_material_tbl(i).project_task_id);
1586        AHL_DEBUG_PUB.debug( 'PJID'||p_x_req_material_tbl(i).project_id);
1587        AHL_DEBUG_PUB.debug( 'CITEM:'||p_x_req_material_tbl(i).concatenated_segments);
1588     END IF;
1589 --sukhwsin: Code Changes for SB Effectivity - starts
1590     --Assign null to relationship_id
1591     l_relationship_tbl(i) := null;
1592     --Get mc_header_id from mc_name
1593     IF (p_x_req_material_tbl(i).mc_name IS NOT NULL AND
1594         p_x_req_material_tbl(i).mc_name <> Fnd_Api.G_MISS_CHAR )   OR
1595        (p_x_req_material_tbl(i).mc_header_id IS NOT NULL AND
1596         p_x_req_material_tbl(i).mc_header_id <> Fnd_Api.G_MISS_NUM) THEN
1597         Get_mc_header_id(p_mc_header_id     => p_x_req_material_tbl(i).mc_header_id,
1598                  p_mc_name      => p_x_req_material_tbl(i).mc_name,
1599                  p_workorder_id     => p_x_req_material_tbl(i).workorder_id,
1600                  x_mc_header_id     => l_mc_header_id,
1601                  x_return_status        => l_return_status,
1602                  x_msg_data            => l_msg_data );
1603         IF NVL(l_return_status,'x') <> 'S'
1604         THEN
1605             Fnd_Message.SET_NAME('AHL',l_msg_data);
1606                   IF ( p_x_req_material_tbl(i).mc_name IS NULL OR
1607                    p_x_req_material_tbl(i).mc_name = FND_API.G_MISS_CHAR ) THEN
1608                 FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).mc_header_id );
1609                   ELSE
1610                 FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).mc_name );
1611                   END IF;
1612             Fnd_Msg_Pub.ADD;
1613         END IF;
1614     --Assign the returned value
1615     p_x_req_material_tbl(i).mc_header_id := l_mc_header_id;
1616     END IF;
1617     --Get mc_position_key from position_ref_code
1618     IF (p_x_req_material_tbl(i).mc_position IS NOT NULL AND
1619         p_x_req_material_tbl(i).mc_position <> Fnd_Api.G_MISS_CHAR )   OR
1620        (p_x_req_material_tbl(i).mc_position_key IS NOT NULL AND
1621         p_x_req_material_tbl(i).mc_position_key <> Fnd_Api.G_MISS_NUM) THEN
1622         Get_mc_position_key(p_mc_header_id  => p_x_req_material_tbl(i).mc_header_id,
1623                  p_mc_position      => p_x_req_material_tbl(i).mc_position,
1624                  p_mc_position_key  => p_x_req_material_tbl(i).mc_position_key,
1625                  x_mc_position_key  => l_mc_position_key,
1626                  x_relationship_id  => l_relationship_tbl(i),
1627                  x_return_status    => l_return_status,
1628                  x_msg_data         => l_msg_data );
1629         IF NVL(l_return_status,'x') <> 'S'
1630         THEN
1631             Fnd_Message.SET_NAME('AHL',l_msg_data);
1632               IF ( p_x_req_material_tbl(i).mc_position IS NULL OR
1633                p_x_req_material_tbl(i).mc_position = FND_API.G_MISS_CHAR ) THEN
1634             FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).mc_position_key );
1635               ELSE
1636             FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).mc_position );
1637               END IF;
1638             Fnd_Msg_Pub.ADD;
1639         END IF;
1640     --Assign the returned value
1641     p_x_req_material_tbl(i).mc_position_key := l_mc_position_key;
1642     END IF;
1643     --Get item_group_id from item_group_name only if mc or position is given
1644     IF  ((p_x_req_material_tbl(i).item_group_name IS NOT NULL AND
1645           p_x_req_material_tbl(i).item_group_name <> Fnd_Api.G_MISS_CHAR ) OR
1646           (p_x_req_material_tbl(i).item_group_id IS NOT NULL AND
1647           p_x_req_material_tbl(i).item_group_id <> Fnd_Api.G_MISS_NUM ))
1648         THEN
1649         Get_item_group_id(p_item_group_name  => p_x_req_material_tbl(i).item_group_name,
1650                  p_item_group_id    => p_x_req_material_tbl(i).item_group_id,
1651                  x_item_group_id    => l_item_group_id,
1652                  x_return_status        => l_return_status,
1653                  x_msg_data            => l_msg_data );
1654         IF NVL(l_return_status,'x') <> 'S'
1655         THEN
1656             Fnd_Message.SET_NAME('AHL',l_msg_data);
1657               IF ( p_x_req_material_tbl(i).item_group_name IS NULL OR
1658                p_x_req_material_tbl(i).item_group_name = FND_API.G_MISS_CHAR ) THEN
1659             FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).item_group_id );
1660               ELSE
1661             FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).item_group_name );
1662               END IF;
1663             Fnd_Msg_Pub.ADD;
1664         END IF;
1665     --Assign the returned value
1666     p_x_req_material_tbl(i).item_group_id := l_item_group_id;
1667     END IF;
1668 
1669     -- Convert concatenated segments to Item ID
1670     IF (p_x_req_material_tbl(i).concatenated_segments IS NOT NULL AND
1671         p_x_req_material_tbl(i).concatenated_segments <> Fnd_Api.G_MISS_CHAR )   OR
1672        (p_x_req_material_tbl(i).inventory_item_id IS NOT NULL AND
1673         p_x_req_material_tbl(i).inventory_item_id <> Fnd_Api.G_MISS_NUM) THEN
1674 
1675         IF(l_relationship_tbl(i) IS NOT NULL) THEN
1676             --Get Item for position based material requirements i.e. against relationship_id
1677             Get_item_Id_from_mc_pos
1678             (p_relationship_id  => l_relationship_tbl(i),
1679             p_inventory_item_id => p_x_req_material_tbl(i).inventory_item_id,
1680             p_concatenated_segments => p_x_req_material_tbl(i).concatenated_segments,
1681             p_organization_id   => l_organization_id,
1682             x_inventory_item_id => l_inventory_item_id,
1683             x_return_status     => l_return_status,
1684             x_msg_data      => l_msg_data
1685             );
1686 
1687         ELSIF (p_x_req_material_tbl(i).item_group_id IS NOT NULL AND
1688             p_x_req_material_tbl(i).item_group_id <> Fnd_Api.G_MISS_NUM )  THEN
1689             --if item group is present then validate item against item group
1690             Get_item_Id_from_item_group
1691              (p_item_group_id         => p_x_req_material_tbl(i).item_group_id,
1692               p_inventory_item_id     => p_x_req_material_tbl(i).inventory_item_id,
1693               p_concatenated_segments => p_x_req_material_tbl(i).concatenated_segments,
1694               p_organization_id       => l_organization_id,
1695               x_inventory_item_id     => l_inventory_item_id,
1696               x_return_status         => l_return_status,
1697               x_msg_data              => l_msg_data);
1698                   IF NVL(l_return_status,'x') <> 'S'
1699                   THEN
1700                     Fnd_Message.SET_NAME('AHL',l_msg_data);
1701                       IF ( p_x_req_material_tbl(i).concatenated_segments IS NULL OR
1702                        p_x_req_material_tbl(i).concatenated_segments = FND_API.G_MISS_CHAR ) THEN
1703                     FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).inventory_item_id );
1704                       ELSE
1705                     FND_MESSAGE.set_token( 'FIELD', p_x_req_material_tbl(i).concatenated_segments );
1706                       END IF;
1707                     Fnd_Msg_Pub.ADD;
1708                   END IF;
1709         ELSE
1710             --validate item only againt organization id.
1711             Get_inventory_item_Id
1712              (p_inventory_item_id     => p_x_req_material_tbl(i).inventory_item_id,
1713               p_concatenated_segments => p_x_req_material_tbl(i).concatenated_segments,
1714               p_organization_id       => l_organization_id,
1715               x_inventory_item_id     => l_inventory_item_id,
1716               x_return_status         => l_return_status,
1717               x_error_msg_code        => l_msg_data);
1718                   IF NVL(l_return_status,'x') <> 'S'
1719                   THEN
1720                     Fnd_Message.SET_NAME('AHL','AHL_PP_INVALID_ITEM');
1721                     Fnd_Msg_Pub.ADD;
1722                   END IF;
1723         END IF;
1724     ELSE
1725          Fnd_Message.SET_NAME('AHL','AHL_PP_INV_ID_REQUIRED');
1726          Fnd_Msg_Pub.ADD;
1727     END IF;
1728         --Assign the returned value
1729         p_x_req_material_tbl(i).inventory_item_id := l_inventory_item_id;
1730     --validate record
1731     Validate_mat_req_record( p_mc_header_id         => p_x_req_material_tbl(i).mc_header_id,
1732                              p_mc_position_key      => p_x_req_material_tbl(i).mc_position_key,
1733                              p_item_group_id        => p_x_req_material_tbl(i).item_group_id,
1734                              p_inventory_item_id    => p_x_req_material_tbl(i).inventory_item_id,
1735                              x_return_status        => l_return_status,
1736                              x_msg_data             => l_msg_data
1737                            );
1738     IF NVL(l_return_status,'x') <> 'S'
1739     THEN
1740     Fnd_Message.SET_NAME('AHL',l_msg_data);
1741     Fnd_Msg_Pub.ADD;
1742     END IF;
1743 --ALSO ONLY IN CASE P_INTERFACE_FLAG IS NULL OR Y.
1744    l_uc_header_id := null;
1745    OPEN Get_Wo_Uc_Header_Id(p_x_req_material_tbl(i).workorder_id);
1746    FETCH Get_Wo_Uc_Header_Id INTO l_uc_header_id;
1747    CLOSE Get_Wo_Uc_Header_Id;
1748    --Call Validate item procedure only for position based requirement.
1749    --If rt_oper_material_id is present, it means mat requirements is created when new operation is added to workorder.
1750    --in this case do not call sb rule validation as this is already done while deriving item for position based mat req.
1751    IF (p_x_req_material_tbl(i).mc_header_id IS NOT NULL AND p_x_req_material_tbl(i).mc_header_id <> Fnd_Api.G_MISS_NUM AND
1752        p_x_req_material_tbl(i).mc_position_key IS NOT NULL AND p_x_req_material_tbl(i).mc_position_key <> Fnd_Api.G_MISS_NUM AND
1753        p_x_req_material_tbl(i).inventory_item_id IS NOT NULL AND p_x_req_material_tbl(i).inventory_item_id <> Fnd_Api.G_MISS_NUM AND
1754        (p_x_req_material_tbl(i).RT_OPER_MATERIAL_ID IS NULL OR p_x_req_material_tbl(i).RT_OPER_MATERIAL_ID = Fnd_Api.G_MISS_NUM) AND
1755        l_uc_header_id IS NOT NULL
1756       ) THEN
1757        --Following procedure valid position based requirement against SB rules and
1758        --insert error messages in Fnd_Msg_Pub... hence increase message count in case of error.
1759     AHL_SB_RULES_PVT.Evaluate_Rules_For_Pos (
1760       p_mc_header_id    => p_x_req_material_tbl(i).mc_header_id,
1761       p_mc_pos_key      => p_x_req_material_tbl(i).mc_position_key,
1762       p_inv_item_id     => p_x_req_material_tbl(i).inventory_item_id,
1763       p_inv_org_id      => l_organization_id,
1764       p_uc_header_id    => l_uc_header_id
1765     );
1766    END IF;
1767 --sukhwsin: Code Changes for SB Effectivity - ends
1768    IF G_DEBUG='Y' THEN
1769      AHL_DEBUG_PUB.debug( 'IVID'||p_x_req_material_tbl(i).requested_quantity);
1770    END IF;
1771    -- Validate for Requested Quantity
1772    IF (p_x_req_material_tbl(i).requested_quantity IS  NULL OR
1773        p_x_req_material_tbl(i).requested_quantity = FND_API.G_MISS_NUM ) THEN
1774        Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_QUANTITY_REQUIRED');
1775        Fnd_Msg_Pub.ADD;
1776    ELSIF (p_x_req_material_tbl(i).requested_quantity IS NOT NULL AND
1777           p_x_req_material_tbl(i).requested_quantity <> FND_API.G_MISS_NUM) THEN
1778          -- Fix for FP bug# 6642084. -- Allow 0 quantity.
1779          IF p_x_req_material_tbl(i).requested_quantity < 0 THEN
1780              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_QUANTITY_INVALID');
1781              Fnd_Msg_Pub.ADD;
1782          END IF;
1783    END IF;
1784    --
1785 
1786    -- MANESING::NR Analysis, 03-Jun-2011, Validate for Scheduled Quantity
1787    IF ( G_DEBUG = 'Y' ) THEN
1788      AHL_DEBUG_PUB.debug('Scheduled Quantity: ' || p_x_req_material_tbl(i).scheduled_quantity);
1789    END IF;
1790 
1791    IF ( p_x_req_material_tbl(i).scheduled_quantity IS NOT NULL AND
1792         p_x_req_material_tbl(i).scheduled_quantity <> FND_API.G_MISS_NUM ) THEN
1793 
1794      IF ( p_x_req_material_tbl(i).scheduled_quantity < 0 ) THEN
1795        FND_MESSAGE.set_name('AHL', 'AHL_PP_SCHLD_QUANTITY_INVLD');
1796        FND_MSG_PUB.add;
1797      END IF;
1798 
1799    END IF;
1800 
1801    IF G_DEBUG='Y' THEN
1802      AHL_DEBUG_PUB.debug( 'RDATE1:'||p_x_req_material_tbl(i).requested_date);
1803    END IF;
1804    --
1805    -- bug 14137417 :: added module type condition by tchimira
1806    -- following validation should not occur for VWP flows
1807    IF ((p_interface_flag = 'Y' OR p_interface_flag is null ) AND (p_module_type <> 'VWP'))THEN
1808         -- Validate for Requested Date
1809        IF (p_x_req_material_tbl(i).requested_date IS  NULL OR
1810            p_x_req_material_tbl(i).requested_date = FND_API.G_MISS_DATE ) THEN
1811              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_DATE_REQUIRED');
1812              Fnd_Msg_Pub.ADD;
1813         ELSIF (p_x_req_material_tbl(i).requested_date IS NOT NULL AND
1814               p_x_req_material_tbl(i).requested_date <> FND_API.G_MISS_DATE) THEN
1815           IF p_x_req_material_tbl(i).requested_date < trunc(SYSDATE) THEN
1816              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_DATE_GT_SYSD');
1817              Fnd_Msg_Pub.ADD;
1818            END IF;
1819         END IF;
1820    END IF;
1821    --
1822    IF G_DEBUG='Y' THEN
1823      AHL_DEBUG_PUB.debug( 'RDATE'||p_x_req_material_tbl(i).requested_date);
1824      AHL_DEBUG_PUB.debug( 'OSID'||p_x_req_material_tbl(i).operation_sequence);
1825    END IF;
1826    --Check for operation sequence
1827    IF( p_x_req_material_tbl(i).operation_sequence IS NULL OR
1828        p_x_req_material_tbl(i).operation_sequence = FND_API.G_MISS_NUM)
1829       THEN
1830       IF  (p_x_req_material_tbl(i).workorder_operation_id IS  NOT NULL AND
1831            p_x_req_material_tbl(i).workorder_operation_id <> FND_API.G_MISS_NUM)
1832           THEN
1833              --
1834                    OPEN  Get_Operation_Seq_cur(p_x_req_material_tbl(i).workorder_operation_id);
1835                    FETCH Get_Operation_Seq_cur INTO p_x_req_material_tbl(i).operation_sequence;
1836                    IF Get_Operation_Seq_cur%NOTFOUND THEN
1837                Fnd_Message.SET_NAME('AHL','AHL_PP_OPER_SEQ_REQD');
1838                Fnd_Msg_Pub.ADD;
1839                    END IF;
1840                CLOSE Get_Operation_Seq_cur;
1841         END IF;
1842    END IF;
1843    --
1844 -- dbms_output.put_line( 'after fetch:'||p_x_req_material_tbl(i).operation_sequence);
1845 -- dbms_output.put_line( 'after fetch:'||p_x_req_material_tbl(i).workorder_operation_id);
1846 -- dbms_output.put_line( 'interface flag:'||p_interface_flag);
1847    -- Check for workorder operation ID
1848    IF G_DEBUG='Y' THEN
1849      AHL_DEBUG_PUB.debug('OPID'||p_x_req_material_tbl(i).workorder_operation_id);
1850    END IF;
1851    --
1852    IF  (p_x_req_material_tbl(i).workorder_operation_id IS  NULL OR
1853         p_x_req_material_tbl(i).workorder_operation_id = FND_API.G_MISS_NUM)
1854       THEN
1855        -- Validate for workorder operation
1856         IF (p_x_req_material_tbl(i).operation_sequence IS NOT NULL AND
1857          p_x_req_material_tbl(i).operation_sequence <> FND_API.G_MISS_NUM) THEN
1858          --
1859            Get_workorder_operation_Id
1860                 (p_workorder_id           => p_x_req_material_tbl(i).workorder_id,
1861                  p_operation_sequence     => p_x_req_material_tbl(i).operation_sequence,
1862                  x_workorder_operation_id => l_workorder_operation_id,
1863                  x_return_status          => l_return_status,
1864                  x_error_msg_code         => l_msg_data);
1865             IF NVL(l_return_status,'x') <> 'S'
1866             THEN
1867                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_OP_ID_NOT_EXIST');
1868                 Fnd_Msg_Pub.ADD;
1869                 --
1870             END IF;
1871          END IF;
1872    END IF;
1873    -- Assigns operation id when called from UI
1874    IF (p_x_req_material_tbl(i).workorder_operation_id <> FND_API.G_MISS_NUM OR
1875        p_x_req_material_tbl(i).workorder_operation_id IS NULL )
1876    THEN
1877      --
1878      p_x_req_material_tbl(i).workorder_operation_id := NVL(p_x_req_material_tbl(i).workorder_operation_id,l_workorder_operation_id);
1879    ELSE
1880      p_x_req_material_tbl(i).workorder_operation_id := l_workorder_operation_id;
1881    END IF;
1882     --
1883    /* sracha: Fix bug#6594189.
1884     * commented out date validation against workorder scheduled dates.
1885     * we should allow creation of material requirements irrespective of
1886     * workorder
1887     * scheduled dates. Note: This validation is triggered only when creating
1888     * material requirement.
1889    IF (
1890         (
1891           p_interface_flag = 'Y' or p_interface_flag IS NULL
1892         )
1893         AND
1894         (
1895           -- Check added by balaji for bug # 4093650
1896           -- When workorder_operation_id is null or g_miss then date check should not
1897           -- be performed.
1898           p_x_req_material_tbl(i).workorder_operation_id IS NOT NULL AND
1899           p_x_req_material_tbl(i).workorder_operation_id <> FND_API.G_MISS_NUM
1900         )
1901      )
1902    THEN
1903       --Check for requested date should be in schedule start date schedule end date
1904       OPEN Get_sch_dates_cur(p_x_req_material_tbl(i).workorder_operation_id,
1905                            trunc(p_x_req_material_tbl(i).requested_date)) ;
1906       FETCH Get_sch_dates_cur INTO l_dummy;
1907       --
1908       IF Get_sch_dates_cur%NOTFOUND THEN
1909          Fnd_Message.SET_NAME('AHL','AHL_PP_RE_DATE_SCH_DATE');
1910          Fnd_Msg_Pub.ADD;
1911       END IF;
1912       --
1913       CLOSE Get_sch_dates_cur;
1914       --
1915    END IF;
1916    */
1917    IF G_DEBUG='Y' THEN
1918      AHL_DEBUG_PUB.debug('Local OPID:'||l_workorder_operation_id);
1919      AHL_DEBUG_PUB.debug('OPID2 :'||p_x_req_material_tbl(i).workorder_operation_id);
1920    END IF;
1921    --Check for operation sequence
1922 -- dbms_output.put_line( 'before uinque check:'||p_x_req_material_tbl(i).inventory_item_id);
1923 -- dbms_output.put_line( 'before unique check:'||p_x_req_material_tbl(i).organization_id);
1924 -- dbms_output.put_line( 'before uinque check:'||p_x_req_material_tbl(i).workorder_operation_id);
1925 -- dbms_output.put_line( 'before unique check:'||p_x_req_material_tbl(i).operation_sequence);
1926 -- dbms_output.put_line( 'before unique check:'||p_x_req_material_tbl(i).requested_date);
1927    --Check for record exists in schedule materials entity
1928    OPEN Check_unique_cur(p_x_req_material_tbl(i).inventory_item_id,
1929                          p_x_req_material_tbl(i).workorder_operation_id,
1930                          p_x_req_material_tbl(i).organization_id,
1931                          p_x_req_material_tbl(i).operation_sequence);
1932    FETCH Check_unique_cur INTO l_dummy;
1933    --
1934    IF Check_unique_cur%FOUND THEN
1935         Fnd_Message.SET_NAME('AHL','AHL_MAT_RECORD_EXIST');
1936         FND_MESSAGE.SET_TOKEN('ITEM',p_x_req_material_tbl(i).concatenated_segments,false);
1937         Fnd_Msg_Pub.ADD;
1938    END IF;
1939    --
1940    CLOSE Check_unique_cur;
1941    --
1942  --dbms_output.put_line( 'before uom conversion:'||p_x_req_material_tbl(i).inventory_item_id);
1943 -- dbms_output.put_line( 'before uom conversion:'||p_x_req_material_tbl(i).organization_id);
1944 -- dbms_output.put_line( 'before uom WO:'||p_x_req_material_tbl(i).workorder_id);
1945    -- Convert Uom code
1946    IF (p_x_req_material_tbl(i).UOM_MEANING IS NOT NULL AND p_x_req_material_tbl(i).UOM_MEANING <> FND_API.G_MISS_CHAR)
1947    THEN
1948         --
1949          OPEN Uom_cur(p_x_req_material_tbl(i).UOM_MEANING);
1950          FETCH Uom_cur INTO p_x_req_material_tbl(i).UOM_CODE;
1951          CLOSE Uom_cur;
1952          -- Get the primary UOM
1953     ELSE
1954         OPEN Primary_Uom_cur(p_x_req_material_tbl(i).inventory_item_id,
1955                                  p_x_req_material_tbl(i).organization_id);
1956             FETCH Primary_Uom_cur INTO p_x_req_material_tbl(i).uom_code;
1957             CLOSE Primary_Uom_cur;
1958     END IF;
1959     -- OGMA issue # 105 - begin
1960     IF (
1961          p_x_req_material_tbl(i).REPAIR_ITEM IS NOT NULL AND
1962          p_x_req_material_tbl(i).REPAIR_ITEM = 'Y'
1963        )
1964     THEN
1965         p_x_req_material_tbl(i).STATUS := 'IN-SERVICE';
1966     END IF;
1967     -- OGMA issue # 105 - end
1968 -- dbms_output.put_line( 'after uom conversion UOM:'||p_x_req_material_tbl(i).uom_code);
1969     -- Standard call to get message count and if count is  get message info.
1970     l_msg_count := FND_MSG_PUB.count_msg;
1971     IF l_msg_count > 0 THEN
1972          X_msg_count := l_msg_count;
1973          X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1974        RAISE FND_API.G_EXC_ERROR;
1975     END IF;
1976 END LOOP;
1977 END IF;
1978 -- dbms_output.put_line( 'before wip jobs:'||p_x_req_material_tbl.COUNT);
1979 -- dbms_output.put_line( 'before wip jobs flag:'||p_interface_flag);
1980 -- Calling Wip job api
1981 IF (p_interface_flag = 'Y' OR p_interface_flag IS NULL )THEN
1982     --
1983 -- dbms_output.put_line( 'inside:'||p_interface_flag);
1984 --    IF G_DEBUG='Y' THEN
1985 --    AHL_DEBUG_PUB.debug('after interface flag yes or null call:'||p_x_req_material_tbl(1).workorder_id);
1986 --    END IF;
1987        --
1988 -- dbms_output.put_line( 'inside:'||p_interface_flag);
1989       IF p_x_req_material_tbl.COUNT >0
1990         THEN
1991         j := 1;
1992         FOR i in p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
1993         LOOP
1994          --
1995             OPEN Get_job_number(p_x_req_material_tbl(i).workorder_id);
1996             FETCH Get_job_number INTO l_workorder_name,l_wip_entity_id;
1997             CLOSE Get_job_number;
1998            --
1999            -- sracha: Fix for FP bug# 6802777.
2000            -- derive dept. ID for the operation.
2001            OPEN get_oper_dept(l_wip_entity_id, p_x_req_material_tbl(i).operation_sequence);
2002            FETCH get_oper_dept INTO l_department_id;
2003            IF (get_oper_dept%FOUND) THEN
2004               p_x_req_material_tbl(i).department_id := l_department_id;
2005            END IF;
2006            CLOSE get_oper_dept;
2007            --
2008            l_req_material_tbl(j).JOB_NUMBER             := l_workorder_name;
2009            l_req_material_tbl(j).WIP_ENTITY_ID          := l_wip_entity_id;
2010            l_req_material_tbl(j).WORKORDER_ID           := p_x_req_material_tbl(i).workorder_id;
2011            l_req_material_tbl(j).OPERATION_SEQUENCE     :=p_x_req_material_tbl(i).operation_sequence;
2012            l_req_material_tbl(j).INVENTORY_ITEM_ID      :=p_x_req_material_tbl(i).inventory_item_id;
2013            l_req_material_tbl(j).UOM_CODE               :=p_x_req_material_tbl(i).uom_code;
2014            l_req_material_tbl(j).ORGANIZATION_ID        :=p_x_req_material_tbl(i).organization_id;
2015            -- fix for bug# 5549135.
2016            --l_req_material_tbl(j).MRP_NET_FLAG           :=1;
2017            l_req_material_tbl(j).MRP_NET_FLAG           :=2;
2018            l_req_material_tbl(j).QUANTITY_PER_ASSEMBLY  :=p_x_req_material_tbl(i).requested_quantity;
2019            l_req_material_tbl(j).REQUESTED_QUANTITY     :=p_x_req_material_tbl(i).requested_quantity;
2020            l_req_material_tbl(j).SUPPLY_TYPE            :=NULL;
2021            l_req_material_tbl(j).LOCATION               :=NULL;
2022            l_req_material_tbl(j).SUB_INVENTORY          :=NULL;
2023            l_req_material_tbl(j).REQUESTED_DATE         :=p_x_req_material_tbl(i).requested_date;
2024            l_req_material_tbl(j).OPERATION_FLAG         :='C';
2025            -- sracha: Fix for FP bug# 6802777.
2026            l_req_material_tbl(j).DEPARTMENT_ID          := p_x_req_material_tbl(i).department_id;
2027            --
2028    IF G_DEBUG='Y' THEN
2029    AHL_DEBUG_PUB.debug('Before Eam job pvt.InentoryItemID:'||l_req_material_tbl(j).INVENTORY_ITEM_ID);
2030    AHL_DEBUG_PUB.debug('Before Eam job pvt.Quantity:'||l_req_material_tbl(j).REQUESTED_QUANTITY);
2031    AHL_DEBUG_PUB.debug('Before Eam job pvt.Uom:'||l_req_material_tbl(j).UOM_CODE);
2032    AHL_DEBUG_PUB.debug('Before Eam job pvt.WorkorderID:'||l_req_material_tbl(j).WORKORDER_ID);
2033    AHL_DEBUG_PUB.debug('Before Eam job pvt.WipentityID:'||l_req_material_tbl(j).WIP_ENTITY_ID);
2034    AHL_DEBUG_PUB.debug('Before Eam job pvt.OrganizationID:'||l_req_material_tbl(j).ORGANIZATION_ID);
2035    AHL_DEBUG_PUB.debug('Before Eam job pvt.Jobmumber:'||l_req_material_tbl(j).JOB_NUMBER);
2036    AHL_DEBUG_PUB.debug('Before Eam job pvt.OperationSequence:'||l_req_material_tbl(j).OPERATION_SEQUENCE);
2037    END IF;
2038 --  dbms_output.put_line( 'Before Eam job pvt.InentoryItemID:'||l_req_material_tbl(j).INVENTORY_ITEM_ID);
2039 --  dbms_output.put_line( 'Before Eam job pvt.quantity:'||l_req_material_tbl(j).REQUESTED_QUANTITY);
2040 --  dbms_output.put_line( 'Before Eam job pvt.uom:'||l_req_material_tbl(j).UOM_CODE);
2041 --  dbms_output.put_line( 'Before Eam job pvt.workorderID:'||l_req_material_tbl(j).WORKORDER_ID);
2042 --  dbms_output.put_line( 'Before Eam job pvt.wip entity:'||l_req_material_tbl(j).WIP_ENTITY_ID);
2043 --  dbms_output.put_line( 'Before Eam job pvt.OPERATION SEQ:'||l_req_material_tbl(j).OPERATION_SEQUENCE);
2044 --  dbms_output.put_line( 'Before Eam job pvt.date:'||l_req_material_tbl(j).REQUESTED_DATE);
2045        j := j+1;
2046        --
2047          END LOOP;
2048        END IF; --Material tbl
2049        --
2050 -- dbms_output.put_line( 'before wip jobs:');
2051    IF G_DEBUG='Y' THEN
2052    AHL_DEBUG_PUB.debug('before wip job call');
2053    END IF;
2054        -- Before Ahl Eam job Call
2055  AHL_EAM_JOB_PVT.process_material_req
2056 (
2057   p_api_version        => l_api_version,
2058   p_init_msg_list      => l_init_msg_list,
2059   p_commit             => p_commit,
2060   p_validation_level   => p_validation_level,
2061   p_default            => l_default,
2062   p_module_type        => l_module_type,
2063   x_return_status      => l_return_status,
2064   x_msg_count          => l_msg_count,
2065   x_msg_data           => l_msg_data,
2066   p_material_req_tbl   => l_req_material_tbl);
2067 -- dbms_output.put_line( 'after wip jobs:'||l_return_status);
2068    IF G_DEBUG='Y' THEN
2069    AHL_DEBUG_PUB.debug('after wip job call:'||l_return_status);
2070    AHL_DEBUG_PUB.debug('after wip job call:'||l_msg_count);
2071    AHL_DEBUG_PUB.debug('after wip job call:'||l_msg_data);
2072    END IF;
2073       --
2074     l_msg_count := FND_MSG_PUB.count_msg;
2075     --
2076      IF l_msg_count > 0 THEN
2077          X_msg_count := l_msg_count;
2078          X_msg_data  := l_msg_data;
2079          X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2080        RAISE FND_API.G_EXC_ERROR;
2081      END IF;
2082 END IF;
2083 --
2084  IF G_DEBUG='Y' THEN
2085  AHL_DEBUG_PUB.debug('Before insert status call');
2086  END IF;
2087 -- dbms_output.put_line( 'after wip jobs:');
2088  --
2089 IF l_return_status ='S' THEN
2090    --Change made on Nov 17, 2005 by jeli due to bug 4742895.
2091    --Ignore messages in stack if return status is S after calls to EAM APIs.
2092    FND_MSG_PUB.initialize;
2093 -- dbms_output.put_line( 'inside return status success:');
2094   IF p_x_req_material_tbl.COUNT > 0 THEN
2095     --
2096     FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
2097       LOOP
2098        --
2099        IF  (p_x_req_material_tbl(i).schedule_material_id = FND_API.G_MISS_NUM OR
2100             p_x_req_material_tbl(i).schedule_material_id IS NULL )
2101        THEN
2102           -- Thease conditions are required for optional fields
2103           IF p_x_req_material_tbl(i).visit_start_date = FND_API.G_MISS_DATE
2104           THEN
2105            l_Req_Material_Tbl(i).visit_start_date := NULL;
2106           ELSE
2107            l_Req_Material_Tbl(i).visit_start_date := p_x_req_material_tbl(i).visit_start_date;
2108           END IF;
2109           -- Scheduled Date
2110           IF p_x_req_material_tbl(i).scheduled_date = FND_API.G_MISS_DATE
2111           THEN
2112            l_Req_Material_Tbl(i).scheduled_date := NULL;
2113           ELSE
2114            l_Req_Material_Tbl(i).scheduled_date := p_x_req_material_tbl(i).scheduled_date;
2115           END IF;
2116           -- Request ID
2117           IF p_x_req_material_tbl(i).request_id = FND_API.G_MISS_NUM
2118           THEN
2119            l_Req_Material_Tbl(i).request_id := NULL;
2120           ELSE
2121            l_Req_Material_Tbl(i).request_id := p_x_req_material_tbl(i).request_id;
2122           END IF;
2123           --Scheduled quantity
2124           IF p_x_req_material_tbl(i).scheduled_quantity = FND_API.G_MISS_NUM
2125           THEN
2126            l_Req_Material_Tbl(i).scheduled_quantity := NULL;
2127           ELSE
2128            l_Req_Material_Tbl(i).scheduled_quantity := p_x_req_material_tbl(i).scheduled_quantity;
2129           END IF;
2130           -- Operation Sequence
2131           IF p_x_req_material_tbl(i).operation_sequence = FND_API.G_MISS_NUM
2132           THEN
2133            l_Req_Material_Tbl(i).operation_sequence := NULL;
2134           ELSE
2135            l_Req_Material_Tbl(i).operation_sequence := p_x_req_material_tbl(i).operation_sequence;
2136           END IF;
2137           -- UOM
2138           IF p_x_req_material_tbl(i).uom_code = FND_API.G_MISS_CHAR
2139           THEN
2140            l_Req_Material_Tbl(i).uom_code := NULL;
2141           ELSE
2142            l_Req_Material_Tbl(i).uom_code := p_x_req_material_tbl(i).uom_code;
2143           END IF;
2144           -- Status
2145           IF p_x_req_material_tbl(i).status = FND_API.G_MISS_CHAR
2146           THEN
2147            l_Req_Material_Tbl(i).status := NULL;
2148           ELSE
2149            l_Req_Material_Tbl(i).status := p_x_req_material_tbl(i).status;
2150           END IF;
2151           -- Operation code
2152           IF p_x_req_material_tbl(i).operation_code = FND_API.G_MISS_CHAR
2153           THEN
2154            l_Req_Material_Tbl(i).operation_code := NULL;
2155           ELSE
2156            l_Req_Material_Tbl(i).operation_code := p_x_req_material_tbl(i).operation_code;
2157           END IF;
2158           -- Transaction ID
2159           IF p_x_req_material_tbl(i).transaction_id = FND_API.G_MISS_NUM
2160           THEN
2161            l_Req_Material_Tbl(i).transaction_id := NULL;
2162           ELSE
2163            l_Req_Material_Tbl(i).transaction_id := p_x_req_material_tbl(i).transaction_id;
2164           END IF;
2165           -- Rt Oper Material ID
2166           IF p_x_req_material_tbl(i).rt_oper_material_id = FND_API.G_MISS_NUM
2167           THEN
2168            l_Req_Material_Tbl(i).rt_oper_material_id := NULL;
2169           ELSE
2170            l_Req_Material_Tbl(i).rt_oper_material_id := p_x_req_material_tbl(i).rt_oper_material_id;
2171           END IF;
2172           -- Program ID
2173           IF p_x_req_material_tbl(i).program_id = FND_API.G_MISS_NUM
2174           THEN
2175            l_Req_Material_Tbl(i).program_id := NULL;
2176           ELSE
2177            l_Req_Material_Tbl(i).program_id := p_x_req_material_tbl(i).program_id;
2178           END IF;
2179           -- Item group ID
2180           IF p_x_req_material_tbl(i).item_group_id = FND_API.G_MISS_NUM
2181           THEN
2182            l_Req_Material_Tbl(i).item_group_id := NULL;
2183           ELSE
2184            l_Req_Material_Tbl(i).item_group_id := p_x_req_material_tbl(i).item_group_id;
2185           END IF;
2186           -- Program Update Date
2187           IF p_x_req_material_tbl(i).program_update_date = FND_API.G_MISS_DATE
2188           THEN
2189            l_Req_Material_Tbl(i).program_update_date := NULL;
2190           ELSE
2191            l_Req_Material_Tbl(i).program_update_date := p_x_req_material_tbl(i).program_update_date;
2192           END IF;
2193           -- Last Updated Date
2194           IF p_x_req_material_tbl(i).last_updated_date = FND_API.G_MISS_DATE
2195           THEN
2196            l_Req_Material_Tbl(i).last_updated_date := NULL;
2197           ELSE
2198           l_Req_Material_Tbl(i).last_updated_date := p_x_req_material_tbl(i).last_updated_date;
2199           END IF;
2200       --sukhwsin: SB Effectivity Code chanages - starts
2201       --mc_header_id
2202           IF p_x_req_material_tbl(i).mc_header_id = FND_API.G_MISS_NUM
2203           THEN
2204            l_Req_Material_Tbl(i).mc_header_id := NULL;
2205           ELSE
2206           l_Req_Material_Tbl(i).mc_header_id := p_x_req_material_tbl(i).mc_header_id;
2207           END IF;
2208       --mc_name
2209           IF p_x_req_material_tbl(i).mc_name = FND_API.G_MISS_CHAR
2210           THEN
2211            l_Req_Material_Tbl(i).mc_name := NULL;
2212           ELSE
2213           l_Req_Material_Tbl(i).mc_name := p_x_req_material_tbl(i).mc_name;
2214           END IF;
2215       --mc_position_key
2216           IF p_x_req_material_tbl(i).mc_position_key = FND_API.G_MISS_NUM
2217           THEN
2218            l_Req_Material_Tbl(i).mc_position_key := NULL;
2219           ELSE
2220           l_Req_Material_Tbl(i).mc_position_key := p_x_req_material_tbl(i).mc_position_key;
2221           END IF;
2222       --mc_position
2223           IF p_x_req_material_tbl(i).mc_position = FND_API.G_MISS_CHAR
2224           THEN
2225            l_Req_Material_Tbl(i).mc_position := NULL;
2226           ELSE
2227           l_Req_Material_Tbl(i).mc_position := p_x_req_material_tbl(i).mc_position;
2228           END IF;
2229       --sukhwsin: SB Effectivity Code chanages - ends
2230           IF G_DEBUG='Y' THEN
2231                         AHL_DEBUG_PUB.debug('fetching dff_default_values');
2232           END IF;
2233           get_dff_default_values
2234           (
2235              p_req_material_rec      => p_x_req_material_tbl(i),
2236              flex_fields_defaults    =>  dff_default_values
2237           );
2238           IF G_DEBUG='Y' THEN
2239              AHL_DEBUG_PUB.debug('dff_default_values have been fetched');
2240           END IF;
2241           -- Attribte Category
2242           IF p_x_req_material_tbl(i).attribute_category = FND_API.G_MISS_CHAR
2243           THEN
2244            l_Req_Material_Tbl(i).attribute_category := NULL;
2245           ELSIF p_x_req_material_tbl(i).attribute_category IS NULL THEN
2246            l_Req_Material_Tbl(i).attribute_category := dff_default_values.attribute_category;
2247           ELSE
2248            l_Req_Material_Tbl(i).attribute_category := p_x_req_material_tbl(i).attribute_category;
2249           END IF;
2250           -- Attribte1
2251           IF p_x_req_material_tbl(i).attribute1 = FND_API.G_MISS_CHAR
2252           THEN
2253            l_Req_Material_Tbl(i).attribute1 := NULL;
2254           ELSIF p_x_req_material_tbl(i).attribute1 IS NULL THEN
2255            l_Req_Material_Tbl(i).attribute1 := dff_default_values.attribute1;
2256           ELSE
2257            l_Req_Material_Tbl(i).attribute1 := p_x_req_material_tbl(i).attribute1;
2258           END IF;
2259           -- Attribte2
2260           IF p_x_req_material_tbl(i).attribute2 = FND_API.G_MISS_CHAR
2261           THEN
2262            l_Req_Material_Tbl(i).attribute2 := NULL;
2263           ELSIF p_x_req_material_tbl(i).attribute2 IS NULL THEN
2264            l_Req_Material_Tbl(i).attribute2 := dff_default_values.attribute2;
2265           ELSE
2266            l_Req_Material_Tbl(i).attribute2 := p_x_req_material_tbl(i).attribute2;
2267           END IF;
2268           -- Attribte3
2269           IF p_x_req_material_tbl(i).attribute3 = FND_API.G_MISS_CHAR
2270           THEN
2271            l_Req_Material_Tbl(i).attribute3 := NULL;
2272           ELSIF p_x_req_material_tbl(i).attribute3 IS NULL THEN
2273            l_Req_Material_Tbl(i).attribute3 := dff_default_values.attribute3;
2274           ELSE
2275            l_Req_Material_Tbl(i).attribute3 := p_x_req_material_tbl(i).attribute3;
2276           END IF;
2277           -- Attribte4
2278           IF p_x_req_material_tbl(i).attribute4 = FND_API.G_MISS_CHAR
2279           THEN
2280            l_Req_Material_Tbl(i).attribute4 := NULL;
2281           ELSIF p_x_req_material_tbl(i).attribute4 IS NULL THEN
2282            l_Req_Material_Tbl(i).attribute4 := dff_default_values.attribute4;
2283           ELSE
2284            l_Req_Material_Tbl(i).attribute4 := p_x_req_material_tbl(i).attribute4;
2285           END IF;
2286           -- Attribte5
2287           IF p_x_req_material_tbl(i).attribute5 = FND_API.G_MISS_CHAR
2288           THEN
2289            l_Req_Material_Tbl(i).attribute5 := NULL;
2290           ELSIF p_x_req_material_tbl(i).attribute5 IS NULL THEN
2291            l_Req_Material_Tbl(i).attribute5 := dff_default_values.attribute5;
2292           ELSE
2293            l_Req_Material_Tbl(i).attribute5 := p_x_req_material_tbl(i).attribute5;
2294           END IF;
2295           -- Attribte6
2296           IF p_x_req_material_tbl(i).attribute6 = FND_API.G_MISS_CHAR
2297           THEN
2298            l_Req_Material_Tbl(i).attribute6 := NULL;
2299           ELSIF p_x_req_material_tbl(i).attribute6 IS NULL THEN
2300            l_Req_Material_Tbl(i).attribute6 := dff_default_values.attribute6;
2301           ELSE
2302            l_Req_Material_Tbl(i).attribute6 := p_x_req_material_tbl(i).attribute6;
2303           END IF;
2304           -- Attribte7
2305           IF p_x_req_material_tbl(i).attribute7 = FND_API.G_MISS_CHAR
2306           THEN
2307            l_Req_Material_Tbl(i).attribute7 := NULL;
2308           ELSIF p_x_req_material_tbl(i).attribute7 IS NULL THEN
2309            l_Req_Material_Tbl(i).attribute7 := dff_default_values.attribute7;
2310           ELSE
2311            l_Req_Material_Tbl(i).attribute7 := p_x_req_material_tbl(i).attribute7;
2312           END IF;
2313           -- Attribte8
2314           IF p_x_req_material_tbl(i).attribute8 = FND_API.G_MISS_CHAR
2315           THEN
2316            l_Req_Material_Tbl(i).attribute8 := NULL;
2317           ELSIF p_x_req_material_tbl(i).attribute8 IS NULL THEN
2318            l_Req_Material_Tbl(i).attribute8 := dff_default_values.attribute8;
2319           ELSE
2320            l_Req_Material_Tbl(i).attribute8 := p_x_req_material_tbl(i).attribute8;
2321           END IF;
2322           -- Attribte9
2323           IF p_x_req_material_tbl(i).attribute9 = FND_API.G_MISS_CHAR
2324           THEN
2325            l_Req_Material_Tbl(i).attribute9 := NULL;
2326           ELSIF p_x_req_material_tbl(i).attribute9 IS NULL THEN
2327            l_Req_Material_Tbl(i).attribute9 := dff_default_values.attribute9;
2328           ELSE
2329            l_Req_Material_Tbl(i).attribute9 := p_x_req_material_tbl(i).attribute9;
2330           END IF;
2331           -- Attribte10
2332           IF p_x_req_material_tbl(i).attribute10 = FND_API.G_MISS_CHAR
2333           THEN
2334            l_Req_Material_Tbl(i).attribute10 := NULL;
2335           ELSIF p_x_req_material_tbl(i).attribute10 IS NULL THEN
2336            l_Req_Material_Tbl(i).attribute10 := dff_default_values.attribute10;
2337           ELSE
2338            l_Req_Material_Tbl(i).attribute10 := p_x_req_material_tbl(i).attribute10;
2339           END IF;
2340           -- Attribte11
2341           IF p_x_req_material_tbl(i).attribute11 = FND_API.G_MISS_CHAR
2342           THEN
2343            l_Req_Material_Tbl(i).attribute11 := NULL;
2344           ELSIF p_x_req_material_tbl(i).attribute11 IS NULL THEN
2345            l_Req_Material_Tbl(i).attribute11 := dff_default_values.attribute11;
2346           ELSE
2347            l_Req_Material_Tbl(i).attribute11 := p_x_req_material_tbl(i).attribute11;
2348           END IF;
2349           -- Attribte12
2350           IF p_x_req_material_tbl(i).attribute12 = FND_API.G_MISS_CHAR
2351           THEN
2352            l_Req_Material_Tbl(i).attribute12 := NULL;
2353           ELSIF p_x_req_material_tbl(i).attribute12 IS NULL THEN
2354            l_Req_Material_Tbl(i).attribute12 := dff_default_values.attribute12;
2355           ELSE
2356            l_Req_Material_Tbl(i).attribute12 := p_x_req_material_tbl(i).attribute12;
2357           END IF;
2358           -- Attribte13
2359           IF p_x_req_material_tbl(i).attribute13 = FND_API.G_MISS_CHAR
2360           THEN
2361            l_Req_Material_Tbl(i).attribute13 := NULL;
2362           ELSIF p_x_req_material_tbl(i).attribute13 IS NULL THEN
2363            l_Req_Material_Tbl(i).attribute13 := dff_default_values.attribute13;
2364           ELSE
2365            l_Req_Material_Tbl(i).attribute13 := p_x_req_material_tbl(i).attribute13;
2366           END IF;
2367           -- Attribte14
2368           IF p_x_req_material_tbl(i).attribute14 = FND_API.G_MISS_CHAR
2369           THEN
2370            l_Req_Material_Tbl(i).attribute14 := NULL;
2371           ELSIF p_x_req_material_tbl(i).attribute14 IS NULL THEN
2372            l_Req_Material_Tbl(i).attribute14 := dff_default_values.attribute14;
2373           ELSE
2374            l_Req_Material_Tbl(i).attribute14 := p_x_req_material_tbl(i).attribute14;
2375           END IF;
2376           -- Attribte15
2377           IF p_x_req_material_tbl(i).attribute15 = FND_API.G_MISS_CHAR
2378           THEN
2379            l_Req_Material_Tbl(i).attribute15 := NULL;
2380           ELSIF p_x_req_material_tbl(i).attribute15 IS NULL THEN
2381            l_Req_Material_Tbl(i).attribute15 := dff_default_values.attribute15;
2382           ELSE
2383            l_Req_Material_Tbl(i).attribute15 := p_x_req_material_tbl(i).attribute15;
2384           END IF;
2385           --
2386           -- debadey: Marshalling FDD section 5.15 (update aog flag in workorder), 2/11/11
2387                       -- AOG Flag
2388           IF p_x_req_material_tbl(i).aog_flag = FND_API.G_MISS_CHAR
2389           THEN
2390            l_Req_Material_Tbl(i).aog_flag := NULL;
2391           ELSE
2392            l_Req_Material_Tbl(i).aog_flag := p_x_req_material_tbl(i).aog_flag;
2393           END IF;
2394           -- end of changes by debadey for Marshalling
2395         -- Get Sequence Number for schedule material ID
2396         SELECT ahl_schedule_materials_s.NEXTVAL
2397                   INTO l_schedule_material_id FROM DUAL;
2398         --
2399         --
2400    IF G_DEBUG='Y' THEN
2401    AHL_DEBUG_PUB.debug( 'before interface flag:'||p_x_req_material_tbl(i).rt_oper_material_id);
2402    AHL_DEBUG_PUB.debug( 'before interface flag:'||p_interface_flag);
2403    END IF;
2404         --Check for materials added from route.Already in scheudle material entity
2405         -- were schedule during LTP process
2406   IF (p_interface_flag = 'N' or  p_interface_flag = 'n') THEN
2407    --
2408    IF G_DEBUG='Y' THEN
2409    AHL_DEBUG_PUB.debug( 'FLAG=N RTID:'||p_x_req_material_tbl(i).rt_oper_material_id);
2410    AHL_DEBUG_PUB.debug( 'FLAG=N VTID:'||p_x_req_material_tbl(i).visit_task_id);
2411    AHL_DEBUG_PUB.debug( 'FLAG=N ITID:'||p_x_req_material_tbl(i).inventory_item_id);
2412    END IF;
2413          IF (p_x_req_material_tbl(i).rt_oper_material_id IS NOT NULL AND
2414              p_x_req_material_tbl(i).rt_oper_material_id <> FND_API.G_MISS_NUM)
2415              THEN
2416              --
2417              OPEN Get_rt_mat_cur (p_x_req_material_tbl(i).visit_task_id,
2418                                   p_x_req_material_tbl(i).rt_oper_material_id,
2419                                   --sukhwsin::SB Effectivity - control position change
2420                                   p_x_req_material_tbl(i).mc_position_key);
2421              FETCH Get_rt_mat_cur INTO l_material_rec;
2422              CLOSE Get_rt_mat_cur;
2423              --
2424    IF G_DEBUG='Y' THEN
2425    AHL_DEBUG_PUB.debug( 'Inside MATID:'||l_material_rec.scheduled_material_id);
2426    AHL_DEBUG_PUB.debug( 'inside VTID:'||l_material_rec.visit_task_id);
2427    AHL_DEBUG_PUB.debug( 'inside ITID:'||l_material_rec.inventory_item_id);
2428    AHL_DEBUG_PUB.debug( 'inside DES:'||l_schedule_designator);
2429    END IF;
2430        --
2431        IF ( l_material_rec.scheduled_material_id IS NOT NULL
2432             --Adithya added for FP Bug# 6366740
2433             AND p_x_req_material_tbl(i).workorder_operation_id = l_material_rec.workorder_operation_id )
2434        THEN
2435           -- UPDATE ahl schedule materials table with operation id, operation sequence
2436               UPDATE ahl_schedule_materials
2437                 SET workorder_operation_id = p_x_req_material_tbl(i).workorder_operation_id,
2438                     operation_code     = p_x_req_material_tbl(i).operation_code,
2439                     operation_sequence = p_x_req_material_tbl(i).operation_sequence,
2440                     object_version_number =l_material_rec.object_version_number +1
2441                 WHERE scheduled_material_id = l_material_rec.scheduled_material_id;
2442               --Assign out parameter
2443     p_x_req_material_tbl(i).schedule_material_id := l_material_rec.scheduled_material_id;
2444     p_x_req_material_tbl(i).requested_quantity   := l_material_rec.requested_quantity;
2445     p_x_req_material_tbl(i).requested_date       := l_material_rec.requested_date;
2446     p_x_req_material_tbl(i).uom_code             := l_material_rec.uom;
2447     -- fix for bug# 5549135.
2448     --p_x_req_material_tbl(i).mrp_net_flag         := 1;
2449     p_x_req_material_tbl(i).mrp_net_flag         := 2;
2450    IF G_DEBUG='Y' THEN
2451    AHL_DEBUG_PUB.debug( 'p_x_req_material_tbl(i).mrp_net_flag:'||p_x_req_material_tbl(i).mrp_net_flag);
2452    END IF;
2453   ELSE
2454    IF G_DEBUG='Y' THEN
2455    AHL_DEBUG_PUB.debug( 'else flag Mat id:'||l_schedule_material_id);
2456    END IF;
2457           -- Create Record in schedule materials
2458              Insert_Row (
2459                    X_SCHEDULED_MATERIAL_ID => l_schedule_material_id,
2460                    X_OBJECT_VERSION_NUMBER => 1,
2461                    X_INVENTORY_ITEM_ID     => p_x_req_material_tbl(i).inventory_item_id,
2462                    X_SCHEDULE_DESIGNATOR   => l_schedule_designator,
2463                    X_VISIT_ID              => l_visit_id,
2464                    X_VISIT_START_DATE      => l_Req_Material_Tbl(i).visit_start_date,
2465                    X_VISIT_TASK_ID         => p_x_req_material_tbl(i).visit_task_id,
2466                    X_ORGANIZATION_ID       => p_x_req_material_tbl(i).organization_id,
2467                    X_SCHEDULED_DATE        => l_Req_Material_Tbl(i).scheduled_date,
2468                    X_REQUEST_ID            => l_Req_Material_Tbl(i).request_id,
2469                    X_REQUESTED_DATE        => p_x_req_material_tbl(i).requested_date,
2470                    X_SCHEDULED_QUANTITY    => l_Req_Material_Tbl(i).scheduled_quantity,
2471                    X_PROCESS_STATUS        => null,
2472                    X_ERROR_MESSAGE         => null,
2473                    X_TRANSACTION_ID        => l_Req_Material_Tbl(i).transaction_id,
2474                    X_UOM                   => l_Req_Material_Tbl(i).uom_code,
2475                    X_RT_OPER_MATERIAL_ID   => l_Req_Material_Tbl(i).rt_oper_material_id,
2476                    X_OPERATION_CODE        => l_Req_Material_Tbl(i).operation_code,
2477                    X_OPERATION_SEQUENCE    => l_Req_Material_Tbl(i).operation_sequence,
2478                    X_ITEM_GROUP_ID         => l_Req_Material_Tbl(i).item_group_id,
2479                    X_REQUESTED_QUANTITY    => p_x_req_material_tbl(i).requested_quantity,
2480                    X_PROGRAM_ID            => l_Req_Material_Tbl(i).program_id,
2481                    X_PROGRAM_UPDATE_DATE   => l_Req_Material_Tbl(i).program_update_date,
2482                    X_LAST_UPDATED_DATE     => l_Req_Material_Tbl(i).last_updated_date,
2483                    X_WORKORDER_OPERATION_ID => p_x_req_material_tbl(i).workorder_operation_id,
2484                    X_MATERIAL_REQUEST_TYPE  => 'UNPLANNED',
2485                  X_STATUS                 => nvl(l_Req_Material_Tbl(i).status, 'ACTIVE'),
2486                   X_ATTRIBUTE_CATEGORY    => l_Req_Material_Tbl(i).attribute_category,
2487                    X_ATTRIBUTE1            => l_Req_Material_Tbl(i).attribute1,
2488                    X_ATTRIBUTE2            => l_Req_Material_Tbl(i).attribute2,
2489                    X_ATTRIBUTE3            => l_Req_Material_Tbl(i).attribute3,
2490                    X_ATTRIBUTE4            => l_Req_Material_Tbl(i).attribute4,
2491                    X_ATTRIBUTE5            => l_Req_Material_Tbl(i).attribute5,
2492                    X_ATTRIBUTE6            => l_Req_Material_Tbl(i).attribute6,
2493                    X_ATTRIBUTE7            => l_Req_Material_Tbl(i).attribute7,
2494                    X_ATTRIBUTE8            => l_Req_Material_Tbl(i).attribute8,
2495                    X_ATTRIBUTE9            => l_Req_Material_Tbl(i).attribute9,
2496                    X_ATTRIBUTE10           => l_Req_Material_Tbl(i).attribute10,
2497                    X_ATTRIBUTE11           => l_Req_Material_Tbl(i).attribute11,
2498                    X_ATTRIBUTE12           => l_Req_Material_Tbl(i).attribute12,
2499                    X_ATTRIBUTE13           => l_Req_Material_Tbl(i).attribute13,
2500                    X_ATTRIBUTE14           => l_Req_Material_Tbl(i).attribute14,
2501                    X_ATTRIBUTE15           => l_Req_Material_Tbl(i).attribute15,
2502                    X_CREATION_DATE         => SYSDATE,
2503                    X_CREATED_BY            => fnd_global.user_id,
2504                    X_LAST_UPDATE_DATE      => SYSDATE,
2505                    X_LAST_UPDATED_BY       => fnd_global.user_id,
2506                    X_LAST_UPDATE_LOGIN     => fnd_global.login_id,
2507                    --sukhwsin: Code changes for SB effectivity - starts
2508                                    X_MC_HEADER_ID                  => l_Req_Material_Tbl(i).mc_header_id,
2509                                    X_POSITION_KEY                  => l_Req_Material_Tbl(i).mc_position_key,
2510                                    X_RELATIONSHIP_ID       => l_relationship_tbl(i),
2511                                    --sukhwsin: Code changes for SB effectivity - ends
2512                    --debadey: Marshalling FDD sction 5.15 - AOG flag addition
2513                    X_AOG_FLAG              => l_Req_Material_Tbl(i).aog_flag
2514                   );
2515    --Assign out parameter
2516    p_x_req_material_tbl(i).schedule_material_id := l_schedule_material_id;
2517    -- fix for bug# 5549135.
2518    --p_x_req_material_tbl(i).mrp_net_flag := 1;
2519    p_x_req_material_tbl(i).mrp_net_flag := 2;
2520    --
2521    END IF; --Get_rt_mat_cur
2522    -- Get Project and Task id
2523    IF G_DEBUG='Y' THEN
2524    AHL_DEBUG_PUB.debug( 'schedule material id 5:'||l_schedule_material_id);
2525    END IF;
2526  ELSE
2527    IF G_DEBUG='Y' THEN
2528    AHL_DEBUG_PUB.debug( 'schedule material id 6:'||l_schedule_material_id);
2529    END IF;
2530           -- Create Record in schedule materials
2531              Insert_Row (
2532                    X_SCHEDULED_MATERIAL_ID => l_schedule_material_id,
2533                    X_OBJECT_VERSION_NUMBER => 1,
2534                    X_INVENTORY_ITEM_ID     => p_x_req_material_tbl(i).inventory_item_id,
2535                    X_SCHEDULE_DESIGNATOR   => l_schedule_designator,
2536                    X_VISIT_ID              => l_visit_id,
2537                    X_VISIT_START_DATE      => l_Req_Material_Tbl(i).visit_start_date,
2538                    X_VISIT_TASK_ID         => p_x_req_material_tbl(i).visit_task_id,
2539                    X_ORGANIZATION_ID       => p_x_req_material_tbl(i).organization_id,
2540                    X_SCHEDULED_DATE        => l_Req_Material_Tbl(i).scheduled_date,
2541                    X_REQUEST_ID            => l_Req_Material_Tbl(i).request_id,
2542                    X_REQUESTED_DATE        => p_x_req_material_tbl(i).requested_date,
2543                    X_SCHEDULED_QUANTITY    => l_Req_Material_Tbl(i).scheduled_quantity,
2544                    X_PROCESS_STATUS        => null,
2545                    X_ERROR_MESSAGE         => null,
2546                    X_TRANSACTION_ID        => l_Req_Material_Tbl(i).transaction_id,
2547                    X_UOM                   => l_Req_Material_Tbl(i).uom_code,
2548                    X_RT_OPER_MATERIAL_ID   => l_Req_Material_Tbl(i).rt_oper_material_id,
2549                    X_OPERATION_CODE        => l_Req_Material_Tbl(i).operation_code,
2550                    X_OPERATION_SEQUENCE    => l_Req_Material_Tbl(i).operation_sequence,
2551                    X_ITEM_GROUP_ID         => l_Req_Material_Tbl(i).item_group_id,
2552                    X_REQUESTED_QUANTITY    => p_x_req_material_tbl(i).requested_quantity,
2553                    X_PROGRAM_ID            => l_Req_Material_Tbl(i).program_id,
2554                    X_PROGRAM_UPDATE_DATE   => l_Req_Material_Tbl(i).program_update_date,
2555                    X_LAST_UPDATED_DATE     => l_Req_Material_Tbl(i).last_updated_date,
2556                    X_WORKORDER_OPERATION_ID => p_x_req_material_tbl(i).workorder_operation_id,
2557                    X_MATERIAL_REQUEST_TYPE  => 'UNPLANNED',
2558                    X_STATUS                 => 'ACTIVE',
2559                    X_ATTRIBUTE_CATEGORY    => l_Req_Material_Tbl(i).attribute_category,
2560                    X_ATTRIBUTE1            => l_Req_Material_Tbl(i).attribute1,
2561                    X_ATTRIBUTE2            => l_Req_Material_Tbl(i).attribute2,
2562                    X_ATTRIBUTE3            => l_Req_Material_Tbl(i).attribute3,
2563                    X_ATTRIBUTE4            => l_Req_Material_Tbl(i).attribute4,
2564                    X_ATTRIBUTE5            => l_Req_Material_Tbl(i).attribute5,
2565                    X_ATTRIBUTE6            => l_Req_Material_Tbl(i).attribute6,
2566                    X_ATTRIBUTE7            => l_Req_Material_Tbl(i).attribute7,
2567                    X_ATTRIBUTE8            => l_Req_Material_Tbl(i).attribute8,
2568                    X_ATTRIBUTE9            => l_Req_Material_Tbl(i).attribute9,
2569                    X_ATTRIBUTE10           => l_Req_Material_Tbl(i).attribute10,
2570                    X_ATTRIBUTE11           => l_Req_Material_Tbl(i).attribute11,
2571                    X_ATTRIBUTE12           => l_Req_Material_Tbl(i).attribute12,
2572                    X_ATTRIBUTE13           => l_Req_Material_Tbl(i).attribute13,
2573                    X_ATTRIBUTE14           => l_Req_Material_Tbl(i).attribute14,
2574                    X_ATTRIBUTE15           => l_Req_Material_Tbl(i).attribute15,
2575                    X_CREATION_DATE         => SYSDATE,
2576                    X_CREATED_BY            => fnd_global.user_id,
2577                    X_LAST_UPDATE_DATE      => SYSDATE,
2578                    X_LAST_UPDATED_BY       => fnd_global.user_id,
2579                    X_LAST_UPDATE_LOGIN     => fnd_global.login_id,
2580                                    --sukhwsin: SB Effectivity Code changes - starts
2581                                    X_MC_HEADER_ID                  => l_Req_Material_Tbl(i).mc_header_id,
2582                                    X_POSITION_KEY          => l_Req_Material_Tbl(i).mc_position_key,
2583                                    X_RELATIONSHIP_ID       => l_relationship_tbl(i),
2584                                    --sukhwsin: SB Effectivity Code changes - ends
2585                    --debadey: Marshalling FDD sction 5.15 - AOG flag addition
2586                    X_AOG_FLAG              => l_Req_Material_Tbl(i).aog_flag
2587                   );
2588    --Assign out parameter
2589    --
2590    p_x_req_material_tbl(i).schedule_material_id := l_schedule_material_id;
2591    -- fix for bug# 5549135.
2592    --p_x_req_material_tbl(i).mrp_net_flag := 1;
2593    p_x_req_material_tbl(i).mrp_net_flag := 2;
2594    --
2595    END IF; -- --rt oper id not null
2596    IF G_DEBUG='Y' THEN
2597    AHL_DEBUG_PUB.debug( 'after rt oper material id:'||l_schedule_material_id);
2598    END IF;
2599    --
2600    END IF; -- --Interface flag
2601    --
2602    IF G_DEBUG='Y' THEN
2603    AHL_DEBUG_PUB.debug( 'schedule material id:'||l_schedule_material_id);
2604    END IF;
2605    --
2606  END IF; --Material id g_miss_num
2607    --
2608    SELECT AHL_WO_OPERATIONS_TXNS_S.NEXTVAL INTO l_wo_operation_txn_id
2609            FROM DUAL;
2610    --
2611    IF G_DEBUG='Y' THEN
2612    AHL_DEBUG_PUB.debug( 'before calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
2613    END IF;
2614       --Create Record in transactions table
2615        Log_Transaction_Record
2616            ( p_wo_operation_txn_id    => l_wo_operation_txn_id,
2617              p_object_version_number  => 1,
2618              p_last_update_date       => sysdate,
2619              p_last_updated_by        => fnd_global.user_id,
2620              p_creation_date          => sysdate,
2621              p_created_by             => fnd_global.user_id,
2622              p_last_update_login      => fnd_global.login_id,
2623              p_load_type_code         => 2,
2624              p_transaction_type_code  => 1,
2625              p_workorder_operation_id => p_x_req_material_tbl(i).workorder_operation_id,
2626              p_schedule_material_id   => p_x_req_material_tbl(i).schedule_material_id,
2627              p_inventory_item_id      => p_x_req_material_tbl(i).inventory_item_id,
2628              p_required_quantity      => p_x_req_material_tbl(i).requested_quantity,
2629              p_date_required          => p_x_req_material_tbl(i).requested_date
2630             );
2631    --Call MRP Process
2632    --
2633    IF G_DEBUG='Y' THEN
2634    AHL_DEBUG_PUB.debug( 'before calling MRP l_schedule_designator:'||l_schedule_designator);
2635    END IF;
2636  IF  (p_interface_flag IS NULL OR p_interface_flag = 'Y') THEN
2637           -- Create Record in schedule materials
2638              Insert_Row (
2639                    X_SCHEDULED_MATERIAL_ID => l_schedule_material_id,
2640                    X_OBJECT_VERSION_NUMBER => 1,
2641                    X_INVENTORY_ITEM_ID     => p_x_req_material_tbl(i).inventory_item_id,
2642                    X_SCHEDULE_DESIGNATOR   => l_schedule_designator,
2643                    X_VISIT_ID              => l_visit_id,
2644                    X_VISIT_START_DATE      => l_Req_Material_Tbl(i).visit_start_date,
2645                    X_VISIT_TASK_ID         => p_x_req_material_tbl(i).visit_task_id,
2646                    X_ORGANIZATION_ID       => p_x_req_material_tbl(i).organization_id,
2647                    X_SCHEDULED_DATE        => l_Req_Material_Tbl(i).scheduled_date,
2648                    X_REQUEST_ID            => l_Req_Material_Tbl(i).request_id,
2649                    X_REQUESTED_DATE        => p_x_req_material_tbl(i).requested_date,
2650                    X_SCHEDULED_QUANTITY    => l_Req_Material_Tbl(i).scheduled_quantity,
2651                    X_PROCESS_STATUS        => null,
2652                    X_ERROR_MESSAGE         => null,
2653                    X_TRANSACTION_ID        => l_Req_Material_Tbl(i).transaction_id,
2654                    X_UOM                   => l_Req_Material_Tbl(i).uom_code,
2655                    X_RT_OPER_MATERIAL_ID   => l_Req_Material_Tbl(i).rt_oper_material_id,
2656                    X_OPERATION_CODE        => l_Req_Material_Tbl(i).operation_code,
2657                    X_OPERATION_SEQUENCE    => l_Req_Material_Tbl(i).operation_sequence,
2658                    X_ITEM_GROUP_ID         => l_Req_Material_Tbl(i).item_group_id,
2659                    X_REQUESTED_QUANTITY    => p_x_req_material_tbl(i).requested_quantity,
2660                    X_PROGRAM_ID            => l_Req_Material_Tbl(i).program_id,
2661                    X_PROGRAM_UPDATE_DATE   => l_Req_Material_Tbl(i).program_update_date,
2662                    X_LAST_UPDATED_DATE     => l_Req_Material_Tbl(i).last_updated_date,
2663                    X_WORKORDER_OPERATION_ID => p_x_req_material_tbl(i).workorder_operation_id,
2664                    X_MATERIAL_REQUEST_TYPE  => 'UNPLANNED',
2665                            X_STATUS                 => nvl(l_Req_Material_Tbl(i).status,'ACTIVE'),
2666                          X_ATTRIBUTE_CATEGORY    => l_Req_Material_Tbl(i).attribute_category,
2667                    X_ATTRIBUTE1            => l_Req_Material_Tbl(i).attribute1,
2668                    X_ATTRIBUTE2            => l_Req_Material_Tbl(i).attribute2,
2669                    X_ATTRIBUTE3            => l_Req_Material_Tbl(i).attribute3,
2670                    X_ATTRIBUTE4            => l_Req_Material_Tbl(i).attribute4,
2671                    X_ATTRIBUTE5            => l_Req_Material_Tbl(i).attribute5,
2672                    X_ATTRIBUTE6            => l_Req_Material_Tbl(i).attribute6,
2673                    X_ATTRIBUTE7            => l_Req_Material_Tbl(i).attribute7,
2674                    X_ATTRIBUTE8            => l_Req_Material_Tbl(i).attribute8,
2675                    X_ATTRIBUTE9            => l_Req_Material_Tbl(i).attribute9,
2676                    X_ATTRIBUTE10           => l_Req_Material_Tbl(i).attribute10,
2677                    X_ATTRIBUTE11           => l_Req_Material_Tbl(i).attribute11,
2678                    X_ATTRIBUTE12           => l_Req_Material_Tbl(i).attribute12,
2679                    X_ATTRIBUTE13           => l_Req_Material_Tbl(i).attribute13,
2680                    X_ATTRIBUTE14           => l_Req_Material_Tbl(i).attribute14,
2681                    X_ATTRIBUTE15           => l_Req_Material_Tbl(i).attribute15,
2682                    X_CREATION_DATE         => SYSDATE,
2683                    X_CREATED_BY            => fnd_global.user_id,
2684                    X_LAST_UPDATE_DATE      => SYSDATE,
2685                    X_LAST_UPDATED_BY       => fnd_global.user_id,
2686                    X_LAST_UPDATE_LOGIN     => fnd_global.login_id,
2687                                    --sukhwsin: SB Effectivity Code changes - starts
2688                                    X_MC_HEADER_ID                  => l_Req_Material_Tbl(i).mc_header_id,
2689                                    X_POSITION_KEY          => l_Req_Material_Tbl(i).mc_position_key,
2690                                    X_RELATIONSHIP_ID       => l_relationship_tbl(i),
2691                                    --sukhwsin: SB Effectivity Code changes - ends
2692                   --debadey: Marshalling FDD sction 5.15 - AOG flag addition
2693                    X_AOG_FLAG              => l_Req_Material_Tbl(i).aog_flag
2694                   );
2695    --Assign out parameter
2696    p_x_req_material_tbl(i).schedule_material_id := l_schedule_material_id;
2697    --
2698    END IF; -- Interface flag Is null condiiton
2699    --
2700    END LOOP;
2701  END IF; --Count
2702      --
2703      X_return_status     := 'S';
2704      x_job_return_status := 'S';
2705   ELSE
2706      x_job_return_status := 'E';
2707      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2708      RAISE Fnd_Api.G_EXC_ERROR;
2709     END IF; --status condition
2710     --Call notification API
2711    --Send Material Notification
2712     IF X_return_status = 'S' THEN
2713      --Check for Profile Option value If 'Y' Call
2714      IF FND_PROFILE.value( 'AHL_MTL_REQ_NOTIFICATION_ENABLED') = 'Y' THEN
2715       --
2716     MATERIAL_NOTIFICATION
2717         (
2718          p_api_version    => p_api_version,
2719          p_init_msg_list  => p_init_msg_list,
2720          p_commit         => p_commit,
2721          p_validation_level       => p_validation_level,
2722          p_Req_Material_Tbl       => p_x_req_material_tbl,
2723          x_return_status          => l_return_status,
2724          x_msg_count              => l_msg_count,
2725          x_msg_data               => l_msg_data);
2726       END IF;
2727  END IF;
2728 -- dbms_output.put_line( 'end of API:');
2729 --sukhwsin::VCP Integration - Code Changes starts
2730 --Construct Workorder table that contains unique workorders
2731 IF p_x_req_material_tbl.COUNT > 0 THEN
2732   FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
2733     LOOP
2734       l_WO_found := 'N';
2735       IF (l_WorkOrders_Table.count > 0) THEN
2736     FOR j in l_WorkOrders_Table.FIRST..l_WorkOrders_Table.LAST
2737     LOOP
2738       IF (l_WorkOrders_Table(j) = p_x_req_material_tbl(i).workorder_id) THEN
2739         l_WO_found := 'Y';
2740         EXIT;
2741       END IF;
2742     END LOOP;
2743       END IF;
2744       IF (l_WO_found = 'N') THEN
2745     l_WorkOrders_Table(nvl(l_WorkOrders_Table.LAST,-1) + 1) := p_x_req_material_tbl(i).workorder_id;
2746       END IF;
2747     END LOOP;
2748 END IF;
2749 --change set ITEM_ALTERNATES_EXIST to Y in AHL_WORKORDERS if workorder contains
2750 --item group based or position based material requirements
2751 IF ( l_WorkOrders_Table.COUNT > 0 ) THEN
2752   FOR i IN l_WorkOrders_Table.FIRST..l_WorkOrders_Table.LAST
2753   LOOP
2754     l_alt_mat_req_count := 0;
2755     OPEN Get_Alt_Mat_Requirment_Count(l_WorkOrders_Table(i));
2756     FETCH Get_Alt_Mat_Requirment_Count INTO l_alt_mat_req_count;
2757     CLOSE Get_Alt_Mat_Requirment_Count;
2758     IF (l_alt_mat_req_count > 0) THEN
2759       UPDATE AHL_WORKORDERS
2760       SET ITEM_ALTERNATES_EXIST = 'Y'
2761       WHERE WORKORDER_ID = l_WorkOrders_Table(i);
2762     END IF;
2763   END LOOP;
2764 END IF;
2765 --sukhwsin::VCP Integration - Code Changes ends
2766    ------------------------End of Body---------------------------------------
2767   --Standard check to count messages
2768    l_msg_count := Fnd_Msg_Pub.count_msg;
2769    IF l_msg_count > 0 THEN
2770       X_msg_count := l_msg_count;
2771       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2772       RAISE Fnd_Api.G_EXC_ERROR;
2773    END IF;
2774    --Standard check for commit
2775    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
2776       COMMIT;
2777    END IF;
2778    -- Debug info
2779    IF G_DEBUG='Y' THEN
2780    Ahl_Debug_Pub.debug( 'End of public api Create Material Reqst','+PPMRP+');
2781    -- Check if API is called in debug mode. If yes, disable debug.
2782    Ahl_Debug_Pub.disable_debug;
2783    END IF;
2784   EXCEPTION
2785  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2786     ROLLBACK TO create_material_reqst;
2787     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2788     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2789                                p_count => x_msg_count,
2790                                p_data  => x_msg_data);
2791       IF G_DEBUG='Y' THEN
2792        AHL_DEBUG_PUB.log_app_messages (
2793              x_msg_count, x_msg_data, 'ERROR' );
2794        AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Create Material Reqst','+PPMRP+');
2795         -- Check if API is called in debug mode. If yes, disable debug.
2796         AHL_DEBUG_PUB.disable_debug;
2797       END IF;
2798 WHEN FND_API.G_EXC_ERROR THEN
2799     ROLLBACK TO create_material_reqst;
2800     X_return_status := FND_API.G_RET_STS_ERROR;
2801     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2802                                p_count => x_msg_count,
2803                                p_data  => X_msg_data);
2804       IF G_DEBUG='Y' THEN
2805         -- Debug info.
2806         AHL_DEBUG_PUB.log_app_messages (
2807              x_msg_count, x_msg_data, 'UNEXPECTED ERROR' );
2808         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Create Material Reqst','+PPMRP+');
2809         -- Check if API is called in debug mode. If yes, disable debug.
2810         AHL_DEBUG_PUB.disable_debug;
2811       END IF;
2812 WHEN OTHERS THEN
2813     ROLLBACK TO create_material_reqst;
2814     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2815     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2816     THEN
2817     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
2818                             p_procedure_name  =>  'CREATE_MATERIAL_REQST',
2819                             p_error_text      => SUBSTR(SQLERRM,1,240));
2820     END IF;
2821     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2822                                p_count => x_msg_count,
2823                                p_data  => X_msg_data);
2824      IF G_DEBUG='Y' THEN
2825         -- Debug info.
2826         AHL_DEBUG_PUB.log_app_messages (
2827               x_msg_count, x_msg_data, 'SQL ERROR' );
2828         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Create Material Reqst','+PPMRP+');
2829         -- Check if API is called in debug mode. If yes, disable debug.
2830         AHL_DEBUG_PUB.disable_debug;
2831      END IF;
2832 END Create_Material_Reqst;
2833 --
2834 -- Start of Comments --
2835 --  Procedure name    : Update_Material_Reqst
2836 --  Type              : Private
2837 --  Function          : Updates schedule material table with requested fields, before
2838 --                      it calls Eam Api
2839 --  Pre-reqs    :
2840 --  Parameters  :
2841 --
2842 --  Standard IN  Parameters :
2843 --      p_api_version                   IN      NUMBER       Required
2844 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
2845 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
2846 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
2847 --      p_default                       IN      VARCHAR2     Default  FND_API.G_TRUE
2848 --      p_module_type                   IN      VARCHAR2     Default  NULL.
2849 --
2850 --  Standard OUT Parameters :
2851 --      x_return_status                 OUT     VARCHAR2               Required
2852 --      x_msg_count                     OUT     NUMBER                 Required
2853 --      x_msg_data                      OUT     VARCHAR2               Required
2854 --
2855 --  Update Material Request Parameters:
2856 --       p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
2857 --         Contains material information to perform material reservation
2858 --
2859 --  Version :
2860 --      Initial Version   1.0
2861 --
2862 --  End of Comments.
2863 PROCEDURE Update_Material_Reqst (
2864     p_api_version            IN            NUMBER,
2865     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
2866     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
2867     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
2868     p_module_type            IN            VARCHAR2  := NULL,
2869     p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
2870     x_return_status             OUT NOCOPY        VARCHAR2,
2871     x_msg_count                 OUT NOCOPY        NUMBER,
2872     x_msg_data                  OUT NOCOPY        VARCHAR2
2873    )
2874  IS
2875  --
2876  CURSOR Get_Req_Matrl_cur (c_schedule_material_id IN NUMBER)
2877   IS
2878    SELECT B.scheduled_material_id,
2879           B.inventory_item_id,
2880           B.object_version_number,
2881           B.requested_date,
2882           B.organization_id,
2883           B.visit_id,
2884           B.visit_task_id,
2885           B.requested_quantity,
2886           -- MANESING::NR Analysis, 03-Jun-2011, fetch schedule quantity also
2887           B.schedule_quantity scheduled_quantity,
2888           B.workorder_operation_id,
2889           B.operation_sequence,
2890           B.item_group_id,
2891           B.uom,
2892           B.rt_oper_material_id,
2893           -- modified for FP bug# 6802777
2894           --B.department_id,
2895           WO.department_id,
2896           B.workorder_name,
2897           B.wip_entity_id,
2898           A.attribute_category,
2899           A.attribute1,
2900           A.attribute2,
2901           A.attribute3,
2902           A.attribute4,
2903           A.attribute5,
2904           A.attribute6,
2905           A.attribute7,
2906           A.attribute8,
2907           A.attribute9,
2908           A.attribute10,
2909           A.attribute11,
2910           A.attribute12,
2911           A.attribute13,
2912           A.attribute14,
2913           A.attribute15,
2914           A.completed_quantity,
2915           A.requested_date old_requested_date,  -- added to fix bug# 5182334.
2916       --sukhwsin: SB Effectivity code changes - starts
2917       A.mc_header_id,
2918       A.position_key,
2919       --sukhwsin: SB Effectivity code changes - ends
2920       --debadey; Marshalling FDD section 5.15
2921       A.aog_flag
2922 FROM AHL_SCHEDULE_MATERIALS A,
2923      AHL_JOB_OPER_MATERIALS_V B, WIP_OPERATIONS WO
2924 WHERE A.SCHEDULED_MATERIAL_ID = B.SCHEDULED_MATERIAL_ID
2925   AND B.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
2926   AND B.OPERATION_SEQUENCE = WO.OPERATION_SEQ_NUM
2927   AND A.SCHEDULED_MATERIAL_ID = c_schedule_material_id
2928 FOR UPDATE OF A.OBJECT_VERSION_NUMBER;
2929 -- Get transaction log
2930 CURSOR Get_trans_log_cur(c_wo_trans_id IN NUMBER)
2931   IS
2932     SELECT inventory_item_id,
2933              schedule_material_id,
2934            date_required,
2935                required_quantity
2936        FROM ahl_wo_operations_txns
2937      WHERE wo_operation_txn_id = c_wo_trans_id;
2938 --
2939 --Check for status Released or Unreleased
2940 /* MANESING::NR Analysis, 03-Jun-2011,
2941  * With the introduction of the concept of Stage workorders,
2942  * Material Requirements can be updated for any workorder even when it is in the Draft ('17') status.
2943  * But this is allowed only if this API is called from the VWP flow.
2944  */
2945 CURSOR Check_wo_status_cur(c_workorder_id IN NUMBER,
2946                            c_module_type  IN VARCHAR2)
2947  IS
2948    SELECT 1
2949    FROM   ahl_workorders
2950    WHERE  workorder_id = c_workorder_id
2951           AND (status_code = 3 or status_code = 1 or
2952                (c_module_type = 'VWP' and status_code = 17));
2953 
2954 --Get wo transaction id
2955 CURSOR Get_wo_transaction_id(c_sch_material_id IN NUMBER)
2956  IS
2957   SELECT max(wo_operation_txn_id)
2958     FROM ahl_wo_operations_txns
2959   WHERE schedule_material_id = c_sch_material_id;
2960             -- rroy
2961             -- ACL Changes
2962   -- Get job number details
2963   CURSOR Get_job_number(c_workorder_id IN NUMBER)
2964   IS
2965   SELECT workorder_name
2966        FROM ahl_workorders
2967   WHERE workorder_id = c_workorder_id;
2968             -- rroy
2969             -- ACL Changes
2970   -- R12: Serial Reservation changes.
2971   -- get count on existing reservations.
2972   CURSOR get_count_resrv_cur (c_item_id       IN NUMBER,
2973                               c_org_id        IN NUMBER,
2974                               c_wip_entity_id IN NUMBER,
2975                               c_oper_seq_num  IN NUMBER) IS
2976    SELECT nvl(SUM(mrv.primary_reservation_quantity), 0) reserved_quantity
2977    FROM mtl_reservations MRV
2978    WHERE MRV.INVENTORY_ITEM_ID = c_item_id
2979      AND MRV.EXTERNAL_SOURCE_CODE = 'AHL'
2980      AND MRV.DEMAND_SOURCE_HEADER_ID = c_wip_entity_id
2981      AND MRV.DEMAND_SOURCE_LINE_ID = c_oper_seq_num;
2982  --
2983  l_api_name        CONSTANT VARCHAR2(30) := 'UPDATE_MATERIAL_REQST';
2984  l_api_version     CONSTANT NUMBER       := 1.0;
2985  l_msg_count                NUMBER;
2986  l_return_status            VARCHAR2(1);
2987  l_msg_data                 VARCHAR2(2000);
2988  l_dummy                    NUMBER;
2989  l_scheduled                VARCHAR2(1);
2990  --
2991  l_get_trans_log_rec       get_trans_log_cur%ROWTYPE;
2992  --
2993  l_workorder_id              NUMBER;
2994  l_new_inventory_id          NUMBER;
2995  l_default                   VARCHAR2(30);
2996  --
2997  l_req_material_tbl          Req_Material_Tbl_Type;
2998  l_object_version_number  NUMBER;
2999  l_req_material_rec       Get_Req_Matrl_cur%ROWTYPE;
3000  --
3001  l_workorder_name     VARCHAR2(80);
3002  l_wo_organization_id  NUMBER;
3003  l_wo_transaction_id   NUMBER;
3004  l_reserved_quantity   NUMBER := 0;
3005  --
3006  -- Variables required for wip jobs call
3007  l_wo_operation_txn_id   NUMBER;
3008  l_inventory_item_old    NUMBER;
3009  j  NUMBER;
3010  --
3011  BEGIN
3012    --------------------Initialize ----------------------------------
3013   -- Standard Start of API savepoint
3014   SAVEPOINT update_material_reqst;
3015    -- Check if API is called in debug mode. If yes, enable debug.
3016    IF G_DEBUG='Y' THEN
3017    AHL_DEBUG_PUB.enable_debug;
3018    -- Debug info.
3019    AHL_DEBUG_PUB.debug( 'enter ahl_pp_materias_pvt. update material  reqst','+PPMRP+');
3020    END IF;
3021    -- Standard call to check for call compatibility.
3022    IF FND_API.to_boolean(p_init_msg_list)
3023    THEN
3024      FND_MSG_PUB.initialize;
3025    END IF;
3026     --  Initialize API return status to success
3027     x_return_status := FND_API.G_RET_STS_SUCCESS;
3028    -- Initialize message list if p_init_msg_list is set to TRUE.
3029    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
3030                                       p_api_version,
3031                                       l_api_name,G_PKG_NAME)
3032    THEN
3033        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3034    END IF;
3035    --------------------Start of API Body-----------------------------------
3036    IF p_x_req_material_tbl.COUNT > 0 THEN
3037       FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
3038         LOOP
3039    IF p_module_type <> 'API' THEN
3040          -- Value to ID Conversion
3041     IF ( ( p_x_req_material_tbl(i).workorder_id IS NOT NULL AND
3042            p_x_req_material_tbl(i).workorder_id <> FND_API.G_MISS_NUM ) OR
3043         ( p_x_req_material_tbl(i).job_number IS NOT NULL AND
3044           p_x_req_material_tbl(i).job_number <> FND_API.G_MISS_CHAR ) )
3045      THEN
3046      --
3047      IF G_DEBUG='Y' THEN
3048         AHL_DEBUG_PUB.debug( 'WOID :'||p_x_req_material_tbl(i).workorder_id);
3049      END IF;
3050      --
3051       Get_workorder_id
3052              (p_workorder_id      => p_x_req_material_tbl(i).workorder_id,
3053               p_job_number        => p_x_req_material_tbl(i).job_number,
3054               x_workorder_id      => l_workorder_id,
3055               x_return_status     => l_return_status,
3056               x_error_msg_code    => l_msg_data);
3057             IF NVL(l_return_status,'x') <> 'S'
3058             THEN
3059                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_NOT_EXISTS');
3060                 Fnd_Msg_Pub.ADD;
3061             END IF;
3062      --
3063      ELSE
3064            Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_REQUIRED');
3065            Fnd_Msg_Pub.ADD;
3066      END IF;
3067      --
3068      p_x_req_material_tbl(i).workorder_id  := l_workorder_id;
3069      -- rroy
3070      -- ACL Changes
3071      l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(
3072                              p_workorder_id => p_x_req_material_tbl(i).workorder_id,
3073                              p_ue_id        => NULL,
3074                              p_visit_id => NULL,
3075                              p_item_instance_id => NULL);
3076      IF l_return_status = FND_API.G_TRUE THEN
3077        OPEN get_job_number(p_x_req_material_tbl(i).workorder_id);
3078        FETCH get_job_number INTO l_workorder_name;
3079        CLOSE get_job_number;
3080        FND_MESSAGE.Set_Name('AHL', 'AHL_PP_UPD_MTL_UNTLCKD');
3081        FND_MESSAGE.Set_Token('WO_NAME', l_workorder_name);
3082        FND_MSG_PUB.ADD;
3083        RAISE FND_API.G_EXC_ERROR;
3084      END IF;
3085      -- rroy
3086      -- ACL Changes
3087      --
3088      IF G_DEBUG='Y' THEN
3089         AHL_DEBUG_PUB.debug( 'WOID 2:'||p_x_req_material_tbl(i).workorder_id);
3090      END IF;
3091    END IF; --Module type
3092    --Get Requirement operation details
3093       OPEN Get_Req_Matrl_cur(p_x_req_material_tbl(i).schedule_material_id);
3094       FETCH Get_Req_Matrl_cur INTO l_req_material_rec;
3095       CLOSE Get_Req_Matrl_cur;
3096           -- Assign workorder operation id if null
3097        p_x_req_material_tbl(i).workorder_operation_id := l_req_material_rec.workorder_operation_id;
3098        p_x_req_material_tbl(i).operation_sequence := l_req_material_rec.operation_sequence;
3099        p_x_req_material_tbl(i).job_number         := l_req_material_rec.workorder_name;
3100        p_x_req_material_tbl(i).wip_entity_id      := l_req_material_rec.wip_entity_id;
3101        p_x_req_material_tbl(i).organization_id    := l_req_material_rec.organization_id;
3102        p_x_req_material_tbl(i).department_id      := l_req_material_rec.department_id;
3103        p_x_req_material_tbl(i).inventory_item_id  := l_req_material_rec.inventory_item_id;
3104        p_x_req_material_tbl(i).visit_id           := l_req_material_rec.visit_id;
3105        p_x_req_material_tbl(i).visit_task_id      := l_req_material_rec.visit_task_id;
3106        --sukhwsin: SB Effectivity code changes - starts
3107        p_x_req_material_tbl(i).item_group_id      := l_req_material_rec.item_group_id;
3108        p_x_req_material_tbl(i).mc_header_id       := l_req_material_rec.mc_header_id;
3109        p_x_req_material_tbl(i).mc_position_key    := l_req_material_rec.position_key;
3110        --sukhwsin: SB Effectivity code changes - ends
3111        --pdoki added for Bug 7712916
3112        p_x_req_material_tbl(i).rt_oper_material_id := l_req_material_rec.rt_oper_material_id;
3113       IF G_DEBUG='Y' THEN
3114         AHL_DEBUG_PUB.debug( 'INVID :'||p_x_req_material_tbl(i).inventory_item_id);
3115       END IF;
3116       -- Validate for Requested Quantity
3117        IF (p_x_req_material_tbl(i).requested_quantity IS  NULL OR
3118             p_x_req_material_tbl(i).requested_quantity = FND_API.G_MISS_NUM) THEN
3119              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_QUANTITY_REQUIRED');
3120              Fnd_Msg_Pub.ADD;
3121         ELSIF (p_x_req_material_tbl(i).requested_quantity IS NOT NULL AND
3122             p_x_req_material_tbl(i).requested_quantity <> FND_API.G_MISS_NUM) THEN
3123            IF p_x_req_material_tbl(i).requested_quantity < 0 THEN
3124              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_QUANTITY_INVALID');
3125              Fnd_Msg_Pub.ADD;
3126            END IF;
3127            -- added in R12: Serial Reservation project.
3128            -- If requested quantity changed -
3129            IF (p_x_req_material_tbl(i).requested_quantity <>
3130                l_req_material_rec.requested_quantity)
3131            THEN
3132               -- check for reservations, if any.
3133               OPEN get_count_resrv_cur(l_req_material_rec.inventory_item_id,
3134                                        l_req_material_rec.organization_id,
3135                                        l_req_material_rec.wip_entity_id,
3136                                        l_req_material_rec.operation_sequence);
3137               FETCH get_count_resrv_cur INTO l_reserved_quantity;
3138               CLOSE get_count_resrv_cur;
3139               IF (p_x_req_material_tbl(i).requested_quantity < l_reserved_quantity)
3140               THEN
3141                 Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_RESRV_QTY');
3142                 Fnd_Message.SET_TOKEN('REQ_QTY',p_x_req_material_tbl(i).requested_quantity);
3143                 Fnd_Message.SET_TOKEN('RRV_QTY',l_reserved_quantity);
3144                 Fnd_Msg_Pub.ADD;
3145               END IF;-- p_x_req_material_tbl(i).requested_quantity <
3146            END IF; --p_x_req_material_tbl(i).requested_quantity <>
3147         END IF;
3148         IF G_DEBUG='Y' THEN
3149            AHL_DEBUG_PUB.debug( 'QTY :'||p_x_req_material_tbl(i).requested_quantity);
3150         END IF;
3151 
3152         -- MANESING::NR Analysis, 03-Jun-2011, Validate for Scheduled Quantity
3153         IF ( p_x_req_material_tbl(i).scheduled_quantity IS NOT NULL AND
3154              p_x_req_material_tbl(i).scheduled_quantity <> FND_API.G_MISS_NUM ) THEN
3155 
3156           IF ( p_x_req_material_tbl(i).scheduled_quantity < 0 ) THEN
3157             FND_MESSAGE.set_name('AHL', 'AHL_PP_SCHLD_QUANTITY_INVLD');
3158             FND_MSG_PUB.add;
3159           END IF;
3160 
3161           -- If scheduled quantity is changed, then check for reservations if any.
3162           IF ( p_x_req_material_tbl(i).scheduled_quantity <> l_req_material_rec.scheduled_quantity ) THEN
3163 
3164             /* In case the reservations are not already queried from the requested quantity validation
3165              * check that is placed above, then find them.
3166              */
3167             IF ( l_reserved_quantity = 0 ) THEN
3168               OPEN  get_count_resrv_cur( l_req_material_rec.inventory_item_id,
3169                                          l_req_material_rec.organization_id,
3170                                          l_req_material_rec.wip_entity_id,
3171                                          l_req_material_rec.operation_sequence );
3172               FETCH get_count_resrv_cur INTO l_reserved_quantity;
3173               CLOSE get_count_resrv_cur;
3174             END IF;
3175 
3176             IF ( p_x_req_material_tbl(i).scheduled_quantity < l_reserved_quantity ) THEN
3177               FND_MESSAGE.set_name('AHL', 'AHL_PP_SCHLD_RESRV_QTY');
3178               FND_MESSAGE.set_token('SCHLD_QTY', p_x_req_material_tbl(i).scheduled_quantity);
3179               FND_MESSAGE.set_token('RRV_QTY'  , l_reserved_quantity);
3180               FND_MSG_PUB.add;
3181             END IF;
3182 
3183           END IF; -- p_x_req_material_tbl(i).scheduled_quantity <> l_req_material_rec.scheduled_quantity
3184 
3185         END IF; -- p_x_req_material_tbl(i).scheduled_quantity IS NOT NULL
3186 
3187         IF ( G_DEBUG = 'Y' ) THEN
3188           AHL_DEBUG_PUB.debug( 'Scheduled Quantity: ' || p_x_req_material_tbl(i).scheduled_quantity);
3189         END IF;
3190 
3191     IF p_module_type NOT IN ('API', 'VWP') THEN --bug 14137417 :: added VWP by tchimira :: below validation should not occur for VWP flows
3192         -- Validate for Requested Date
3193        IF (p_x_req_material_tbl(i).requested_date IS  NULL OR
3194             p_x_req_material_tbl(i).requested_date = FND_API.G_MISS_DATE) THEN
3195              Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_DATE_REQUIRED');
3196              Fnd_Msg_Pub.ADD;
3197        ELSIF (p_x_req_material_tbl(i).requested_date IS NOT NULL AND
3198             P_X_REQ_MATERIAL_TBL(I).REQUESTED_DATE <> FND_API.G_MISS_DATE) THEN
3199 
3200           -- Included by sansatpa for bug - 14023722 - CERTAF: CANNOT UPDATE MATERIAL REQ WITH AOG FLAG WHEN REQ DATE < SYS DATE
3201           IF(( P_X_REQ_MATERIAL_TBL(I).AOG_FLAG = L_REQ_MATERIAL_REC.AOG_FLAG ) AND
3202               ( P_X_REQ_MATERIAL_TBL(I).REQUESTED_DATE < TRUNC(SYSDATE) ) AND
3203               (( P_X_REQ_MATERIAL_TBL(I).REQUESTED_QUANTITY <> L_REQ_MATERIAL_REC.REQUESTED_QUANTITY ) OR
3204               ( P_X_REQ_MATERIAL_TBL(I).REQUESTED_DATE <> L_REQ_MATERIAL_REC.REQUESTED_DATE ))) THEN
3205             Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_DATE_GT_EQ_SYSD');
3206             Fnd_Msg_Pub.ADD;
3207           END IF;
3208        END IF;
3209        IF G_DEBUG='Y' THEN
3210            AHL_DEBUG_PUB.debug( 'DATE :'||p_x_req_material_tbl(i).requested_date);
3211        END IF;
3212        -- Validate for Schedule Material ID
3213        IF (p_x_req_material_tbl(i).schedule_material_id IS  NULL AND
3214             p_x_req_material_tbl(i).schedule_material_id = FND_API.G_MISS_NUM) THEN
3215              Fnd_Message.SET_NAME('AHL','AHL_PP_SCH_MATRL_REQUIRED');
3216              Fnd_Msg_Pub.ADD;
3217         END IF;
3218         IF G_DEBUG='Y' THEN
3219            AHL_DEBUG_PUB.debug( 'SCHID :'||p_x_req_material_tbl(i).schedule_material_id);
3220            AHL_DEBUG_PUB.debug( 'OSID'||p_x_req_material_tbl(i).operation_sequence);
3221         END IF;
3222         --Check for workorder status
3223         OPEN Check_wo_status_cur(p_x_req_material_tbl(i).workorder_id, p_module_type);
3224         FETCH Check_wo_status_cur INTO l_dummy;
3225         IF Check_wo_status_cur%NOTFOUND THEN
3226         --
3227           /* MANESING::NR Analysis, 03-Jun-2011,
3228            * give appropriate error message based on the flow in which this API is called.
3229            */
3230           IF ( p_module_type = 'VWP' ) THEN
3231             Fnd_Message.SET_NAME('AHL','AHL_PP_WO_STATUS_INVLD');
3232           ELSE
3233             Fnd_Message.SET_NAME('AHL','AHL_PP_WO_STATUS_INVALID');
3234           END IF;
3235 
3236           Fnd_Msg_Pub.ADD;
3237         END IF;
3238         --
3239         CLOSE Check_wo_status_cur;
3240        --
3241     ELSE
3242         p_x_req_material_tbl(i).requested_date := l_req_material_rec.requested_date;
3243     END IF; --Module type
3244      --Standard check to count messages
3245      l_msg_count := Fnd_Msg_Pub.count_msg;
3246      IF l_msg_count > 0 THEN
3247         X_msg_count := l_msg_count;
3248         X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3249         RAISE Fnd_Api.G_EXC_ERROR;
3250      END IF;
3251    END LOOP; --for loop
3252   END IF;
3253   -- Calling Wip job api
3254   --
3255   IF G_DEBUG='Y' THEN
3256     AHL_DEBUG_PUB.debug( 'End of validations');
3257     AHL_DEBUG_PUB.debug('Before processing updates');
3258   END IF;
3259    --
3260 --IF p_module_type <> 'API' THEN
3261 IF p_x_req_material_tbl.COUNT >0
3262       THEN
3263          j := 1;
3264         FOR i in p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
3265         LOOP
3266            --Get the latest record
3267            OPEN Get_wo_transaction_id(p_x_req_material_tbl(i).schedule_material_id);
3268            FETCH get_wo_transaction_id INTO l_wo_transaction_id;
3269            CLOSE get_wo_transaction_id;
3270            --Get the transaction log record from ahl_wo_operation_txns table
3271            OPEN Get_trans_log_cur(l_wo_transaction_id);
3272            FETCH Get_trans_log_cur INTO l_get_trans_log_rec;
3273            CLOSE Get_trans_log_cur;
3274            --
3275           OPEN Get_Req_Matrl_cur(p_x_req_material_tbl(i).schedule_material_id);
3276           FETCH Get_Req_Matrl_cur INTO l_req_material_rec;
3277           CLOSE Get_Req_Matrl_cur;
3278            --Check for item id
3279            IF l_get_trans_log_rec.inventory_item_id <> p_x_req_material_tbl(i).inventory_item_id
3280             THEN
3281               l_inventory_item_old := l_get_trans_log_rec.inventory_item_id;
3282             ELSE
3283                l_inventory_item_old := p_x_req_material_tbl(i).inventory_item_id;
3284            END IF;
3285                -- Assign workorder operation id if null
3286            p_x_req_material_tbl(i).workorder_operation_id := l_req_material_rec.workorder_operation_id;
3287            --
3288            --Call transaction log to create record ahl_wo_operations_txns
3289       SELECT AHL_WO_OPERATIONS_TXNS_S.NEXTVAL INTO l_wo_operation_txn_id
3290              FROM DUAL;
3291       --
3292    IF G_DEBUG='Y' THEN
3293    AHL_DEBUG_PUB.debug( 'before calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
3294    END IF;
3295              Log_Transaction_Record
3296                ( p_wo_operation_txn_id    => l_wo_operation_txn_id,
3297                  p_object_version_number  => 1,
3298                  p_last_update_date       => sysdate,
3299                  p_last_updated_by        => fnd_global.user_id,
3300                  p_creation_date          => sysdate,
3301                  p_created_by             => fnd_global.user_id,
3302                  p_last_update_login      => fnd_global.login_id,
3303                  p_load_type_code         => 2,
3304                  p_transaction_type_code  => 1,
3305                  p_workorder_operation_id => p_x_req_material_tbl(i).workorder_operation_id,
3306                  p_schedule_material_id   => p_x_req_material_tbl(i).schedule_material_id,
3307                  p_inventory_item_id      => p_x_req_material_tbl(i).inventory_item_id,
3308                  p_required_quantity      => p_x_req_material_tbl(i).requested_quantity,
3309                  p_date_required          => p_x_req_material_tbl(i).requested_date
3310                );
3311            --Assign to output
3312            l_req_material_tbl(j).JOB_NUMBER              := p_x_req_material_tbl(i).job_number;
3313            l_req_material_tbl(j).WIP_ENTITY_ID           := p_x_req_material_tbl(i).wip_entity_id;
3314            l_req_material_tbl(j).WORKORDER_ID            := p_x_req_material_tbl(i).workorder_id;
3315            l_req_material_tbl(j).OPERATION_SEQUENCE      := l_req_material_rec.operation_sequence;
3316            l_req_material_tbl(j).UOM_CODE                := l_req_material_rec.uom;
3317            l_req_material_tbl(j).INVENTORY_ITEM_ID       := p_x_req_material_tbl(i).inventory_item_id;
3318            l_req_material_tbl(j).ORGANIZATION_ID         := p_x_req_material_tbl(i).organization_id;
3319            l_req_material_tbl(j).DEPARTMENT_ID           := p_x_req_material_tbl(i).department_id;
3320            -- fix for bug# 5549135
3321            --l_req_material_tbl(j).MRP_NET_FLAG            := 1;
3322            l_req_material_tbl(j).MRP_NET_FLAG            := 2;
3323            l_req_material_tbl(j).QUANTITY_PER_ASSEMBLY   := p_x_req_material_tbl(i).requested_quantity;
3324            l_req_material_tbl(j).REQUESTED_QUANTITY      := p_x_req_material_tbl(i).requested_quantity;
3325            l_req_material_tbl(j).SUPPLY_TYPE             := NULL;
3326            l_req_material_tbl(j).LOCATION                := NULL;
3327            l_req_material_tbl(j).SUB_INVENTORY           := NULL;
3328            l_req_material_tbl(j).REQUESTED_DATE          := p_x_req_material_tbl(i).requested_date;
3329            l_req_material_tbl(j).OPERATION_FLAG          := 'U';
3330            j := j + 1;
3331               IF G_DEBUG='Y' THEN
3332                   AHL_DEBUG_PUB.debug('Request Date from DB for sch. Mat ID:1:' || l_req_material_rec.old_requested_date || ':' || p_x_req_material_tbl(i).schedule_material_id);
3333                   AHL_DEBUG_PUB.debug('Changed Request Date :' || p_x_req_material_tbl(i).requested_date );
3334               END IF;
3335           --
3336          END LOOP;
3337        END IF; --Material tbl
3338    IF G_DEBUG='Y' THEN
3339    AHL_DEBUG_PUB.debug('beforer wip job record assign');
3340    END IF;
3341   IF l_req_material_tbl.COUNT > 0 THEN
3342        --
3343    IF G_DEBUG='Y' THEN
3344    AHL_DEBUG_PUB.debug('before Eam Workorder job call');
3345    AHL_DEBUG_PUB.debug('before Eam Api jobs call''count :'||l_req_material_tbl.count);
3346    END IF;
3347        -- Call wip job api
3348        --
3349  AHL_EAM_JOB_PVT.process_material_req
3350     (
3351      p_api_version        => l_api_version,
3352      p_init_msg_list      => p_init_msg_list,
3353      p_commit             => p_commit,
3354      p_validation_level   => p_validation_level,
3355      p_default            => l_default,
3356      p_module_type        => p_module_type,
3357      x_return_status      => l_return_status,
3358      x_msg_count          => l_msg_count,
3359      x_msg_data           => l_msg_data,
3360      p_material_req_tbl   => l_req_material_tbl
3361        );
3362      --
3363      END IF; --Eam table count > 0
3364    IF G_DEBUG='Y' THEN
3365    AHL_DEBUG_PUB.debug('AHLVPPMB: after wip job call'||l_return_status);
3366    END IF;
3367 --END IF; --Module type null
3368 IF l_return_status ='S' THEN
3369    --
3370    IF p_x_req_material_tbl.COUNT > 0
3371    THEN
3372    FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
3373      LOOP
3374         OPEN Get_Req_Matrl_cur(p_x_req_material_tbl(i).schedule_material_id);
3375         FETCH Get_Req_Matrl_cur INTO l_req_material_rec;
3376         CLOSE Get_Req_Matrl_cur;
3377         IF p_x_req_material_tbl(i).schedule_material_id IS NOT NULL
3378           THEN
3379               --
3380               -- Added for R12 serial reservations enhancements - ER# 4295982.
3381               -- If requested date is changed, then call reservations api to change the
3382               -- requested date in WMS.
3383               IF G_DEBUG='Y' THEN
3384                  AHL_DEBUG_PUB.debug('Request Date from DB for sch. Mat ID:2:' || l_req_material_rec.old_requested_date
3385                                       || ':' || p_x_req_material_tbl(i).schedule_material_id);
3386                  AHL_DEBUG_PUB.debug('Changed Request Date :' || p_x_req_material_tbl(i).requested_date );
3387               END IF;
3388               IF (trunc(p_x_req_material_tbl(i).requested_date) <> trunc(l_req_material_rec.old_requested_date))
3389               THEN
3390                   IF G_DEBUG='Y' THEN
3391                      AHL_DEBUG_PUB.debug('Before Call to Upd RSV ') ;
3392                   END IF;
3393                   -- call update reservations api.
3394                   AHL_RSV_RESERVATIONS_PVT.Update_Reservation(
3395                            p_api_version      => 1.0,
3396                            p_init_msg_list    => FND_API.G_FALSE,
3397                            p_commit           => FND_API.G_FALSE,
3398                            p_module_type      => NULL,
3399                            x_return_status    => x_return_status,
3400                            x_msg_count        => x_msg_count,
3401                            x_msg_data         => x_msg_data,
3402                            p_scheduled_material_id => p_x_req_material_tbl(i).schedule_material_id,
3403                            p_requested_date        => p_x_req_material_tbl(i).requested_date);
3404                   IF G_DEBUG='Y' THEN
3405                      AHL_DEBUG_PUB.debug('After Call to Upd RSV- Return Status:' || x_return_status);
3406                   END IF;
3407                   -- Raise error if exceptions occur
3408                   IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3409                      RAISE FND_API.G_EXC_ERROR;
3410                   END IF;
3411               END IF; -- p_x_req_material_tbl(i).requested_date <>
3412               --
3413               --
3414               -- The following conditions compare the new record value with old  record
3415               -- value, if its different then assign the new value else continue
3416               IF NVL(p_x_req_material_tbl(i).inventory_item_id, 0) <> FND_API.G_MISS_NUM
3417               THEN
3418                  l_req_material_rec.inventory_item_id := p_x_req_material_tbl(i).inventory_item_id;
3419               END IF;
3420               --
3421               IF NVL(p_x_req_material_tbl(i).requested_date,sysdate) <> FND_API.G_MISS_DATE
3422               THEN
3423                  l_req_material_rec.requested_date := p_x_req_material_tbl(i).requested_date;
3424               END IF;
3425               --
3426               IF NVL(p_x_req_material_tbl(i).requested_quantity, 0) <> FND_API.G_MISS_NUM
3427               THEN
3428                  l_req_material_rec.requested_quantity := p_x_req_material_tbl(i).requested_quantity;
3429               END IF;
3430               --
3431               -- MANESING::NR Analysis, 03-Jun-2011, add scheduled quantity also to local record
3432               IF NVL(p_x_req_material_tbl(i).scheduled_quantity, 0) <> FND_API.G_MISS_NUM
3433               THEN
3434                  l_req_material_rec.scheduled_quantity := p_x_req_material_tbl(i).scheduled_quantity;
3435               END IF;
3436               --
3437               IF NVL(p_x_req_material_tbl(i).organization_id, 0) <> FND_API.G_MISS_NUM
3438               THEN
3439                  l_req_material_rec.organization_id := p_x_req_material_tbl(i).organization_id;
3440               END IF;
3441               --
3442               IF NVL(p_x_req_material_tbl(i).visit_id, 0) <> FND_API.G_MISS_NUM
3443               THEN
3444                  l_req_material_rec.visit_id := p_x_req_material_tbl(i).visit_id;
3445               END IF;
3446               --
3447               IF NVL(p_x_req_material_tbl(i).visit_task_id, 0) <> FND_API.G_MISS_NUM
3448               THEN
3449                  l_req_material_rec.visit_task_id := p_x_req_material_tbl(i).visit_task_id;
3450               END IF;
3451               --
3452               IF NVL(p_x_req_material_tbl(i).item_group_id, 0) <> FND_API.G_MISS_NUM
3453               THEN
3454                  l_req_material_rec.item_group_id := p_x_req_material_tbl(i).item_group_id;
3455               END IF;
3456               --
3457               IF NVL(p_x_req_material_tbl(i).rt_oper_material_id, 0) <> FND_API.G_MISS_NUM
3458               THEN
3459                  l_req_material_rec.rt_oper_material_id := p_x_req_material_tbl(i).rt_oper_material_id;
3460               END IF;
3461           --sukhwsin: SB Effectivity Code changes - starts
3462           --
3463               IF NVL(p_x_req_material_tbl(i).mc_header_id, 0) <> FND_API.G_MISS_NUM
3464               THEN
3465                  l_req_material_rec.mc_header_id := p_x_req_material_tbl(i).mc_header_id;
3466               END IF;
3467           --
3468               IF NVL(p_x_req_material_tbl(i).mc_position_key, 0) <> FND_API.G_MISS_NUM
3469               THEN
3470                  l_req_material_rec.position_key := p_x_req_material_tbl(i).mc_position_key;
3471               END IF;
3472           --sukhwsin: SB Effectivity Code changes - ends
3473               --
3474               IF p_x_req_material_tbl(i).attribute_category IS NOT NULL AND
3475                  p_x_req_material_tbl(i).attribute_category <> FND_API.G_MISS_CHAR
3476               THEN
3477                  l_req_material_rec.attribute_category := p_x_req_material_tbl(i).attribute_category;
3478               ELSIF p_x_req_material_tbl(i).attribute_category = FND_API.G_MISS_CHAR THEN
3479                  l_req_material_rec.attribute_category := NULL;
3480               END IF;
3481               --
3482               IF p_x_req_material_tbl(i).attribute1 IS NOT NULL AND
3483                  p_x_req_material_tbl(i).attribute1 <> FND_API.G_MISS_CHAR
3484               THEN
3485                  l_req_material_rec.attribute1 := p_x_req_material_tbl(i).attribute1;
3486               ELSIF p_x_req_material_tbl(i).attribute1 = FND_API.G_MISS_CHAR THEN
3487                  l_req_material_rec.attribute1 := NULL;
3488               END IF;
3489               --
3490               IF p_x_req_material_tbl(i).attribute2 IS NOT NULL AND
3491                  p_x_req_material_tbl(i).attribute2 <> FND_API.G_MISS_CHAR
3492               THEN
3493                  l_req_material_rec.attribute2 := p_x_req_material_tbl(i).attribute2;
3494               ELSIF p_x_req_material_tbl(i).attribute2 = FND_API.G_MISS_CHAR THEN
3495                  l_req_material_rec.attribute2 := NULL;
3496               END IF;
3497               --
3498               IF p_x_req_material_tbl(i).attribute3 IS NOT NULL AND
3499                  p_x_req_material_tbl(i).attribute3 <> FND_API.G_MISS_CHAR
3500               THEN
3501                  l_req_material_rec.attribute3 := p_x_req_material_tbl(i).attribute3;
3502               ELSIF p_x_req_material_tbl(i).attribute3 = FND_API.G_MISS_CHAR THEN
3503                  l_req_material_rec.attribute3 := NULL;
3504               END IF;
3505               --
3506               IF p_x_req_material_tbl(i).attribute4 IS NOT NULL AND
3507                  p_x_req_material_tbl(i).attribute4 <> FND_API.G_MISS_CHAR
3508               THEN
3509                  l_req_material_rec.attribute4 := p_x_req_material_tbl(i).attribute4;
3510               ELSIF p_x_req_material_tbl(i).attribute4 = FND_API.G_MISS_CHAR THEN
3511                  l_req_material_rec.attribute4 := NULL;
3512               END IF;
3513               --
3514               IF p_x_req_material_tbl(i).attribute5 IS NOT NULL AND
3515                  p_x_req_material_tbl(i).attribute5 <> FND_API.G_MISS_CHAR
3516               THEN
3517                  l_req_material_rec.attribute5 := p_x_req_material_tbl(i).attribute5;
3518               ELSIF p_x_req_material_tbl(i).attribute5 = FND_API.G_MISS_CHAR THEN
3519                  l_req_material_rec.attribute5 := NULL;
3520               END IF;
3521               --
3522               IF p_x_req_material_tbl(i).attribute6 IS NOT NULL AND
3523                  p_x_req_material_tbl(i).attribute6 <> FND_API.G_MISS_CHAR
3524               THEN
3525                  l_req_material_rec.attribute6 := p_x_req_material_tbl(i).attribute6;
3526               ELSIF p_x_req_material_tbl(i).attribute6 = FND_API.G_MISS_CHAR THEN
3527                  l_req_material_rec.attribute6 := NULL;
3528               END IF;
3529               --
3530               IF p_x_req_material_tbl(i).attribute7 IS NOT NULL AND
3531                  p_x_req_material_tbl(i).attribute7 <> FND_API.G_MISS_CHAR
3532               THEN
3533                  l_req_material_rec.attribute7 := p_x_req_material_tbl(i).attribute7;
3534               ELSIF p_x_req_material_tbl(i).attribute7 = FND_API.G_MISS_CHAR THEN
3535                  l_req_material_rec.attribute7 := NULL;
3536               END IF;
3537               --
3538               IF p_x_req_material_tbl(i).attribute8 IS NOT NULL AND
3539                  p_x_req_material_tbl(i).attribute8 <> FND_API.G_MISS_CHAR
3540               THEN
3541                  l_req_material_rec.attribute8 := p_x_req_material_tbl(i).attribute8;
3542               ELSIF p_x_req_material_tbl(i).attribute8 = FND_API.G_MISS_CHAR THEN
3543                  l_req_material_rec.attribute8 := NULL;
3544               END IF;
3545               --
3546               IF p_x_req_material_tbl(i).attribute9 IS NOT NULL AND
3547                  p_x_req_material_tbl(i).attribute9 <> FND_API.G_MISS_CHAR
3548               THEN
3549                  l_req_material_rec.attribute9 := p_x_req_material_tbl(i).attribute9;
3550               ELSIF p_x_req_material_tbl(i).attribute9 = FND_API.G_MISS_CHAR THEN
3551                  l_req_material_rec.attribute9 := NULL;
3552               END IF;
3553               --
3554               IF p_x_req_material_tbl(i).attribute10 IS NOT NULL AND
3555                  p_x_req_material_tbl(i).attribute10 <> FND_API.G_MISS_CHAR
3556               THEN
3557                  l_req_material_rec.attribute10 := p_x_req_material_tbl(i).attribute10;
3558               ELSIF p_x_req_material_tbl(i).attribute10 = FND_API.G_MISS_CHAR THEN
3559                  l_req_material_rec.attribute10 := NULL;
3560               END IF;
3561               --
3562               IF p_x_req_material_tbl(i).attribute11 IS NOT NULL AND
3563                  p_x_req_material_tbl(i).attribute11 <> FND_API.G_MISS_CHAR
3564               THEN
3565                  l_req_material_rec.attribute11 := p_x_req_material_tbl(i).attribute11;
3566               ELSIF p_x_req_material_tbl(i).attribute11 = FND_API.G_MISS_CHAR THEN
3567                  l_req_material_rec.attribute11 := NULL;
3568               END IF;
3569               --
3570               IF p_x_req_material_tbl(i).attribute12 IS NOT NULL AND
3571                  p_x_req_material_tbl(i).attribute12 <> FND_API.G_MISS_CHAR
3572               THEN
3573                  l_req_material_rec.attribute12 := p_x_req_material_tbl(i).attribute12;
3574               ELSIF p_x_req_material_tbl(i).attribute12 = FND_API.G_MISS_CHAR THEN
3575                  l_req_material_rec.attribute12 := NULL;
3576               END IF;
3577               --
3578               IF p_x_req_material_tbl(i).attribute13 IS NOT NULL AND
3579                  p_x_req_material_tbl(i).attribute13 <> FND_API.G_MISS_CHAR
3580               THEN
3581                  l_req_material_rec.attribute13 := p_x_req_material_tbl(i).attribute13;
3582               ELSIF p_x_req_material_tbl(i).attribute13 = FND_API.G_MISS_CHAR THEN
3583                  l_req_material_rec.attribute13 := NULL;
3584               END IF;
3585               --
3586               IF p_x_req_material_tbl(i).attribute14 IS NOT NULL AND
3587                  p_x_req_material_tbl(i).attribute14 <> FND_API.G_MISS_CHAR
3588               THEN
3589                  l_req_material_rec.attribute14 := p_x_req_material_tbl(i).attribute14;
3590               ELSIF p_x_req_material_tbl(i).attribute14 = FND_API.G_MISS_CHAR THEN
3591                  l_req_material_rec.attribute14 := NULL;
3592               END IF;
3593               --
3594               IF p_x_req_material_tbl(i).attribute15 IS NOT NULL AND
3595                  p_x_req_material_tbl(i).attribute15 <> FND_API.G_MISS_CHAR
3596               THEN
3597                  l_req_material_rec.attribute15 := p_x_req_material_tbl(i).attribute15;
3598               ELSIF p_x_req_material_tbl(i).attribute15 = FND_API.G_MISS_CHAR THEN
3599                  l_req_material_rec.attribute15 := NULL;
3600               END IF;
3601 
3602                           -- debadey: Start of changes for Marshalling FDD section 5.15
3603                           -- AOG Flag
3604               IF p_x_req_material_tbl(i).aog_flag IS NOT NULL AND
3605                                    p_x_req_material_tbl(i).aog_flag <> FND_API.G_MISS_CHAR
3606                                 THEN
3607                  l_req_material_rec.aog_flag := p_x_req_material_tbl(i).aog_flag;
3608               ELSIF p_x_req_material_tbl(i).aog_flag = FND_API.G_MISS_CHAR
3609                                 THEN
3610                  l_req_material_rec.aog_flag := NULL;
3611               END IF;
3612                       -- end of changes by debadey for Marshalling
3613               --
3614                --Update schedule material table
3615                  UPDATE AHL_SCHEDULE_MATERIALS
3616                  SET inventory_item_id    = l_req_material_rec.inventory_item_id,
3617                   -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
3618                   requested_date        = trunc(l_req_material_rec.requested_date),
3619                   requested_quantity    = l_req_material_rec.requested_quantity,
3620                   -- MANESING::NR Analysis, 03-Jun-2011, update scheduled quantity also
3621                   scheduled_quantity    = l_req_material_rec.scheduled_quantity,
3622                   object_version_number = l_req_material_rec.object_version_number+1,
3623                   visit_id              = l_req_material_rec.visit_id,
3624                   visit_task_id         = l_req_material_rec.visit_task_id,
3625                   organization_id       = l_req_material_rec.organization_id,
3626                   item_group_id         = l_req_material_rec.item_group_id,
3627                   rt_oper_material_id    = l_req_material_rec.rt_oper_material_id,
3628                   workorder_operation_id = l_req_material_rec.workorder_operation_id,
3629                   attribute_category    = l_req_material_rec.attribute_category,
3630                   attribute1            = l_req_material_rec.attribute1,
3631                   attribute2            = l_req_material_rec.attribute2,
3632                   attribute3            = l_req_material_rec.attribute3,
3633                   attribute4            = l_req_material_rec.attribute4,
3634                   attribute5            = l_req_material_rec.attribute5,
3635                   attribute6            = l_req_material_rec.attribute6,
3636                   attribute7            = l_req_material_rec.attribute7,
3637                   attribute8            = l_req_material_rec.attribute8,
3638                   attribute9            = l_req_material_rec.attribute9,
3639                   attribute10           = l_req_material_rec.attribute10,
3640                   attribute11           = l_req_material_rec.attribute11,
3641                   attribute12           = l_req_material_rec.attribute12,
3642                   attribute13           = l_req_material_rec.attribute13,
3643                   attribute14           = l_req_material_rec.attribute14,
3644                   attribute15           = l_req_material_rec.attribute15,
3645                   last_update_date      = sysdate,
3646                   last_updated_by       = fnd_global.user_id,
3647                   last_update_login     = fnd_global.login_id,
3648           --sukhwsin: SB Effectivity code changes - starts
3649           mc_header_id      = l_req_material_rec.mc_header_id,
3650           position_key      = l_req_material_rec.position_key,
3651           --sukhwsin: SB Effectivity code changes - ends
3652                  -- debadey: Start of changes for Marshalling FDD section 5.15
3653                   -- AOG Flag
3654                               aog_flag              = l_req_material_rec.aog_flag
3655                  WHERE  scheduled_material_id  = p_x_req_material_tbl(i).schedule_material_id;
3656               --
3657         END IF; -- p_x_req_material_tbl(i).schedule_material_id
3658      END LOOP;
3659    END IF; -- p_x_req_material_tbl.COUNT
3660    --
3661 ELSE
3662      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3663      RAISE Fnd_Api.G_EXC_ERROR;
3664 END IF;-- Return status
3665     IF X_return_status = 'S' THEN
3666      --Check for Profile Option value If 'Y' Call
3667      IF FND_PROFILE.value( 'AHL_MTL_REQ_NOTIFICATION_ENABLED') = 'Y' THEN
3668       --Send Materil Notification
3669       MATERIAL_NOTIFICATION
3670         (
3671          p_api_version            => p_api_version,
3672          p_init_msg_list          => p_init_msg_list,
3673          p_commit                 => p_commit,
3674          p_validation_level       => p_validation_level,
3675          p_Req_Material_Tbl       => p_x_req_material_tbl,
3676          x_return_status          => l_return_status,
3677          x_msg_count              => l_msg_count,
3678          x_msg_data               => l_msg_data);
3679       END IF;
3680    END IF;
3681    IF G_DEBUG='Y' THEN
3682    AHL_DEBUG_PUB.debug( 'END OF UPDATE PROCESS');
3683    END IF;
3684   --
3685    ------------------------End of Body---------------------------------------
3686   --Standard check to count messages
3687    l_msg_count := Fnd_Msg_Pub.count_msg;
3688    --Change made on Nov 17, 2005 by jeli due to bug 4742895.
3689    --Ignore messages in stack if return status is S after calls to EAM APIs.
3690    /*
3691    IF l_msg_count > 0 THEN
3692       X_msg_count := l_msg_count;
3693       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3694       RAISE Fnd_Api.G_EXC_ERROR;
3695    END IF;
3696    */
3697    --Standard check for commit
3698    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
3699       COMMIT;
3700    END IF;
3701    -- Debug info
3702    IF G_DEBUG='Y' THEN
3703    Ahl_Debug_Pub.debug( 'End of public api Update Material Reqst','+PPMRP+');
3704    -- Check if API is called in debug mode. If yes, disable debug.
3705    Ahl_Debug_Pub.disable_debug;
3706    END IF;
3707   EXCEPTION
3708  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3709     ROLLBACK TO update_material_reqst;
3710     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3711     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
3712                                p_count => x_msg_count,
3713                                p_data  => x_msg_data);
3714        IF G_DEBUG='Y' THEN
3715        AHL_DEBUG_PUB.log_app_messages (
3716              x_msg_count, x_msg_data, 'ERROR' );
3717        AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Update Material Reqst','+PPMRP+');
3718         -- Check if API is called in debug mode. If yes, disable debug.
3719         AHL_DEBUG_PUB.disable_debug;
3720        END IF;
3721 WHEN FND_API.G_EXC_ERROR THEN
3722     ROLLBACK TO update_material_reqst;
3723     X_return_status := FND_API.G_RET_STS_ERROR;
3724     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
3725                                p_count => x_msg_count,
3726                                p_data  => X_msg_data);
3727         IF G_DEBUG='Y' THEN
3728         -- Debug info.
3729         AHL_DEBUG_PUB.log_app_messages (
3730              x_msg_count, x_msg_data, 'UNEXPECTED ERROR' );
3731         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Update Material Reqst','+PPMRP+');
3732         -- Check if API is called in debug mode. If yes, disable debug.
3733         AHL_DEBUG_PUB.disable_debug;
3734         END IF;
3735 WHEN OTHERS THEN
3736     ROLLBACK TO update_material_reqst;
3737     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3738     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3739     THEN
3740     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
3741                             p_procedure_name  =>  'UPDATE_MATERIAL_REQST',
3742                             p_error_text      => SUBSTR(SQLERRM,1,240));
3743     END IF;
3744     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
3745                                p_count => x_msg_count,
3746                                p_data  => X_msg_data);
3747         IF G_DEBUG='Y' THEN
3748         -- Debug info.
3749         AHL_DEBUG_PUB.log_app_messages (
3750               x_msg_count, x_msg_data, 'SQL ERROR' );
3751         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Update Material Reqst','+PPMRP+');
3752         -- Check if API is called in debug mode. If yes, disable debug.
3753         AHL_DEBUG_PUB.disable_debug;
3754         END IF;
3755 END Update_Material_Reqst;
3756 -- Start of Comments --
3757 --  Procedure name    : Remove_Material_Reqst
3758 --  Type              : Private
3759 --  Function          : Updates schedule material table with request quantity to zero,
3760 --                      Calls Eam APi to remove material request
3761 --  Pre-reqs    :
3762 --  Parameters  :
3763 --
3764 --  Standard IN  Parameters :
3765 --      p_api_version                   IN      NUMBER       Required
3766 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
3767 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
3768 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
3769 --      p_default                       IN      VARCHAR2     Default  FND_API.G_TRUE
3770 --      p_module_type                   IN      VARCHAR2     Default  NULL.
3771 --
3772 --  Standard OUT Parameters :
3773 --      x_return_status                 OUT     VARCHAR2               Required
3774 --      x_msg_count                     OUT     NUMBER                 Required
3775 --      x_msg_data                      OUT     VARCHAR2               Required
3776 --
3777 --  Remove Material Request Parameters:
3778 --       p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
3779 --         Contains material information to perform material reservation
3780 --
3781 --  Version :
3782 --      Initial Version   1.0
3783 --
3784 --  End of Comments.
3785 PROCEDURE Remove_Material_Request (
3786    p_api_version             IN    NUMBER,
3787    p_init_msg_list           IN    VARCHAR2  := Fnd_Api.g_false,
3788    p_commit                  IN    VARCHAR2  := Fnd_Api.g_false,
3789    p_validation_level        IN    NUMBER    := Fnd_Api.g_valid_level_full,
3790    p_module_type             IN    VARCHAR2  := 'JSP',
3791    p_x_req_material_tbl      IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
3792    x_return_status              OUT NOCOPY VARCHAR2,
3793    x_msg_count                  OUT NOCOPY NUMBER,
3794    x_msg_data                   OUT NOCOPY VARCHAR2
3795 )
3796 IS
3797 --Get job number
3798  CURSOR Get_job_details(c_workorder_id IN NUMBER)
3799     IS
3800     SELECT workorder_name
3801       FROM ahl_workorders
3802     WHERE workorder_id = c_workorder_id;
3803  -- Bug # 6680137 - begin.
3804  CURSOR c_get_wo_status(c_workorder_id IN NUMBER)
3805  IS
3806  SELECT
3807       AWO.status_code
3808  FROM
3809       AHL_WORKORDERS AWO
3810  WHERE
3811       workorder_id = c_workorder_id;
3812  -- Bug # 6680137 - end
3813  -- Get schedule material details
3814   CURSOR Get_Req_Matrl_cur (c_schedule_material_id IN NUMBER)
3815   IS
3816   /*
3817    SELECT B.scheduled_material_id,
3818           B.inventory_item_id,
3819           B.object_version_number,
3820           B.requested_date,
3821           B.organization_id,
3822           B.visit_id,
3823           B.visit_task_id,
3824           B.requested_quantity,
3825           B.workorder_operation_id,
3826           B.operation_sequence,
3827           B.item_group_id,
3828               B.uom,
3829           B.rt_oper_material_id,
3830               B.department_id,
3831               B.workorder_name,
3832               B.wip_entity_id
3833 FROM AHL_SCHEDULE_MATERIALS A,
3834      AHL_JOB_OPER_MATERIALS_V B
3835 WHERE A.SCHEDULED_MATERIAL_ID = B.SCHEDULED_MATERIAL_ID
3836   AND A.SCHEDULED_MATERIAL_ID = c_schedule_material_id;
3837 */
3838  /*
3839   * R12 Perf Tuning
3840   * Balaji modified the query to use only base tables
3841   * instead of AHL_JOB_OPER_MATERIALS_V. Bug # 4919273
3842   */
3843 SELECT
3844   ASML.scheduled_material_id,
3845   ASML.inventory_item_id,
3846   ASML.object_version_number,
3847   wipr.date_required requested_date,
3848   AVST.organization_id,
3849   AVST.visit_id,
3850   ASML.visit_task_id,
3851   wipr.REQUIRED_QUANTITY requested_quantity,
3852   ASML.workorder_operation_id,
3853   wipr.operation_seq_num operation_sequence,
3854   ASML.item_group_id,
3855   MSIV.PRIMARY_UNIT_OF_MEASURE uom,
3856   ASML.rt_oper_material_id,
3857   AVST.department_id,
3858   AWOS.workorder_name,
3859   AWOS.wip_entity_id,
3860   --debadey: Marshalling FDD section 5.15, AOG flag updation
3861   ASML.aog_flag
3862 FROM
3863   AHL_WORKORDERS AWOS,
3864   AHL_SCHEDULE_MATERIALS ASML,
3865   wip_requirement_operations wipr,
3866   MTL_SYSTEM_ITEMS_VL MSIV,
3867   AHL_VISITS_VL AVST,
3868   AHL_WORKORDER_OPERATIONS AWOP,
3869   -- added for FP bug# 6802777
3870   WIP_OPERATIONS WOP
3871 WHERE
3872   AWOP.WORKORDER_OPERATION_ID = ASML.WORKORDER_OPERATION_ID AND
3873   AWOS.VISIT_TASK_ID = ASML.VISIT_TASK_ID AND
3874   ASML.VISIT_ID = AVST.VISIT_ID AND
3875   awos.wip_entity_id = wipr.wip_entity_id AND
3876   asml.operation_sequence = wipr.operation_seq_num AND
3877   asml.inventory_item_id = wipr.inventory_item_id AND
3878   asml.organization_id = wipr.organization_id AND
3879   asml.INVENTORY_ITEM_ID = MSIV.INVENTORY_ITEM_ID AND
3880   ASML.ORGANIZATION_ID = MSIV.ORGANIZATION_ID AND
3881   wop.wip_entity_id = wipr.wip_entity_id AND
3882   wop.operation_seq_num = wipr.operation_seq_num AND
3883   asml.status IN ('ACTIVE', 'IN-SERVICE') AND
3884   ASML.SCHEDULED_MATERIAL_ID = c_schedule_material_id;
3885   -- R12: Serial Reservation changes.
3886   -- get count on existing reservations.
3887   CURSOR get_count_resrv_cur (c_item_id       IN NUMBER,
3888                               c_org_id        IN NUMBER,
3889                               c_wip_entity_id IN NUMBER,
3890                               c_oper_seq_num  IN NUMBER) IS
3891    SELECT nvl(SUM(mrv.primary_reservation_quantity), 0) reserved_quantity
3892    FROM mtl_reservations MRV
3893    WHERE MRV.INVENTORY_ITEM_ID = c_item_id
3894      AND MRV.EXTERNAL_SOURCE_CODE = 'AHL'
3895      AND MRV.DEMAND_SOURCE_HEADER_ID = c_wip_entity_id
3896      AND MRV.DEMAND_SOURCE_LINE_ID = c_oper_seq_num;
3897  -- Standard local variable
3898  l_api_name        CONSTANT VARCHAR2(30) := 'REMOVE_MATERIAL_REQUEST';
3899  l_api_version     CONSTANT NUMBER       := 1.0;
3900  l_return_status            VARCHAR2(1);
3901  l_msg_data                 VARCHAR2(200);
3902  l_msg_count                NUMBER;
3903       l_workorder_name           VARCHAR2(80);
3904  --
3905  l_object_version_number   NUMBER;
3906  --
3907  l_req_material_rec       Req_Material_Rec_Type;
3908  l_req_material_tbl       Req_Material_Tbl_Type;
3909  l_material_rec           Get_Req_Matrl_cur%ROWTYPE;
3910   -- Variables required for wip jobs call
3911  l_ahl_wip_work_rec      AHL_WIP_JOB_PVT.ahl_wo_rec_type;
3912  l_ahl_wip_oper_tbl      AHL_WIP_JOB_PVT.ahl_wo_op_tbl_type ;
3913  l_ahl_wip_rsrc_tbl      AHL_WIP_JOB_PVT.ahl_wo_res_tbl_type;
3914  l_ahl_wip_mtrl_tbl      AHL_WIP_JOB_PVT.ahl_wo_mtl_tbl_type;
3915  l_default               VARCHAR2(30);
3916  j  NUMBER;
3917  l_reserved_quantity     NUMBER;
3918  -- Bug # 6680137 - begin
3919  l_wo_status             VARCHAR2(30);
3920  -- Bug # 6680137 - end
3921  BEGIN
3922   --------------------Initialize ----------------------------------
3923   -- Standard Start of API savepoint
3924   SAVEPOINT remove_material_request;
3925    -- Check if API is called in debug mode. If yes, enable debug.
3926    IF G_DEBUG='Y' THEN
3927    Ahl_Debug_Pub.enable_debug;
3928    -- Debug info.
3929    Ahl_Debug_Pub.debug( 'enter ahl_pp_materials_pvt Remove Material Request ','+MAATP+');
3930    --
3931    END IF;
3932    -- Standard call to check for call compatibility.
3933    IF Fnd_Api.to_boolean(p_init_msg_list)
3934    THEN
3935      Fnd_Msg_Pub.initialize;
3936    END IF;
3937     --  Initialize API return status to success
3938     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3939    -- Initialize message list if p_init_msg_list is set to TRUE.
3940    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
3941                                       p_api_version,
3942                                       l_api_name,G_PKG_NAME)
3943    THEN
3944        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3945    END IF;
3946  ------------------------Start API Body ---------------------------------
3947    IF p_x_req_material_tbl.COUNT > 0 THEN
3948       FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
3949         LOOP
3950          -- Value to ID Conversion
3951          --Get visit task id
3952          IF (p_x_req_material_tbl(i).workorder_id IS NOT NULL AND
3953              p_x_req_material_tbl(i).workorder_id <> Fnd_Api.G_MISS_NUM )
3954           THEN
3955              --
3956              -- Bug # 6680137 - start
3957              OPEN Get_job_details(p_x_req_material_tbl(i).workorder_id);
3958              FETCH Get_job_details INTO l_workorder_name;
3959              IF Get_job_details%NOTFOUND THEN
3960                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_NOT_EXISTS');
3961                 Fnd_Msg_Pub.ADD;
3962                 CLOSE Get_job_details;
3963                 RAISE FND_API.G_EXC_ERROR;
3964              END IF;
3965              CLOSE Get_job_details;
3966              -- Bug # 6680137 - end
3967              -- Balaji added this validation for Bug # 6680137 - begin.
3968              -- When work order is in status cancelled, complete no-charge or closed
3969              -- material deletion should be disallowed.
3970              OPEN c_get_wo_status(p_x_req_material_tbl(i).workorder_id);
3971              FETCH c_get_wo_status INTO l_wo_status;
3972              CLOSE c_get_wo_status;
3973              IF l_wo_status IN ('7', '5', '12')
3974              THEN
3975                   Fnd_Message.SET_NAME('AHL','AHL_PP_WO_STATUS_INVALID');
3976                   Fnd_Msg_Pub.ADD;
3977                   RAISE FND_API.G_EXC_ERROR;
3978              END IF;
3979              -- Bug # 6680137 - end
3980          END IF;
3981          -- rroy
3982          -- ACL Changes
3983          l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked
3984                             (
3985                               p_workorder_id => p_x_req_material_tbl(i).workorder_id,
3986                               p_ue_id => NULL,
3987                               p_visit_id => NULL,
3988                               p_item_instance_id => NULL);
3989          IF l_return_status = FND_API.G_TRUE THEN
3990             FND_MESSAGE.Set_Name('AHL', 'AHL_PP_DEL_MTL_UNTLCKD');
3991             FND_MESSAGE.Set_Token('WO_NAME', l_workorder_name);
3992             FND_MSG_PUB.ADD;
3993             RAISE FND_API.G_EXC_ERROR;
3994          END IF;
3995          -- rroy
3996          -- ACL Changes
3997          -- Check for Schedule Material ID
3998          IF (p_x_req_material_tbl(i).schedule_material_id IS  NULL OR
3999              p_x_req_material_tbl(i).schedule_material_id = FND_API.G_MISS_NUM) THEN
4000              Fnd_Message.SET_NAME('AHL','AHL_PP_SCH_MATRL_REQUIRED');
4001              Fnd_Msg_Pub.ADD;
4002          END IF;
4003          --
4004          IF G_DEBUG='Y' THEN
4005             Ahl_Debug_Pub.debug( 'Obj Number:'||p_x_req_material_tbl(i).object_version_number);
4006             Ahl_Debug_Pub.debug( 'Sch mat Id:'||p_x_req_material_tbl(i).schedule_material_id);
4007          END IF;
4008          -- Check for object version number
4009          IF (p_x_req_material_tbl(i).object_version_number IS  NOT NULL AND
4010              p_x_req_material_tbl(i).object_version_number <> FND_API.G_MISS_NUM) THEN
4011              --
4012                SELECT object_version_number,requested_quantity INTO l_object_version_number,
4013                       p_x_req_material_tbl(i).requested_quantity
4014                      FROM ahl_schedule_materials
4015                   WHERE scheduled_material_id = p_x_req_material_tbl(i).schedule_material_id
4016                   FOR UPDATE OF STATUS NOWAIT;
4017             --
4018             IF  p_x_req_material_tbl(i).object_version_number <> l_object_version_number  THEN
4019               Fnd_Message.SET_NAME('AHL','AHL_PP_RECORD_CHANGED');
4020               Fnd_Msg_Pub.ADD;
4021               RAISE Fnd_Api.G_EXC_ERROR;
4022             END IF;
4023             --
4024          END IF;
4025          --Standard check to count messages
4026          l_msg_count := Fnd_Msg_Pub.count_msg;
4027          IF l_msg_count > 0 THEN
4028             X_msg_count := l_msg_count;
4029             X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4030             RAISE Fnd_Api.G_EXC_ERROR;
4031          END IF;
4032       END LOOP;
4033    END IF;
4034    --
4035    IF G_DEBUG='Y' THEN
4036     Ahl_Debug_Pub.debug( 'before wip jobs call:');
4037    END IF;
4038    --
4039   IF p_x_req_material_tbl.COUNT >0    THEN
4040     j := 1;
4041    FOR i in p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
4042    LOOP
4043       --
4044       OPEN Get_Req_Matrl_cur(p_x_req_material_tbl(i).schedule_material_id);
4045       FETCH Get_Req_Matrl_cur INTO l_material_rec;
4046       CLOSE Get_Req_matrl_cur;
4047       --
4048       --Assign to output
4049       l_req_material_tbl(j).JOB_NUMBER              := l_material_rec.workorder_name;
4050       l_req_material_tbl(j).WIP_ENTITY_ID           := l_material_rec.wip_entity_id;
4051       l_req_material_tbl(j).WORKORDER_ID            := p_x_req_material_tbl(i).workorder_id;
4052       l_req_material_tbl(j).OPERATION_SEQUENCE      := l_material_rec.operation_sequence;
4053       l_req_material_tbl(j).INVENTORY_ITEM_ID       := l_material_rec.inventory_item_id;
4054       l_req_material_tbl(j).ORGANIZATION_ID         := l_material_rec.organization_id;
4055       l_req_material_tbl(j).DEPARTMENT_ID           := l_material_rec.department_id;
4056       -- fix for bug# 5549135
4057       --l_req_material_tbl(j).MRP_NET_FLAG            := 1;
4058       l_req_material_tbl(j).MRP_NET_FLAG            := 2;
4059       l_req_material_tbl(j).QUANTITY_PER_ASSEMBLY   := l_material_rec.requested_quantity;
4060       l_req_material_tbl(j).REQUESTED_QUANTITY      := l_material_rec.requested_quantity;
4061       l_req_material_tbl(j).SUPPLY_TYPE             := NULL;
4062       l_req_material_tbl(j).LOCATION                := NULL;
4063       l_req_material_tbl(j).SUB_INVENTORY           := NULL;
4064       l_req_material_tbl(j).REQUESTED_DATE          := l_material_rec.requested_date;
4065       l_req_material_tbl(j).OPERATION_FLAG          := 'D';
4066       --
4067      j := j+1;
4068          -- Added for R12: Serial Reservation.
4069          -- check for reservations, if any.
4070          OPEN get_count_resrv_cur(l_material_rec.inventory_item_id,
4071                                   l_material_rec.organization_id,
4072                                   l_material_rec.wip_entity_id,
4073                                   l_material_rec.operation_sequence);
4074          FETCH get_count_resrv_cur INTO l_reserved_quantity;
4075          CLOSE get_count_resrv_cur;
4076          IF (l_reserved_quantity > 0) THEN
4077             IF G_DEBUG='Y' THEN
4078                AHL_DEBUG_PUB.debug('Reserved quantity for sch. material ID:' || p_x_req_material_tbl(i).schedule_material_id || ' is: ' || l_reserved_quantity || 'for INV ID: ' || l_material_rec.inventory_item_id);
4079                AHL_DEBUG_PUB.debug('Before calling delete reservation api');
4080             END IF;
4081             -- delete reservations.
4082             AHL_RSV_RESERVATIONS_PVT.DELETE_RESERVATION(
4083                           p_api_version => 1.0,
4084                           p_init_msg_list => FND_API.G_FALSE,
4085                           p_commit        => FND_API.G_FALSE,
4086                           p_module_type   => NULL,
4087                           x_return_status        => x_return_status,
4088                           x_msg_count            => x_msg_count,
4089                           x_msg_data             => x_msg_data,
4090                           p_scheduled_material_id => p_x_req_material_tbl(i).schedule_material_id);
4091             IF G_DEBUG='Y' THEN
4092               AHL_DEBUG_PUB.debug('After calling delete reservation api. Return status:' || x_return_status);
4093             END IF;
4094             -- check return status.
4095             IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4096                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4097             ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
4098                RAISE FND_API.G_EXC_ERROR;
4099             END IF;
4100          END IF;
4101      END LOOP;
4102     END IF; --Material tbl
4103    IF G_DEBUG='Y' THEN
4104    AHL_DEBUG_PUB.debug('beforer Eam wip job call');
4105    END IF;
4106    -- Call wip job api
4107     AHL_EAM_JOB_PVT.process_material_req
4108        (
4109         p_api_version        => l_api_version,
4110         p_init_msg_list      => p_init_msg_list,
4111         p_commit             => p_commit,
4112         p_validation_level   => p_validation_level,
4113         p_default            => l_default,
4114         p_module_type        => p_module_type,
4115         x_return_status      => l_return_status,
4116         x_msg_count          => l_msg_count,
4117         x_msg_data           => l_msg_data,
4118         p_material_req_tbl   => l_req_material_tbl
4119         );
4120      --
4121    IF G_DEBUG='Y' THEN
4122    AHL_DEBUG_PUB.debug('after wip job call');
4123    END IF;
4124  IF l_return_Status = 'S' THEN
4125      --Remove the records
4126      IF p_x_req_material_tbl.COUNT > 0 THEN
4127        FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
4128        LOOP
4129        -- If schedule date is not null then update to zero because collection has been done
4130             IF  p_x_req_material_tbl(i).schedule_material_id IS NOT NULL THEN
4131             -- Update schedule materials table requested quantity to zero
4132            UPDATE  AHL_SCHEDULE_MATERIALS
4133                   SET requested_quantity = 0,
4134                         status = 'DELETED',
4135                         object_version_number = p_x_req_material_tbl(i).object_version_number + 1
4136                WHERE SCHEDULED_MATERIAL_ID = p_x_req_material_tbl(i).schedule_material_id;
4137             END IF;
4138               --
4139    IF G_DEBUG='Y' THEN
4140    AHL_DEBUG_PUB.debug('after set request quantity to zero');
4141    END IF;
4142           --
4143       END LOOP;
4144     END IF;
4145     --
4146    ELSE
4147      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4148      RAISE Fnd_Api.G_EXC_ERROR;
4149     --
4150 END IF; --Status
4151 ---------------------------End of Body---------------------------------------
4152   --Standard check to count messages
4153    l_msg_count := Fnd_Msg_Pub.count_msg;
4154    --Change made on Nov 17, 2005 by jeli due to bug 4742895.
4155    --Ignore messages in stack if return status is S after calls to EAM APIs.
4156    /*
4157    IF l_msg_count > 0 THEN
4158       X_msg_count := l_msg_count;
4159       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4160       RAISE Fnd_Api.G_EXC_ERROR;
4161    END IF;
4162    */
4163    --Standard check for commit
4164    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
4165       COMMIT;
4166    END IF;
4167    -- Debug info
4168    IF G_DEBUG='Y' THEN
4169    Ahl_Debug_Pub.debug( 'End of private api Remove Material Request ','+MAMRP+');
4170    -- Check if API is called in debug mode. If yes, disable debug.
4171    Ahl_Debug_Pub.disable_debug;
4172    END IF;
4173   EXCEPTION
4174  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4175     ROLLBACK TO remove_material_request;
4176     X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4177     Fnd_Msg_Pub.count_and_get( p_encoded => Fnd_Api.G_FALSE,
4178                                p_count => x_msg_count,
4179                                p_data  => x_msg_data);
4180         IF G_DEBUG='Y' THEN
4181         Ahl_Debug_Pub.log_app_messages (
4182              x_msg_count, x_msg_data, 'ERROR' );
4183         Ahl_Debug_Pub.debug( 'ahl_pp_materials_pvt. Remove Material Request ','+MAMRP+');
4184         -- Check if API is called in debug mode. If yes, disable debug.
4185         Ahl_Debug_Pub.disable_debug;
4186         END IF;
4187 WHEN Fnd_Api.G_EXC_ERROR THEN
4188     ROLLBACK TO remove_material_request;
4189     X_return_status := Fnd_Api.G_RET_STS_ERROR;
4190     Fnd_Msg_Pub.count_and_get( p_encoded => Fnd_Api.G_FALSE,
4191                                p_count => x_msg_count,
4192                                p_data  => X_msg_data);
4193         IF G_DEBUG='Y' THEN
4194         -- Debug info.
4195         Ahl_Debug_Pub.log_app_messages (
4196              x_msg_count, x_msg_data, 'UNEXPECTED ERROR' );
4197         Ahl_Debug_Pub.debug( 'ahl_pp_materials_pvt. Remove Material Request ','+MAMRP+');
4198         -- Check if API is called in debug mode. If yes, disable debug.
4199         Ahl_Debug_Pub.disable_debug;
4200         END IF;
4201 WHEN OTHERS THEN
4202     ROLLBACK TO remove_material_request;
4203     X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4204     IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR)
4205     THEN
4206     Fnd_Msg_Pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
4207                             p_procedure_name  =>  'REMOVE_MATERIAL_REQUEST',
4208                             p_error_text      => SUBSTR(SQLERRM,1,240));
4209     END IF;
4210     Fnd_Msg_Pub.count_and_get( p_encoded => Fnd_Api.G_FALSE,
4211                                p_count => x_msg_count,
4212                                p_data  => X_msg_data);
4213         IF G_DEBUG='Y' THEN
4214         -- Debug info.
4215         Ahl_Debug_Pub.log_app_messages (
4216              x_msg_count, x_msg_data, 'SQL ERROR' );
4217         Ahl_Debug_Pub.debug( 'ahl_pp_materials_pvt. Remove Material Request ','+MTMRP+');
4218         -- Check if API is called in debug mode. If yes, disable debug.
4219         Ahl_Debug_Pub.disable_debug;
4220         END IF;
4221 END Remove_Material_Request;
4222 
4223 -- Start of Comments --
4224 --  Procedure name    : Change_Requirement_Item
4225 --  Type              : Private
4226 --  Function          : Updates the Schedule Material table and WIP table if requirement item
4227 --                      needs to be changed.
4228 --  Pre-reqs    :
4229 --  Parameters  :
4230 --
4231 --  Standard IN  Parameters :
4232 --      p_api_version                   IN      NUMBER       Required
4233 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
4234 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
4235 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
4236 --      p_module_type                   IN      VARCHAR2     Default  NULL.
4237 --
4238 --  Standard OUT Parameters :
4239 --      x_return_status                 OUT     VARCHAR2               Required
4240 --      x_msg_count                     OUT     NUMBER                 Required
4241 --      x_msg_data                      OUT     VARCHAR2               Required
4242 --
4243 --  Remove Material Request Parameters:
4244 --       p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
4245 --         Contains material information to perform material reservation
4246 --
4247 --  Version :
4248 --      Initial Version   1.0
4249 --
4250 --  End of Comments.
4251 PROCEDURE Change_Requirement_Item (
4252    p_api_version             IN    NUMBER,
4253    p_init_msg_list           IN    VARCHAR2  := Fnd_Api.g_false,
4254    p_commit                  IN    VARCHAR2  := Fnd_Api.g_false,
4255    p_validation_level        IN    NUMBER    := Fnd_Api.g_valid_level_full,
4256    p_module_type             IN    VARCHAR2  := 'API',
4257    p_x_req_material_tbl      IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
4258    x_return_status              OUT NOCOPY VARCHAR2,
4259    x_msg_count                  OUT NOCOPY NUMBER,
4260    x_msg_data                   OUT NOCOPY VARCHAR2
4261 )
4262 IS
4263 CURSOR Get_Mtl_Req_Csr(c_schedule_material_id IN NUMBER)
4264 IS
4265     SELECT asm.inventory_item_id old_inventory_item_id,
4266            asm.requested_date old_requested_date,
4267            asm.requested_quantity old_requested_quantity,
4268            asm.workorder_operation_id,
4269            NVL(asm.completed_quantity, 0) completed_quantity,
4270            (SELECT NVL(SUM(mrv.primary_reservation_quantity), 0)
4271             FROM mtl_reservations mrv, ahl_schedule_materials asmt
4272             WHERE mrv.inventory_item_id       = asmt.inventory_item_id
4273             AND mrv.external_source_code      = 'AHL'
4274             AND mrv.requirement_date          = asmt.requested_date
4275             AND mrv.organization_id           = asmt.organization_id
4276             AND mrv.demand_source_line_detail = c_schedule_material_id) reserved_quantity,
4277            wo.workorder_id,
4278            vst.organization_id
4279     FROM ahl_schedule_materials asm, ahl_workorders wo, ahl_visits_b vst
4280     WHERE asm.visit_task_id   = wo.visit_task_id
4281     AND vst.visit_id = asm.visit_id
4282     AND scheduled_material_id = c_schedule_material_id;
4283 
4284 CURSOR Get_job_details(c_workorder_id IN NUMBER)
4285 IS
4286     SELECT workorder_name
4287     FROM ahl_workorders
4288     WHERE workorder_id = c_workorder_id
4289     AND  (status_code  = 3 or
4290           status_code  = 1 or
4291           status_code  = 17);
4292 
4293 --sukhwsin::Marshling Enhancements. Code Changes starts
4294 --Following cursor will be used when call is from Marshling.
4295 CURSOR Get_job_details_for_exe(c_workorder_id IN NUMBER)
4296 IS
4297     SELECT workorder_name
4298     FROM ahl_workorders
4299     WHERE workorder_id = c_workorder_id
4300     AND  status_code NOT IN (12,17,18,22,4,5,7,14,21); --Closed,Draft,Deffered,Deleted,complete,Complete No-charge,Cancelled,Pending Close,Pending Defer/Cancel Approval
4301 
4302 --sukhwsin::Marshling Enhancements. Code Changes ends
4303 
4304 CURSOR Get_Wip_Req_Csr(c_inventory_item_id    IN NUMBER,
4305                        c_schedule_material_id IN NUMBER)
4306 IS
4307     SELECT wip.required_quantity,
4308            wip.date_required,
4309            wip.wip_entity_id,
4310            wip.operation_seq_num operation_sequence,
4311            wip.organization_id,
4312            wip.department_id
4313     FROM wip_requirement_operations wip,
4314          ahl_schedule_materials asm,
4315          ahl_workorders wo
4316     WHERE wip.wip_entity_id         = wo.wip_entity_id
4317     AND   wo.visit_task_id          = asm.visit_task_id
4318     AND   asm.operation_sequence    = wip.operation_seq_num
4319     AND   asm.inventory_item_id     = wip.inventory_item_id
4320     AND   asm.organization_id       = wip.organization_id
4321     AND   (asm.visit_task_id, asm.operation_sequence) IN (SELECT ASM2.visit_task_id, ASM2.operation_sequence
4322                                                             FROM ahl_schedule_materials ASM2
4323                                                            WHERE ASM2.scheduled_material_id = c_schedule_material_id)
4324     AND   wip.inventory_item_id     = c_inventory_item_id;
4325 
4326 CURSOR Get_Item_Name_Cur(c_inventory_item_id IN NUMBER,
4327                          c_organization_id   IN NUMBER)
4328 IS
4329     SELECT concatenated_segments
4330     FROM mtl_system_items_kfv
4331     WHERE inventory_item_id = c_inventory_item_id
4332     AND   organization_id   = c_organization_id;
4333 
4334           -- Standard local variable
4335  l_api_name        CONSTANT VARCHAR2(30) := 'Change_Requirement_Item';
4336  l_api_version     CONSTANT NUMBER       := 1.0;
4337  l_return_status            VARCHAR2(1);
4338  l_msg_data                 VARCHAR2(200);
4339  l_msg_count                NUMBER;
4340  l_debug_key   CONSTANT  VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || l_api_name;
4341 
4342 l_material_req_rec         Get_Mtl_Req_Csr%ROWTYPE;
4343 l_old_wip_req_rec          Get_Wip_Req_Csr%ROWTYPE;
4344 l_new_wip_req_rec          Get_Wip_Req_Csr%ROWTYPE;
4345 l_schedule_material_id     NUMBER;
4346 l_default                  VARCHAR2(30);
4347 l_workorder_name           VARCHAR2(80);
4348 l_new_requested_qty        NUMBER;
4349 l_new_requested_date       DATE;
4350 l_material_req_up_tbl      Req_Material_Tbl_Type;
4351 l_material_req_re_tbl      Req_Material_Tbl_Type;
4352 l_material_req_cr_tbl      Req_Material_Tbl_Type;
4353 up_index                   NUMBER   := 1;
4354 re_index                   NUMBER   := 1;
4355 cr_index                   NUMBER   := 1;
4356 l_dummy                    NUMBER;
4357 l_wo_operation_txn_id      NUMBER;
4358 l_item_name                VARCHAR2(80);
4359 
4360 BEGIN
4361    --------------------Initialize ----------------------------------
4362     -- Standard Start of API savepoint
4363     SAVEPOINT Change_Requirement_Item;
4364 
4365     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
4366         fnd_log.string(fnd_log.level_procedure, l_debug_key || '.begin',
4367             'At the start of PLSQL procedure.');
4368     END IF;
4369 
4370     -- Standard call to check for call compatibility.
4371     IF FND_API.to_boolean(p_init_msg_list)
4372     THEN
4373         FND_MSG_PUB.initialize;
4374     END IF;
4375     --  Initialize API return status to success
4376     x_return_status := FND_API.G_RET_STS_SUCCESS;
4377     -- Initialize message list if p_init_msg_list is set to TRUE.
4378     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
4379                                       p_api_version,
4380                                       l_api_name,G_PKG_NAME)
4381     THEN
4382         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4383     END IF;
4384 
4385     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4386         fnd_log.string(fnd_log.level_statement, l_debug_key,  'requirements count'||p_x_req_material_tbl.COUNT);
4387     END IF;
4388     --------------------Start of API Body-----------------------------------
4389     IF p_x_req_material_tbl.COUNT > 0 THEN
4390         FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
4391         LOOP
4392             l_schedule_material_id := p_x_req_material_tbl(i).schedule_material_id;
4393             -- Check for Schedule Material ID
4394             IF (l_schedule_material_id IS  NULL OR
4395                 l_schedule_material_id = FND_API.G_MISS_NUM) THEN
4396                 Fnd_Message.SET_NAME('AHL','AHL_PP_SCH_MATRL_REQUIRED');
4397                 Fnd_Msg_Pub.ADD;
4398                 RAISE FND_API.G_EXC_ERROR;
4399             END IF;
4400 
4401             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4402                 fnd_log.string(fnd_log.level_statement, l_debug_key,  'Schedule Material ID'||l_schedule_material_id);
4403             END IF;
4404 
4405             -- Get Scheduled Material requirement  details
4406             OPEN Get_Mtl_Req_Csr(l_schedule_material_id);
4407             FETCH Get_Mtl_Req_Csr INTO l_material_req_rec;
4408             CLOSE Get_Mtl_Req_Csr;
4409 
4410             IF ( l_material_req_rec.old_inventory_item_id IS NOT NULL) THEN
4411 
4412                  IF (p_module_type = 'MM') THEN
4413                 --When call is from Marshling then use different cursor for job validation.
4414                         -- Check for existance of valid work order
4415                         OPEN Get_job_details_for_exe(l_material_req_rec.workorder_id);
4416                         FETCH Get_job_details_for_exe INTO l_workorder_name;
4417                             IF Get_job_details_for_exe%NOTFOUND THEN
4418                                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_NOT_EXISTS');
4419                                 Fnd_Msg_Pub.ADD;
4420                                 CLOSE Get_job_details_for_exe;
4421                                 RAISE FND_API.G_EXC_ERROR;
4422                             END IF;
4423                         CLOSE Get_job_details_for_exe;
4424                 ELSE
4425                         -- Check for existance of valid work order
4426                         OPEN Get_job_details(l_material_req_rec.workorder_id);
4427                         FETCH Get_job_details INTO l_workorder_name;
4428                             IF Get_job_details%NOTFOUND THEN
4429                                 Fnd_Message.SET_NAME('AHL','AHL_PP_WO_ORD_NOT_EXISTS');
4430                                 Fnd_Msg_Pub.ADD;
4431                                 CLOSE Get_job_details;
4432                                 RAISE FND_API.G_EXC_ERROR;
4433                             END IF;
4434                         CLOSE Get_job_details;
4435                 END IF;
4436 
4437                 OPEN Get_Item_Name_Cur(l_material_req_rec.old_inventory_item_id,
4438                                        l_material_req_rec.organization_id);
4439                 FETCH Get_Item_Name_Cur INTO l_item_name;
4440                 CLOSE Get_Item_Name_Cur;
4441 
4442                 -- Check whether the item is issued
4443                 IF (l_material_req_rec.completed_quantity > 0 ) THEN
4444                     Fnd_Message.SET_NAME('AHL','AHL_PP_TXN_ISSUED_ITEM'); -- Issued item  cannot be changed.
4445                     FND_MESSAGE.Set_Token('ITEM', l_item_name);
4446                     Fnd_Msg_Pub.ADD;
4447                 END IF;
4448 
4449                 -- Check whether the item is reserved
4450                 IF (l_material_req_rec.reserved_quantity > 0 ) THEN
4451                     Fnd_Message.SET_NAME('AHL','AHL_PP_RESERVED_ITEM'); -- Reserved item  cannot be changed.
4452                     FND_MESSAGE.Set_Token('ITEM', l_item_name);
4453                     Fnd_Msg_Pub.ADD;
4454                 END IF;
4455 
4456                 --Check whether the item is locked.
4457                 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked
4458                                 (
4459                                 p_workorder_id => l_material_req_rec.workorder_id,
4460                                 p_ue_id => NULL,
4461                                 p_visit_id => NULL,
4462                                 p_item_instance_id => NULL);
4463                 IF l_return_status = FND_API.G_TRUE THEN
4464                     FND_MESSAGE.Set_Name('AHL', 'AHL_PP_DEL_MTL_UNTLCKD');
4465                     FND_MESSAGE.Set_Token('WO_NAME', l_workorder_name);
4466                     FND_MSG_PUB.ADD;
4467                     RAISE FND_API.G_EXC_ERROR;
4468                 END IF;
4469 
4470                 --sukhwsin::Marshling Enhancements - Reseting l_return_status to S as it is used while calling AHL_EAM_JOB_PVT.process_material_req
4471                 l_return_status := FND_API.G_RET_STS_SUCCESS;
4472 
4473                 -- Check for valid requested quantity
4474                 IF (p_x_req_material_tbl(i).requested_quantity IS NULL OR (p_x_req_material_tbl(i).requested_quantity = FND_API.G_MISS_NUM)) THEN
4475                     p_x_req_material_tbl(i).requested_quantity := l_material_req_rec.old_requested_quantity;
4476                 ELSIF p_x_req_material_tbl(i).requested_quantity < 0 THEN
4477                     Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_QUANTITY_INVALID');
4478                     Fnd_Msg_Pub.ADD;
4479                 END IF;
4480 
4481                 -- Check for valid requested date
4482                 IF (p_x_req_material_tbl(i).requested_date IS NULL OR (p_x_req_material_tbl(i).requested_date = FND_API.G_MISS_DATE)) THEN
4483                     p_x_req_material_tbl(i).requested_date := l_material_req_rec.old_requested_date;
4484                 ELSIF p_x_req_material_tbl(i).requested_date < trunc(SYSDATE) THEN
4485                     Fnd_Message.SET_NAME('AHL','AHL_PP_REQ_DATE_GT_EQ_SYSD');
4486                     Fnd_Msg_Pub.ADD;
4487                 END IF;
4488 
4489                 --Standard check to count messages
4490                 l_msg_count := Fnd_Msg_Pub.count_msg;
4491                 IF l_msg_count > 0 THEN
4492                     X_msg_count := l_msg_count;
4493                     X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4494                     RAISE Fnd_Api.G_EXC_ERROR;
4495                 END IF;
4496 
4497                 -- If the inventory item id is updated.
4498                 IF ( p_x_req_material_tbl(i).inventory_item_id <> l_material_req_rec.old_inventory_item_id ) THEN
4499                     -- Get the WIP requirement for the original item
4500                     OPEN Get_Wip_Req_Csr(l_material_req_rec.old_inventory_item_id, l_schedule_material_id);
4501                     FETCH Get_Wip_Req_Csr INTO l_old_wip_req_rec;
4502                     CLOSE Get_Wip_Req_Csr;
4503                     -- If WIP requirement exists for the original item
4504                     IF (l_old_wip_req_rec.wip_entity_id IS NOT NULL) THEN
4505                         -- If WIP requirement has more required quantity then ASM requested quantity
4506                         -- A merge happened in WIP requirement
4507                         IF (l_old_wip_req_rec.required_quantity > l_material_req_rec.old_requested_quantity) THEN
4508                             -- Reduce the original ASM quantity from WIP requirement quantity..
4509                             l_new_requested_qty := l_old_wip_req_rec.required_quantity - l_material_req_rec.old_requested_quantity;
4510 
4511                             SELECT AHL_WO_OPERATIONS_TXNS_S.NEXTVAL INTO l_wo_operation_txn_id FROM DUAL;
4512                             --
4513                             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4514                                 AHL_DEBUG_PUB.debug( 'before calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
4515                             END IF;
4516                                 --Create Record in transactions table
4517                                 Log_Transaction_Record
4518                                     (   p_wo_operation_txn_id    => l_wo_operation_txn_id,
4519                                         p_object_version_number  => 1,
4520                                         p_last_update_date       => sysdate,
4521                                         p_last_updated_by        => fnd_global.user_id,
4522                                         p_creation_date          => sysdate,
4523                                         p_created_by             => fnd_global.user_id,
4524                                         p_last_update_login      => fnd_global.login_id,
4525                                         p_load_type_code         => 2,
4526                                         p_transaction_type_code  => 1,
4527                                         p_workorder_operation_id => l_material_req_rec.workorder_operation_id,
4528                                         p_schedule_material_id   => l_schedule_material_id,
4529                                         p_inventory_item_id      => l_material_req_rec.old_inventory_item_id,
4530                                         p_required_quantity      => l_new_requested_qty,
4531                                         p_date_required          => p_x_req_material_tbl(i).requested_date
4532                                     );
4533                             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4534                                 fnd_log.string(fnd_log.level_statement, l_debug_key,  'After calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
4535                             END IF;
4536 
4537                             -- Update the original WIP requirement
4538                             l_material_req_up_tbl(up_index).schedule_material_id    := l_schedule_material_id;
4539                             l_material_req_up_tbl(up_index).job_number              := l_workorder_name;
4540                             l_material_req_up_tbl(up_index).wip_entity_id           := l_old_wip_req_rec.wip_entity_id;
4541                             l_material_req_up_tbl(up_index).workorder_id            := l_material_req_rec.workorder_id;
4542                             l_material_req_up_tbl(up_index).operation_sequence      := l_old_wip_req_rec.operation_sequence;
4543                             l_material_req_up_tbl(up_index).inventory_item_id       := l_material_req_rec.old_inventory_item_id;
4544                             l_material_req_up_tbl(up_index).uom_code                := p_x_req_material_tbl(i).uom_code;
4545                             l_material_req_up_tbl(up_index).organization_id         := l_material_req_rec.organization_id;
4546                             l_material_req_up_tbl(up_index).department_id           := l_old_wip_req_rec.department_id;
4547                             l_material_req_up_tbl(up_index).mrp_net_flag            := 2;
4548                             l_material_req_up_tbl(up_index).quantity_per_assembly   := l_new_requested_qty;
4549                             l_material_req_up_tbl(up_index).requested_quantity      := l_new_requested_qty;
4550                             l_material_req_up_tbl(up_index).supply_type             := NULL;
4551                             l_material_req_up_tbl(up_index).location                := NULL;
4552                             l_material_req_up_tbl(up_index).sub_inventory           := NULL;
4553                             l_material_req_up_tbl(up_index).requested_date          := p_x_req_material_tbl(i).requested_date;
4554                             l_material_req_up_tbl(up_index).operation_flag          := 'U';
4555                             up_index := up_index + 1 ;
4556 
4557                         ELSE
4558                             -- If WIP requirement quantity and ASM requirement quantity matches.
4559                             -- Delete the original WIP requirement
4560                             l_material_req_re_tbl(re_index).schedule_material_id    := l_schedule_material_id;
4561                             l_material_req_re_tbl(re_index).job_number              := l_workorder_name;
4562                             l_material_req_re_tbl(re_index).wip_entity_id           := l_old_wip_req_rec.wip_entity_id;
4563                             l_material_req_re_tbl(re_index).workorder_id            := l_material_req_rec.workorder_id;
4564                             l_material_req_re_tbl(re_index).operation_sequence      := l_old_wip_req_rec.operation_sequence;
4565                             l_material_req_re_tbl(re_index).inventory_item_id       := l_material_req_rec.old_inventory_item_id;
4566                             l_material_req_re_tbl(re_index).organization_id         := l_material_req_rec.organization_id;
4567                             l_material_req_re_tbl(re_index).department_id           := l_old_wip_req_rec.department_id;
4568                             l_material_req_re_tbl(re_index).mrp_net_flag            := 2;
4569                             l_material_req_re_tbl(re_index).quantity_per_assembly   := l_old_wip_req_rec.required_quantity;
4570                             l_material_req_re_tbl(re_index).requested_quantity      := l_old_wip_req_rec.required_quantity;
4571                             l_material_req_re_tbl(re_index).supply_type             := NULL;
4572                             l_material_req_re_tbl(re_index).location                := NULL;
4573                             l_material_req_re_tbl(re_index).sub_inventory           := NULL;
4574                             l_material_req_re_tbl(re_index).requested_date          := l_old_wip_req_rec.date_required;
4575                             l_material_req_re_tbl(re_index).operation_flag          := 'D';
4576                             re_index := re_index + 1;
4577                         END IF;
4578                         -- Get the WIP requirement for the new item
4579                         OPEN Get_Wip_Req_Csr(p_x_req_material_tbl(i).inventory_item_id, l_schedule_material_id);
4580                         FETCH Get_Wip_Req_Csr INTO l_new_wip_req_rec;
4581                         CLOSE Get_Wip_Req_Csr;
4582 
4583                         -- If WIP requirement exists for the new item then throw the error.
4584                         -- This part needs to be changed during Marshaling
4585                         IF (l_new_wip_req_rec.wip_entity_id IS NOT NULL) THEN
4586                             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4587                                 fnd_log.string(fnd_log.level_statement, l_debug_key,  'WIP entity ID already exists for Item: ' || p_x_req_material_tbl(i).inventory_item_id);
4588                             END IF;
4589 
4590                             OPEN Get_Item_Name_Cur(p_x_req_material_tbl(i).inventory_item_id,
4591                                                    l_material_req_rec.organization_id);
4592                             FETCH Get_Item_Name_Cur INTO l_item_name;
4593                             CLOSE Get_Item_Name_Cur;
4594                             Fnd_Message.SET_NAME('AHL','AHL_PP_WIP_REQ_EXISTS'); -- WIP requirement already exists for the new item
4595                             FND_MESSAGE.Set_Token('ITEM', l_item_name);
4596                             Fnd_Msg_Pub.ADD;
4597                             RAISE FND_API.G_EXC_ERROR;
4598                         ELSE
4599                             -- If no WIP requirement exists for the new item then create a WIP requirement.
4600                             SELECT AHL_WO_OPERATIONS_TXNS_S.NEXTVAL INTO l_wo_operation_txn_id FROM DUAL;
4601                             --
4602                             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4603                                 fnd_log.string(fnd_log.level_statement, l_debug_key,  'before calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
4604                             END IF;
4605                                 --Create Record in transactions table
4606                                 Log_Transaction_Record
4607                                     (   p_wo_operation_txn_id    => l_wo_operation_txn_id,
4608                                         p_object_version_number  => 1,
4609                                         p_last_update_date       => sysdate,
4610                                         p_last_updated_by        => fnd_global.user_id,
4611                                         p_creation_date          => sysdate,
4612                                         p_created_by             => fnd_global.user_id,
4613                                         p_last_update_login      => fnd_global.login_id,
4614                                         p_load_type_code         => 2,
4615                                         p_transaction_type_code  => 1,
4616                                         p_workorder_operation_id => l_material_req_rec.workorder_operation_id,
4617                                         p_schedule_material_id   => l_schedule_material_id,
4618                                         p_inventory_item_id      => p_x_req_material_tbl(i).inventory_item_id,
4619                                         p_required_quantity      => p_x_req_material_tbl(i).requested_quantity,
4620                                         p_date_required          => p_x_req_material_tbl(i).requested_date
4621                                     );
4622                             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4623                                 AHL_DEBUG_PUB.debug( 'After calling log record l_wo_operation_txn_id:'||l_wo_operation_txn_id);
4624                             END IF;
4625 
4626                             l_material_req_cr_tbl(cr_index).schedule_material_id   := l_schedule_material_id;
4627                             l_material_req_cr_tbl(cr_index).job_number             := l_workorder_name;
4628                             l_material_req_cr_tbl(cr_index).wip_entity_id          := l_old_wip_req_rec.wip_entity_id;
4629                             l_material_req_cr_tbl(cr_index).workorder_id           := l_material_req_rec.workorder_id;
4630                             l_material_req_cr_tbl(cr_index).operation_sequence     := l_old_wip_req_rec.operation_sequence;
4631                             l_material_req_cr_tbl(cr_index).inventory_item_id      := p_x_req_material_tbl(i).inventory_item_id;
4632                             l_material_req_cr_tbl(cr_index).uom_code               := p_x_req_material_tbl(i).uom_code;
4633                             l_material_req_cr_tbl(cr_index).organization_id        := l_material_req_rec.organization_id;
4634                             l_material_req_cr_tbl(cr_index).department_id          := l_old_wip_req_rec.department_id;
4635                             l_material_req_cr_tbl(cr_index).mrp_net_flag           := 2;
4636                             l_material_req_cr_tbl(cr_index).quantity_per_assembly  := p_x_req_material_tbl(i).requested_quantity;
4637                             l_material_req_cr_tbl(cr_index).requested_quantity     := p_x_req_material_tbl(i).requested_quantity;
4638                             l_material_req_cr_tbl(cr_index).supply_type            := NULL;
4639                             l_material_req_cr_tbl(cr_index).location               := NULL;
4640                             l_material_req_cr_tbl(cr_index).sub_inventory          := NULL;
4641                             l_material_req_cr_tbl(cr_index).requested_date         := p_x_req_material_tbl(i).requested_date;
4642                             l_material_req_cr_tbl(cr_index).operation_flag         :='C';
4643                             cr_index := cr_index + 1;
4644                         END IF; -- End of existance of WIP requirement for the new item check.
4645                     END IF; -- End of existance of WIP requirement for the original item check.
4646                 END IF; -- End of item changed check.
4647             ELSE
4648                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4649                     AHL_DEBUG_PUB.debug( 'Invalid Scedule Material Id: '||l_schedule_material_id);
4650                 END IF;
4651                 Fnd_Message.SET_NAME('AHL','AHL_RSV_INVALID_MTRLREQ'); -- Material Requirement is Invalid.
4652                 Fnd_Msg_Pub.ADD;
4653             END IF; -- End of existance of ASM requirement for the original item check.
4654         END LOOP; -- End of p_x_req_material_tbl loop
4655         IF (l_material_req_re_tbl.COUNT > 0 ) THEN
4656             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4657                fnd_log.string(fnd_log.level_statement, l_debug_key, 'before calling AHL_EAM_JOB_PVT.process_material_req to remove WIP requirements');
4658             END IF;
4659             -- Call wip job api
4660             AHL_EAM_JOB_PVT.process_material_req
4661                 (
4662                 p_api_version        => l_api_version,
4663                 p_init_msg_list      => Fnd_Api.g_false,
4664                 p_commit             => Fnd_Api.g_false,
4665                 p_validation_level   => p_validation_level,
4666                 p_default            => l_default,
4667                 p_module_type        => p_module_type,
4668                 x_return_status      => l_return_status,
4669                 x_msg_count          => l_msg_count,
4670                 x_msg_data           => l_msg_data,
4671                 p_material_req_tbl   => l_material_req_re_tbl
4672                 );
4673             --
4674             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4675                 fnd_log.string(fnd_log.level_statement, l_debug_key, 'after calling AHL_EAM_JOB_PVT.process_material_req to remove WIP requirements, Status: '||l_return_status);
4676             END IF;
4677         END IF;
4678         IF (l_material_req_cr_tbl.COUNT > 0 AND l_return_status = 'S') THEN
4679             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4680                fnd_log.string(fnd_log.level_statement, l_debug_key, 'before calling AHL_EAM_JOB_PVT.process_material_req to Create WIP requirements');
4681             END IF;
4682             -- Call wip job api
4683             AHL_EAM_JOB_PVT.process_material_req
4684                 (
4685                 p_api_version        => l_api_version,
4686                 p_init_msg_list      => Fnd_Api.g_false,
4687                 p_commit             => Fnd_Api.g_false,
4688                 p_validation_level   => p_validation_level,
4689                 p_default            => l_default,
4690                 p_module_type        => p_module_type,
4691                 x_return_status      => l_return_status,
4692                 x_msg_count          => l_msg_count,
4693                 x_msg_data           => l_msg_data,
4694                 p_material_req_tbl   => l_material_req_cr_tbl
4695                 );
4696             --
4697             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4698                 fnd_log.string(fnd_log.level_statement, l_debug_key, 'after calling AHL_EAM_JOB_PVT.process_material_req to Create WIP requirements, Status: '||l_return_status);
4699             END IF;
4700         END IF;
4701         IF (l_material_req_up_tbl.COUNT > 0 AND l_return_status = 'S') THEN
4702             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4703                fnd_log.string(fnd_log.level_statement, l_debug_key, 'before calling AHL_EAM_JOB_PVT.process_material_req to update WIP requirements');
4704             END IF;
4705             -- Call wip job api
4706             AHL_EAM_JOB_PVT.process_material_req
4707                 (
4708                 p_api_version        => l_api_version,
4709                 p_init_msg_list      => Fnd_Api.g_false,
4710                 p_commit             => Fnd_Api.g_false,
4711                 p_validation_level   => p_validation_level,
4712                 p_default            => l_default,
4713                 p_module_type        => p_module_type,
4714                 x_return_status      => l_return_status,
4715                 x_msg_count          => l_msg_count,
4716                 x_msg_data           => l_msg_data,
4717                 p_material_req_tbl   => l_material_req_up_tbl
4718                 );
4719             --
4720             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4721                 fnd_log.string(fnd_log.level_statement, l_debug_key, 'after calling AHL_EAM_JOB_PVT.process_material_req to update WIP requirements, Status: '||l_return_status);
4722             END IF;
4723         END IF;
4724         IF (l_return_status = 'S') THEN
4725             FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
4726             LOOP
4727                 --Update the Schedule materials table.
4728                 -- Update the ASM record with the changed attributes
4729 
4730                 /*sukhwsin::Marshling enhancements requirements.
4731                         Need to logic to conditionally update ASM columns based upon the call. i.e. if p_module_type = MM then
4732                         sheduling information also needs to be updated for changed item in ASM. This logic will be handled later.
4733                 */
4734 
4735                 UPDATE   ahl_schedule_materials
4736                 SET inventory_item_id     = p_x_req_material_tbl(i).inventory_item_id,
4737                     object_version_number = p_x_req_material_tbl(i).object_version_number + 1,
4738                     last_update_date      = sysdate,
4739                     last_updated_by       = Fnd_Global.USER_ID,
4740                     last_update_login     = Fnd_Global.LOGIN_ID
4741                 WHERE    scheduled_material_id = p_x_req_material_tbl(i).schedule_material_id ;
4742             END LOOP; -- End of p_x_req_material_tbl loop
4743         END IF; -- End of l_return_status check
4744     END IF; -- End of p_x_req_material_tbl check for records
4745     IF l_return_status = 'S' THEN
4746         --Check for Profile Option value If 'Y' Call
4747         IF FND_PROFILE.value( 'AHL_MTL_REQ_NOTIFICATION_ENABLED') = 'Y' THEN
4748         --Send Materil Notification
4749         MATERIAL_NOTIFICATION
4750             (
4751             p_api_version            => p_api_version,
4752             p_init_msg_list          => Fnd_Api.g_false,
4753             p_commit                 => Fnd_Api.g_false,
4754             p_validation_level       => p_validation_level,
4755             p_Req_Material_Tbl       => p_x_req_material_tbl,
4756             x_return_status          => l_return_status,
4757             x_msg_count              => l_msg_count,
4758             x_msg_data               => l_msg_data);
4759         END IF;
4760     END IF;
4761     l_msg_count := Fnd_Msg_Pub.count_msg;
4762     -- Check the return status of API call.
4763     IF (l_return_status <> 'S' OR l_msg_count > 0) THEN
4764         X_msg_count := l_msg_count;
4765         X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4766         RAISE Fnd_Api.G_EXC_ERROR;
4767     END IF;
4768    --Standard check for commit
4769    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
4770       COMMIT;
4771    END IF;
4772    -- Debug info
4773     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
4774         fnd_log.string(fnd_log.level_procedure, L_DEBUG_KEY || '.end',
4775             'At the end of normal execution of the PLSQL procedure. Status: '||l_return_status );
4776     END IF;
4777   EXCEPTION
4778  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4779     ROLLBACK TO Change_Requirement_Item;
4780     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4781     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4782                                p_count => x_msg_count,
4783                                p_data  => x_msg_data);
4784 WHEN FND_API.G_EXC_ERROR THEN
4785     ROLLBACK TO Change_Requirement_Item;
4786     X_return_status := FND_API.G_RET_STS_ERROR;
4787     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4788                                p_count => x_msg_count,
4789                                p_data  => X_msg_data);
4790 WHEN OTHERS THEN
4791     ROLLBACK TO Change_Requirement_Item;
4792     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4793     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4794     THEN
4795     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
4796                             p_procedure_name  =>  'Change_Requirement_Item',
4797                             p_error_text      => SUBSTR(SQLERRM,1,240));
4798     END IF;
4799     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4800                                p_count => x_msg_count,
4801                                p_data  => X_msg_data);
4802 END Change_Requirement_Item;
4803 
4804 -- Public Procedure Definitions follow --
4805 -----------------------------------------
4806 -- Start of Comments --
4807 --  Procedure name    : Process_Material_Request
4808 --  Type              : Private
4809 --  Function          : Process material reservations through MRP for Routine and Non
4810 --                      Routine jobs based on operation flag
4811 --  Pre-reqs    :
4812 --  Parameters  :
4813 --
4814 --  Standard IN  Parameters :
4815 --      p_api_version                   IN      NUMBER       Required
4816 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
4817 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
4818 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
4819 --      p_default                       IN      VARCHAR2     Default  FND_API.G_TRUE
4820 --      p_module_type                   IN      VARCHAR2     Default  NULL.
4821 --
4822 --  Standard OUT Parameters :
4823 --      x_return_status                 OUT     VARCHAR2               Required
4824 --      x_msg_count                     OUT     NUMBER                 Required
4825 --      x_msg_data                      OUT     VARCHAR2               Required
4826 --
4827 --  Process Material Request Parameters:
4828 --       p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
4829 --         Contains material information to perform material reservation depending
4830 --         on operation flag
4831 --
4832 --  Version :
4833 --      Initial Version   1.0
4834 --
4835 --  End of Comments.
4836 PROCEDURE Process_Material_Request (
4837     p_api_version            IN            NUMBER,
4838     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
4839     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
4840     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
4841     p_module_type            IN            VARCHAR2  := NULL,
4842     p_x_req_material_tbl     IN OUT NOCOPY AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type,
4843     x_return_status             OUT NOCOPY        VARCHAR2,
4844     x_msg_count                 OUT NOCOPY        NUMBER,
4845     x_msg_data                  OUT NOCOPY        VARCHAR2
4846    )
4847  IS
4848  l_api_name        CONSTANT VARCHAR2(30) := 'PROCESS_MATERIAL_REQUEST';
4849  l_api_version     CONSTANT NUMBER       := 1.0;
4850  l_msg_count                NUMBER;
4851  l_return_status            VARCHAR2(1);
4852  l_job_return_status        VARCHAR2(1);
4853  l_msg_data                 VARCHAR2(2000);
4854  l_interface_flag           VARCHAR2(1) := NULL;
4855  l_called_module            VARCHAR2(10) := 'UI';
4856  l_req_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
4857  l_req_cr_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
4858  l_req_up_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
4859  l_req_re_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
4860  l_req_ci_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
4861  l_commit              VARCHAR2(30)  := Fnd_Api.G_FALSE;
4862 
4863  --Added by debadey for Aog notification
4864  l_asm_id_tbl                       AHL_MM_MTL_MGT_PVT.number_table_type;
4865  l_temp_var                                       NUMBER;
4866  l_count              NUMBER;
4867 
4868  CURSOR AOG_CHECK_CUR(p_asm_id NUMBER)
4869  IS
4870  SELECT 1 FROM AHL_SCHEDULE_MATERIALS_V
4871  WHERE schedule_material_id = p_asm_id
4872  AND NVL(aog_flag, 'N') = 'N';
4873  BEGIN
4874    --------------------Initialize ----------------------------------
4875   -- Standard Start of API savepoint
4876   SAVEPOINT process_material_request;
4877    -- Check if API is called in debug mode. If yes, enable debug.
4878    IF G_DEBUG='Y' THEN
4879    AHL_DEBUG_PUB.enable_debug;
4880    -- Debug info.
4881    AHL_DEBUG_PUB.debug( 'enter ahl_pp_materias_pvt.process material request','+PPMRP+');
4882    --
4883    END IF;
4884    -- Standard call to check for call compatibility.
4885    IF FND_API.to_boolean(p_init_msg_list)
4886    THEN
4887      FND_MSG_PUB.initialize;
4888    END IF;
4889     --  Initialize API return status to success
4890     x_return_status := FND_API.G_RET_STS_SUCCESS;
4891    -- Initialize message list if p_init_msg_list is set to TRUE.
4892    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
4893                                       p_api_version,
4894                                       l_api_name,G_PKG_NAME)
4895    THEN
4896        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4897    END IF;
4898    --------------------Start of API Body-----------------------------------
4899    --debadey:logging
4900    IF G_DEBUG='Y' THEN
4901    Ahl_Debug_Pub.debug( 'p_x_req_material_tbl.COUNT= '||p_x_req_material_tbl.COUNT,'+PPMRP+');
4902    Ahl_Debug_Pub.debug( 'p_x_req_material_tbl(1).operation_flag= '||p_x_req_material_tbl(1).operation_flag,'+PPMRP+');
4903    -- Check if API is called in debug mode. If yes, disable debug.
4904    Ahl_Debug_Pub.disable_debug;
4905    END IF;
4906    --debadey:logging end
4907 
4908    IF p_x_req_material_tbl.COUNT > 0 THEN
4909       FOR i IN p_x_req_material_tbl.FIRST..p_x_req_material_tbl.LAST
4910         LOOP
4911            IF p_x_req_material_tbl(i).operation_flag = 'C'
4912             THEN
4913               --
4914               l_req_cr_material_tbl(i) := p_x_req_material_tbl(i);
4915                --
4916            ELSIF p_x_req_material_tbl(i).operation_flag = 'U'
4917            THEN
4918                 l_req_up_material_tbl(i) := p_x_req_material_tbl(i);
4919                 -- Added for AOG notification by debadey
4920                 --debadey:logging
4921                 IF G_DEBUG='Y' THEN
4922                 Ahl_Debug_Pub.debug( 'p_x_req_material_tbl(i).AOG_FLAG= '||p_x_req_material_tbl(i).AOG_FLAG,'+PPMRP+');
4923                 Ahl_Debug_Pub.debug( 'p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID= '||p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID,'+PPMRP+');
4924                 -- Check if API is called in debug mode. If yes, disable debug.
4925                 Ahl_Debug_Pub.disable_debug;
4926                 END IF;
4927                 --debadey:logging end
4928                                   IF (p_x_req_material_tbl(i).AOG_FLAG = 'Y')
4929                                   THEN
4930                                       OPEN AOG_CHECK_CUR(p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID);
4931                     FETCH AOG_CHECK_CUR INTO l_temp_var;
4932                                             IF (AOG_CHECK_CUR%FOUND)
4933                                             THEN
4934 
4935                         -- ASM Id had AOG flag N earlier.Update table type variable
4936                         -- Update table type variable
4937                         IF (l_asm_id_tbl.COUNT=0)
4938                         THEN
4939                           l_count:=0;
4940                         ELSE
4941                           l_count := l_asm_id_tbl.LAST;
4942                         END IF;
4943                                                 l_asm_id_tbl(l_count+1):= p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID;
4944 
4945                     END IF;
4946                     CLOSE AOG_CHECK_CUR;
4947                 END IF;
4948                 -- End of changes by debadey
4949            ELSIF p_x_req_material_tbl(i).operation_flag = 'D'
4950            THEN
4951                    --
4952                 l_req_re_material_tbl(i) := p_x_req_material_tbl(i);
4953            ELSIF p_x_req_material_tbl(i).operation_flag = 'I'
4954            THEN
4955                 l_req_ci_material_tbl(i) := p_x_req_material_tbl(i);
4956            END IF;
4957         END LOOP;
4958     END IF;
4959     --Call Private API to process
4960       IF l_req_cr_material_tbl.COUNT > 0 THEN
4961        -- Call create material request
4962        -- MANESING::NR Analysis, 03-Jun-2011, added p_module_type in the API signature
4963        Create_Material_Reqst
4964                              (
4965                       p_api_version         => p_api_version,
4966                       p_init_msg_list       => p_init_msg_list,
4967                       p_commit              => l_commit,
4968                       p_validation_level    => p_validation_level,
4969                       p_module_type         => p_module_type,
4970                       p_interface_flag      => l_interface_flag,
4971                       p_x_req_material_tbl  => l_req_cr_material_tbl,
4972                       x_job_return_status   => l_job_return_status,
4973                       x_return_status       => l_return_status,
4974                       x_msg_count           => l_msg_count,
4975                       x_msg_data            => l_msg_data
4976                      ) ;
4977        IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
4978          l_msg_count := FND_MSG_PUB.count_msg;
4979             IF l_msg_count > 0 THEN
4980               RAISE FND_API.G_EXC_ERROR;
4981             END IF;
4982        END IF;
4983        FOR i IN l_req_cr_material_tbl.First..l_req_cr_material_tbl.LAST LOOP
4984                    p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID := l_req_cr_material_tbl(i).SCHEDULE_MATERIAL_ID;
4985                                    -- Added by debadey for AOG notification
4986 
4987                                    IF G_DEBUG='Y' THEN
4988                       Ahl_Debug_Pub.debug( 'l_req_cr_material_tbl(i).AOG_FLAG= '||p_x_req_material_tbl(i).AOG_FLAG,'+PPMRP+');
4989                       Ahl_Debug_Pub.debug( 'l_req_cr_material_tbl(i).SCHEDULE_MATERIAL_ID= '||p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID,'+PPMRP+');
4990                       -- Check if API is called in debug mode. If yes, disable debug.
4991                       Ahl_Debug_Pub.disable_debug;
4992                    END IF;
4993 
4994                                    IF (l_req_cr_material_tbl(i).AOG_FLAG = 'Y')
4995                                THEN
4996                                         -- Update table type variable
4997                                                 IF (l_asm_id_tbl.COUNT=0)
4998                                                 THEN
4999                                                         l_count:=0;
5000                                                 ELSE
5001                                                         l_count := l_asm_id_tbl.LAST;
5002                                                 END IF;
5003                                         l_asm_id_tbl(l_count+1):= p_x_req_material_tbl(i).SCHEDULE_MATERIAL_ID;
5004                                END IF;
5005                                    -- End of change sby debadey
5006 
5007        END LOOP;
5008      END IF;
5009    IF l_req_up_material_tbl.COUNT > 0 THEN
5010      -- Call Update material request
5011        Update_Material_Reqst
5012                        (
5013                   p_api_version         => p_api_version,
5014                   p_init_msg_list       => p_init_msg_list,
5015                   p_commit              => l_commit,
5016                   p_validation_level    => p_validation_level,
5017                   p_module_type         => p_module_type,
5018                   p_x_req_material_tbl  => l_req_up_material_tbl,
5019                   x_return_status       => l_return_status,
5020                   x_msg_count           => l_msg_count,
5021                   x_msg_data            => l_msg_data
5022                   );
5023      IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
5024          l_msg_count := FND_MSG_PUB.count_msg;
5025             IF l_msg_count > 0 THEN
5026               RAISE FND_API.G_EXC_ERROR;
5027             END IF;
5028        END IF;
5029    END IF;
5030 
5031    IF l_req_re_material_tbl.COUNT > 0 THEN
5032       -- Call Remove material request
5033         Remove_Material_Request
5034                       (
5035                    p_api_version   => p_api_version,
5036                    p_init_msg_list => p_init_msg_list,
5037                    p_commit        => l_commit,
5038                    p_validation_level  => p_validation_level,
5039                    p_module_type       => p_module_type,
5040                    p_x_req_material_tbl  => l_req_re_material_tbl,
5041                    x_return_status       => l_return_status,
5042                    x_msg_count           => l_msg_count,
5043                    x_msg_data            => l_msg_data
5044                    );
5045      IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
5046          l_msg_count := FND_MSG_PUB.count_msg;
5047             IF l_msg_count > 0 THEN
5048               RAISE FND_API.G_EXC_ERROR;
5049             END IF;
5050      END IF;
5051    END IF;
5052 
5053    IF l_req_ci_material_tbl.COUNT > 0 THEN
5054         -- Call Change Requirement Item
5055         Change_Requirement_Item
5056                    (
5057                    p_api_version         => p_api_version,
5058                    p_init_msg_list       => p_init_msg_list,
5059                    p_commit              => l_commit,
5060                    p_validation_level    => p_validation_level,
5061                    p_module_type         => p_module_type,
5062                    p_x_req_material_tbl  => l_req_ci_material_tbl,
5063                    x_return_status       => l_return_status,
5064                    x_msg_count           => l_msg_count,
5065                    x_msg_data            => l_msg_data
5066                    );
5067      IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
5068          l_msg_count := FND_MSG_PUB.count_msg;
5069             IF l_msg_count > 0 THEN
5070               RAISE FND_API.G_EXC_ERROR;
5071             END IF;
5072      END IF;
5073     END IF;
5074      -- Added by debadey for AOG notification and WO updation
5075         IF (l_asm_id_tbl IS NOT NULL AND l_asm_id_tbl.COUNT > 0)
5076         THEN
5077                 --debadey:logging
5078                 IF (G_DEBUG='Y') THEN
5079                         Ahl_Debug_Pub.debug( 'No. of asm ids for which notification to be sent = '||l_asm_id_tbl.COUNT,'+PPMRP+');
5080                 -- Check if API is called in debug mode. If yes, disable debug.
5081                 Ahl_Debug_Pub.disable_debug;
5082                 END IF;
5083                 --debadey:logging end
5084 
5085                 AHL_MM_MTL_MGT_PVT.aog_upd_notification(p_api_version      => p_api_version,
5086                                                         p_init_msg_list    => p_init_msg_list,
5087                                                                                                                     p_commit           => l_commit,
5088                                                                                                                     p_validation_level => p_validation_level,
5089                                             p_schedule_material_id_tbl       => l_asm_id_tbl,
5090                                                                                                                     x_return_status    => l_return_status,
5091                                                                                                                     x_msg_count        => l_msg_count,
5092                                                                                                                     x_msg_data         => l_msg_data
5093                                                                                                                    );
5094                 IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
5095          l_msg_count := FND_MSG_PUB.count_msg;
5096             IF l_msg_count > 0 THEN
5097               RAISE FND_API.G_EXC_ERROR;
5098             END IF;
5099     END IF;
5100   END IF;
5101 
5102    ------------------------End of Body---------------------------------------
5103   --Standard check to count messages
5104    l_msg_count := Fnd_Msg_Pub.count_msg;
5105    IF l_msg_count > 0 THEN
5106       X_msg_count := l_msg_count;
5107       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5108       RAISE Fnd_Api.G_EXC_ERROR;
5109    END IF;
5110    --Standard check for commit
5111    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
5112       COMMIT;
5113    END IF;
5114    -- Debug info
5115    IF G_DEBUG='Y' THEN
5116    Ahl_Debug_Pub.debug( 'End of public api Process Material Request','+PPMRP+');
5117    -- Check if API is called in debug mode. If yes, disable debug.
5118    Ahl_Debug_Pub.disable_debug;
5119    --
5120    END IF;
5121   EXCEPTION
5122  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5123     ROLLBACK TO process_material_request;
5124     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5125     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
5126                                p_count => x_msg_count,
5127                                p_data  => x_msg_data);
5128        IF G_DEBUG='Y' THEN
5129        AHL_DEBUG_PUB.log_app_messages (
5130              x_msg_count, x_msg_data, 'ERROR' );
5131        AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Process Material Request','+PPMRP+');
5132         -- Check if API is called in debug mode. If yes, disable debug.
5133        AHL_DEBUG_PUB.disable_debug;
5134        END IF;
5135 WHEN FND_API.G_EXC_ERROR THEN
5136     ROLLBACK TO process_material_request;
5137     X_return_status := FND_API.G_RET_STS_ERROR;
5138     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
5139                                p_count => x_msg_count,
5140                                p_data  => X_msg_data);
5141         IF G_DEBUG='Y' THEN
5142         -- Debug info.
5143         AHL_DEBUG_PUB.log_app_messages (
5144              x_msg_count, x_msg_data, 'UNEXPECTED ERROR' );
5145         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Process Material Request','+PPMRP+');
5146         -- Check if API is called in debug mode. If yes, disable debug.
5147         AHL_DEBUG_PUB.disable_debug;
5148             --
5149         END IF;
5150 WHEN OTHERS THEN
5151     ROLLBACK TO process_material_request;
5152     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5153     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5154     THEN
5155     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
5156                             p_procedure_name  =>  'PROCESS_MATERIAL_REQUEST',
5157                             p_error_text      => SUBSTR(SQLERRM,1,240));
5158     END IF;
5159     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
5160                                p_count => x_msg_count,
5161                                p_data  => X_msg_data);
5162         IF G_DEBUG='Y' THEN
5163         -- Debug info.
5164         AHL_DEBUG_PUB.log_app_messages (
5165               x_msg_count, x_msg_data, 'SQL ERROR' );
5166         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt. Process Material Request','+PPMRP+');
5167         -- Check if API is called in debug mode. If yes, disable debug.
5168         AHL_DEBUG_PUB.disable_debug;
5169         END IF;
5170  END Process_Material_Request;
5171 --
5172 -- aps obsoleted
5173 FUNCTION Get_Mrp_Net
5174  (p_schedule_material_id IN NUMBER,
5175   p_item_desc    IN VARCHAR2)
5176 RETURN VARCHAR2 IS
5177  --
5178  CURSOR Check_material_cur (c_schedule_material_id IN NUMBER)
5179      IS
5180   SELECT scheduled_material_id,
5181          rt_oper_material_id
5182      FROM ahl_schedule_materials
5183   WHERE scheduled_material_id = c_schedule_material_id;
5184  --
5185  CURSOR Get_item_cur(c_segments IN VARCHAR2)
5186  IS
5187    SELECT distinct(inventory_item_id)
5188      FROM mtl_system_items_kfv
5189     WHERE concatenated_segments = c_segments;
5190  --
5191  l_return    VARCHAR2(1);
5192  --
5193  l_inventory_item_id       NUMBER;
5194  l_rt_oper_material_id     NUMBER;
5195  l_schedule_material_id    NUMBER;
5196 BEGIN
5197     --Check for schedule material id
5198    OPEN Check_material_cur(p_schedule_material_id);
5199    FETCH Check_material_cur INTO l_schedule_material_id,l_rt_oper_material_id;
5200    CLOSE Check_material_cur;
5201    --
5202    -- Get inventory item
5203    OPEN Get_item_cur(p_item_desc);
5204    FETCH Get_item_cur INTO l_inventory_item_id;
5205    CLOSE Get_item_cur;
5206    --
5207    IF l_rt_oper_material_id IS NOT NULL THEN
5208        l_return := 'N';
5209     ELSE
5210       l_return := 'Y';
5211    END IF;
5212       RETURN  l_return;
5213 EXCEPTION
5214   WHEN OTHERS THEN
5215     RETURN NULL;
5216 END Get_Mrp_Net;
5217 -- aps obsoleted
5218 --
5219 FUNCTION GET_QTY_PER_ASBLY
5220     (p_schedule_material_id IN NUMBER,
5221      p_item_desc            IN VARCHAR2 )
5222   RETURN NUMBER IS
5223  CURSOR Check_material_cur (c_schedule_material_id IN NUMBER)
5224      IS
5225   SELECT scheduled_material_id,
5226          rt_oper_material_id,requested_quantity
5227      FROM ahl_schedule_materials
5228   WHERE scheduled_material_id = c_schedule_material_id;
5229  --
5230  CURSOR Get_item_cur(c_segments IN VARCHAR2)
5231  IS
5232    SELECT distinct(inventory_item_id)
5233      FROM mtl_system_items_kfv
5234     WHERE concatenated_segments = c_segments;
5235  --
5236  l_inventory_item_id       NUMBER;
5237  l_rt_oper_material_id     NUMBER;
5238  l_schedule_material_id    NUMBER;
5239  l_requested_quantity      NUMBER;
5240 BEGIN
5241      --Check for schedule material id
5242    OPEN Check_material_cur(p_schedule_material_id);
5243    FETCH Check_material_cur INTO l_schedule_material_id,l_rt_oper_material_id,
5244                                  l_requested_quantity;
5245    CLOSE Check_material_cur;
5246    --
5247    -- Get inventory item
5248    OPEN Get_item_cur(p_item_desc);
5249    FETCH Get_item_cur INTO l_inventory_item_id;
5250    CLOSE Get_item_cur;
5251    --
5252    IF l_schedule_material_id IS NOT NULL THEN
5253        RETURN l_requested_quantity;
5254     END IF;
5255 EXCEPTION
5256   WHEN OTHERS THEN
5257     RETURN NULL;
5258 END Get_Qty_Per_Asbly;
5259 --
5260 -- Start of Comments --
5261 --  Procedure name    : Log_Transaction_Record
5262 --  Type              : Private
5263 --  Function          : Writes the details about a transaction in the Log Table
5264 --                 AHL_WO_OPERATION_TXNS
5265 --  Pre-reqs    :
5266 --  Parameters  :
5267 --
5268 --  Log_Transaction Parameters:
5269 --      p_trans_type_code               IN      VARCHAR2     Required
5270 --      p_load_type_code                IN      NUMBER       Required
5271 --      p_transaction_type_code         IN      NUMBER       Required
5272 --      p_workorder_operation_id        IN      NUMBER       Default  NULL,
5273 --      p_operation_resource_id         IN      NUMBER       Default  NULL,
5274 --      p_schedule_material_id          IN      NUMBER       Default  NULL,
5275 --      p_bom_resource_id               IN      NUMBER       Default  NULL,
5276 --      p_cost_basis_code               IN      NUMBER       Default  NULL,
5277 --      p_total_required                IN      NUMBER       Default  NULL,
5278 --      p_assigned_units                IN      NUMBER       Default  NULL,
5279 --      p_autocharge_type_code          IN      NUMBER       Default  NULL,
5280 --      p_standard_rate_flag_code       IN      NUMBER       Default  NULL,
5281 --      p_applied_resource_units        IN      NUMBER       Default  NULL,
5282 --      p_applied_resource_value        IN      NUMBER       Default  NULL,
5283 --      p_inventory_item_id             IN      NUMBER       Default  NULL,
5284 --      p_scheduled_quantity            IN      NUMBER       Default  NULL,
5285 --      p_scheduled_date                IN      DATE         Default  NULL,
5286 --      p_mrp_net_flag                  IN      NUMBER       Default  NULL,
5287 --      p_quantity_per_assembly         IN      NUMBER       Default  NULL,
5288 --      p_required_quantity             IN      NUMBER       Default  NULL,
5289 --      p_supply_locator_id             IN      NUMBER       Default  NULL,
5290 --      p_supply_subinventory           IN      NUMBER       Default  NULL,
5291 --      p_date_required                 IN      DATE         Default  NULL,
5292 --      p_operation_type_code           IN      VARCHAR2     Default  NULL,
5293 --      p_sched_start_date              IN      DATE         Default  NULL,
5294 --      p_res_sched_end_date            IN      DATE         Default  NULL,
5295 --      p_op_scheduled_start_date       IN      DATE         Default  NULL,
5296 --      p_op_scheduled_end_date         IN      DATE         Default  NULL,
5297 --      p_op_actual_start_date          IN      DATE         Default  NULL,
5298 --      p_op_actual_end_date            IN      DATE         Default  NULL,
5299 --      p_attribute_category            IN      VARCHAR2     Default  NULL,
5300 --      p_attribute1                    IN      VARCHAR2     Default  NULL
5301 --      p_attribute2                    IN      VARCHAR2     Default  NULL
5302 --      p_attribute3                    IN      VARCHAR2     Default  NULL
5303 --      p_attribute4                    IN      VARCHAR2     Default  NULL
5304 --      p_attribute5                    IN      VARCHAR2     Default  NULL
5305 --      p_attribute6                    IN      VARCHAR2     Default  NULL
5306 --      p_attribute7                    IN      VARCHAR2     Default  NULL
5307 --      p_attribute8                    IN      VARCHAR2     Default  NULL
5308 --      p_attribute9                    IN      VARCHAR2     Default  NULL
5309 --      p_attribute10                   IN      VARCHAR2     Default  NULL
5310 --      p_attribute11                   IN      VARCHAR2     Default  NULL
5311 --      p_attribute12                   IN      VARCHAR2     Default  NULL
5312 --      p_attribute13                   IN      VARCHAR2     Default  NULL
5313 --      p_attribute14                   IN      VARCHAR2     Default  NULL
5314 --      p_attribute15                   IN      VARCHAR2     Default  NULL
5315 --
5316 --  Version :
5317 --      Initial Version   1.0
5318 --
5319 --  End of Comments.
5320 --
5321 PROCEDURE Log_Transaction_Record
5322     ( p_wo_operation_txn_id      IN   NUMBER,
5323       p_object_version_number    IN   NUMBER,
5324       p_last_update_date         IN   DATE,
5325       p_last_updated_by          IN   NUMBER,
5326       p_creation_date            IN   DATE,
5327       p_created_by               IN   NUMBER,
5328       p_last_update_login        IN   NUMBER,
5329       p_load_type_code           IN   NUMBER,
5330       p_transaction_type_code    IN   NUMBER,
5331       p_workorder_operation_id   IN   NUMBER   := NULL,
5332       p_operation_resource_id    IN   NUMBER   := NULL,
5333       p_schedule_material_id     IN   NUMBER   := NULL,
5334       p_bom_resource_id          IN   NUMBER   := NULL,
5335       p_cost_basis_code          IN   NUMBER   := NULL,
5336       p_total_required           IN   NUMBER   := NULL,
5337       p_assigned_units           IN   NUMBER   := NULL,
5338       p_autocharge_type_code     IN   NUMBER   := NULL,
5339       p_standard_rate_flag_code  IN   NUMBER   := NULL,
5340       p_applied_resource_units   IN   NUMBER   := NULL,
5341       p_applied_resource_value   IN   NUMBER   := NULL,
5342       p_inventory_item_id        IN   NUMBER   := NULL,
5343       p_scheduled_quantity       IN   NUMBER   := NULL,
5344       p_scheduled_date           IN   DATE     := NULL,
5345       p_mrp_net_flag             IN   NUMBER   := NULL,
5346       p_quantity_per_assembly    IN   NUMBER   := NULL,
5347       p_required_quantity        IN   NUMBER   := NULL,
5348       p_supply_locator_id        IN   NUMBER   := NULL,
5349       p_supply_subinventory      IN   NUMBER   := NULL,
5350       p_date_required            IN   DATE     := NULL,
5351       p_operation_type_code      IN   VARCHAR2 := NULL,
5352       p_res_sched_start_date     IN   DATE     := NULL,
5353       p_res_sched_end_date       IN   DATE     := NULL,
5354       p_op_scheduled_start_date  IN   DATE     := NULL,
5355       p_op_scheduled_end_date    IN   DATE     := NULL,
5356       p_op_actual_start_date     IN   DATE     := NULL,
5357       p_op_actual_end_date       IN   DATE     := NULL,
5358       p_attribute_category       IN   VARCHAR2 := NULL,
5359       p_attribute1               IN   VARCHAR2 := NULL,
5360       p_attribute2               IN   VARCHAR2 := NULL,
5361       p_attribute3               IN   VARCHAR2 := NULL,
5362       p_attribute4               IN   VARCHAR2 := NULL,
5363       p_attribute5               IN   VARCHAR2 := NULL,
5364       p_attribute6               IN   VARCHAR2 := NULL,
5365       p_attribute7               IN   VARCHAR2 := NULL,
5366       p_attribute8               IN   VARCHAR2 := NULL,
5367       p_attribute9               IN   VARCHAR2 := NULL,
5368       p_attribute10              IN   VARCHAR2 := NULL,
5369       p_attribute11              IN   VARCHAR2 := NULL,
5370       p_attribute12              IN   VARCHAR2 := NULL,
5371       p_attribute13              IN   VARCHAR2 := NULL,
5372       p_attribute14              IN   VARCHAR2 := NULL,
5373       p_attribute15              IN   VARCHAR2 := NULL)
5374      IS
5375 BEGIN
5376    --
5377    INSERT INTO AHL_WO_OPERATIONS_TXNS
5378     (  wo_operation_txn_id       ,
5379        object_version_number     ,
5380        last_update_date          ,
5381        last_updated_by           ,
5382        creation_date             ,
5383        created_by                ,
5384        last_update_login         ,
5385        load_type_code            ,
5386        transaction_type_code     ,
5387        workorder_operation_id    ,
5388        operation_resource_id     ,
5389        schedule_material_id      ,
5390        bom_resource_id           ,
5391        cost_basis_code           ,
5392        total_required            ,
5393        assigned_units            ,
5394        autocharge_type_code      ,
5395        standard_rate_flag_code   ,
5396        applied_resource_units    ,
5397        applied_resource_value    ,
5398        inventory_item_id         ,
5399        scheduled_quantity        ,
5400        scheduled_date            ,
5401        mrp_net_flag              ,
5402        quantity_per_assembly     ,
5403        required_quantity         ,
5404        supply_locator_id         ,
5405        supply_subinventory       ,
5406        date_required             ,
5407        operation_type_code       ,
5408        res_sched_start_date      ,
5409        res_sched_end_date        ,
5410        op_scheduled_start_date   ,
5411        op_scheduled_end_date     ,
5412        op_actual_start_date      ,
5413        op_actual_end_date        ,
5414        attribute_category        ,
5415        attribute1                ,
5416        attribute2                ,
5417        attribute3                ,
5418        attribute4                ,
5419        attribute5                ,
5420        attribute6                ,
5421        attribute7                ,
5422        attribute8                ,
5423        attribute9                ,
5424        attribute10               ,
5425        attribute11               ,
5426        attribute12               ,
5427        attribute13               ,
5428        attribute14               ,
5429        attribute15
5430        )
5431     VALUES
5432     (
5433        p_wo_operation_txn_id       ,
5434        p_object_version_number     ,
5435        p_last_update_date          ,
5436        p_last_updated_by           ,
5437        p_creation_date             ,
5438        p_created_by                ,
5439        p_last_update_login         ,
5440        p_load_type_code            ,
5441        p_transaction_type_code     ,
5442        p_workorder_operation_id    ,
5443        p_operation_resource_id     ,
5444        p_schedule_material_id      ,
5445        p_bom_resource_id           ,
5446        p_cost_basis_code           ,
5447        p_total_required            ,
5448        p_assigned_units            ,
5449        p_autocharge_type_code      ,
5450        p_standard_rate_flag_code   ,
5451        p_applied_resource_units    ,
5452        p_applied_resource_value    ,
5453        p_inventory_item_id         ,
5454        p_scheduled_quantity        ,
5455        p_scheduled_date            ,
5456        p_mrp_net_flag              ,
5457        p_quantity_per_assembly     ,
5458        p_required_quantity         ,
5459        p_supply_locator_id         ,
5460        p_supply_subinventory       ,
5461        p_date_required             ,
5462        p_operation_type_code       ,
5463        p_res_sched_start_date      ,
5464        p_res_sched_end_date        ,
5465        p_op_scheduled_start_date   ,
5466        p_op_scheduled_end_date     ,
5467        p_op_actual_start_date      ,
5468        p_op_actual_end_date        ,
5469        p_attribute_category        ,
5470        p_attribute1                ,
5471        p_attribute2                ,
5472        p_attribute3                ,
5473        p_attribute4                ,
5474        p_attribute5                ,
5475        p_attribute6                ,
5476        p_attribute7                ,
5477        p_attribute8                ,
5478        p_attribute9                ,
5479        p_attribute10               ,
5480        p_attribute11               ,
5481        p_attribute12               ,
5482        p_attribute13               ,
5483        p_attribute14               ,
5484        p_attribute15
5485     );
5486 END log_transaction_record;
5487 --
5488 function GET_ISSUED_QTY(P_ORG_ID IN NUMBER, P_ITEM_ID IN NUMBER, P_WORKORDER_OP_ID IN NUMBER) RETURN NUMBER
5489 IS
5490 issued NUMBER;
5491 CURSOR Q1(p_org_id NUMBER, p_itme_Id NUMBER,p_wo_op_id in NUMBER) IS
5492 SELECT SUM(QUANTITY) FROM AHL_WORKORDER_MTL_TXNS
5493 WHERE ORGANIZATION_ID = p_org_id
5494 AND INVENTORY_ITEM_ID = p_item_id
5495 AND WORKORDER_OPERATION_ID = p_wo_op_id
5496 AND TRANSACTION_TYPE_ID = 35;
5497 BEGIN
5498       OPEN Q1(P_ORG_ID,P_ITEM_ID, P_WORKORDER_OP_ID);
5499       FETCH Q1 INTO issued;
5500       IF(Q1%NOTFOUND) THEN
5501             issued := 0;
5502       END IF;
5503       CLOSE Q1;
5504       return issued;
5505 END GET_ISSUED_QTY;
5506 ---JKJAIN FP ER # 6436303
5507     -------------------------------------------------------------------------------------
5508          -- Function for returning net quantity of material available with
5509          -- a workorder.
5510          -- Net Total Quantity = Total Quantity Issued - Total quantity returned
5511          -- Balaji added this function for OGMA ER # 5948868.
5512          --------------------------------------------------------------------------------------
5513          FUNCTION GET_NET_QTY(
5514                     P_ORG_ID IN NUMBER,
5515                     P_ITEM_ID IN NUMBER,
5516                     P_WORKORDER_OP_ID IN NUMBER
5517                   )
5518          RETURN NUMBER
5519          IS
5520          -- Local variables
5521          l_issue_qty NUMBER;
5522          l_rtn_qty NUMBER;
5523          l_net_qty NUMBER;
5524          -- Cursors
5525          -- cursor for getting total issued quantity
5526          CURSOR c_get_issue_qty(c_org_id NUMBER, c_itme_Id NUMBER,c_wo_op_id in NUMBER)
5527          IS
5528          SELECT  SUM(QUANTITY)
5529          FROM    AHL_WORKORDER_MTL_TXNS
5530          WHERE   ORGANIZATION_ID        = c_org_id
5531              AND INVENTORY_ITEM_ID      = c_itme_Id
5532              AND WORKORDER_OPERATION_ID = c_wo_op_id
5533              AND TRANSACTION_TYPE_ID    = 35; -- Mtl Issue Txn
5534          -- cursor for getting total returned quantity
5535          CURSOR c_get_rtn_qty(c_org_id NUMBER, c_itme_Id NUMBER,c_wo_op_id in NUMBER)
5536          IS
5537          SELECT  SUM(QUANTITY)
5538          FROM    AHL_WORKORDER_MTL_TXNS
5539          WHERE   ORGANIZATION_ID        = c_org_id
5540              AND INVENTORY_ITEM_ID      = c_itme_Id
5541              AND WORKORDER_OPERATION_ID = c_wo_op_id
5542              AND TRANSACTION_TYPE_ID    = 43; -- Mtl Rtn Txn
5543          BEGIN
5544                  OPEN c_get_issue_qty(p_org_id, p_item_id, p_workorder_op_id);
5545                  FETCH c_get_issue_qty INTO l_issue_qty;
5546                  CLOSE c_get_issue_qty;
5547                  IF l_issue_qty IS NULL
5548                  THEN
5549                     l_issue_qty := 0;
5550                  END IF;
5551                  OPEN c_get_rtn_qty(p_org_id, p_item_id, p_workorder_op_id);
5552                  FETCH c_get_rtn_qty INTO l_rtn_qty;
5553                  CLOSE c_get_rtn_qty;
5554                  IF l_rtn_qty IS NULL
5555                  THEN
5556                     l_rtn_qty := 0;
5557                  END IF;
5558                  l_net_qty := l_issue_qty - l_rtn_qty;
5559 -- JKJAIN BUG # 7587902
5560 --               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5561 --                    fnd_log.string
5562 --                        (
5563 --                           fnd_log.level_statement,
5564 --                           'ahl.plsql.AHL_PP_MATERIALS_PVT.GET_NET_QTY',
5565 --                           'l_net_qty -> ' || l_net_qty
5566 --                        );
5567 --               END IF;
5568                  return l_net_qty;
5569          END GET_NET_QTY;
5570 --
5571 -- Start of Comments --
5572 --  Procedure name    : Process_Wo_Op_Materials
5573 --  Type        : Private
5574 --  Function    : Procedure to Process Requested materials defined at Route/Operation/Dispostion
5575 --
5576 --  Pre-reqs    :
5577 --  Parameters  :
5578 --
5579 --  Standard IN  Parameters :
5580 --      p_api_version                   IN      NUMBER                Required
5581 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
5582 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
5583 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
5584 --         Based on this flag, the API will set the default attributes.
5585 --  Standard OUT Parameters :
5586 --      x_return_status                 OUT     VARCHAR2               Required
5587 --      x_msg_count                     OUT     NUMBER                 Required
5588 --      x_msg_data                      OUT     VARCHAR2               Required
5589 --
5590 --  Process_Material Parameters :
5591 --  p_prd_wooperation_tbl    IN       AHL_PRD_WORKORDER_PVT.Prd_Workoper_Tbl,
5592 --  x_req_material_tbl     OUT        Ahl_Pp_Material_Pvt.Req_Material_Tbl_Type,Required
5593 --         List of Required materials for a job
5594 --
5595 PROCEDURE Process_Wo_Op_Materials (
5596     p_api_version            IN            NUMBER,
5597     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
5598     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
5599     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
5600     p_operation_flag         IN            VARCHAR2,
5601     p_prd_wooperation_tbl    IN  AHL_PRD_OPERATIONS_PVT.Prd_Operation_Tbl,
5602     x_req_material_tbl       OUT NOCOPY Req_Material_Tbl_Type,
5603     x_return_status             OUT NOCOPY        VARCHAR2,
5604     x_msg_count                 OUT NOCOPY        NUMBER,
5605     x_msg_data                  OUT NOCOPY        VARCHAR2)
5606    IS
5607 
5608 /* MANESING::NR Analysis, 03-Jun-2011, modified cursor query to include an outer join with table AHL_RT_OPER_MATERIALS
5609  * instead of previous inner join. This is required since material requirements for Stage workorders do not come
5610  * directly from routes.
5611  */
5612 CURSOR Sche_Mat_Cur(c_visit_task_id IN NUMBER)
5613  IS
5614 SELECT ASM.scheduled_material_id,
5615        ASM.visit_id,visit_task_id,
5616        ASM.inventory_item_id,
5617          ASM.organization_id,
5618          ASM.requested_date,uom,
5619          ASM.rt_oper_material_id,
5620        ASM.operation_code,
5621          ASM.operation_sequence,
5622          ASM.requested_quantity,
5623          ASM.workorder_operation_id,
5624          ASM.position_path_id,
5625        ASM.relationship_id,
5626          ASM.mr_route_id,
5627          ASM.material_request_type,
5628          ASM.status,
5629          -- Bug 8569097
5630          ASM.attribute_category,
5631          ASM.attribute1,
5632          ASM.attribute2,
5633          ASM.attribute3,
5634          ASM.attribute4,
5635          ASM.attribute5,
5636          ASM.attribute6,
5637          ASM.attribute7,
5638          ASM.attribute8,
5639          ASM.attribute9,
5640          ASM.attribute10,
5641          ASM.attribute11,
5642          ASM.attribute12,
5643          ASM.attribute13,
5644          ASM.attribute14,
5645          ASM.attribute15
5646  FROM  AHL_SCHEDULE_MATERIALS ASM,
5647        AHL_RT_OPER_MATERIALS ARM
5648  WHERE ASM.rt_oper_material_id = ARM.RT_OPER_MATERIAL_ID(+)
5649    AND ASM.visit_task_id = C_VISIT_TASK_ID
5650    AND ASM.requested_quantity > 0
5651    AND ASM.STATUS IN ('ACTIVE','IN-SERVICE');
5652    --
5653    CURSOR Visit_Task_Cur(c_workorder_id IN NUMBER)
5654     IS
5655      SELECT a.visit_id,
5656           visit_task_id,
5657           organization_id
5658         FROM ahl_workorders A,
5659              ahl_visits_b b
5660       WHERE workorder_id = c_workorder_id
5661        AND a.visit_id = b.visit_id;
5662   CURSOR Material_Detail_Cur (c_operation_id       IN NUMBER,
5663                               c_operation_sequence IN NUMBER)
5664    IS
5665   SELECT Scheduled_material_id
5666     FROM AHL_SCHEDULE_MATERIALS
5667       WHERE WORKORDER_OPERATION_ID = c_operation_id
5668      AND OPERATION_SEQUENCE = c_operation_sequence;
5669     l_api_name        CONSTANT VARCHAR2(30) := 'PROCESS_WO_OP_MATERIALS';
5670     l_api_version     CONSTANT NUMBER       := 1.0;
5671     l_msg_count                NUMBER;
5672     l_return_status            VARCHAR2(1);
5673     l_msg_data                 VARCHAR2(2000);
5674     --
5675     l_prd_wooperation_tbl   AHL_PRD_OPERATIONS_PVT.Prd_Operation_Tbl := p_prd_wooperation_tbl;
5676     l_Sche_Mat_Rec          Sche_Mat_Cur%ROWTYPE;
5677       l_Visit_Task_Rec        Visit_Task_Cur%ROWTYPE;
5678     l_req_material_tbl      Req_Material_Tbl_Type;
5679     l_scheduled_material_id NUMBER;
5680       l_idx NUMBER;
5681     dff_default_values dff_default_values_type;
5682     BEGIN
5683    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5684             fnd_log.string
5685             (
5686                   fnd_log.level_procedure,
5687                   'ahl.plsql.AHL_PP_MATERIALS_PVT.Process_Wo_Op_Materials',
5688                   'At the start of PLSQL procedure'
5689             );
5690     END IF;
5691    --------------------Initialize ----------------------------------
5692    -- Standard Start of API savepoint
5693    SAVEPOINT Process_Wo_Op_Materials;
5694    -- Standard call to check for call compatibility.
5695    IF FND_API.to_boolean(p_init_msg_list)
5696    THEN
5697      FND_MSG_PUB.initialize;
5698    END IF;
5699     --  Initialize API return status to success
5700     x_return_status := FND_API.G_RET_STS_SUCCESS;
5701    -- Initialize message list if p_init_msg_list is set to TRUE.
5702    IF NOT FND_API.COMPATIBLE_API_CALL(p_api_version,
5703                                       p_api_version,
5704                                       l_api_name,G_PKG_NAME)
5705    THEN
5706        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5707    END IF;
5708      --
5709        IF l_prd_wooperation_tbl.COUNT > 0 THEN
5710          FOR i IN l_prd_wooperation_tbl.FIRST..l_prd_wooperation_tbl.LAST
5711          LOOP
5712            --
5713               IF (p_operation_flag = 'C' AND
5714                   l_prd_wooperation_tbl(i).workorder_operation_id IS NOT NULL AND
5715                 l_prd_wooperation_tbl(i).workorder_operation_id <> FND_API.G_MISS_NUM )
5716                THEN
5717            --Get visit id, visit task id
5718            OPEN Visit_Task_Cur(l_prd_wooperation_tbl(i).workorder_id);
5719            FETCH Visit_Task_Cur INTO l_Visit_Task_Rec;
5720            CLOSE Visit_Task_Cur;
5721    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5722             fnd_log.string
5723             (
5724                   fnd_log.level_statement,
5725             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
5726                   'Material Requirement for workorder id: ' || l_prd_wooperation_tbl(i).workorder_id
5727             );
5728             fnd_log.string
5729             (
5730                   fnd_log.level_statement,
5731             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
5732                   'Material Requirement for workorder operation id: ' || l_prd_wooperation_tbl(i).workorder_operation_id
5733             );
5734             fnd_log.string
5735             (
5736                   fnd_log.level_statement,
5737             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
5738                   'Material Requirement for workorder operation seq: ' || l_prd_wooperation_tbl(i).operation_sequence_num
5739             );
5740      END IF;
5741               --Check for one operation sequence exists means materials exist at route only
5742                     IF (l_prd_wooperation_tbl(i).operation_sequence_num IS NOT NULL AND
5743                           l_prd_wooperation_tbl(i).operation_sequence_num <> FND_API.G_MISS_NUM)
5744                          THEN
5745                          --
5746                            l_idx := 0;
5747                            FOR l_Sche_Mat_Rec IN Sche_Mat_Cur(l_Visit_Task_Rec.visit_task_id)
5748                            LOOP
5749                              IF (l_Sche_Mat_Rec.operation_sequence IS NULL AND
5750                                    l_Sche_Mat_Rec.workorder_operation_id IS NULL )THEN
5751                              l_req_material_tbl(l_idx).workorder_id := l_prd_wooperation_tbl(i).workorder_id;
5752                              l_req_material_tbl(l_idx).organization_id := l_Visit_Task_Rec.organization_id;
5753                              l_req_material_tbl(l_idx).workorder_operation_id := l_prd_wooperation_tbl(i).workorder_operation_id;
5754                              l_req_material_tbl(l_idx).operation_sequence := l_prd_wooperation_tbl(i).operation_sequence_num;
5755                              l_req_material_tbl(l_idx).inventory_item_id := l_Sche_Mat_Rec.inventory_item_id;
5756                              l_req_material_tbl(l_idx).schedule_material_id := l_Sche_Mat_Rec.scheduled_material_id;
5757                              l_req_material_tbl(l_idx).requested_date := l_prd_wooperation_tbl(i).scheduled_start_date;
5758                              l_req_material_tbl(l_idx).rt_oper_material_id := l_Sche_Mat_Rec.rt_oper_material_id;
5759                              l_req_material_tbl(l_idx).requested_quantity := l_Sche_Mat_Rec.requested_quantity;
5760                              l_req_material_tbl(l_idx).uom_code := l_Sche_Mat_Rec.uom;
5761 --  Fix for Bug 8569097
5762 /*                             get_dff_default_values
5763                              (
5764                               p_req_material_rec      => l_req_material_tbl(l_idx),
5765                               flex_fields_defaults    =>  dff_default_values
5766                              );
5767                              l_req_material_tbl(l_idx).attribute_category := dff_default_values.attribute_category;
5768                              l_req_material_tbl(l_idx).attribute1 := dff_default_values.attribute1;
5769                              l_req_material_tbl(l_idx).attribute2 := dff_default_values.attribute2;
5770                              l_req_material_tbl(l_idx).attribute3 := dff_default_values.attribute3;
5771                              l_req_material_tbl(l_idx).attribute4 := dff_default_values.attribute4;
5772                              l_req_material_tbl(l_idx).attribute5 := dff_default_values.attribute5;
5773                              l_req_material_tbl(l_idx).attribute6 := dff_default_values.attribute6;
5774                              l_req_material_tbl(l_idx).attribute7 := dff_default_values.attribute7;
5775                              l_req_material_tbl(l_idx).attribute8 := dff_default_values.attribute8;
5776                              l_req_material_tbl(l_idx).attribute9 := dff_default_values.attribute9;
5777                              l_req_material_tbl(l_idx).attribute10 := dff_default_values.attribute10;
5778                              l_req_material_tbl(l_idx).attribute11 := dff_default_values.attribute11;
5779                              l_req_material_tbl(l_idx).attribute12 := dff_default_values.attribute12;
5780                              l_req_material_tbl(l_idx).attribute13 := dff_default_values.attribute13;
5781                              l_req_material_tbl(l_idx).attribute14 := dff_default_values.attribute14;
5782                              l_req_material_tbl(l_idx).attribute15 := dff_default_values.attribute15;
5783 */
5784                              l_req_material_tbl(l_idx).attribute_category := l_Sche_Mat_Rec.attribute_category;
5785                              l_req_material_tbl(l_idx).attribute1 := l_Sche_Mat_Rec.attribute1;
5786                              l_req_material_tbl(l_idx).attribute2 := l_Sche_Mat_Rec.attribute2;
5787                              l_req_material_tbl(l_idx).attribute3 := l_Sche_Mat_Rec.attribute3;
5788                              l_req_material_tbl(l_idx).attribute4 := l_Sche_Mat_Rec.attribute4;
5789                              l_req_material_tbl(l_idx).attribute5 := l_Sche_Mat_Rec.attribute5;
5790                              l_req_material_tbl(l_idx).attribute6 := l_Sche_Mat_Rec.attribute6;
5791                              l_req_material_tbl(l_idx).attribute7 := l_Sche_Mat_Rec.attribute7;
5792                              l_req_material_tbl(l_idx).attribute8 := l_Sche_Mat_Rec.attribute8;
5793                              l_req_material_tbl(l_idx).attribute9 := l_Sche_Mat_Rec.attribute9;
5794                              l_req_material_tbl(l_idx).attribute10 := l_Sche_Mat_Rec.attribute10;
5795                              l_req_material_tbl(l_idx).attribute11 := l_Sche_Mat_Rec.attribute11;
5796                              l_req_material_tbl(l_idx).attribute12 := l_Sche_Mat_Rec.attribute12;
5797                              l_req_material_tbl(l_idx).attribute13 := l_Sche_Mat_Rec.attribute13;
5798                              l_req_material_tbl(l_idx).attribute14 := l_Sche_Mat_Rec.attribute14;
5799                              l_req_material_tbl(l_idx).attribute15 := l_Sche_Mat_Rec.attribute15;
5800                              -- fix for bug# 5549135.
5801                              --l_req_material_tbl(l_idx).mrp_net_flag := 1;
5802                              l_req_material_tbl(l_idx).mrp_net_flag := 2;
5803                        -- Update with workorder operation details
5804                                  UPDATE ahl_schedule_materials
5805                                    SET workorder_operation_id = l_prd_wooperation_tbl(i).workorder_operation_id,
5806                                          operation_sequence = l_prd_wooperation_tbl(i).operation_sequence_num,
5807                                            -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
5808                                            requested_date   =  trunc(l_prd_wooperation_tbl(i).scheduled_start_date),
5809                                            organization_id  = l_Visit_Task_Rec.organization_id,
5810                                            object_version_number = object_version_number + 1,
5811                              last_update_date      = sysdate,
5812                              last_updated_by       = fnd_global.user_id,
5813                              last_update_login     = fnd_global.login_id,
5814                              ATTRIBUTE_CATEGORY  = l_req_material_tbl(l_idx).attribute_category,
5815                              ATTRIBUTE1          = l_req_material_tbl(l_idx).attribute1,
5816                              ATTRIBUTE2          = l_req_material_tbl(l_idx).attribute2,
5817                              ATTRIBUTE3          = l_req_material_tbl(l_idx).attribute3,
5818                              ATTRIBUTE4          = l_req_material_tbl(l_idx).attribute4,
5819                              ATTRIBUTE5          = l_req_material_tbl(l_idx).attribute5,
5820                              ATTRIBUTE6          = l_req_material_tbl(l_idx).attribute6,
5821                              ATTRIBUTE7          = l_req_material_tbl(l_idx).attribute7,
5822                              ATTRIBUTE8          = l_req_material_tbl(l_idx).attribute8,
5823                              ATTRIBUTE9          = l_req_material_tbl(l_idx).attribute9,
5824                              ATTRIBUTE10          = l_req_material_tbl(l_idx).attribute10,
5825                              ATTRIBUTE11          = l_req_material_tbl(l_idx).attribute11,
5826                              ATTRIBUTE12          = l_req_material_tbl(l_idx).attribute12,
5827                              ATTRIBUTE13          = l_req_material_tbl(l_idx).attribute13,
5828                              ATTRIBUTE14          = l_req_material_tbl(l_idx).attribute14,
5829                              ATTRIBUTE15          = l_req_material_tbl(l_idx).attribute15
5830                              WHERE scheduled_material_id = l_Sche_Mat_Rec.scheduled_material_id;
5831                                ELSIF (l_prd_wooperation_tbl(i).operation_sequence_num = l_Sche_Mat_Rec.operation_sequence
5832                                       AND l_Sche_Mat_Rec.workorder_operation_id IS NULL) THEN
5833                              l_req_material_tbl(l_idx).workorder_id := l_prd_wooperation_tbl(i).workorder_id;
5834                              l_req_material_tbl(l_idx).organization_id := l_Visit_Task_Rec.organization_id;
5835                              l_req_material_tbl(l_idx).workorder_operation_id := l_prd_wooperation_tbl(i).workorder_operation_id;
5836                              l_req_material_tbl(l_idx).operation_sequence := l_prd_wooperation_tbl(i).operation_sequence_num;
5837                              l_req_material_tbl(l_idx).inventory_item_id := l_Sche_Mat_Rec.inventory_item_id;
5838                              l_req_material_tbl(l_idx).schedule_material_id := l_Sche_Mat_Rec.scheduled_material_id;
5839                              l_req_material_tbl(l_idx).requested_date := l_prd_wooperation_tbl(i).scheduled_start_date;
5840                              l_req_material_tbl(l_idx).rt_oper_material_id := l_Sche_Mat_Rec.rt_oper_material_id;
5841                              l_req_material_tbl(l_idx).requested_quantity := l_Sche_Mat_Rec.requested_quantity;
5842                              l_req_material_tbl(l_idx).uom_code := l_Sche_Mat_Rec.uom;
5843                              -- fix for bug# 5549135
5844                              --l_req_material_tbl(l_idx).mrp_net_flag := 1;
5845                              l_req_material_tbl(l_idx).mrp_net_flag := 2;
5846 --  Fix for Bug 8569097
5847 /*
5848                              get_dff_default_values
5849                              (
5850                               p_req_material_rec      => l_req_material_tbl(l_idx),
5851                               flex_fields_defaults    =>  dff_default_values
5852                              );
5853                              l_req_material_tbl(l_idx).attribute_category := dff_default_values.attribute_category;
5854                              l_req_material_tbl(l_idx).attribute1 := dff_default_values.attribute1;
5855                              l_req_material_tbl(l_idx).attribute2 := dff_default_values.attribute2;
5856                              l_req_material_tbl(l_idx).attribute3 := dff_default_values.attribute3;
5857                              l_req_material_tbl(l_idx).attribute4 := dff_default_values.attribute4;
5858                              l_req_material_tbl(l_idx).attribute5 := dff_default_values.attribute5;
5859                              l_req_material_tbl(l_idx).attribute6 := dff_default_values.attribute6;
5860                              l_req_material_tbl(l_idx).attribute7 := dff_default_values.attribute7;
5861                              l_req_material_tbl(l_idx).attribute8 := dff_default_values.attribute8;
5862                              l_req_material_tbl(l_idx).attribute9 := dff_default_values.attribute9;
5863                              l_req_material_tbl(l_idx).attribute10 := dff_default_values.attribute10;
5864                              l_req_material_tbl(l_idx).attribute11 := dff_default_values.attribute11;
5865                              l_req_material_tbl(l_idx).attribute12 := dff_default_values.attribute12;
5866                              l_req_material_tbl(l_idx).attribute13 := dff_default_values.attribute13;
5867                              l_req_material_tbl(l_idx).attribute14 := dff_default_values.attribute14;
5868                              l_req_material_tbl(l_idx).attribute15 := dff_default_values.attribute15;
5869 */
5870                              l_req_material_tbl(l_idx).attribute_category := l_Sche_Mat_Rec.attribute_category;
5871                              l_req_material_tbl(l_idx).attribute1 := l_Sche_Mat_Rec.attribute1;
5872                              l_req_material_tbl(l_idx).attribute2 := l_Sche_Mat_Rec.attribute2;
5873                              l_req_material_tbl(l_idx).attribute3 := l_Sche_Mat_Rec.attribute3;
5874                              l_req_material_tbl(l_idx).attribute4 := l_Sche_Mat_Rec.attribute4;
5875                              l_req_material_tbl(l_idx).attribute5 := l_Sche_Mat_Rec.attribute5;
5876                              l_req_material_tbl(l_idx).attribute6 := l_Sche_Mat_Rec.attribute6;
5877                              l_req_material_tbl(l_idx).attribute7 := l_Sche_Mat_Rec.attribute7;
5878                              l_req_material_tbl(l_idx).attribute8 := l_Sche_Mat_Rec.attribute8;
5879                              l_req_material_tbl(l_idx).attribute9 := l_Sche_Mat_Rec.attribute9;
5880                              l_req_material_tbl(l_idx).attribute10 := l_Sche_Mat_Rec.attribute10;
5881                              l_req_material_tbl(l_idx).attribute11 := l_Sche_Mat_Rec.attribute11;
5882                              l_req_material_tbl(l_idx).attribute12 := l_Sche_Mat_Rec.attribute12;
5883                              l_req_material_tbl(l_idx).attribute13 := l_Sche_Mat_Rec.attribute13;
5884                              l_req_material_tbl(l_idx).attribute14 := l_Sche_Mat_Rec.attribute14;
5885                              l_req_material_tbl(l_idx).attribute15 := l_Sche_Mat_Rec.attribute15;
5886                        --Update with operation details
5887                                  UPDATE ahl_schedule_materials
5888                                    SET workorder_operation_id = l_prd_wooperation_tbl(i).workorder_operation_id,
5889                                            object_version_number = object_version_number + 1,
5890                                            -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
5891                                            requested_date   =  trunc(l_prd_wooperation_tbl(i).scheduled_start_date),
5892                                            organization_id  = l_Visit_Task_Rec.organization_id,
5893                              last_update_date      = sysdate,
5894                              last_updated_by       = fnd_global.user_id,
5895                                    last_update_login     = fnd_global.login_id,
5896                                            ATTRIBUTE_CATEGORY  = l_req_material_tbl(l_idx).attribute_category,
5897                                            ATTRIBUTE1          = l_req_material_tbl(l_idx).attribute1,
5898                                            ATTRIBUTE2          = l_req_material_tbl(l_idx).attribute2,
5899                                            ATTRIBUTE3          = l_req_material_tbl(l_idx).attribute3,
5900                                            ATTRIBUTE4          = l_req_material_tbl(l_idx).attribute4,
5901                                            ATTRIBUTE5          = l_req_material_tbl(l_idx).attribute5,
5902                                            ATTRIBUTE6          = l_req_material_tbl(l_idx).attribute6,
5903                                            ATTRIBUTE7          = l_req_material_tbl(l_idx).attribute7,
5904                                            ATTRIBUTE8          = l_req_material_tbl(l_idx).attribute8,
5905                                            ATTRIBUTE9          = l_req_material_tbl(l_idx).attribute9,
5906                                            ATTRIBUTE10          = l_req_material_tbl(l_idx).attribute10,
5907                                            ATTRIBUTE11          = l_req_material_tbl(l_idx).attribute11,
5908                                            ATTRIBUTE12          = l_req_material_tbl(l_idx).attribute12,
5909                                            ATTRIBUTE13          = l_req_material_tbl(l_idx).attribute13,
5910                                            ATTRIBUTE14          = l_req_material_tbl(l_idx).attribute14,
5911                                            ATTRIBUTE15          = l_req_material_tbl(l_idx).attribute15
5912                                   WHERE scheduled_material_id = l_Sche_Mat_Rec.scheduled_material_id;
5913                                END IF;
5914                                l_idx := l_idx + 1;
5915                  END LOOP;
5916                         END IF; --COUNT
5917               END IF; --dml operation
5918          END LOOP;
5919        END IF;
5920    --Modified by srin to remove the replave percent check for Bug #4007076
5921    --Assign the derived values
5922       IF l_req_material_tbl.COUNT > 0 THEN
5923          FOR j IN l_req_material_tbl.FIRST..l_req_material_tbl.LAST
5924          LOOP
5925          x_req_material_tbl(j).workorder_id := l_req_material_tbl(j).workorder_id;
5926        x_req_material_tbl(j).organization_id := l_req_material_tbl(j).organization_id;
5927        x_req_material_tbl(j).workorder_operation_id := l_req_material_tbl(j).workorder_operation_id;
5928          x_req_material_tbl(j).operation_sequence := l_req_material_tbl(j).operation_sequence;
5929          x_req_material_tbl(j).inventory_item_id := l_req_material_tbl(j).inventory_item_id;
5930          x_req_material_tbl(j).schedule_material_id := l_req_material_tbl(j).schedule_material_id;
5931          x_req_material_tbl(j).requested_date := l_req_material_tbl(j).requested_date;
5932          x_req_material_tbl(j).rt_oper_material_id := l_req_material_tbl(j).rt_oper_material_id;
5933          x_req_material_tbl(j).requested_quantity := l_req_material_tbl(j).requested_quantity;
5934          x_req_material_tbl(j).uom_code   := l_req_material_tbl(j).uom_code;
5935          x_req_material_tbl(j).mrp_net_flag := l_req_material_tbl(j).mrp_net_flag;
5936          x_req_material_tbl(j).operation_flag := 'C';
5937          x_req_material_tbl(j).ATTRIBUTE_CATEGORY  := l_req_material_tbl(j).attribute_category;
5938          x_req_material_tbl(j).ATTRIBUTE1 := l_req_material_tbl(j).attribute1;
5939          x_req_material_tbl(j).ATTRIBUTE2 := l_req_material_tbl(j).attribute2;
5940          x_req_material_tbl(j).ATTRIBUTE3 := l_req_material_tbl(j).attribute3;
5941          x_req_material_tbl(j).ATTRIBUTE4 := l_req_material_tbl(j).attribute4;
5942          x_req_material_tbl(j).ATTRIBUTE5 := l_req_material_tbl(j).attribute5;
5943          x_req_material_tbl(j).ATTRIBUTE6 := l_req_material_tbl(j).attribute6;
5944          x_req_material_tbl(j).ATTRIBUTE7 := l_req_material_tbl(j).attribute7;
5945          x_req_material_tbl(j).ATTRIBUTE8 := l_req_material_tbl(j).attribute8;
5946          x_req_material_tbl(j).ATTRIBUTE9 := l_req_material_tbl(j).attribute9;
5947          x_req_material_tbl(j).ATTRIBUTE10 := l_req_material_tbl(j).attribute10;
5948          x_req_material_tbl(j).ATTRIBUTE11 := l_req_material_tbl(j).attribute11;
5949          x_req_material_tbl(j).ATTRIBUTE12 := l_req_material_tbl(j).attribute12;
5950          x_req_material_tbl(j).ATTRIBUTE13 := l_req_material_tbl(j).attribute13;
5951          x_req_material_tbl(j).ATTRIBUTE14 := l_req_material_tbl(j).attribute14;
5952          x_req_material_tbl(j).ATTRIBUTE15 := l_req_material_tbl(j).attribute15;
5953        END LOOP;
5954         END IF;
5955      --Sync up process to update requested date if changed from original date
5956        IF l_prd_wooperation_tbl.COUNT > 0 THEN
5957          FOR i IN l_prd_wooperation_tbl.FIRST..l_prd_wooperation_tbl.LAST
5958          LOOP
5959            --
5960               IF (p_operation_flag = 'S' AND
5961                   l_prd_wooperation_tbl(i).workorder_operation_id IS NOT NULL AND
5962                 l_prd_wooperation_tbl(i).workorder_operation_id <> FND_API.G_MISS_NUM AND
5963                    l_prd_wooperation_tbl(i).operation_sequence_num IS NOT NULL AND
5964                 l_prd_wooperation_tbl(i).operation_sequence_num <> FND_API.G_MISS_NUM)
5965                THEN
5966                  --
5967              OPEN Material_Detail_Cur(l_prd_wooperation_tbl(i).workorder_operation_id,
5968                                             l_prd_wooperation_tbl(i).operation_sequence_num);
5969                    LOOP
5970                    FETCH Material_Detail_Cur INTO l_scheduled_material_id;
5971                    EXIT WHEN Material_Detail_Cur%NOTFOUND;
5972                    IF l_scheduled_material_id IS NOT NULL THEN
5973                       --
5974                         UPDATE ahl_schedule_materials
5975                           -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
5976                           SET requested_date = trunc(l_prd_wooperation_tbl(i).actual_start_date),
5977                               object_version_number = object_version_number + 1,
5978                       last_update_date      = sysdate,
5979                       last_updated_by       = fnd_global.user_id,
5980                       last_update_login     = fnd_global.login_id
5981                         WHERE scheduled_material_id = l_scheduled_material_id;
5982                     END IF;
5983                  END LOOP;
5984                    CLOSE Material_Detail_Cur;
5985              END IF;
5986       END LOOP;
5987        END IF;
5988    --Debug Info
5989    IF x_req_material_tbl.count > 0 THEN
5990    FOR i IN x_req_material_tbl.FIRST..x_req_material_tbl.LAST
5991    LOOP
5992    IF G_DEBUG='Y' THEN
5993    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).workorder_id'||x_req_material_tbl(i).workorder_id);
5994    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).organization_id'||x_req_material_tbl(i).organization_id);
5995    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).workorder_operation_id'||x_req_material_tbl(i).workorder_operation_id);
5996    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).operation_sequence'||x_req_material_tbl(i).operation_sequence);
5997    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).inventory_item_id'||x_req_material_tbl(i).inventory_item_id);
5998    AHL_DEBUG_PUB.debug( 'x_req_material_tbl(i).requested_date'||x_req_material_tbl(i).requested_date);
5999    END IF;
6000    END LOOP;
6001    END IF;
6002    IF G_DEBUG='Y' THEN
6003    AHL_DEBUG_PUB.debug( 'x_req_material_tbl.count'||x_req_material_tbl.count);
6004    END IF;
6005    ------------------------End of Body---------------------------------------
6006   --Standard check to count messages
6007    l_msg_count := Fnd_Msg_Pub.count_msg;
6008    IF l_msg_count > 0 THEN
6009       X_msg_count := l_msg_count;
6010       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6011       RAISE Fnd_Api.G_EXC_ERROR;
6012    END IF;
6013    --Standard check for commit
6014    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
6015       COMMIT;
6016    END IF;
6017    -- Debug info
6018      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
6019             fnd_log.string
6020             (
6021                   fnd_log.level_procedure,
6022                   'ahl.plsql.AHL_PP_MATERIALS_PVT.Process_Wo_Op_Materials.end',
6023                   'At the end of PLSQL procedure'
6024             );
6025      END IF;
6026   EXCEPTION
6027  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6028     ROLLBACK TO Process_Wo_Op_Materials;
6029     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6030     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6031                                p_count => x_msg_count,
6032                                p_data  => x_msg_data);
6033 WHEN FND_API.G_EXC_ERROR THEN
6034     ROLLBACK TO Process_Wo_Op_Materials;
6035     X_return_status := FND_API.G_RET_STS_ERROR;
6036     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6037                                p_count => x_msg_count,
6038                                p_data  => X_msg_data);
6039 WHEN OTHERS THEN
6040     ROLLBACK TO Process_Wo_Op_Materials;
6041     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6042     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6043     THEN
6044     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
6045                             p_procedure_name  =>  'PROCESS_WO_OP_MATERIALS',
6046                             p_error_text      => SUBSTR(SQLERRM,1,240));
6047     END IF;
6048     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6049                                p_count => x_msg_count,
6050                                p_data  => X_msg_data);
6051   END Process_Wo_Op_Materials;
6052 --
6053 -- Start of Comments --
6054 --  Procedure name    : Material_Notification
6055 --  Type        : Private
6056 --  Function    : Procedure to send material Notification when new item has been added
6057 --                or quantity has been changed.
6058 --
6059 --  Pre-reqs    :
6060 --  Parameters  :
6061 --
6062 --  Standard IN  Parameters :
6063 --      p_api_version                   IN      NUMBER                Required
6064 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
6065 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
6066 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
6067 --         Based on this flag, the API will set the default attributes.
6068 --  Standard OUT Parameters :
6069 --      x_return_status                 OUT     VARCHAR2               Required
6070 --      x_msg_count                     OUT     NUMBER                 Required
6071 --      x_msg_data                      OUT     VARCHAR2               Required
6072 --
6073 --  Process_Material Notification Parameters :
6074 --  p_Req_Material_Tbl          IN         Req_Material_Tbl_Type,
6075 --
6076 PROCEDURE  MATERIAL_NOTIFICATION
6077 (
6078  p_api_version               IN         NUMBER:=  1.0,
6079  p_init_msg_list             IN         VARCHAR2,
6080  p_commit                    IN         VARCHAR2,
6081  p_validation_level          IN         NUMBER,
6082  p_Req_Material_Tbl          IN         Req_Material_Tbl_Type,
6083  x_return_status                OUT NOCOPY     VARCHAR2,
6084  x_msg_count                    OUT NOCOPY     NUMBER,
6085  x_msg_data                     OUT NOCOPY     VARCHAR2
6086  )
6087  IS
6088  CURSOR  CursorNotify(c_object_type IN VARCHAR2)
6089  IS
6090  /*
6091  SELECT A.APPROVAL_RULE_ID,
6092           A.APPROVAL_OBJECT_CODE,
6093             A.STATUS_CODE,
6094             B.APPROVER_NAME,
6095             B.APPROVER_SEQUENCE
6096       FROM AHL_APPROVAL_RULES_B A,AHL_APPROVERS_V B
6097       WHERE A.APPROVAL_RULE_ID=B.APPROVAL_RULE_ID
6098       AND A.STATUS_CODE='ACTIVE'
6099     AND A.APPROVAL_OBJECT_CODE=c_object_type
6100     ORDER BY  B.APPROVER_SEQUENCE;
6101  */
6102  /*
6103   * R12 Perf Tuning
6104   * Balaji blown open AHL_APPROVERS_V since it introduces NMV
6105   * due to Unions in the query. Reference bug # 4919273 and 4919045
6106   */
6107  SELECT DISTINCT
6108        JRREV.USER_NAME APPROVER_NAME
6109  FROM
6110        AHL_APPROVERS AA,
6111        FND_LOOKUP_VALUES_VL FNDA,
6112        AHL_JTF_RS_EMP_V JRREV,
6113        AHL_APPROVAL_RULES_B APR
6114  WHERE
6115       FNDA.LOOKUP_TYPE = 'AHL_APPROVER_TYPE'
6116       AND FNDA.LOOKUP_CODE = AA.APPROVER_TYPE_CODE
6117       AND AA.APPROVER_TYPE_CODE = 'USER'
6118       AND AA.APPROVER_ID = JRREV.RESOURCE_ID
6119       AND APR.APPROVAL_RULE_ID = AA.APPROVAL_RULE_ID
6120       AND APR.APPROVAL_OBJECT_CODE = c_object_type
6121 UNION
6122  SELECT DISTINCT
6123       JRRV.ROLE_NAME APPROVER_NAME
6124  FROM
6125       AHL_APPROVERS AA,
6126       FND_LOOKUP_VALUES_VL FNDA,
6127       JTF_RS_ROLE_RELATIONS_VL JRRV,
6128       AHL_APPROVAL_RULES_B APR
6129  WHERE
6130       FNDA.LOOKUP_TYPE = 'AHL_APPROVER_TYPE'
6131       AND FNDA.LOOKUP_CODE = AA.APPROVER_TYPE_CODE
6132       AND AA.APPROVER_TYPE_CODE = 'ROLE'
6133       AND AA.APPROVER_ID = JRRV.ROLE_ID
6134       AND APR.APPROVAL_RULE_ID = AA.APPROVAL_RULE_ID
6135       AND APR.APPROVAL_OBJECT_CODE = c_object_type
6136 UNION
6137  SELECT DISTINCT
6138      '' APPROVER_NAME
6139  FROM
6140      AHL_APPROVERS AA,
6141      FND_LOOKUP_VALUES_VL FNDA,
6142      AHL_APPROVAL_RULES_B APR
6143  WHERE
6144      FNDA.LOOKUP_TYPE = 'AHL_APPROVER_TYPE'
6145      AND FNDA.LOOKUP_CODE = AA.APPROVER_TYPE_CODE
6146      AND AA.APPROVER_TYPE_CODE = 'ROLE'
6147      AND AA.APPROVER_ID IS NULL
6148      AND APR.APPROVAL_RULE_ID = AA.APPROVAL_RULE_ID
6149      AND APR.APPROVAL_OBJECT_CODE = c_object_type;
6150    l_rec   CursorNotify%rowtype;
6151    l_api_name        CONSTANT VARCHAR2(30) := 'MATERIAL_NOTIFICATION';
6152    l_api_version     CONSTANT NUMBER       := 1.0;
6153    l_msg_count                NUMBER;
6154    l_return_status            VARCHAR2(1);
6155    l_msg_data                 VARCHAR2(2000);
6156    --
6157    l_object                       VARCHAR2(30):='PRD_MTL_NTF';
6158    l_active                       VARCHAR2(50) := 'N';
6159    l_process_name                 VARCHAR2(50);
6160    l_item_type                 VARCHAR2(30) := 'AHLGAPP';
6161    l_message_name              VARCHAR2(200) := 'GEN_STDLN_MESG';
6162    l_subject                   VARCHAR2(3000);
6163    l_body                      VARCHAR2(3000) := NULL;
6164    l_text                      VARCHAR2(3000) := NULL;
6165    l_send_to_role_name         VARCHAR2(30):= NULL;
6166    l_send_to_res_id            NUMBER:= NULL;
6167    l_notif_id                  NUMBER;
6168    l_notif_id1                 NUMBER;
6169    l_role_name                 VARCHAR2(100);
6170    l_display_role_name         VARCHAR2(240);
6171    l_object_notes              VARCHAR2(400);
6172    l_Req_Material_Tbl   Req_Material_Tbl_Type := p_Req_Material_Tbl;
6173   BEGIN
6174    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
6175             fnd_log.string
6176             (
6177                   fnd_log.level_procedure,
6178                   'ahl.plsql.AHL_PP_MATERIALS_PVT.Material_Notification',
6179                   'At the start of PLSQL procedure'
6180             );
6181     END IF;
6182     -- Standard Start of API savepoint
6183     SAVEPOINT Material_Notification;
6184     -- Initialize message list if p_init_msg_list is set to TRUE.
6185     IF FND_API.to_boolean(p_init_msg_list)
6186     THEN
6187        FND_MSG_PUB.initialize;
6188      END IF;
6189     --  Initialize API return status to success
6190     x_return_status := FND_API.G_RET_STS_SUCCESS;
6191     -- Standard call to check for call compatibility.
6192    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
6193                                       l_api_version,
6194                                       l_api_name,G_PKG_NAME)
6195    THEN
6196        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6197    END IF;
6198    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6199             fnd_log.string
6200             (
6201                   fnd_log.level_statement,
6202             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
6203                   'Request for Material Notification for Number of Records : ' || l_Req_Material_Tbl.COUNT
6204             );
6205      END IF;
6206      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
6207             fnd_log.string
6208               (
6209                fnd_log.level_procedure,
6210                 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
6211                   'Before calling Ahl_Utility_Pvt.Get_Wf_Process_Name'
6212                  );
6213      END IF;
6214     --Get workflow status active or not
6215      Ahl_Utility_Pvt.Get_Wf_Process_Name
6216                      (
6217                     p_object       =>l_object,
6218                     x_active       =>l_active,
6219                     x_process_name =>l_process_name ,
6220                     x_item_type    =>l_item_type,
6221                     x_return_status=>l_return_status,
6222                     x_msg_count    =>l_msg_count,
6223                     x_msg_data     =>l_msg_data);
6224    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
6225           fnd_log.string
6226             (
6227               fnd_log.level_procedure,
6228             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
6229               'After calling Ahl_Utility_Pvt.Get_Wf_Process_Name, Return Status : '|| l_return_status
6230             );
6231     END IF;
6232     -- Check Error Message stack.
6233      IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
6234         RAISE FND_API.G_EXC_ERROR;
6235        END IF;
6236    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6237        fnd_log.string
6238           (
6239                 fnd_log.level_statement,
6240             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
6241                 'Active flag : '||l_active
6242           );
6243    END IF;
6244     IF l_active = 'Y' THEN
6245     FOR i IN l_Req_Material_Tbl.FIRST..l_Req_Material_Tbl.LAST
6246       LOOP
6247           IF l_Req_Material_Tbl(i).operation_flag = 'C' THEN
6248          IF l_Req_Material_Tbl(i).concatenated_segments IS NOT NULL THEN
6249             FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MAT_REQ_ADDED_NTF');
6250             FND_MESSAGE.set_token('ITEM',l_Req_Material_Tbl(i).concatenated_segments,false);
6251             l_text := fnd_message.get;
6252             --Include quantity and date
6253             FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MAT_REQ_QTY_NTF');
6254             FND_MESSAGE.set_token('QTY',l_Req_Material_Tbl(i).requested_quantity,false);
6255             l_body := fnd_message.get;
6256             l_Req_Material_Tbl(i).notify_text := l_text ||''||l_body
6257                   ||'; For Workorder:'||l_Req_Material_Tbl(i).job_number
6258                   || '; Required date:'||l_Req_Material_Tbl(i).requested_date;
6259          END IF;
6260             ELSE
6261             --Update
6262             FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MAT_REQ_NTF_UPDATE');
6263             FND_MESSAGE.set_token('ITEM',l_Req_Material_Tbl(i).concatenated_segments,false);
6264             l_text := fnd_message.get;
6265             --Include quantity and date
6266             FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MAT_QTY_NTF_CHG');
6267             FND_MESSAGE.set_token('QTY',l_Req_Material_Tbl(i).requested_quantity,false);
6268             l_body := fnd_message.get;
6269             l_Req_Material_Tbl(i).notify_text := l_text ||''||l_body
6270                   || ';For Workorder:'||l_Req_Material_Tbl(i).job_number
6271                   || ';Required date:'||l_Req_Material_Tbl(i).requested_date;
6272              END IF;
6273       END LOOP;
6274       --
6275         l_body := null;
6276         FOR i IN l_Req_Material_Tbl.FIRST..l_Req_Material_Tbl.LAST
6277         LOOP
6278             IF l_Req_Material_Tbl(i).notify_text IS NOT NULL THEN
6279           IF l_body is null then
6280             l_body := l_Req_Material_Tbl(i).notify_text;
6281               ELSE
6282               l_body := l_body ||':' ||l_Req_Material_Tbl(i).notify_text;
6283             END IF;
6284               END IF;
6285         END LOOP;
6286    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6287        fnd_log.string
6288           (
6289                 fnd_log.level_statement,
6290             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
6291                 'Number of records : '||l_Req_Material_Tbl.count
6292           );
6293     END IF;
6294           OPEN CursorNotify(l_object);
6295               FETCH CursorNotify INTO l_rec;
6296               CLOSE CursorNotify;
6297           FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MAT_REQ_NTF_CONTENT');
6298           l_subject := fnd_message.get;
6299           l_role_name:=l_rec.approver_name;
6300           l_return_status := FND_API.G_RET_STS_SUCCESS;
6301           l_notif_id := WF_NOTIFICATION.Send
6302                           (  role => l_role_name
6303                             , msg_type => l_item_type
6304                             , msg_name => l_message_name
6305                            );
6306                           WF_NOTIFICATION.SetAttrText(l_notif_id,
6307                                        'GEN_MSG_SUBJECT',
6308                                        l_subject);
6309                            WF_NOTIFICATION.SetAttrText(l_notif_id,
6310                                        'GEN_MSG_BODY',
6311                                        l_body);
6312                            WF_NOTIFICATION.SetAttrText(l_notif_id,
6313                                        'GEN_MSG_SEND_TO',
6314                                        l_role_name);
6315                            WF_NOTIFICATION.Denormalize_Notification(l_notif_id);
6316      END IF;
6317      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
6318             fnd_log.string
6319             (
6320                   fnd_log.level_procedure,
6321                   'ahl.plsql.AHL_PP_MATERIALS_PVT.Material_Notification.end',
6322                   'At the end of PLSQL procedure'
6323             );
6324      END IF;
6325 EXCEPTION
6326  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6327     ROLLBACK TO Material_Notification;
6328     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6329     FND_MSG_PUB.count_and_get( p_encoded =>FND_API.G_FALSE,
6330                                p_count => x_msg_count,
6331                                p_data  => x_msg_data);
6332  WHEN FND_API.G_EXC_ERROR THEN
6333     ROLLBACK TO MATERIAL_NOTIFICATION;
6334     X_return_status := FND_API.G_RET_STS_ERROR;
6335     FND_MSG_PUB.count_and_get( p_encoded =>FND_API.G_FALSE,
6336                                p_count => x_msg_count,
6337                                p_data  => X_msg_data);
6338  WHEN OTHERS THEN
6339     ROLLBACK TO Material_Notification;
6340     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6341     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6342     THEN
6343     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  G_PKG_NAME,
6344                             p_procedure_name  =>  'MATERIAL_NOTIFICATION',
6345                             p_error_text      => SUBSTR(SQLERRM,1,240));
6346     END IF;
6347     FND_MSG_PUB.count_and_get( p_encoded =>FND_API.G_FALSE,
6348                                p_count => x_msg_count,
6349                                p_data  => X_msg_data);
6350  END Material_Notification;
6351 PROCEDURE get_dff_default_values
6352 (
6353    p_req_material_rec       IN REQ_MATERIAL_REC_TYPE,
6354    flex_fields_defaults     OUT NOCOPY dff_default_values_type
6355 ) IS
6356 flexfield fnd_dflex.dflex_r;
6357 flexinfo  fnd_dflex.dflex_dr;
6358 contexts  fnd_dflex.contexts_dr;
6359 i BINARY_INTEGER;
6360 j  BINARY_INTEGER;
6361 segments  fnd_dflex.segments_dr;
6362 BEGIN
6363   fnd_dflex.get_flexfield('AHL', 'Material Reqmt Flex Field', flexfield, flexinfo);
6364   IF(p_req_material_rec.ATTRIBUTE_CATEGORY IS NULL)THEN
6365     flex_fields_defaults.ATTRIBUTE_CATEGORY := flexinfo.default_context_value;
6366   ELSIF (p_req_material_rec.ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR)THEN
6367     flex_fields_defaults.ATTRIBUTE_CATEGORY := NULL;
6368   ELSE
6369     flex_fields_defaults.ATTRIBUTE_CATEGORY := p_req_material_rec.ATTRIBUTE_CATEGORY;
6370   END IF;
6371   IF G_DEBUG='Y' THEN
6372     AHL_DEBUG_PUB.debug('flex_fields_defaults.ATTRIBUTE_CATEGORY : ' || flex_fields_defaults.ATTRIBUTE_CATEGORY);
6373   END IF;
6374   IF(flex_fields_defaults.ATTRIBUTE_CATEGORY IS NOT NULL)THEN
6375    fnd_dflex.get_contexts(flexfield, contexts);
6376    FOR j IN 1 .. contexts.ncontexts LOOP
6377       IF(contexts.is_enabled(j) AND
6378           (flex_fields_defaults.ATTRIBUTE_CATEGORY = contexts.context_code(j)
6379            OR contexts.is_global(j))
6380       ) THEN
6381         fnd_dflex.get_segments
6382         (  fnd_dflex.make_context(flexfield,
6383           contexts.context_code(j)),
6384           segments,
6385           TRUE
6386         );
6387         FOR i IN 1 .. segments.nsegments LOOP
6388         IF(segments.is_enabled(i)) THEN
6389           IF(segments.application_column_name(i) = 'ATTRIBUTE1')THEN
6390              flex_fields_defaults.ATTRIBUTE1 := to_char(segments.default_value(i));
6391           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE2')THEN
6392              flex_fields_defaults.ATTRIBUTE2 := to_char(segments.default_value(i));
6393           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE3')THEN
6394              flex_fields_defaults.ATTRIBUTE3 := to_char(segments.default_value(i));
6395           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE4')THEN
6396              flex_fields_defaults.ATTRIBUTE4 := to_char(segments.default_value(i));
6397           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE5')THEN
6398              flex_fields_defaults.ATTRIBUTE5 := to_char(segments.default_value(i));
6399           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE6')THEN
6400              flex_fields_defaults.ATTRIBUTE6 := to_char(segments.default_value(i));
6401           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE7')THEN
6402              flex_fields_defaults.ATTRIBUTE7 := to_char(segments.default_value(i));
6403           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE8')THEN
6404              flex_fields_defaults.ATTRIBUTE8 := to_char(segments.default_value(i));
6405           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE9')THEN
6406              flex_fields_defaults.ATTRIBUTE9 := to_char(segments.default_value(i));
6407           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE10')THEN
6408              flex_fields_defaults.ATTRIBUTE10 := to_char(segments.default_value(i));
6409           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE11')THEN
6410              flex_fields_defaults.ATTRIBUTE11 := to_char(segments.default_value(i));
6411           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE12')THEN
6412              flex_fields_defaults.ATTRIBUTE12 := to_char(segments.default_value(i));
6413           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE13')THEN
6414              flex_fields_defaults.ATTRIBUTE13 := to_char(segments.default_value(i));
6415           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE14')THEN
6416              flex_fields_defaults.ATTRIBUTE14 := to_char(segments.default_value(i));
6417           ELSIF(segments.application_column_name(i) = 'ATTRIBUTE15')THEN
6418              flex_fields_defaults.ATTRIBUTE15 := to_char(segments.default_value(i));
6419           END IF;
6420         END IF;
6421       END LOOP;
6422       END IF;
6423    END LOOP;
6424   END IF;
6425 END get_dff_default_values;
6426 -- sukhwsin::Marshling enhancements - added following procedure for changing item on workorder material requirement.
6427 -- Start of Comments --
6428 --  Procedure name    : Wo_Mat_Req_Item_Change
6429 --  Type        : Public
6430 --  Usage       : This procedure is used to change item for item group OR position based item requirements.
6431 --  Parameters  :
6432 --
6433 --  Standard IN  Parameters :
6434 --      p_api_version                   IN      NUMBER                Required
6435 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
6436 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
6437 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
6438 --  Standard OUT Parameters :
6439 --      x_return_status                 OUT     VARCHAR2               Required
6440 --      x_msg_count                     OUT     NUMBER                 Required
6441 --      x_msg_data                      OUT     VARCHAR2               Required
6442 --
6443 --  Process_Material Notification Parameters :
6444 --  p_asm_id                            IN         ahl_schedule_materials.schedule_material_id
6445 --  p_alternate_item_id                 IN         New Inventory_Item_Id which will replace old inventory item.
6446 PROCEDURE Wo_Mat_Req_Item_Change(
6447     p_api_version            IN            NUMBER,
6448     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
6449     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
6450     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
6451     p_module_type            IN            VARCHAR2  := NULL,
6452     p_asm_id                 IN            NUMBER,
6453     p_alternate_item_id      IN            NUMBER,
6454     x_return_status             OUT NOCOPY VARCHAR2,
6455     x_msg_count                 OUT NOCOPY NUMBER,
6456     x_msg_data                  OUT NOCOPY VARCHAR2
6457 )
6458 IS
6459   --Cursor Declaration.
6460 CURSOR Get_WO_Mat_Details(c_asm_id IN NUMBER) IS
6461 SELECT asm.scheduled_material_id
6462 ,asm.inventory_item_id
6463 ,asm.organization_id
6464 ,asm.uom
6465 ,asm.visit_id
6466 ,asm.requested_date
6467 ,asm.requested_quantity
6468 ,asm.object_version_number
6469 ,'I' operation_flag
6470 ,asm.relationship_id
6471 ,asm.mc_header_id
6472 ,asm.position_key
6473 ,asm.item_group_id
6474 ,wo.workorder_id
6475 ,wo.status_code
6476 FROM ahl_schedule_materials asm, ahl_workorders wo
6477 WHERE
6478 asm.scheduled_material_id = c_asm_id
6479 AND asm.status = 'ACTIVE'
6480 AND asm.visit_task_id = wo.visit_task_id;
6481 
6482 --Cursor to get item name and primary uom code at organization level
6483 CURSOR Get_Item_Uom_Code(c_inventory_item_id NUMBER, c_organization_id NUMBER) IS
6484 SELECT concatenated_segments,primary_uom_code
6485 FROM mtl_system_items_kfv
6486 WHERE inventory_item_id = c_inventory_item_id
6487 AND organization_id = c_organization_id;
6488 
6489 --Cursor to get uc_header_id for workorder
6490 CURSOR Get_Wo_Uc_Header_Id(c_workorder_id IN NUMBER)
6491 IS
6492 SELECT uc_header_id
6493 FROM AHL_WORKORDER_TASKS_V
6494 WHERE workorder_id = c_workorder_id;
6495 
6496  --Local Variable Declaration
6497  l_api_name        CONSTANT VARCHAR2(30) := 'Wo_Mat_Req_Item_Change';
6498  l_api_version     CONSTANT NUMBER       := 1.0;
6499  l_req_material_tbl         AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
6500  l_inventory_item_id        NUMBER := NULL;
6501  l_msg_data                 VARCHAR2(2000);
6502  l_msg_count                NUMBER;
6503  l_return_status            VARCHAR2(1);
6504  l_req_ci_material_tbl      AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type;
6505  l_uom_code                 MTL_SYSTEM_ITEMS_B.PRIMARY_UOM_CODE%TYPE;
6506  l_item_name                MTL_SYSTEM_ITEMS_KFV.CONCATENATED_SEGMENTS%TYPE;
6507  l_current_mat_dtl_rec Get_WO_Mat_Details%ROWTYPE;
6508  l_uc_header_id             NUMBER;
6509 
6510 BEGIN
6511   -- Standard Start of API savepoint
6512   SAVEPOINT Wo_Mat_Req_Item_Change;
6513    -- Check if API is called in debug mode. If yes, enable debug.
6514    IF G_DEBUG='Y' THEN
6515    AHL_DEBUG_PUB.enable_debug;
6516    -- Debug info.
6517    AHL_DEBUG_PUB.debug( 'enter ahl_pp_materias_pvt.Wo_Mat_Req_Item_Change','+PPMRP+');
6518    --
6519    END IF;
6520 
6521    -- Standard call to check for call compatibility.
6522    IF FND_API.to_boolean(p_init_msg_list)
6523    THEN
6524      FND_MSG_PUB.initialize;
6525    END IF;
6526     --  Initialize API return status to success
6527     x_return_status := FND_API.G_RET_STS_SUCCESS;
6528    -- Initialize message list if p_init_msg_list is set to TRUE.
6529    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
6530                                       p_api_version,
6531                                       l_api_name,G_PKG_NAME)
6532    THEN
6533        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6534    END IF;
6535    --------------------Start of Main Logic-----------------------------------
6536    --Get Existing Material Record Details
6537    OPEN Get_WO_Mat_Details(p_asm_id);
6538    FETCH Get_WO_Mat_Details INTO l_current_mat_dtl_rec;
6539    IF (Get_WO_Mat_Details%NOTFOUND) THEN
6540       CLOSE Get_WO_Mat_Details;
6541       FND_MESSAGE.Set_Name('AHL', 'AHL_PP_MAT_ID_INVALID');
6542       FND_MSG_PUB.ADD;
6543       RAISE FND_API.G_EXC_ERROR;
6544    END IF;
6545    CLOSE Get_WO_Mat_Details;
6546 
6547    --Check old and new items are same or different. If same Items then Raise Error.
6548    IF (p_alternate_item_id = l_current_mat_dtl_rec.inventory_item_id) THEN
6549         FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_ALT_ITEM_SAME'); --Old and New Items are same.
6550         FND_MSG_PUB.ADD;
6551         RAISE FND_API.G_EXC_ERROR;
6552    END IF;
6553 
6554    --Item validation based upon requirement type.
6555    IF (l_current_mat_dtl_rec.item_group_id IS NOT NULL) THEN
6556    --Perform Item Group based validations.
6557         Get_item_Id_from_item_group
6558            (p_item_group_id         => l_current_mat_dtl_rec.item_group_id,
6559             p_inventory_item_id     => p_alternate_item_id,
6560             p_concatenated_segments => NULL,
6561             p_organization_id       => l_current_mat_dtl_rec.organization_id,
6562             x_inventory_item_id     => l_inventory_item_id,
6563             x_return_status         => l_return_status,
6564             x_msg_data              => l_msg_data
6565            );
6566       IF NVL(l_return_status,'x') <> 'S' THEN
6567         --If alternate item is not a valid item in item group, then raise exception.
6568         Fnd_Message.SET_NAME('AHL',l_msg_data);
6569         FND_MESSAGE.set_token( 'FIELD', p_alternate_item_id ); -- Invalid Item 1
6570         Fnd_Msg_Pub.ADD;
6571         RAISE FND_API.G_EXC_ERROR;
6572       END IF;
6573    ELSIF(l_current_mat_dtl_rec.position_key IS NOT NULL) THEN
6574    --Perform Position based validation check.
6575         Get_item_Id_from_mc_pos
6576             (p_relationship_id  => l_current_mat_dtl_rec.relationship_id,
6577             p_inventory_item_id => p_alternate_item_id,
6578             p_concatenated_segments => NULL,
6579             p_organization_id   => l_current_mat_dtl_rec.organization_id,
6580             x_inventory_item_id => l_inventory_item_id,
6581             x_return_status     => l_return_status,
6582             x_msg_data      => l_msg_data
6583             );
6584         IF NVL(l_return_status,'x') <> 'S' THEN
6585             --If alternate item is not a valid item in item group, then raise exception.
6586             Fnd_Message.SET_NAME('AHL',l_msg_data);
6587             FND_MESSAGE.set_token( 'FIELD', p_alternate_item_id ); -- Invalid Item 1
6588             Fnd_Msg_Pub.ADD;
6589             RAISE FND_API.G_EXC_ERROR;
6590         END IF;
6591         --Get UC associated with workorder
6592         OPEN Get_Wo_Uc_Header_Id(l_current_mat_dtl_rec.workorder_id);
6593         FETCH Get_Wo_Uc_Header_Id INTO l_uc_header_id;
6594         CLOSE Get_Wo_Uc_Header_Id;
6595         IF (l_uc_header_id IS NOT NULL) THEN
6596                 --Perform SB Rule Validation
6597                 AHL_SB_RULES_PVT.Evaluate_Rules_For_Pos (
6598                 p_mc_header_id    => l_current_mat_dtl_rec.mc_header_id,
6599                 p_mc_pos_key      => l_current_mat_dtl_rec.position_key,
6600 		/* ARUNJK l_current_mat_dtl_rec.inventory_item_id is replaced with p_alternate_item_id
6601                  * for bug # 13834008
6602                  * p_inv_item_id     => l_current_mat_dtl_rec.inventory_item_id,
6603 		 */
6604 		p_inv_item_id     => p_alternate_item_id,
6605                 p_inv_org_id      => l_current_mat_dtl_rec.organization_id,
6606                 p_uc_header_id    => l_uc_header_id
6607                 );
6608         END IF;
6609    ELSE
6610        --Only item based requirement. In this case Raise Exception as item change is only possible for item group or position based demand.
6611        FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_IVLD_REQ_FOR_CHG'); --Item Change is not posible for Item Based requirement type.
6612        RAISE FND_API.G_EXC_ERROR;
6613    END IF;
6614    --Get primary uom of new item
6615    OPEN Get_Item_Uom_Code(p_alternate_item_id,l_current_mat_dtl_rec.organization_id);
6616    FETCH Get_Item_Uom_Code INTO l_item_name, l_uom_code;
6617    CLOSE Get_Item_Uom_Code;
6618    IF (l_uom_code IS NULL) THEN
6619         Fnd_Message.SET_NAME('AHL','AHL_ITEM_UOM_MISSING'); --Missing UOM at Item Setup for Item 1
6620         FND_MESSAGE.set_token( 'ITEM', l_item_name );
6621         Fnd_Msg_Pub.ADD;
6622         RAISE FND_API.G_EXC_ERROR;
6623    END IF;
6624    --After Validation of item under item group or position. call item change procedure.
6625    --Constructor table of item change
6626     l_req_ci_material_tbl.delete();
6627     l_req_ci_material_tbl(1).schedule_material_id := l_current_mat_dtl_rec.scheduled_material_id;
6628     l_req_ci_material_tbl(1).object_version_number := l_current_mat_dtl_rec.object_version_number;
6629     l_req_ci_material_tbl(1).organization_id := l_current_mat_dtl_rec.organization_id;
6630     l_req_ci_material_tbl(1).inventory_item_id := p_alternate_item_id;
6631     l_req_ci_material_tbl(1).uom_code := l_uom_code;
6632 
6633     Change_Requirement_Item
6634         (
6635         p_api_version         => 1.0,
6636         p_init_msg_list       => Fnd_Api.G_FALSE,
6637         p_commit              => Fnd_Api.G_FALSE,
6638         p_validation_level    => p_validation_level,
6639         p_module_type         => p_module_type,
6640         p_x_req_material_tbl  => l_req_ci_material_tbl,
6641         x_return_status       => l_return_status,
6642         x_msg_count           => l_msg_count,
6643         x_msg_data            => l_msg_data
6644         );
6645      IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
6646          l_msg_count := FND_MSG_PUB.count_msg;
6647             IF l_msg_count > 0 THEN
6648               RAISE FND_API.G_EXC_ERROR;
6649             END IF;
6650      END IF;
6651 
6652    ------------------------End of Body---------------------------------------
6653   --Standard check to count messages
6654    l_msg_count := Fnd_Msg_Pub.count_msg;
6655    IF l_msg_count > 0 THEN
6656       X_msg_count := l_msg_count;
6657       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6658       RAISE Fnd_Api.G_EXC_ERROR;
6659    END IF;
6660    --Standard check for commit
6661    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
6662       COMMIT;
6663    END IF;
6664    -- Debug info
6665    IF G_DEBUG='Y' THEN
6666    Ahl_Debug_Pub.debug( 'End of api Wo_Mat_Req_Item_Change','+PPMRP+');
6667    END IF;
6668   EXCEPTION
6669  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6670     ROLLBACK TO Wo_Mat_Req_Item_Change;
6671     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6672     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6673                                p_count => x_msg_count,
6674                                p_data  => x_msg_data);
6675       IF G_DEBUG='Y' THEN
6676        AHL_DEBUG_PUB.log_app_messages (
6677              x_msg_count, x_msg_data, 'ERROR' );
6678        AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt.Wo_Mat_Req_Item_Change','+PPMRP+');
6679         -- Check if API is called in debug mode. If yes, disable debug.
6680         AHL_DEBUG_PUB.disable_debug;
6681       END IF;
6682 WHEN FND_API.G_EXC_ERROR THEN
6683     ROLLBACK TO Wo_Mat_Req_Item_Change;
6684     X_return_status := FND_API.G_RET_STS_ERROR;
6685     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6686                                p_count => x_msg_count,
6687                                p_data  => X_msg_data);
6688       IF G_DEBUG='Y' THEN
6689         -- Debug info.
6690         AHL_DEBUG_PUB.log_app_messages (
6691              x_msg_count, x_msg_data, 'UNEXPECTED ERROR' );
6692         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt.Wo_Mat_Req_Item_Change','+PPMRP+');
6693         -- Check if API is called in debug mode. If yes, disable debug.
6694         AHL_DEBUG_PUB.disable_debug;
6695       END IF;
6696 WHEN OTHERS THEN
6697     ROLLBACK TO Wo_Mat_Req_Item_Change;
6698     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6699     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6700     THEN
6701     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_PP_MATERIALS_PVT',
6702                             p_procedure_name  =>  'Wo_Mat_Req_Item_Change',
6703                             p_error_text      => SUBSTR(SQLERRM,1,240));
6704     END IF;
6705     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6706                                p_count => x_msg_count,
6707                                p_data  => X_msg_data);
6708      IF G_DEBUG='Y' THEN
6709         -- Debug info.
6710         AHL_DEBUG_PUB.log_app_messages (
6711               x_msg_count, x_msg_data, 'SQL ERROR' );
6712         AHL_DEBUG_PUB.debug( 'ahl_pp_materials_pvt.Wo_Mat_Req_Item_Change','+PPMRP+');
6713         -- Check if API is called in debug mode. If yes, disable debug.
6714         AHL_DEBUG_PUB.disable_debug;
6715      END IF;
6716 
6717 END Wo_Mat_Req_Item_Change;
6718 
6719 END AHL_PP_MATERIALS_PVT;