DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_PRD_MTLTXN_PVT

Source


1 PACKAGE BODY AHL_PRD_MTLTXN_PVT AS
2 /* $Header: AHLVMTXB.pls 120.28.12010000.4 2008/11/26 11:31:26 jkjain ship $ */
3 
4 G_DEBUG                                 VARCHAR2(1):=AHL_DEBUG_PUB.is_log_enabled;
5 G_PKG_NAME                  CONSTANT    VARCHAR2(30) := 'AHL_PRD_MTLTXN_PVT';
6 G_AHL_PRD_RECEPIENT                     VARCHAR2(30) := FND_PROFILE.VALUE('AHL_PRD_MTX_RECEPIENT');
7 
8 -- Hard coded string used in this proc
9 -- These are the profile names used to populate service request record default values
10 
11 C_AHL_DEF_SR_TYPE           CONSTANT    VARCHAR2(30) := 'AHL_DEFAULT_SR_TYPE';
12 C_AHL_DEF_TASK_EST_DURATION CONSTANT    VARCHAR2(40) := 'AHL_DEFAULT_TASK_EST_DURATION';
13 
14 --- LOOKUP Tpye for problem code values
15 C_REQUEST_PROBLEM_CODE      CONSTANT    VARCHAR2(30) := 'REQUEST_PROBLEM_CODE';
16 
17 --ITEM Params
18 C_NO_SERIAL_CONTROL         CONSTANT    NUMBER := 1;
19 C_NO_LOT_CONTROL            CONSTANT    NUMBER := 1;
20 C_NO_LOCATOR_CONTROL        CONSTANT    NUMBER := 1;
21 C_SUBINV_LOCATOR            CONSTANT    NUMBER := 4;
22 C_ITEM_LOCATOR              CONSTANT    NUMBER := 5;
23 C_JOB_RELEASED              CONSTANT    VARCHAR2(30) := '3';
24 C_JOB_COMPLETE              CONSTANT    VARCHAR2(30) := '4';
25 C_JOB_PENDING_QA            CONSTANT    VARCHAR2(30) := '20';
26 C_JOB_PARTS_HOLD            CONSTANT    VARCHAR2(30) := '19';
27 
28 -- Declare the private procedures.
29 FUNCTION IS_ITEM_TRACKABLE(p_Org_Id IN NUMBER, p_Item_Id IN NUMBER) RETURN BOOLEAN;
30 
31 --PROCEDURE SHOW_MTX_ERRORS;
32 
33 PROCEDURE Insert_Mtl_Txn_Row
34         (
35         p_x_ahl_mtltxn_rec              IN  OUT   NOCOPY  Ahl_Mtltxn_Rec_Type,
36         p_material_Transaction_Id       IN             NUMBER,
37         p_nonroutine_workorder_Id       IN             NUMBER,
38         p_prim_uom_qty                  IN         NUMBER:=0,
39         x_return_status                 OUT NOCOPY     VARCHAR2,
40         x_msg_count                     OUT NOCOPY     NUMBER,
41         x_msg_data                      OUT NOCOPY     VARCHAR2,
42         x_ahl_mtl_txn_id                OUT NOCOPY     NUMBER
43         );
44 
45 PROCEDURE Insert_Sch_Mtl_Row
46         (
47         p_mtl_txn_Rec        IN                   Ahl_Mtltxn_Rec_Type,
48     x_return_status      OUT NOCOPY           VARCHAR2,
49     x_msg_count          OUT NOCOPY           NUMBER,
50     x_msg_data           OUT NOCOPY           VARCHAR2,
51         x_ahl_sch_mtl_id     OUT NOCOPY           NUMBER
52         );
53 PROCEDURE Populate_Srvc_Rec(
54         p_item_instance_id    NUMBER,
55         p_srvc_rec OUT NOCOPY AHL_PRD_NONROUTINE_PVT.Sr_task_Rec_type,
56         p_x_ahl_mtltxn_rec IN Ahl_Mtltxn_Rec_Type);
57 
58 -- Added p_eam_item_type_id for FP ER#6310766.
59 PROCEDURE INSERT_MTL_TXN_INTF
60     (
61         p_x_ahl_mtl_txn_rec     IN OUT NOCOPY   AHL_MTLTXN_REC_TYPE,
62         p_eam_item_type_id      IN              NUMBER,
63         p_x_txn_hdr_id          IN  OUT NOCOPY      NUMBER,
64         p_x_txn_intf_id         IN  OUT NOCOPY      NUMBER,
65         p_reservation_flag      IN                  VARCHAR2,
66         x_return_status         OUT NOCOPY      VARCHAR2
67 
68     );
69 procedure dumpInput(p_x_ahl_mtltxn_tbl  IN      AHL_MTLTXN_TBL_TYPE);
70 
71 -- R12: Serial Reservation enhancements.
72 -- Added procedure to relieve reservation when user is issuing a reserved serial
73 -- number against a different workorder.
74 PROCEDURE Relieve_Serial_Reservation(p_ahl_mtl_txn_rec  IN            AHL_MTLTXN_REC_TYPE,
75                                      x_reservation_flag IN OUT NOCOPY VARCHAR2,
76                                      x_return_status    IN OUT NOCOPY VARCHAR2
77                                     );
78 
79 -- Added for pre/post user hooks(FP bug# 5903207).
80 PROCEDURE Perform_MtlTxn_Pre( p_x_ahl_mtltxn_tbl   IN OUT NOCOPY AHL_MTLTXN_TBL_TYPE,
81                               x_msg_count          IN OUT NOCOPY NUMBER,
82                               x_msg_data           IN OUT NOCOPY VARCHAR2,
83                               x_return_status      IN OUT NOCOPY VARCHAR2);
84 
85 
86 PROCEDURE Perform_MtlTxn_Post( p_ahl_mtltxn_tbl   IN AHL_MTLTXN_TBL_TYPE,
87                                x_msg_count        IN OUT NOCOPY NUMBER,
88                                x_msg_data         IN OUT NOCOPY VARCHAR2,
89                                x_return_status    IN OUT NOCOPY VARCHAR2);
90 
91 -- Added for FP ER 6447935.
92 -- breakup input locator concatenated segments to populate MTI.
93 PROCEDURE Get_MTL_LocatorSegs (p_concat_segs     IN VARCHAR2,
94                                p_organization_id IN NUMBER,
95                                p_x_mti_seglist   IN OUT NOCOPY fnd_flex_ext.SegmentArray,
96                                x_return_status      OUT NOCOPY VARCHAR2);
97 
98 
99 --Declare any types used by the procedure
100 TYPE TXN_INTF_ID_TBL    IS TABLE OF NUMBER index by BINARY_INTEGER;
101 TYPE INSTANCE_ID_TBL    IS TABLE OF NUMBER index by BINARY_INTEGER;
102 TYPE ITEM_TYPE_TBL      IS TABLE OF NUMBER index by BINARY_INTEGER;
103 TYPE SR_MTL_ID_MAP_TBL  IS TABLE OF NUMBER index by BINARY_INTEGER;
104 
105 --------------------------------------------------------------------
106 -- PROCEDURE
107 --    Convert_Name_To_Id
108 --
109 -- PURPOSE
110 --    Converts Name to ID
111 --------------------------------------------------------------------
112 PROCEDURE Convert_Name_To_Id(
113      p_x_ahl_mtltxn_rec         IN OUT NOCOPY       Ahl_Mtltxn_Rec_Type,
114      p_module_type                 IN  VARCHAR2 := NULL,
115      x_return_status               OUT NOCOPY VARCHAR2)
116    IS
117 
118 -- Query for validating item segments  and  selecting item id
119     CURSOR Item_Cur(p_org_id number, p_item_name varchar2) IS
120         SELECT Inventory_Item_Id
121         FROM MTL_SYSTEM_ITEMS_KFV
122         WHERE Concatenated_Segments = p_item_name
123         AND Organization_Id = p_org_id
124         AND ENABLED_FLAG = 'Y'
125         AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
126         AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));
127 
128     -- Query for validating location segments and selecting location_id
129     /*CURSOR Location_Cur(p_org_id number, p_location_name varchar2) IS
130         SELECT INVENTORY_LOCATION_ID
131         FROM MTL_ITEM_LOCATIONS_KFV
132         WHERE ORGANIZATION_ID = p_org_Id
133         AND CONCATENATED_SEGMENTS = p_location_name
134         AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
135         AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));*/
136     -- fix for bug number 5903275
137     -- modified to retrieve segment19 and 20 from base table to fix bug# 6611033.
138     CURSOR Location_Cur(p_org_id number, p_location_name varchar2) IS
139         SELECT MIL.INVENTORY_LOCATION_ID, MIL_kfv.CONCATENATED_SEGMENTS
140         FROM MTL_ITEM_LOCATIONS_KFV MIL_kfv, MTL_ITEM_LOCATIONS MIL
141         WHERE MIL_kfv.INVENTORY_LOCATION_ID = MIL.INVENTORY_LOCATION_ID
142         AND MIL.ORGANIZATION_ID = p_org_Id
143         AND upper(decode(MIL.segment19, null, MIL_kfv.concatenated_segments,
144             INV_PROJECT.GET_LOCSEGS(MIL_kfv.concatenated_segments) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
145             || INV_ProjectLocator_PUB.get_project_number(MIL.segment19) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
146             || INV_ProjectLocator_PUB.get_task_number(MIL.segment20))) = upper(p_location_name)
147         AND ((MIL.START_DATE_ACTIVE IS NULL) OR (MIL.START_DATE_ACTIVE <= SYSDATE))
148         AND ((MIL.END_DATE_ACTIVE IS NULL) OR (MIL.END_DATE_ACTIVE >= SYSDATE));
149 
150     l_locator_segments 	VARCHAR2(240);
151 
152 --Query for validating reason name and selecting reason id.
153     CURSOR Reason_Cur(p_reason_Name varchar2) IS
154         SELECT REASON_ID
155         FROM MTL_TRANSACTION_REASONS
156         WHERE REASON_NAME = p_reason_Name
157         AND (DISABLE_DATE IS NULL OR DISABLE_DATE > SYSDATE);
158 
159 -- Query for validating Transaction_Type_NAme and selecting Transaction_Type_Id
160     CURSOR Transaction_Type_Cur(p_Transaction_Type_name varchar2) IS
161         SELECT Transaction_Type_Id
162         FROM MTL_TRANSACTION_TYPES
163         WHERE TRANSACTION_TYPE_NAME = p_Transaction_Type_Name
164         AND (DISABLE_DATE IS NULL OR DISABLE_DATE > SYSDATE);
165 
166 -- Query for Selcting Problem_Code
167     CURSOR Fnd_Lookups_Cur(p_Lookup_Meaning varchar2) IS
168         SELECT LOOKUP_CODE
169         FROM FND_LOOKUP_VALUES_VL
170         WHERE MEANING =  p_Lookup_Meaning
171         AND LOOKUP_TYPE = C_REQUEST_PROBLEM_CODE
172         AND ENABLED_FLAG = 'Y'
173         AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
174         AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));
175 -- Cursor for Selecting UOM from UOM description.
176     CURSOR Uom_Cur(p_Uom_Desc varchar2) IS
177         SELECT UOM_CODE
178         FROM MTL_UNITS_OF_MEASURE
179         WHERE UNIT_OF_MEASURE =  p_Uom_Desc;
180 -- Cursor for Wip job id.
181     CURSOR WIP_JOB_ID_CUR(p_wo_id NUMBER) IS
182         SELECT A.WIP_ENTITY_ID, C.ORGANIZATION_ID
183         FROM AHL_WORKORDERS A, AHL_VISIT_TASKS_B B, AHL_VISITS_B C
184         WHERE A.WORKORDER_ID =  p_wo_id
185         AND B.VISIT_TASK_ID = A.VISIT_TASK_ID
186         AND C.VISIT_ID = B.VISIT_ID;
187 -- Cursor for Work order operation id.
188     CURSOR WO_OP_CUR(p_wo_id NUMBER, p_oper_seq NUMBER) IS
189         SELECT WORKORDER_OPERATION_ID
190         FROM AHL_WORKORDER_OPERATIONS
191         WHERE WORKORDER_ID =  p_wo_id
192         AND OPERATION_SEQUENCE_NUM = p_oper_seq;
193 -- query for converting condition desc
194    CURSOR CONDITION_CUR (p_condition_desc VARCHAR2) IS
195           SELECT STATUS_ID
196           FROM MTL_MATERIAL_STATUSES
197           WHERE STATUS_CODE= RTRIM(LTRIM(p_condition_desc))
198           AND ENABLED_FLAG = 1;
199 -- query for converting Employee/Recepient to employee_id
200    CURSOR RECEPIENT_CUR (p_recepient_name VARCHAR2) IS
201                   SELECT PERSON_ID
202                   FROM PER_PEOPLE_F
203                   WHERE FULL_NAME = p_recepient_name
204                   AND SYSDATE BETWEEN NVL(EFFECTIVE_START_DATE,SYSDATE) AND
205                   NVL(EFFECTIVE_END_DATE,SYSDATE);
206 
207 -- query for converting Employee/Recepient to employee_id
208    CURSOR DEFAULT_USER_CUR
209    IS
210    SELECT  A.employee_id
211    FROM FND_USER A
212    WHERE USER_ID=FND_GLOBAL.USER_ID;
213 
214 -- Query for Disposition..
215 
216    CURSOR DISPOSITION_CUR(C_WORKORDER_ID NUMBER,C_DISP_ID  NUMBER)
217    IS
218 /* Tamal [R12 APPSPERF fixes]
219  * R12 Drop 4 - SQL ID: 14399309
220  * Bug #4918991
221  */
222 SELECT DISPOSITION_ID
223 FROM AHL_PRD_DISPOSITIONS_B A
224 WHERE
225     A.WORKORDER_ID = C_WORKORDER_ID AND
226     A.DISPOSITION_ID = C_DISP_ID;
227 
228 -- Query based on workorder name.
229 -- Need to strip by OU.
230    CURSOR WORKORDER_CUR(C_WORKORDER_NAME IN VARCHAR2)
231    IS
232 /* Tamal [R12 APPSPERF fixes]
233  * R12 Drop 4 - SQL ID: 14399329
234  * Bug #4918991
235  */
236 SELECT
237     A.JOB_NUMBER,
238     A.WORKORDER_ID,
239     A.ORGANIZATION_ID,
240     A.ORGANIZATION_NAME,
241     A.JOB_STATUS_CODE,
242     A.JOB_STATUS_MEANING,
243     A.WIP_ENTITY_ID
244 FROM
245     AHL_SEARCH_WORKORDERS_V A
246     --AHL_VISITS_B V,
247     --AHL_VISIT_TASKS_B VT,
248     --INV_ORGANIZATION_NAME_V ORG,
249     --FND_LOOKUP_VALUES WO_STS
250 WHERE
251     A.JOB_NUMBER = C_WORKORDER_NAME
252     AND A.JOB_STATUS_CODE NOT IN ('17', '22');
253     --AND A.MASTER_WORKORDER_FLAG = 'N'
254     --AND A.VISIT_TASK_ID = VT.VISIT_TASK_ID
255     --AND VT.VISIT_ID = V.VISIT_ID
256     --AND V.ORGANIZATION_ID = ORG.ORGANIZATION_ID
257     --AND WO_STS.LOOKUP_TYPE = 'AHL_JOB_STATUS'
258     --AND WO_STS.LANGUAGE = USERENV('LANG')
259     --AND WO_STS.LOOKUP_CODE = A.STATUS_CODE;
260 
261 -- Query based on workorder ID.
262 -- Added for public api support.
263    CURSOR WORKORDER_ID_CUR(C_WORKORDER_ID IN VARCHAR2)
264    IS
265    SELECT A.job_number,
266           A.workorder_id,
267           A.organization_id,
268           A.Organization_name,
269           A.JOB_STATUS_CODE,
270           A.job_status_meaning,
271           A.wip_entity_id
272    FROM AHL_SEARCH_WORKORDERS_V A
273    WHERE A.workorder_id=C_WORKORDER_ID;
274 
275    L_WORKDET_REC    WORKORDER_CUR%ROWTYPE;
276    L_WORKDET_ID_REC WORKORDER_ID_CUR%ROWTYPE;
277 
278    l_recepient_id NUMBER;
279 BEGIN
280 
281         x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
282 
283         -- Get the vlaues for Entity ID from Workorders table
284         -- and workorder operation id from workorder_operations table for the given work
285         -- order id and Operation seq number
286         -- ?????????
287 
288     IF G_DEBUG='Y' THEN
289           AHL_DEBUG_PUB.debug('Convert_Name_To_Id');
290     END IF;
291 
292     IF ( (p_x_ahl_mtltxn_rec.Workorder_Id IS NULL
293       OR  p_x_ahl_mtltxn_rec.Workorder_Id = FND_API.G_MISS_NUM)) THEN
294 
295         IF (p_x_ahl_mtltxn_rec.WORKORDER_NAME IS NOT NULL AND
296            p_x_ahl_mtltxn_rec.WORKORDER_NAME <> FND_API.G_MISS_CHAR)
297         THEN
298 
299           OPEN    WORKORDER_CUR(p_x_ahl_mtltxn_rec.WORKORDER_NAME);
300           FETCH   WORKORDER_CUR INTO L_WORKDET_REC;
301           IF  WORKORDER_CUR%NOTFOUND
302           THEN
303             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WORKORDER');
304             FND_MESSAGE.Set_Token('WORKORDER',p_x_ahl_mtltxn_rec.Workorder_name);
305             FND_MSG_PUB.ADD;
306             x_return_status := Fnd_Api.G_RET_STS_ERROR;
307           ELSIF L_WORKDET_REC.JOB_STATUS_CODE<>'3' AND
308                L_WORKDET_REC.JOB_STATUS_CODE<>'19' AND
309                L_WORKDET_REC.JOB_STATUS_CODE<>'20' AND
310                L_WORKDET_REC.JOB_STATUS_CODE<>'6' AND
311                L_WORKDET_REC.JOB_STATUS_CODE<>'4' THEN
312                FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_JOB_STATUS');
313                FND_MESSAGE.Set_Token('STATUS',L_WORKDET_REC.job_status_meaning);
314                FND_MSG_PUB.ADD;
315                x_return_status := Fnd_Api.G_RET_STS_ERROR;
316           ELSE
317             p_x_ahl_mtltxn_rec.Workorder_Id                     :=L_WORKDET_REC.WORKORDER_ID;
318             p_x_ahl_mtltxn_rec.Workorder_Status                 :=L_WORKDET_REC.JOB_STATUS_MEANING;
319             p_x_ahl_mtltxn_rec.Workorder_Status_Code            :=L_WORKDET_REC.JOB_STATUS_CODE;
320             p_x_ahl_mtltxn_rec.Organization_Id                  :=L_WORKDET_REC.ORGANIZATION_ID;
321             p_x_ahl_mtltxn_rec.Wip_Entity_Id                    :=L_WORKDET_REC.WIP_ENTITY_ID;
322           END IF; -- WORKORDER_CUR%NOTFOUND
323           CLOSE   WORKORDER_CUR;
324         ELSE -- both Workorder_Id and WORKORDER_NAME are NULLs
325            FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_WORKORDER_ID');
326            FND_MSG_PUB.ADD;
327            x_return_status := Fnd_Api.G_RET_STS_ERROR;
328         END IF; -- p_x_ahl_mtltxn_rec.WORKORDER_NAME
329     ELSE -- workorderId is not null.
330         OPEN WORKORDER_ID_CUR(p_x_ahl_mtltxn_rec.Workorder_Id);
331         FETCH WORKORDER_ID_CUR INTO L_WORKDET_ID_REC;
332         IF WORKORDER_ID_CUR%NOTFOUND
333         THEN
334            FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WORKORDER');
335            FND_MESSAGE.Set_Token('WORKORDER',p_x_ahl_mtltxn_rec.Workorder_Id);
336            FND_MSG_PUB.ADD;
337            x_return_status := Fnd_Api.G_RET_STS_ERROR;
338         ELSIF L_WORKDET_REC.JOB_STATUS_CODE<>'3' AND  -- Released
339               L_WORKDET_REC.JOB_STATUS_CODE<>'19' AND -- Parts Hold
340               L_WORKDET_REC.JOB_STATUS_CODE<>'20' AND -- pending deferral
341               L_WORKDET_REC.JOB_STATUS_CODE<>'6' AND  -- on hold
342               L_WORKDET_REC.JOB_STATUS_CODE<>'4'      -- complete
343         THEN
344            FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_JOB_STATUS');
345            FND_MESSAGE.Set_Token('STATUS',L_WORKDET_ID_REC.job_status_meaning);
346            FND_MSG_PUB.ADD;
347         ELSE
348            p_x_ahl_mtltxn_rec.Workorder_Id  := L_WORKDET_ID_REC.WORKORDER_ID;
349            p_x_ahl_mtltxn_rec.Workorder_Status := L_WORKDET_ID_REC.JOB_STATUS_MEANING;
350            p_x_ahl_mtltxn_rec.Workorder_Status_Code := L_WORKDET_ID_REC.JOB_STATUS_CODE;
351            p_x_ahl_mtltxn_rec.Organization_Id := L_WORKDET_ID_REC.ORGANIZATION_ID;
352            p_x_ahl_mtltxn_rec.Wip_Entity_Id :=L_WORKDET_ID_REC.WIP_ENTITY_ID;
353         END IF; -- WORKORDER_ID_CUR%NOTFOUND
354         CLOSE   WORKORDER_ID_CUR;
355     END IF; -- p_x_ahl_mtltxn_tbl(i).Workorder_Id
356 
357     -- Check for operation sequence number.
358     IF ( p_x_ahl_mtltxn_rec.Operation_Seq_num IS NULL
359          OR  p_x_ahl_mtltxn_rec.Operation_Seq_num = FND_API.G_MISS_NUM) THEN
360           FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_OPER_SEQ');
361           FND_MSG_PUB.ADD;
362           x_return_status := Fnd_Api.G_RET_STS_ERROR;
363     END IF;
364 
365     -- Check for errors.
366     IF (x_return_status = Fnd_Api.G_RET_STS_ERROR)
367     THEN
368        RETURN; -- do not proceed for the rest of the validations.
369     END IF;
370 
371     IF (p_x_ahl_mtltxn_rec.Wip_Entity_Id IS NULL
372     OR p_x_ahl_mtltxn_rec.Wip_Entity_Id = FND_API.G_MISS_NUM) THEN
373         IF G_DEBUG='Y' THEN
374           AHL_DEBUG_PUB.debug('Getting WipEntity for['||p_x_ahl_mtltxn_rec.Workorder_Id||']');
375         END IF;
376         OPEN WIP_JOB_ID_CUR(p_x_ahl_mtltxn_rec.Workorder_Id);
377         FETCH WIP_JOB_ID_CUR INTO p_x_ahl_mtltxn_rec.Wip_Entity_Id,p_x_ahl_mtltxn_rec.Organization_Id ;
378         IF(WIP_JOB_ID_CUR%NOTFOUND) THEN
379             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WIP_ENTITY_WO');
380             FND_MESSAGE.Set_Token('WORKORDER',p_x_ahl_mtltxn_rec.Workorder_Id);
381             FND_MSG_PUB.ADD;
382             x_return_status := Fnd_Api.G_RET_STS_ERROR;
383         END IF;
384         CLOSE WIP_JOB_ID_CUR;
385     END IF;
386 
387 
388 
389     IF G_DEBUG='Y' THEN
390           AHL_DEBUG_PUB.debug('after the Wip entity select['||p_x_ahl_mtltxn_rec.Wip_Entity_Id||','||p_x_ahl_mtltxn_rec.Organization_Id||']');
391 
392     END IF;
393 
394 
395     IF (p_x_ahl_mtltxn_rec.Workorder_Operation_Id IS NULL
396     OR p_x_ahl_mtltxn_rec.Workorder_Operation_Id = FND_API.G_MISS_NUM) THEN
397         IF G_DEBUG='Y' THEN
398           AHL_DEBUG_PUB.debug('selecting woopid for['||p_x_ahl_mtltxn_rec.Workorder_Id||','||p_x_ahl_mtltxn_rec.Operation_Seq_num||']');
399 
400     END IF;
401         OPEN WO_OP_CUR(p_x_ahl_mtltxn_rec.Workorder_Id,
402                         p_x_ahl_mtltxn_rec.Operation_Seq_num);
403         FETCH WO_OP_CUR INTO p_x_ahl_mtltxn_rec.Workorder_Operation_Id ;
404         IF(WO_OP_CUR%NOTFOUND) THEN
405             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WO_OP');
406             FND_MESSAGE.Set_Token('WORKORDER',p_x_ahl_mtltxn_rec.Workorder_Id);
407             FND_MESSAGE.Set_Token('OP_SEQUENCE',p_x_ahl_mtltxn_rec.Operation_Seq_num);
408             FND_MSG_PUB.ADD;
409             x_return_status := Fnd_Api.G_RET_STS_ERROR;
410         END IF;
411         CLOSE WO_OP_CUR;
412     END IF;
413     IF G_DEBUG='Y' THEN
414           AHL_DEBUG_PUB.debug('after the woop id select');
415     END IF;
416 
417       --Convert Transaction Type Name into Transaction Type Id
418     IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id IS NULL
419     OR p_x_ahl_mtltxn_rec.Transaction_Type_Id = FND_API.G_MISS_NUM) THEN
420         IF G_DEBUG='Y' THEN
421           AHL_DEBUG_PUB.debug('Converting Txn type name['||p_x_ahl_mtltxn_rec.Transaction_Type_Name||']');
422         END IF;
423         IF (p_x_ahl_mtltxn_rec.Transaction_Type_Name IS  NULL
424            OR p_x_ahl_mtltxn_rec.Transaction_Type_Name = FND_API.G_MISS_CHAR) THEN
425             FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_TXN_TYPE');
426             FND_MSG_PUB.ADD;
427             x_return_status := Fnd_Api.G_RET_STS_ERROR;
428         ELSE
429             OPEN Transaction_Type_Cur(p_x_ahl_mtltxn_rec.Transaction_Type_Name);
430             FETCH Transaction_Type_Cur INTO p_x_ahl_mtltxn_rec.Transaction_Type_Id ;
431             IF(Transaction_Type_Cur%NOTFOUND) THEN
432                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_TXN_TYPE');
433                 FND_MESSAGE.Set_Token('TXN_TYPE',p_x_ahl_mtltxn_rec.Transaction_Type_Name);
434                 FND_MSG_PUB.ADD;
435                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
436             END IF;
437             CLOSE Transaction_Type_Cur;
438         END IF;
439     END IF;
440     IF G_DEBUG='Y' THEN
441           AHL_DEBUG_PUB.debug('after the txn type select');
442     END IF;
443 
444       -- Convert item segments into item id
445       IF (p_x_ahl_mtltxn_rec.Inventory_Item_Id IS NULL OR p_x_ahl_mtltxn_rec.Inventory_Item_Id = FND_API.G_MISS_NUM) THEN
446          IF G_DEBUG='Y' THEN
447           AHL_DEBUG_PUB.debug('Converting item for['||to_char(p_x_ahl_mtltxn_rec.Organization_Id)||','||p_x_ahl_mtltxn_rec.Inventory_Item_Segments||']');
448         END IF;
449 
450         IF (p_x_ahl_mtltxn_rec.Inventory_Item_Segments IS NULL
451             OR p_x_ahl_mtltxn_rec.Inventory_Item_Segments = FND_API.G_MISS_CHAR) THEN
452                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_ITEM');
453                 FND_MSG_PUB.ADD;
454                 RAISE FND_API.G_EXC_ERROR;
455          ELSE
456             OPEN Item_Cur(p_x_ahl_mtltxn_rec.Organization_Id,
457                         p_x_ahl_mtltxn_rec.Inventory_Item_Segments);
458             FETCH Item_Cur INTO p_x_ahl_mtltxn_rec.Inventory_Item_Id ;
459             IF(Item_Cur%NOTFOUND) THEN
460                 FND_MESSAGE.Set_Name('AHL','AHL_COM_INVALID_ITEM');
461                 FND_MESSAGE.Set_Token('FIELD',p_x_ahl_mtltxn_rec.Inventory_Item_Segments);
462                 FND_MSG_PUB.ADD;
463                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
464             END IF;
465             CLOSE Item_Cur;
466           END IF;
467 
468       END IF;
469     IF G_DEBUG='Y'
470     THEN
471           AHL_DEBUG_PUB.debug('after the item id select:'||to_char(p_x_ahl_mtltxn_rec.Inventory_Item_Id)||'.');
472     END IF;
473 
474       -- Convert Locator segments into locator id when item is locator controlled.
475       IF (p_x_ahl_mtltxn_rec.Locator_Id IS NULL
476             OR p_x_ahl_mtltxn_rec.Locator_Id = FND_API.G_MISS_NUM) THEN
477          IF (p_x_ahl_mtltxn_rec.Locator_Segments IS NOT NULL
478             AND p_x_ahl_mtltxn_rec.Locator_Segments <> FND_API.G_MISS_CHAR) THEN
479             IF G_DEBUG='Y' THEN
480                 AHL_DEBUG_PUB.debug('Converting locator['||to_char(p_x_ahl_mtltxn_rec.Organization_Id)||','||p_x_ahl_mtltxn_rec.Locator_Segments||']');
481             END IF;
482             OPEN Location_Cur(p_x_ahl_mtltxn_rec.Organization_Id,
483                               p_x_ahl_mtltxn_rec.Locator_Segments);
484             FETCH Location_Cur INTO p_x_ahl_mtltxn_rec.Locator_Id,l_locator_segments  ;--Fix for bug number 5903275
485             -- ER 5854712 (if locator not found, it will be created.)
486             /*
487             IF(Location_Cur%NOTFOUND)
488             THEN
489                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOCATION');
490                 FND_MESSAGE.Set_Token('LOCATOR',p_x_ahl_mtltxn_rec.Locator_Segments);
491                 FND_MSG_PUB.ADD;
492                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
493             ELSE
494             */
495             IF (Location_Cur%FOUND) THEN
496               p_x_ahl_mtltxn_rec.Locator_Segments := l_locator_segments;--Fix for bug number 5903275
497               IF G_DEBUG='Y' THEN
498                  AHL_DEBUG_PUB.debug('Converted locator['||to_char(p_x_ahl_mtltxn_rec.Organization_Id)||','||p_x_ahl_mtltxn_rec.Locator_Segments||']');
499               END IF;
500             END IF;
501             CLOSE Location_Cur;
502         END IF;
503 
504       END IF;
505     IF G_DEBUG='Y' THEN
506           AHL_DEBUG_PUB.debug('after the locator  select');
507     END IF;
508 
509       -- convert reason name into reason id.
510       IF (p_x_ahl_mtltxn_rec.Reason_Id IS NULL OR p_x_ahl_mtltxn_rec.Reason_Id = FND_API.G_MISS_NUM)
511       THEN
512          IF (p_x_ahl_mtltxn_rec.Reason_Name IS NOT NULL
513          AND p_x_ahl_mtltxn_rec.Reason_Name <> FND_API.G_MISS_CHAR)
514          THEN
515             IF G_DEBUG='Y' THEN
516             AHL_DEBUG_PUB.debug('Converting reason name'||p_x_ahl_mtltxn_rec.Reason_Name||']');
517             END IF;
518              OPEN Reason_Cur(p_x_ahl_mtltxn_rec.Reason_Name);
519              FETCH Reason_Cur INTO p_x_ahl_mtltxn_rec.Reason_Id ;
520              IF(Reason_Cur%NOTFOUND) THEN
521                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_REASON');
522                 FND_MESSAGE.Set_Token('REASON',p_x_ahl_mtltxn_rec.Reason_Name);
523                 FND_MSG_PUB.ADD;
524                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
525              END IF;
526              CLOSE Reason_Cur;
527         END IF;
528 
529       END IF;
530 
531     IF G_DEBUG='Y' THEN
532           AHL_DEBUG_PUB.debug('after the reason name select');
533     END IF;
534 
535 
536       --Convert Problem_code_Meaning to Problem_code incase of returns
537 
538       IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
539         IF (p_x_ahl_mtltxn_rec.Problem_Code IS NULL
540                 OR p_x_ahl_mtltxn_rec.Problem_Code = FND_API.G_MISS_CHAR) THEN
541              IF (p_x_ahl_mtltxn_rec.Problem_Code_Meaning IS NOT NULL
542                 AND p_x_ahl_mtltxn_rec.Problem_Code_Meaning <> FND_API.G_MISS_CHAR) THEN
543                  IF G_DEBUG='Y' THEN
544           AHL_DEBUG_PUB.debug('Converting Problem code['||p_x_ahl_mtltxn_rec.Problem_Code_Meaning||']');
545 
546     END IF;
547                  OPEN Fnd_Lookups_Cur(p_x_ahl_mtltxn_rec.Problem_Code_Meaning);
548                  FETCH Fnd_Lookups_Cur INTO p_x_ahl_mtltxn_rec.Problem_Code ;
549                  IF(Fnd_Lookups_Cur%NOTFOUND) THEN
550                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_PROBLEM_CODE_INVALID');
551                     FND_MESSAGE.Set_Token('CODE',p_x_ahl_mtltxn_rec.Problem_Code_Meaning);
552                     FND_MSG_PUB.ADD;
553                     x_return_status := Fnd_Api.G_RET_STS_ERROR;
554                  END IF;
555                  CLOSE Fnd_Lookups_Cur;
556             END IF;
557         END IF;
558         IF G_DEBUG='Y' THEN
559           AHL_DEBUG_PUB.debug('after problem code select');
560         END IF;
561         IF (p_x_ahl_mtltxn_rec.Condition_Desc IS NOT NULL
562         AND  p_x_ahl_mtltxn_rec.Condition_Desc <> FND_API.G_MISS_CHAR)
563         THEN
564                 IF G_DEBUG='Y' THEN
565                 AHL_DEBUG_PUB.debug('Getting Condition for['||p_x_ahl_mtltxn_rec.Condition_Desc||']');
566                 END IF;
567             OPEN CONDITION_CUR(p_x_ahl_mtltxn_rec.Condition_Desc);
568             FETCH CONDITION_CUR INTO p_x_ahl_mtltxn_rec.Condition;
569 
570             IF(CONDITION_CUR%NOTFOUND) THEN
571                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_COND_INVALID');
572                 FND_MESSAGE.Set_Token('CODE',p_x_ahl_mtltxn_rec.Condition_Desc);
573                 FND_MSG_PUB.ADD;
574                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
575             END IF;
576 
577             CLOSE CONDITION_CUR;
578         END IF;
579 
580 
581         IF G_DEBUG='Y' THEN
582           AHL_DEBUG_PUB.debug('after the CONDITION select['||p_x_ahl_mtltxn_rec.CONDITION||']');
583         END IF;
584 
585       END IF;
586 
587     IF (p_module_type = 'JSP') THEN
588 
589         -- nullify id and retrive id from name entered.
590         p_x_ahl_mtltxn_rec.RECEPIENT_ID := NULL;
591 
592         IF (p_x_ahl_mtltxn_rec.recepient_name IS NOT NULL AND  p_x_ahl_mtltxn_rec.recepient_name <> FND_API.G_MISS_CHAR)
593         THEN
594             OPEN RECEPIENT_CUR(p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
595             FETCH RECEPIENT_CUR INTO p_x_ahl_mtltxn_rec.RECEPIENT_ID;
596             IF(RECEPIENT_CUR%NOTFOUND)
597             THEN
598                 IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
599                 THEN
600                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID2');
601                 ELSE
602                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID');
603                 END IF;
604                 FND_MESSAGE.Set_Token('RECEPIENT',p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
605                 FND_MSG_PUB.ADD;
606                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
607             END IF;
608             CLOSE RECEPIENT_CUR;
609         END IF;
610 
611     ELSE
612         --if backend call.
613         IF (p_x_ahl_mtltxn_rec.recepient_name IS NOT NULL AND p_x_ahl_mtltxn_rec.recepient_name <> FND_API.G_MISS_CHAR)
614         THEN
615             -- if name is availave retrive id from name
616             OPEN RECEPIENT_CUR(p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
617             FETCH RECEPIENT_CUR INTO l_recepient_id;
618             IF(RECEPIENT_CUR%NOTFOUND)
619             THEN
620                 IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
621                 THEN
622                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID2');
623                 ELSE
624                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID');
625                 END IF;
626                 FND_MESSAGE.Set_Token('RECEPIENT',p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
627                 FND_MSG_PUB.ADD;
628                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
629             ELSE
630                 -- if id is available then see if this id is the same as the one retrived from the name.
631                 IF(p_x_ahl_mtltxn_rec.recepient_id IS NOT NULL AND p_x_ahl_mtltxn_rec.recepient_id <> FND_API.G_MISS_NUM)
632                 THEN
633                     IF(l_recepient_id <> p_x_ahl_mtltxn_rec.RECEPIENT_ID)
634                     THEN
635                         IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
636                         THEN
637                             FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID2');
638                         ELSE
639                             FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID');
640                         END IF;
641                         FND_MESSAGE.Set_Token('RECEPIENT',p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
642                         FND_MSG_PUB.ADD;
643                         x_return_status := Fnd_Api.G_RET_STS_ERROR;
644                     END IF;
645                 ELSE
646                     -- if id is not available then populate the id with the id retrived.
647                     p_x_ahl_mtltxn_rec.recepient_id:=l_recepient_id;
648                 END IF;
649             END IF;
650             CLOSE RECEPIENT_CUR;
651         END IF;
652     END IF;
653 
654     IF(p_x_ahl_mtltxn_rec.recepient_id IS NULL OR p_x_ahl_mtltxn_rec.recepient_id = FND_API.G_MISS_NUM)
655     THEN
656         IF(NVL(FND_PROFILE.VALUE('AHL_PRD_MTX_RECEPIENT'),'N')='Y')
657         THEN
658             IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
659             THEN
660                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_MANDATORY2');
661             ELSE
662                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_MANDATORY');
663             END IF;
664             FND_MSG_PUB.ADD;
665             x_return_status := Fnd_Api.G_RET_STS_ERROR;
666         ELSE
667             OPEN  DEFAULT_USER_CUR;
668             FETCH DEFAULT_USER_CUR INTO p_x_ahl_mtltxn_rec.RECEPIENT_ID;
669             IF DEFAULT_USER_CUR%NOTFOUND
670             THEN
671                 IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
672                 THEN
673                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID2');
674                 ELSE
675                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTX_PERSON_INVALID');
676                 END IF;
677                 FND_MESSAGE.Set_Token('RECEPIENT',p_x_ahl_mtltxn_rec.RECEPIENT_NAME);
678                 FND_MSG_PUB.ADD;
679                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
680             END IF;
681             CLOSE DEFAULT_USER_CUR;
682         END IF;
683     END IF;
684 
685       --Convert UOM DESC into UOM
686       IF (p_x_ahl_mtltxn_rec.Uom IS NULL
687             OR p_x_ahl_mtltxn_rec.Uom = FND_API.G_MISS_CHAR) THEN
688          IF G_DEBUG='Y' THEN
689           AHL_DEBUG_PUB.debug('Converting UOM['||p_x_ahl_mtltxn_rec.Uom_Desc||']');
690 
691     END IF;
692          IF (p_x_ahl_mtltxn_rec.Uom_Desc IS NULL
693             OR p_x_ahl_mtltxn_rec.Uom_Desc = FND_API.G_MISS_CHAR) THEN
694                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_UOM');
695                 FND_MSG_PUB.ADD;
696                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
697          ELSE
698              OPEN Uom_Cur(p_x_ahl_mtltxn_rec.Uom_Desc);
699              FETCH Uom_Cur INTO p_x_ahl_mtltxn_rec.Uom ;
700              IF(Uom_Cur%NOTFOUND) THEN
701                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_UOM');
702                 FND_MESSAGE.Set_Token('UOM',p_x_ahl_mtltxn_rec.Uom_Desc);
703                 FND_MSG_PUB.ADD;
704                 x_return_status := Fnd_Api.G_RET_STS_ERROR;
705              END IF;
706              CLOSE Uom_Cur;
707         END IF;
708 
709       END IF;
710     IF G_DEBUG='Y' THEN
711           AHL_DEBUG_PUB.debug('after UOM select');
712 
713     END IF;
714 EXCEPTION
715           WHEN FND_API.G_EXC_ERROR THEN
716               x_return_status := Fnd_Api.G_RET_STS_ERROR;
717 
718 END Convert_Name_To_Id;
719 
720 
721 
722 
723 /***********************************************************************/
724 
725 
726 /***********************************************************************/
727 
728 PROCEDURE PERFORM_MTL_TXN
729 (
730     p_api_version        IN            NUMBER     := 1.0,
731     p_init_msg_list      IN            VARCHAR2   := FND_API.G_FALSE,
732     p_commit             IN            VARCHAR2   := FND_API.G_FALSE,
733     p_validation_level   IN            NUMBER     := FND_API.G_VALID_LEVEL_FULL,
734     p_default            IN            VARCHAR2   := FND_API.G_FALSE,
735     p_module_type        IN            VARCHAR2   := NULL,
736     p_create_sr          IN            VARCHAR2,
737     p_x_ahl_mtltxn_tbl   IN OUT NOCOPY Ahl_Mtltxn_Tbl_Type,
738     x_return_status      OUT NOCOPY           VARCHAR2,
739     x_msg_count          OUT NOCOPY           NUMBER,
740     x_msg_data           OUT NOCOPY           VARCHAR2
741 )
742     IS
743     l_api_name              CONSTANT VARCHAR2(30) := 'PERFORM_MTL_TXN';
744     l_api_version           CONSTANT NUMBER       := 1.0;
745     --l_count               NUMBER;
746     l_x_Mtl_Txn_id          NUMBER;
747     l_sch_Mtl_Id            NUMBER;
748     l_Txn_Header_Id         NUMBER;
749     l_Txn_tmp_Id            NUMBER;
750     l_x_sr_rec_tbl          AHL_PRD_NONROUTINE_PVT.Sr_task_tbl_type;
751     l_Txn_Id_Tbl            TXN_INTF_ID_TBL;
752     l_instance_id_tbl       INSTANCE_ID_TBL;
753     l_eam_item_type_id_tbl  ITEM_TYPE_TBL;
754     l_timeout               NUMBER;
755     l_outcome               BOOLEAN;
756     l_error_msg             varchar2(240);
757     l_error_code            varchar2(240);
758     l_error                 BOOLEAN;
759     l_nonrtn_wo_id          NUMBER;
760     l_item_instance_id      NUMBER;
761     l_eam_item_type_id      NUMBER;
762     j                       INTEGER;
763 
764     l_completed_quantity             NUMBER;
765     l_object_version_number          NUMBER;
766     l_uom_code                       AHL_SCHEDULE_MATERIALS.UOM%TYPE;
767     l_quantity                       NUMBER;
768 
769     l_concatenated_segments          mtl_system_items_kfv.concatenated_segments%TYPE;
770     l_workorder_name                 ahl_workorders.workorder_name%TYPE;
771 
772     l_reservation_flag               VARCHAR2(1);
773     l_sr_mtl_id_map_tbl              SR_MTL_ID_MAP_TBL;
774 
775     --Query to get the error message
776     CURSOR Txn_Error_Cur(p_txn_Id NUMBER) IS
777         SELECT intf.ERROR_EXPLANATION ,intf.ERROR_CODE, kfv.concatenated_segments,
778                WO.workorder_name
779         --FROM MTL_MATERIAL_TRANSACTIONS_TEMP
780         FROM MTL_TRANSACTIONS_INTERFACE INTF, mtl_system_items_kfv kfv,
781                      ahl_workorders WO
782         --WHERE TRANSACTION_TEMP_ID = p_txn_Id;
783         WHERE TRANSACTION_INTERFACE_ID = p_txn_Id
784                   AND intf.inventory_item_id = kfv.inventory_item_id
785                   AND intf.organization_id = kfv.organization_id
786                   AND WO.wip_entity_id = intf.transaction_source_id;
787 
788     -- Query for finding the scheduled materials
789     CURSOR Sch_Mtl_Cur(p_org_id NUMBER, p_workorder_Op_id NUMBER,
790                        p_item_Id NUMBER) IS
791         SELECT COMPLETED_QUANTITY, UOM, object_version_number
792         FROM AHL_SCHEDULE_MATERIALS A
793         WHERE ORGANIZATION_ID = p_org_id
794         AND A.WORKORDER_OPERATION_ID =p_workorder_op_id
795         AND A.INVENTORY_ITEM_ID = p_item_Id
796         AND A.MATERIAL_REQUEST_TYPE <> 'FORECAST'
797         --AND A.status='ACTIVE'
798         --Added for FP ER# 6310725.
799         AND A.status IN ('ACTIVE','HISTORY', 'IN-SERVICE')
800         FOR UPDATE OF COMPLETED_QUANTITY NOWAIT;
801 
802     -- Query to check existence of AHL_SCHEDULE_MATERIALS record.
803     CURSOR Sch_Mtl_Exists_Cur(p_org_id NUMBER, p_workorder_Op_id NUMBER,
804                               p_item_Id NUMBER) IS
805         SELECT 'x'
806         FROM AHL_SCHEDULE_MATERIALS A
807         WHERE ORGANIZATION_ID = p_org_id
808         AND A.WORKORDER_OPERATION_ID =p_workorder_op_id
809         AND A.INVENTORY_ITEM_ID = p_item_Id
810         AND A.MATERIAL_REQUEST_TYPE <> 'FORECAST'
811         --AND A.status='ACTIVE';
812         --Added for FP ER# 6310725.
813         AND A.status IN ('ACTIVE','HISTORY','IN-SERVICE');
814 
815     /* commented out as part of FP bug fix 5172147. Instead querying disposition ID in
816      * procedure validate_txn_rec.
817 
818        -- Cursor to check if disposition exists for the item instance.
819        CURSOR ahl_mtl_ret_disp_csr (p_item_instance_id  IN NUMBER,
820                                     p_workorder_id  IN NUMBER) IS
821 
822         /* Tamal [R12 APPSPERF fixes]
823          * R12 Drop 4 - SQL ID: 14399558
824          * Bug #4918991
825          */
826         /*
827         SELECT 'x'
828         FROM AHL_PRD_DISPOSITIONS_B DISP, AHL_WORKORDERS WO, CSI_ITEM_INSTANCES CSI
829         WHERE
830             DISP.INSTANCE_ID = CSI.INSTANCE_ID AND
831             DISP.WORKORDER_ID = WO.WORKORDER_ID AND
832             WO.WIP_ENTITY_ID = CSI.WIP_JOB_ID AND
833             CSI.LOCATION_TYPE_CODE NOT IN ('PO', 'IN-TRANSIT', 'PROJECT', 'INVENTORY') AND
834             TRUNC(SYSDATE) BETWEEN TRUNC(NVL(CSI.ACTIVE_START_DATE, SYSDATE)) AND TRUNC(NVL(CSI.ACTIVE_END_DATE, SYSDATE)) AND
835             DISP.INSTANCE_ID = p_item_instance_id AND
836             DISP.WORKORDER_ID = p_workorder_id AND
837             CSI.QUANTITY > 0;
838        */
839 
840        l_junk   VARCHAR2(1);
841 
842        -- Added for FP bug# 6086419.
843        l_mr_asso_tbl AHL_PRD_NONROUTINE_PVT.MR_Association_tbl_type;
844 
845        -- sracha: Added for ER 5854712.
846        l_valid_flag  BOOLEAN;
847 
848 
849     BEGIN
850         -- Standard start of API savepoint
851         SAVEPOINT PERFORM_MTL_TXN_PVT;
852 
853         -- Standard call to check for call compatibility
854         IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
855                                            G_PKG_NAME) THEN
856             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
857         END IF;
858         -- Initialize message list if p_init_msg_list is set to TRUE
859         IF FND_API.To_Boolean(p_init_msg_list) THEN
860             FND_MSG_PUB.Initialize;
861         END IF;
862 
863         -- Initialize API return status to success
864         x_return_status := FND_API.G_RET_STS_SUCCESS;
865 
866         -- call user hook api.
867         -- User Hooks
868         IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_MATERIAL_TXN_CUHK', 'PERFORM_MTLTXN_PRE', 'B', 'C')) THEN
869            Perform_MtlTxn_Pre(p_x_ahl_mtltxn_tbl => p_x_ahl_mtltxn_tbl,
870                               x_msg_count => x_msg_count,
871                               x_msg_data => x_msg_data,
872                               x_return_status => x_return_status);
873            IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
874              RAISE FND_API.G_EXC_ERROR;
875            ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
876              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
877            END IF;
878         END IF;
879 
880         dumpInput(p_x_ahl_mtltxn_tbl);
881 
882 
883         IF G_DEBUG='Y' THEN
884           AHL_DEBUG_PUB.enable_debug;
885           AHL_DEBUG_PUB.debug('Entered ahl mtl api');
886         END IF;
887 
888         IF (p_x_ahl_mtltxn_tbl.COUNT > 0) THEN
889 
890             -- Validation LOOP.
891             --l_Error := false;
892             FOR i IN p_x_ahl_mtltxn_tbl.FIRST..p_x_ahl_mtltxn_tbl.LAST  LOOP
893 
894                 IF (p_module_type = 'JSP')
895                                 THEN
896                    -- Set all the Ids to null for which there is an LOV.
897                    p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id    := FND_API.G_MISS_NUM;
898                    p_x_ahl_mtltxn_tbl(i).Locator_Id             := FND_API.G_MISS_NUM;
899                    p_x_ahl_mtltxn_tbl(i).Reason_Id              := FND_API.G_MISS_NUM;
900                    p_x_ahl_mtltxn_tbl(i).Problem_Code           := FND_API.G_MISS_CHAR;
901                    --p_x_ahl_mtltxn_tbl(i).Uom                    := FND_API.G_MISS_CHAR;
902                 END IF;
903                 /*Public api changes: Moved to Convert_Name_To_Id api
904                 --Check the context fields
905                 IF ( (p_x_ahl_mtltxn_tbl(i).Workorder_Id IS NULL
906                  OR  p_x_ahl_mtltxn_tbl(i).Workorder_Id = FND_API.G_MISS_NUM)) THEN
907                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_WORKORDER_ID');
908                     FND_MSG_PUB.ADD;
909                                         l_error := true;
910                 ELSIF ( p_x_ahl_mtltxn_tbl(i).Operation_Seq_num IS NULL
911                  OR  p_x_ahl_mtltxn_tbl(i).Operation_Seq_num = FND_API.G_MISS_NUM) THEN
912                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_NULL_OPER_SEQ');
913                     FND_MSG_PUB.ADD;
914                                         l_error := true;
915                 ELSE
916                 */
917                    IF G_DEBUG='Y' THEN
918                        AHL_DEBUG_PUB.debug('calling Convert_Name_To_Id for i=['||i||']');
919                    END IF;
920 
921                     -- This procedure will convert name parameters into IDs in the input
922                     Convert_Name_To_Id(p_x_ahl_mtltxn_rec => p_x_ahl_mtltxn_tbl(i),
923                                        p_module_type => p_module_type ,
924                                    x_return_status  => x_return_status  );
925 
926                    IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
927                      --l_error := true;
928                      -- raise error if mandatory paramaters missing or WO-OP
929                      -- validation fails.
930                      RAISE FND_API.G_EXC_ERROR;
931 
932                    ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
933                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
934                    END IF;
935 
936 
937                    IF G_DEBUG='Y' THEN
938                       AHL_DEBUG_PUB.debug('calling Validate_Txn_rec for i=['||i||']');
939                    END IF;
940 
941                    --Call  Validate_Txn(Ahl_Mtltxn_rec)  to validate the material txn record.
942                    Validate_Txn_rec(p_x_ahl_mtltxn_rec => p_x_ahl_mtltxn_tbl(i),
943                            x_item_instance_id   => l_item_instance_id,
944                            x_return_status => x_Return_Status,
945                            x_msg_data       => x_msg_data,
946                            x_msg_count      => x_msg_Count,
947                            x_eam_item_type_id => l_eam_item_type_id );
948 
949                    IF G_DEBUG='Y' THEN
950                        AHL_DEBUG_PUB.debug('After calling Validate_Txn_rec');
951                    END IF;
952 
953                    IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
954                       l_error := true;
955 
956                       IF G_DEBUG='Y' THEN
957                           AHL_DEBUG_PUB.debug('Error in Validation');
958                       END IF;
959                    ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
960                       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
961 
962                       IF G_DEBUG='Y' THEN
963                           AHL_DEBUG_PUB.debug('Unexpected error in Validate_Txn_rec');
964                       END IF;
965                    ELSE
966                       l_instance_id_tbl(i) := l_item_instance_id;
967                       l_eam_item_type_id_tbl(i) := l_eam_item_type_id;
968                    END IF;
969                 -- END IF; -- commented out for public api changes.
970 
971             END LOOP;
972             -- End of Validation LOOP
973             IF (l_Error) THEN
974                RAISE FND_API.G_EXC_ERROR;
975             END IF;
976 
977             -- Inteface table insert.
978             l_txn_Header_Id := NULL;
979             l_Error := false;
980             FOR i IN p_x_ahl_mtltxn_tbl.FIRST..p_x_ahl_mtltxn_tbl.LAST  LOOP
981 
982 
983                 l_reservation_flag := 'N';
984                 IF (p_x_ahl_mtltxn_tbl(i).serial_number IS NOT NULL) THEN
985                     -- Added in R12: Serial Reservation.. (to relieve reservation if serial number
986                     -- is reserved against a different demand source)
987                     Relieve_Serial_Reservation(p_ahl_mtl_txn_rec  => p_x_ahl_mtltxn_tbl(i),
988                                                x_reservation_flag => l_reservation_flag,
989                                                x_return_status => x_return_status);
990                     IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
991                         l_error := true;
992                         RAISE FND_API.G_EXC_ERROR;
993                     ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
994                         l_error := true;
995                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
996                     END IF;
997 
998                 END IF;
999 
1000                 -- For an issue transaction and return transaction (bug 5499575)
1001                 -- IF Material requlrements are not existing in the  AHL_SCHEDULE_MATERIALS
1002                 -- then insert into the scheduled materials table with submitted status.
1003                 OPEN Sch_Mtl_Exists_Cur(p_x_ahl_mtltxn_tbl(i).Organization_Id,
1004                          p_x_ahl_mtltxn_tbl(i).Workorder_operation_Id,
1005                          p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id);
1006                 FETCH Sch_Mtl_Exists_Cur INTO l_junk;
1007 
1008                 If(Sch_Mtl_Exists_Cur%NOTFOUND) THEN
1009 
1010                           --Check if the material exists in the AHL_SCHEDULE_MATERIALS table
1011                           --for the given work order operation id.
1012                           --IF (p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.ISSCOMP_TYPE) THEN
1013 
1014                               Insert_Sch_Mtl_Row( p_mtl_txn_rec    => p_x_ahl_mtltxn_tbl(i),
1015                                                   x_return_status  => x_Return_Status,
1016                                                   x_msg_count      => x_Msg_Count,
1017                                                   x_msg_data       => x_Msg_Data,
1018                                                   x_ahl_sch_mtl_id => l_sch_Mtl_Id);
1019 
1020 
1021                               IF G_DEBUG='Y' THEN
1022                                   AHL_DEBUG_PUB.debug('after Sch_Mtl insert api');
1023                               END IF;
1024 
1025                               IF (x_return_status = FND_API.G_RET_STS_ERROR
1026                                   OR x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1027                                    CLOSE Sch_Mtl_Exists_Cur;
1028                                    FND_MESSAGE.Set_Name('AHL','AHL_PRD_SCHMTLAPI_ERROR');
1029                                    FND_MESSAGE.Set_Token('MSG',x_msg_data);
1030                                    FND_MSG_PUB.ADD;
1031                                    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1032                               END IF;
1033                           --END IF; -- fix for bug# 5499575
1034 
1035                 END IF;
1036                 CLOSE Sch_Mtl_Exists_Cur;
1037 
1038                 --call Insert_Interface_Temp API to insert data into transaction
1039                 --temp tables. F
1040 
1041                 IF G_DEBUG='Y' THEN
1042                        AHL_DEBUG_PUB.debug('Calling Insert_Txn_Intf...');
1043                 END IF;
1044 
1045                 -- Added l_eam_item_type_id_tbl(i) for FP ER# 6310766.
1046                 Insert_Mtl_Txn_Intf(p_x_ahl_mtl_txn_rec  => p_x_ahl_mtltxn_tbl(i),
1047                         p_eam_item_type_id   => l_eam_item_type_id_tbl(i),
1048                         p_x_txn_Hdr_Id       => l_txn_Header_Id,
1049                         p_x_txn_intf_Id      => l_txn_tmp_Id,
1050                         p_reservation_flag   => l_reservation_flag, -- added for R12.
1051                         x_return_status      => x_return_status
1052                         );
1053 
1054                 l_txn_Id_Tbl(i) := l_Txn_tmp_Id;
1055                 IF G_DEBUG='Y' THEN
1056                     AHL_DEBUG_PUB.debug('After Calling Insert_Txn_Intf...ret_status['||x_return_status||']');
1057                     AHL_DEBUG_PUB.debug('Ahl_mtltxn_id'||p_x_ahl_mtltxn_tbl(i).ahl_mtltxn_id);
1058                 END IF;
1059 
1060 
1061                 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1062                       l_error := true;
1063                 ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1064                       l_error := true;
1065                       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1066                 END IF;
1067 
1068             END LOOP; -- End of loop for Interface table inserts
1069 
1070             IF(l_error )       THEN
1071                 RAISE FND_API.G_EXC_ERROR;
1072             END IF;
1073             -- Now process the interface records
1074             IF G_DEBUG='Y' THEN
1075                  AHL_DEBUG_PUB.debug('Before calling wip_mtlInterfaceProc_pub.processInterface....');
1076             END IF;
1077 
1078             wip_mtlInterfaceProc_pub.processInterface(
1079                                 p_txnHdrId  => l_Txn_Header_Id,
1080                                 x_returnStatus  => x_return_status
1081                                 );
1082 
1083 	    --Adithya added the following code to fix bugs 5611465 and 6962468
1084 	      mo_global.init('AHL');
1085 
1086             IF(x_return_status = FND_API.G_RET_STS_UNEXP_ERROR  ) THEN
1087               IF G_DEBUG='Y' THEN
1088                     AHL_DEBUG_PUB.debug('wip_mtlInterfaceProc_pub.processInterface....errored');
1089                     AHL_DEBUG_PUB.debug('count of error msgs: ' || FND_MSG_PUB.COUNT_MSG);
1090               END IF;
1091               --RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1092             END IF;
1093 
1094         END IF;
1095 
1096         -- Now  Loop thru the transaction Id table, Check Errors and update AHL tables
1097         IF (l_txn_Id_Tbl.COUNT > 0) THEN
1098 
1099             -- This loop checks for errors. No interface record implies
1100             -- tha there is no error.
1101             l_error := false;
1102             FOR i IN l_txn_Id_Tbl.FIRST..l_txn_Id_Tbl.LAST  LOOP
1103 
1104                 OPEN Txn_Error_cur(l_txn_Id_Tbl(i));
1105                 FETCH Txn_Error_cur INTO l_error_msg,l_error_code,
1106                                        l_concatenated_segments, l_workorder_name;
1107                 IF(Txn_Error_cur%FOUND AND (l_error_code IS NOT NULL
1108                     OR trim(l_error_code) = '')) THEN
1109 
1110                       IF G_DEBUG='Y' THEN
1111                          AHL_DEBUG_PUB.debug('Error in transaction['||l_error_msg||']');
1112                       END IF;
1113 
1114                       FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
1115                       FND_MESSAGE.Set_Token('MSG',l_error_msg);
1116                       FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
1117                       FND_MESSAGE.Set_Token('WO_NAME',l_workorder_name);
1118                       FND_MSG_PUB.ADD;
1119                       l_error := true;
1120                 END IF;
1121                 CLOSE Txn_Error_cur;
1122             END LOOP;
1123 
1124             IF(l_error ) THEN
1125                 RAISE FND_API.G_EXC_ERROR;
1126             END IF;
1127 
1128             -- No errors returned by  WIP API.Initialize message list to
1129             -- remove 'Txn success' message.
1130             IF FND_API.To_Boolean(p_init_msg_list) THEN
1131                FND_MSG_PUB.Initialize;
1132             END IF;
1133 
1134             FOR i IN l_txn_Id_Tbl.FIRST..l_txn_Id_Tbl.LAST  LOOP
1135 
1136                 -- Tamal: Bug #4095376: Begin
1137                 -- For all cases (i.e. ISSUE / RETURN + whether found in AHL_SCHEDULE_MATERIALS) do the following
1138                 l_quantity :=  p_x_ahl_mtltxn_tbl(i).quantity;
1139 
1140                 -- The following depends on the fact that ahl_schedule_materials records all quantities in the primary_uom_code
1141                 -- of the item, which is the case currently as it is a requirement from WIP
1142                 SELECT PRIMARY_UOM_CODE INTO l_uom_code
1143                 FROM MTL_SYSTEM_ITEMS_B
1144                 WHERE INVENTORY_ITEM_ID = p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id
1145                 AND ORGANIZATION_ID = p_x_ahl_mtltxn_tbl(i).Organization_Id;
1146 
1147                 IF (l_uom_code <> p_x_ahl_mtltxn_tbl(i).uom)
1148                 THEN
1149                     l_quantity := inv_convert.inv_um_convert
1150                     (
1151                     item_id         => p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id,
1152                     precision       => null,
1153                     from_quantity   => p_x_ahl_mtltxn_tbl(i).quantity,
1154                     from_unit       => p_x_ahl_mtltxn_tbl(i).uom,
1155                     to_unit         => l_uom_code,
1156                     from_name       => null,
1157                     to_name         => null
1158                     );
1159 
1160                     IF (l_quantity < 0)
1161                     THEN
1162                        FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_UOMCONVERT_ERROR');
1163                        FND_MESSAGE.Set_Token('UOM_FROM', p_x_ahl_mtltxn_tbl(i).uom);
1164                        FND_MESSAGE.Set_Token('UOM_TO', l_uom_code);
1165                        FND_MSG_PUB.ADD;
1166                        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1167                     END IF;
1168                 END IF;
1169                 -- Tamal: Bug #4095376: End
1170 
1171                 OPEN Sch_Mtl_Cur(p_x_ahl_mtltxn_tbl(i).Organization_Id,
1172                          p_x_ahl_mtltxn_tbl(i).Workorder_operation_Id,
1173                          p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id);
1174                 FETCH Sch_Mtl_Cur INTO l_completed_quantity, l_uom_code, l_object_version_number;
1175 
1176                 If(Sch_Mtl_Cur%NOTFOUND) THEN
1177                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_SCHMTL_NOTFOUND');
1178                     FND_MESSAGE.Set_Token('WO_OP',p_x_ahl_mtltxn_tbl(i).Workorder_operation_Id);
1179                     FND_MESSAGE.Set_Token('INV_ITEM',p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id);
1180                     FND_MSG_PUB.ADD;
1181                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1182                 ELSE
1183 
1184                     IF G_DEBUG='Y' THEN
1185                        AHL_DEBUG_PUB.debug('l_completed_quantity=['||l_completed_quantity||']');
1186                     END IF;
1187 
1188                     -- Tamal: Bug #4095376: Begin
1189                     -- Retrieving quantity, then converting to primary uom, etc have been moved out of this ELSE loop
1190                     -- to ensure that quantity is not updated to NULL in mtl_txn rows
1191                     -- Tamal: Bug #4095376: End
1192 
1193                     -- Update Completion quantity for cMRO-APS integration.
1194                     IF (p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.ISSCOMP_TYPE) THEN
1195                     -- Issue Txn.
1196                         UPDATE AHL_SCHEDULE_MATERIALS
1197                         SET completed_quantity = nvl(completed_quantity,0) + l_quantity,
1198                             object_version_number = l_object_version_number + 1
1199                         WHERE CURRENT OF Sch_Mtl_Cur;
1200                     -- 11/20: Commented out updation of completed quantity to fix bug# 6598809
1201                     /*
1202                     ELSIF (p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
1203                     -- Return Txn.
1204                         UPDATE AHL_SCHEDULE_MATERIALS
1205                         SET completed_quantity = nvl(completed_quantity,0) -  l_quantity,
1206                             object_version_number = l_object_version_number + 1
1207                         WHERE CURRENT OF Sch_Mtl_Cur;
1208                     */
1209                     END IF;
1210                 END IF;
1211                 CLOSE Sch_Mtl_Cur;
1212 
1213 
1214                 --IF( l_x_sr_rec_tbl.COUNT > 0) THEN
1215                 --    l_nonrtn_wo_id := l_x_sr_rec_tbl(i).Nonroutine_wo_id;
1216                 --END IF;
1217 
1218                 --Insert a record into the AHL_WORKORDER_MTL_TXNS.
1219                 IF(p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id = FND_API.G_MISS_NUM OR
1220                    p_x_ahl_mtltxn_tbl(i).disposition_id is NOT NULL) THEN
1221                     p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id := NULL;
1222                 END IF;
1223                 IF(l_nonrtn_wo_id = FND_API.G_MISS_NUM) THEN
1224                     l_nonrtn_wo_id := NULL;
1225                 END IF;
1226 
1227                 IF(p_x_ahl_mtltxn_tbl(i).Locator_Id = FND_API.G_MISS_NUM) THEN
1228                     p_x_ahl_mtltxn_tbl(i).Locator_Id := NULL;
1229                 END IF;
1230 
1231                 -- In case of dynamic locator creation, retrieve locator ID to populate ahl_workorder_mtl_txns table.
1232                 IF (p_x_ahl_mtltxn_tbl(i).locator_segments IS NOT NULL AND
1233                     p_x_ahl_mtltxn_tbl(i).locator_id IS NULL) THEN
1234 
1235                    IF G_DEBUG='Y' THEN
1236                      AHL_DEBUG_PUB.DEBUG('Profile mfg_organization_id:'  || fnd_profile.value('MFG_ORGANIZATION_ID') );
1237                    END IF;
1238 
1239                    l_valid_flag := fnd_flex_keyval.validate_segs(
1240                                        operation         => 'FIND_COMBINATION'
1241                                      , appl_short_name   => 'INV'
1242                                      , key_flex_code     => 'MTLL'
1243                                      , structure_number  => 101
1244                                      , concat_segments   => p_x_ahl_mtltxn_tbl(i).locator_segments
1245                                      , values_or_ids     => 'V'
1246                                      , data_set          => p_x_ahl_mtltxn_tbl(i).organization_id
1247                          );
1248 
1249                    IF (l_valid_flag) THEN
1250                        p_x_ahl_mtltxn_tbl(i).locator_id := fnd_flex_keyval.combination_id;
1251                    END IF;
1252 
1253                 END IF;
1254 
1255                 IF(p_x_ahl_mtltxn_tbl(i).condition = FND_API.G_MISS_NUM) THEN
1256                     p_x_ahl_mtltxn_tbl(i).condition := NULL;
1257                 END IF;
1258                 IF G_DEBUG='Y' THEN
1259                           AHL_DEBUG_PUB.debug('RECEPIENT_ID'||p_x_ahl_mtltxn_tbl(i).RECEPIENT_ID);
1260                 END IF;
1261 
1262                 Insert_Mtl_Txn_Row(p_x_ahl_mtltxn_rec     => p_x_ahl_mtltxn_tbl(i),
1263                                 p_material_Transaction_Id => NULL,
1264                                 p_nonroutine_workorder_Id => l_nonrtn_wo_id,
1265                                 p_prim_uom_qty      =>L_QUANTITY,
1266                                 x_return_status      => x_Return_Status,
1267                                 x_msg_count          => x_Msg_Count,
1268                                 x_msg_data           => x_Msg_Data,
1269                                 x_ahl_mtl_txn_id     => l_x_Mtl_Txn_Id);
1270 
1271 
1272                 IF G_DEBUG='Y' THEN
1273                           AHL_DEBUG_PUB.debug('after mtl_Txn insert api');
1274                           AHL_DEBUG_PUB.debug('after mtl_Txn insert api call ret status=['||x_return_status||']');
1275                           AHL_DEBUG_PUB.debug('after mtl_Txn insert api call msg=['||x_msg_data||']');
1276                 END IF;
1277 
1278 
1279                 IF (x_return_status = FND_API.G_RET_STS_ERROR
1280                     OR x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1281                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_AHLMTLTXN_ERROR');
1282                         FND_MESSAGE.Set_Token('MSG',x_msg_data);
1283                         FND_MSG_PUB.ADD;
1284                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1285                 END IF;
1286 
1287                 p_x_ahl_mtltxn_tbl(i).ahl_mtltxn_id :=  l_x_Mtl_Txn_Id;
1288 
1289                    -- For trackable returns, update ahl_parts_change table for return_mtl_txn_id.
1290                    IF (l_instance_id_tbl(i) IS NOT NULL) AND
1291                       (p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
1292                          AHL_PRD_PARTS_CHANGE_PVT.Update_Material_Return
1293                                   (
1294                                      p_return_mtl_txn_id  => l_x_Mtl_Txn_Id,
1295                                      p_workorder_id     => p_x_ahl_mtltxn_tbl(i).workorder_id,
1296                                      p_Item_Instance_Id  => l_instance_id_tbl(i),
1297                                      x_return_status  => x_return_status
1298                                   );
1299 
1300                          IF G_DEBUG='Y' THEN
1301                             AHL_DEBUG_PUB.debug('after PartsChange Update api');
1302                             AHL_DEBUG_PUB.debug('after PartsChange Update api call ret status=['||x_return_status||']');
1303                          END IF;
1304 
1305                          IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1306                              RAISE FND_API.G_EXC_ERROR;
1307                          ELSIF  (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1308                              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1309                          END IF;
1310 
1311                    END IF;
1312 
1313             END LOOP;
1314         END IF;
1315 
1316         -- END of if which checks the count of transactions created
1317 
1318         IF (G_DEBUG='Y') THEN
1319           AHL_DEBUG_PUB.debug('Unservicable profile value:' || G_AHL_UNSERVICEABLE_CONDITION);
1320           AHL_DEBUG_PUB.debug('MRB profile value:' || G_AHL_MRB_CONDITION);
1321         END IF;
1322 
1323         IF (l_txn_Id_Tbl.COUNT > 0) THEN
1324             -- THis loop is for creating service request. Since
1325             -- service reques API commits, we need to do this separately.
1326             BEGIN
1327                 l_error := false;
1328                 --j:=1;
1329                 j := l_txn_Id_Tbl.FIRST;
1330                 FOR i IN l_txn_Id_Tbl.FIRST..l_txn_Id_Tbl.LAST  LOOP
1331                     IF G_DEBUG='Y' THEN
1332                       AHL_DEBUG_PUB.debug('Processing SR for item:' || p_x_ahl_mtltxn_tbl(i).inventory_item_id);
1333                       AHL_DEBUG_PUB.debug('Condition is:' || p_x_ahl_mtltxn_tbl(i).Condition);
1334                       AHL_DEBUG_PUB.debug('Disposition ID is:' || p_x_ahl_mtltxn_tbl(i).disposition_id);
1335                       AHL_DEBUG_PUB.debug('Instance ID is:' || l_instance_id_tbl(i));
1336                       AHL_DEBUG_PUB.debug('Create WO Option is:' || p_x_ahl_mtltxn_tbl(i).create_wo_option);
1337 
1338                     END IF;
1339 
1340                     --If (condition is unserviceable/MRB AND P_create_SR == 'Y' ) then
1341                     --Select EMP_ID from FND_USERS table for the FND_GLOBAL.USER_ID
1342                     --Call Service request API to create service request.
1343                     --( AHL_NONROUTINE_JOB_PVT.process_nonroutine_job)
1344                     IF ((p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
1345                           AND l_eam_item_type_id_tbl(i) = wip_constants.rebuild_item_type
1346                           AND (p_x_ahl_mtltxn_tbl(i).Condition = G_AHL_UNSERVICEABLE_CONDITION
1347                           OR p_x_ahl_mtltxn_tbl(i).Condition = G_AHL_MRB_CONDITION)
1348                           AND (p_create_sr = 'Y')
1349                           AND (l_instance_id_tbl(i) IS NOT NULL)
1350                           AND (p_x_ahl_mtltxn_tbl(i).disposition_id IS NULL)
1351                           -- added for FP bug# 5903318.
1352                           AND (p_x_ahl_mtltxn_tbl(i).create_wo_option <> 'CREATE_SR_NO')) THEN
1353                                 populate_Srvc_Rec( p_item_instance_id => l_instance_id_tbl(i),
1354                                                    p_srvc_rec => l_x_sr_rec_tbl(j),
1355                                                    p_x_ahl_mtltxn_rec => p_x_ahl_mtltxn_tbl(i));
1356                                 -- populate l_sr_mtl_id_map_tbl to link the mtl_txnID with the l_x_sr_rec_tbl
1357                                 -- table index.
1358                                 l_sr_mtl_id_map_tbl(j) := p_x_ahl_mtltxn_tbl(i).ahl_mtltxn_id;
1359 
1360                                 j := j+1;
1361                     END IF;
1362 
1363                 END LOOP;
1364                           -- added for FP bug# 5903318.
1365                 IF G_DEBUG='Y' THEN
1366                     AHL_DEBUG_PUB.debug('Will call service request API if there are srvc request to be created');
1367                     AHL_DEBUG_PUB.debug('srvc req rec count=['||to_Char(l_x_sr_rec_tbl.COUNT)||']');
1368                     AHL_DEBUG_PUB.debug('mr tbl count=['||to_Char(l_mr_asso_tbl.COUNT)||']');
1369                 END IF;
1370 
1371 
1372                 IF(l_x_sr_rec_tbl.COUNT > 0) THEN
1373                     AHL_PRD_NONROUTINE_PVT.PROCESS_NONROUTINE_JOB (
1374                                         p_api_version  => 1.0,
1375                                         p_commit       => Fnd_Api.g_false,
1376                                         p_module_type   => NULL,
1377                                         x_return_status =>x_return_status,
1378                                         x_msg_count     =>x_msg_count,
1379                                         x_msg_data      =>x_msg_data,
1380                                         p_x_sr_task_tbl =>l_x_sr_rec_tbl,
1381                                         --Parameter added for bug# 6086419.
1382                                         p_x_mr_asso_tbl => l_mr_asso_tbl);
1383                     IF G_DEBUG='Y' THEN
1384                         AHL_DEBUG_PUB.debug('after the srvc req api call ret status=['||x_return_status||']');
1385                         AHL_DEBUG_PUB.debug('after the srvc req api call x_msg_count=['||x_msg_count||']');
1386                         AHL_DEBUG_PUB.debug('after the srvc req api call msg=['||x_msg_data||']');
1387                     END IF;
1388 
1389                     IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1390                         RAISE FND_API.G_EXC_ERROR;
1391                     ELSIF  (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1392                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1393                     END IF;
1394 
1395                     -- ANd now update the nonroutine workorder id in the workorder_mtl_Txns table
1396                     FOR j IN l_x_sr_rec_tbl.FIRST..l_x_sr_rec_tbl.LAST LOOP
1397                         IF G_DEBUG='Y' THEN
1398                             AHL_DEBUG_PUB.debug('l_x_sr_rec_tbl.Incident_id[' || j || ']=['||l_x_sr_rec_tbl(j).Incident_id||']');
1399                             AHL_DEBUG_PUB.debug('l_x_sr_rec_tbl.Visit_task_id[' || j || ']=['||l_x_sr_rec_tbl(j).Visit_task_id||']');
1400                             AHL_DEBUG_PUB.debug('l_sr_mtl_id_map_tbl[' || j || ']=['|| l_sr_mtl_id_map_tbl(j) ||']');
1401                         END IF;
1402 
1403                         -- update non-routine workorder id.
1404                         UPDATE AHL_WORKORDER_MTL_TXNS
1405                            SET NON_ROUTINE_WORKORDER_ID = l_x_sr_rec_tbl(j).Nonroutine_wo_id,
1406 			-- Adithya added for bug# 6995541
1407 			       CS_INCIDENT_ID           = l_x_sr_rec_tbl(j).Incident_id
1408                          WHERE WORKORDER_MTL_TXN_ID = l_sr_mtl_id_map_tbl(j);
1409                     END LOOP; -- l_x_sr_rec_tbl.FIRST
1410                 END IF;
1411             END; -- begin
1412         END IF; -- Second if stmt which checks the count of txns created.
1413 
1414         -- Fix for bug# 5501482.
1415         IF (p_x_ahl_mtltxn_tbl.COUNT > 0) THEN
1416 
1417           FOR i IN p_x_ahl_mtltxn_tbl.FIRST..p_x_ahl_mtltxn_tbl.LAST  LOOP
1418             IF (p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE AND
1419                 p_x_ahl_mtltxn_tbl(i).Condition = G_AHL_MRB_CONDITION AND
1420                 p_x_ahl_mtltxn_tbl(i).disposition_id IS NULL AND
1421                 p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id  IS NOT NULL AND FND_API.to_boolean( p_commit )) THEN
1422                     QA_SS_RESULTS.wrapper_fire_action
1423                     (
1424                       q_collection_id       => p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id,
1425                       q_return_status       => x_return_status,
1426                       q_msg_count           => x_msg_count,
1427                       q_msg_data            => x_msg_data
1428                     );
1429 
1430                     IF ( x_return_status = FND_API.G_RET_STS_ERROR ) THEN
1431                        IF ( x_msg_data IS NULL ) THEN
1432                           FND_MESSAGE.set_name( 'AHL', 'AHL_PRD_QA_ACTION_UNEXP_ERROR' );
1433                           FND_MSG_PUB.add;
1434                           RAISE FND_API.G_EXC_ERROR;
1435                        END IF;
1436                     ELSIF ( x_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
1437                        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1438                     END IF;
1439             END IF;
1440           END LOOP;
1441         END IF;
1442 
1443         -- Standard check of p_commit
1444         IF FND_API.To_Boolean(p_commit) THEN
1445             COMMIT WORK;
1446         END IF;
1447         x_return_status := FND_API.G_RET_STS_SUCCESS;
1448         dumpInput(p_x_ahl_mtltxn_tbl);
1449 
1450         -- call user hook api.
1451         -- User Hooks
1452         IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_MATERIAL_TXN_CUHK', 'PERFORM_MTLTXN_POST', 'A', 'C')) THEN
1453            Perform_MtlTxn_Post( p_ahl_mtltxn_tbl => p_x_ahl_mtltxn_tbl,
1454                                 x_msg_count => x_msg_count,
1455                                 x_msg_data => x_msg_data,
1456                                 x_return_status => x_return_status);
1457            IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1458              RAISE FND_API.G_EXC_ERROR;
1459            ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1460              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1461            END IF;
1462         END IF;
1463 
1464         -- Standard call to get message count and if count is 1, get message
1465         FND_MSG_PUB.Count_And_Get
1466             ( p_count => x_msg_count,
1467             p_data  => x_msg_data,
1468             p_encoded => fnd_api.g_false);
1469 
1470 --
1471     EXCEPTION
1472         WHEN FND_API.G_EXC_ERROR THEN
1473             x_return_status := FND_API.G_RET_STS_ERROR;
1474             --SHOW_MTX_ERRORS;
1475             Rollback to PERFORM_MTL_TXN_PVT;
1476             FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1477                     p_data  => x_msg_data,
1478                     p_encoded => fnd_api.g_false);
1479 
1480 
1481         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1482             --SHOW_MTX_ERRORS;
1483             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1484         Rollback to PERFORM_MTL_TXN_PVT;
1485             FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1486                     p_data  => x_msg_data,
1487                     p_encoded => fnd_api.g_false);
1488 
1489         WHEN OTHERS THEN
1490             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1491             --SHOW_MTX_ERRORS;
1492             Rollback to PERFORM_MTL_TXN_PVT;
1493             fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
1494                     p_procedure_name => 'Perform_Mtl_txn',
1495                     p_error_text     => SQLERRM);
1496             FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1497                     p_data  => x_msg_data,
1498                     p_encoded => fnd_api.g_false);
1499 
1500 END PERFORM_MTL_TXN;
1501 
1502 /**********************************************************
1503 This procedure will insert a record in the AHL_WO_MTL_TXNS table.
1504 **********************************************************/
1505 
1506 PROCEDURE Insert_Mtl_Txn_Row(
1507     p_x_ahl_mtltxn_rec          IN OUT NOCOPY Ahl_Mtltxn_Rec_Type,
1508     p_material_Transaction_Id   IN         NUMBER,
1509     p_nonroutine_workorder_Id   IN         NUMBER,
1510     p_prim_uom_qty              IN         NUMBER:=0,
1511     x_return_status             OUT NOCOPY        VARCHAR2,
1512     x_msg_count                 OUT NOCOPY        NUMBER,
1513     x_msg_data                  OUT NOCOPY        VARCHAR2,
1514     x_ahl_mtl_txn_id            OUT NOCOPY         NUMBER)
1515 IS
1516 l_x_row_id              VARCHAR2(240);
1517 l_quantity              NUMBER;
1518 BEGIN
1519 
1520         IF G_DEBUG='Y' THEN
1521           AHL_DEBUG_PUB.enable_debug;
1522           AHL_DEBUG_PUB.debug('Entered Insert_Mtl_Txn_Row, p_x_ahl_mtltxn_rec.Inventory_Item_Id='|| p_x_ahl_mtltxn_rec.Inventory_Item_Id);
1523           AHL_DEBUG_PUB.debug('Entered Insert_Mtl_Txn_Row, p_x_ahl_mtltxn_rec.Recepient_id='||p_x_ahl_mtltxn_rec.Recepient_id);
1524         END IF;
1525         AHL_WORKORDER_MTL_TXNS_PKG.INSERT_ROW(
1526                         X_ROWID                         => l_x_row_id,
1527                         X_WORKORDER_MTL_TXN_ID          => x_ahl_mtl_txn_id,
1528                         X_OBJECT_VERSION_NUMBER         => 1,
1529                         X_WORKORDER_OPERATION_ID        => p_x_ahl_mtltxn_rec.workorder_Operation_Id,
1530                         X_MATERIAL_TRANSACTION_ID       => p_material_Transaction_Id,
1531                         X_COLLECTION_ID                 => p_x_ahl_mtltxn_rec.Qa_Collection_Id,
1532                         X_STATUS_ID                     => p_x_ahl_mtltxn_rec.Condition,
1533                         X_NON_ROUTINE_WORKORDER_ID      => p_nonroutine_workorder_Id,
1534                         X_ORGANIZATION_ID               => p_x_ahl_mtltxn_rec.Organization_Id,
1535                         X_INVENTORY_ITEM_ID             => p_x_ahl_mtltxn_rec.Inventory_Item_Id,
1536                         X_REVISION                      => p_x_ahl_mtltxn_rec.Revision,
1537                         X_LOT_NUMBER                    => p_x_ahl_mtltxn_rec.Lot_Number,
1538                         X_SERIAL_NUMBER                 => p_x_ahl_mtltxn_rec.Serial_Number,
1539                         X_LOCATOR_ID                    => p_x_ahl_mtltxn_rec.Locator_Id,
1540                         X_SUBINVENTORY_CODE             => p_x_ahl_mtltxn_rec.Subinventory_Name,
1541                         X_QUANTITY                      => p_x_ahl_mtltxn_rec.Quantity,
1542                         X_TRANSACTION_TYPE_ID           => p_x_ahl_mtltxn_rec.Transaction_Type_Id,
1543                         X_UOM                           => p_x_ahl_mtltxn_rec.Uom,
1544                         X_RECEPIENT_ID                  => p_x_ahl_mtltxn_rec.Recepient_id,
1545                         X_PRIMARY_UOM_QUANTITY          => P_PRIM_UOM_QTY,
1546                         X_INSTANCE_ID                   => p_x_ahl_mtltxn_rec.Item_Instance_ID,
1547                         X_TRANSACTION_DATE              => p_x_ahl_mtltxn_rec.transaction_date,
1548                         X_ATTRIBUTE_CATEGORY            => NULL ,
1549                         X_ATTRIBUTE1                    => NULL ,
1550                         X_ATTRIBUTE2                    => NULL ,
1551                         X_ATTRIBUTE3                    => NULL ,
1552                         X_ATTRIBUTE4                    => NULL ,
1553                         X_ATTRIBUTE5                    => NULL ,
1554                         X_ATTRIBUTE6                    => NULL ,
1555                         X_ATTRIBUTE7                    => NULL ,
1556                         X_ATTRIBUTE8                    => NULL ,
1557                         X_ATTRIBUTE9                    => NULL ,
1558                         X_ATTRIBUTE10                   => NULL ,
1559                         X_ATTRIBUTE11                   => NULL ,
1560                         X_ATTRIBUTE12                   => NULL ,
1561                         X_ATTRIBUTE13                   => NULL ,
1562                         X_ATTRIBUTE14                   => NULL ,
1563                         X_ATTRIBUTE15                   => NULL ,
1564                         X_CREATION_DATE                 => SYSDATE,
1565                         X_CREATED_BY                    => FND_GLOBAL.USER_ID,
1566                         X_LAST_UPDATE_DATE              => SYSDATE,
1567                         X_LAST_UPDATED_BY               => FND_GLOBAL.USER_ID,
1568                         X_LAST_UPDATE_LOGIN             => FND_GLOBAL.LOGIN_ID);
1569 
1570             select AHL_WORKORDER_MTL_TXNS_S.currval into p_x_ahl_mtltxn_rec.Ahl_mtltxn_Id  from dual;
1571 --                      p_x_ahl_mtltxn_rec.Ahl_mtltxn_Id:=x_ahl_mtl_txn_id;
1572 
1573         IF G_DEBUG='Y' THEN
1574           AHL_DEBUG_PUB.debug('Entered p_x_ahl_mtltxn_rec.Ahl_mtltxn_Id='||p_x_ahl_mtltxn_rec.Ahl_mtltxn_Id);
1575         END IF;
1576 
1577 /*
1578 
1579 EXCEPTION
1580 WHEN OTHERS THEN
1581         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1582         IF G_DEBUG='Y'
1583         THEN
1584           AHL_DEBUG_PUB.debug('Exception inserting into mtl_txn' || SQLCODE);
1585           AHL_DEBUG_PUB.debug('SQLERRM:' || SQLERRM);
1586         END IF;
1587 
1588 */
1589 END Insert_Mtl_Txn_Row;
1590 /*******************************************************************
1591 This procedure will do all the validations requried for the matrial
1592 transaction record .
1593 *******************************************************************/
1594 
1595 
1596 PROCEDURE Validate_item_duplic
1597     (
1598                 p_ahl_mtltxn_rec       IN Ahl_Mtltxn_Rec_Type
1599     )
1600 IS
1601 CURSOR GET_WO_MTL_TXNS
1602 (C_WRK_ID           IN  NUMBER,
1603  C_INV_ITEM_ID      IN  NUMBER,
1604  C_REVISION         IN  VARCHAR2,
1605  C_SERIAL_NO        IN  VARCHAR2,
1606  C_WO_MTLTXN_ID     IN  NUMBER
1607 )
1608 IS
1609 SELECT COUNT(A.workorder_mtl_txn_id)
1610 FROM   AHL_WORKORDER_MTL_TXNS A,
1611        AHL_WORKORDER_OPERATIONS_V B,
1612        AHL_SCHEDULE_MATERIALS  C
1613 WHERE  B.WORKORDER_ID=C_WRK_ID
1614 AND    B.WORKORDER_OPERATION_ID=A.WORKORDER_OPERATION_ID
1615 AND    B.WORKORDER_OPERATION_ID=C.WORKORDER_OPERATION_ID
1616 AND    A.INVENTORY_ITEM_ID=C.INVENTORY_ITEM_ID
1617 AND    C.STATUS='ACTIVE'
1618 AND    A.INVENTORY_ITEM_ID=C_INV_ITEM_ID
1619 AND    A.SERIAL_NUMBER=C_SERIAL_NO
1620 AND    A.REVISION=C_REVISION
1621 AND    A.workorder_mtl_txn_id<>C_WO_MTLTXN_ID;
1622 L_COUNTER           NUMBER:=0;
1623 BEGIN
1624     OPEN  GET_WO_MTL_TXNS(p_ahl_mtltxn_rec.WORKORDER_ID,
1625                           p_ahl_mtltxn_rec.INVENTORY_ITEM_ID,
1626                           p_ahl_mtltxn_rec.REVISION,
1627                           p_ahl_mtltxn_rec.SERIAL_NUMBER,
1628                           p_ahl_mtltxn_rec.AHL_MTLTXN_ID
1629                           );
1630     FETCH GET_WO_MTL_TXNS INTO L_COUNTER;
1631     IF L_COUNTER >0
1632     THEN
1633             FND_MESSAGE.Set_Name('AHL','AHL_PRD_DUPLICATE_ITEM');
1634                         FND_MESSAGE.Set_Token('INV_ITEM',p_ahl_mtltxn_rec.INVENTORY_ITEM_SEGMENTS);
1635             FND_MSG_PUB.ADD;
1636     END IF;
1637     CLOSE GET_WO_MTL_TXNS;
1638 END;
1639 
1640 
1641 
1642 
1643 PROCEDURE Validate_Txn_Rec
1644     (
1645         p_x_ahl_mtltxn_rec   IN OUT NOCOPY Ahl_Mtltxn_Rec_Type,
1646         x_item_instance_id   OUT NOCOPY        NUMBER,
1647         x_eam_item_type_id   OUT NOCOPY        NUMBER,
1648         x_return_status      OUT NOCOPY           VARCHAR2,
1649         x_msg_count          OUT NOCOPY           NUMBER,
1650         x_msg_data           OUT NOCOPY           VARCHAR2
1651     )
1652 IS
1653 l_Count                 NUMBER;
1654 l_sql                   VARCHAR2(1024);
1655 l_serial_control        NUMBER;
1656 l_revision_control      NUMBER;
1657 l_lot_control           NUMBER;
1658 l_location_control      NUMBER;
1659 --l_wip_location          NUMBER;
1660 l_job_status            VARCHAR2(30);
1661 l_plan_id               NUMBER;
1662 l_return_status         VARCHAR2(10);
1663 l_msg_count             NUMBER;
1664 l_msg_data              VARCHAR2(240);
1665 
1666 l_lot_flag              BOOLEAN := FALSE;  -- indicator for lot.
1667 l_revision_flag         BOOLEAN := FALSE;  -- indicator for revision.
1668 
1669 --Query to get the Location_id
1670 -- R12: Fix for bug# 5221513
1671 -- IB team have asked us to remove the location validation to fix the issue.
1672 /*
1673 CURSOR CSI_LOCATION_CUR(p_org_id IN NUMBER) IS
1674 
1675     --SELECT WIP_LOCATION_ID
1676     --FROM CSI_INSTALL_PARAMETERS;
1677 
1678     SELECT location_id
1679     FROM hr_all_organization_units
1680     WHERE organization_id = p_org_id;
1681 */
1682 
1683 --Query to validate the instance for the job
1684 -- R12: Fix for bug# 5221513
1685 CURSOR CSI_SER_ITEM_CUR(p_item_id IN NUMBER,
1686                         p_job_id IN NUMBER,
1687                         p_serial_num IN VARCHAR2) IS
1688                         --p_wip_location NUMBER) IS  (fix for bug# 5221513).
1689     SELECT INSTANCE_ID
1690     FROM CSI_ITEM_INSTANCES CII
1691     WHERE INVENTORY_ITEM_ID       = p_item_id
1692     AND WIP_JOB_ID            = p_job_id
1693     AND SERIAL_NUMBER         = p_serial_num
1694     AND ACTIVE_START_DATE     <= SYSDATE
1695     AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE > SYSDATE))
1696     --AND LOCATION_TYPE_CODE = 'WIP'
1697     --AND LOCATION_ID = p_wip_location
1698     AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
1699         WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
1700               AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
1701               --AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE) AND NVL(ACTIVE_END_DATE,SYSDATE));
1702                 AND NVL(ACTIVE_START_DATE,SYSDATE) <= SYSDATE
1703                 AND SYSDATE < NVL(ACTIVE_END_DATE,SYSDATE+1));
1704 
1705 --fix for bug number 4089691 -- inserted by sikumar
1706 --Query to validate the instance for the job during issue if there is a serial number avaialble
1707 CURSOR CSI_ISSUE_SER_ITEM_CUR(p_item_id IN NUMBER,
1708                         p_serial_num IN VARCHAR2)IS
1709     SELECT INSTANCE_ID
1710     FROM CSI_ITEM_INSTANCES CII
1711     WHERE INVENTORY_ITEM_ID       = p_item_id
1712     AND SERIAL_NUMBER         = p_serial_num
1713     AND ACTIVE_START_DATE     <= SYSDATE
1714     AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE > SYSDATE))
1715     AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
1716         WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
1717               AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
1718               AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE) AND NVL(ACTIVE_END_DATE,SYSDATE));
1719 
1720 --Query to validate workorder operaiton id.
1721 CURSOR AHL_WORKORDER_OPER_CUR (p_wo_id NUMBER,p_op_seq NUMBER, p_woop_id IN NUMBER) IS
1722      SELECT 1
1723      FROM AHL_WORKORDER_OPERATIONS
1724      WHERE WORKORDER_OPERATION_ID =p_woop_id
1725      AND WORKORDER_ID =p_wo_id
1726      AND OPERATION_SEQUENCE_NUM = p_op_seq;
1727 
1728 -- Query to validate job id
1729 -- Added project and locator for ER# 5854712.
1730 CURSOR AHL_WIPJOB_CUR (p_org_id NUMBER, p_wo_id NUMBER, p_wipjob IN NUMBER) IS
1731      SELECT A.STATUS_CODE, C.Visit_id, C.Inv_Locator_Id, C.project_id, B.project_task_id,
1732      LOC.subinventory_code
1733      FROM AHL_WORKORDERS A, AHL_VISIT_TASKS_B B, AHL_VISITS_B C, MTL_ITEM_LOCATIONS LOC
1734      WHERE A.WIP_ENTITY_ID = p_wipjob
1735      AND A.WORKORDER_ID = p_wo_id
1736      AND B.VISIT_TASK_ID = A.VISIT_TASK_ID
1737      AND C.VISIT_ID = B.VISIT_ID
1738      AND C.ORGANIZATION_ID = p_org_id
1739      AND C.ORGANIZATION_ID = LOC.ORGANIZATION_ID(+)
1740      AND C.INV_LOCATOR_ID = LOC.INVENTORY_LOCATION_ID(+);
1741 
1742 -- Item id validation and selecting serial control code,lot control code values
1743 CURSOR AHL_ITEM_ID_CUR (p_org_id NUMBER, p_item NUMBER) IS
1744     SELECT SERIAL_NUMBER_CONTROL_CODE, LOT_CONTROL_CODE, REVISION_QTY_CONTROL_CODE,
1745            LOCATION_CONTROL_CODE,EAM_ITEM_TYPE, primary_uom_code, concatenated_segments
1746     FROM MTL_SYSTEM_ITEMS_kfv
1747     WHERE ORGANIZATION_ID = p_org_id
1748     AND INVENTORY_ITEM_ID = p_item
1749     AND ENABLED_FLAG = 'Y'
1750     AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
1751     AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));
1752 
1753  --Sub inventory Query
1754 CURSOR AHL_SUBINV_CUR (p_org_id NUMBER, p_subinv VARCHAR2) IS
1755     SELECT 1
1756     FROM MTL_SECONDARY_INVENTORIES
1757     WHERE ORGANIZATION_ID = p_org_id
1758     AND SECONDARY_INVENTORY_NAME  = p_subinv;
1759 
1760 -- Locator query
1761 CURSOR AHL_LOCATOR_CUR (p_org_id NUMBER, p_locator_id NUMBER, p_subinv VARCHAR2) IS
1762     SELECT 1
1763     FROM MTL_ITEM_LOCATIONS
1764     WHERE ORGANIZATION_ID = p_org_id
1765     AND INVENTORY_LOCATION_ID = p_locator_id
1766     ;--AND SUBINVENTORY_CODE = p_subinv;
1767 
1768 -- Revision query
1769 CURSOR AHL_REVISION_CUR (p_org_id NUMBER, p_item NUMBER, p_revision VARCHAR2) IS
1770     SELECT 1
1771     FROM MTL_ITEM_REVISIONS
1772     WHERE ORGANIZATION_ID = p_org_id
1773     AND INVENTORY_ITEM_ID = p_item
1774     AND REVISION = p_revision;
1775 
1776 -- Reason query
1777 CURSOR AHL_REASON_CUR (p_reason NUMBER) IS
1778     SELECT 1
1779     FROM MTL_TRANSACTION_REASONS
1780     WHERE REASON_ID = p_reason;
1781 
1782 -- Condition Validaiton
1783 CURSOR Condition_Cur(p_condition NUMBER) IS
1784     SELECT STATUS_ID
1785     FROM MTL_MATERIAL_STATUSES
1786     WHERE STATUS_ID = p_Condition;
1787 
1788 -- Query to Validate Problem Code
1789 CURSOR PROBLEM_CODE_LKUP_CUR (p_problem_code VARCHAR2) IS
1790 /* Tamal [R12 APPSPERF fixes]
1791  * R12 Drop 4 - SQL ID: 14399922
1792  * Bug #4918991
1793  */
1794 SELECT 1
1795 FROM FND_LOOKUP_VALUES FL
1796 WHERE
1797     FL.LOOKUP_TYPE = 'REQUEST_PROBLEM_CODE' AND
1798     FL.LOOKUP_CODE = p_problem_code AND
1799     FL.ENABLED_FLAG = 'Y' AND
1800     FL.LANGUAGE = USERENV('LANG') AND
1801     TRUNC(SYSDATE) BETWEEN TRUNC(NVL(FL.START_DATE_ACTIVE,SYSDATE)) AND TRUNC(NVL(FL.END_DATE_ACTIVE,SYSDATE)) AND
1802     (
1803         (
1804             NOT EXISTS
1805             (
1806                 SELECT 1
1807                 FROM CS_SR_PROB_CODE_MAPPING_DETAIL
1808                 WHERE
1809                     INCIDENT_TYPE_ID = FND_PROFILE.VALUE('AHL_PRD_SR_TYPE') AND
1810                     TRUNC(SYSDATE) BETWEEN TRUNC(NVL(START_DATE_ACTIVE,SYSDATE)) AND TRUNC(NVL(END_DATE_ACTIVE,SYSDATE))
1811             )
1812         )
1813         OR
1814         (
1815             EXISTS
1816             (
1817                 SELECT 1
1818                 FROM CS_SR_PROB_CODE_MAPPING_DETAIL
1819                 WHERE
1820                     INCIDENT_TYPE_ID = FND_PROFILE.VALUE('AHL_PRD_SR_TYPE') AND
1821                     PROBLEM_CODE = p_problem_code AND
1822                     TRUNC(SYSDATE) BETWEEN TRUNC(NVL(START_DATE_ACTIVE,SYSDATE)) AND TRUNC(NVL(END_DATE_ACTIVE,SYSDATE))
1823             )
1824         )
1825     );
1826 
1827 /*
1828 CURSOR TRANSACTION_DATE_CUR(C_WORKORDER_OPERATION_ID NUMBER,C_WORKORDER_ID NUMBER,C_INV_ITEM_ID NUMBER) IS
1829        SELECT A.scheduled_start_date
1830        FROM AHL_WORKORDER_OPERATIONS_V A ,AHL_SCHEDULE_MATERIALS B
1831        WHERE A.WORKORDER_OPERATION_ID=C_WORKORDER_OPERATION_ID
1832        AND   A.WORKORDER_ID=C_WORKORDER_ID
1833        AND  A.WORKORDER_OPERATION_ID=B.WORKORDER_OPERATION_ID
1834        AND  B.INVENTORY_ITEM_ID=C_INV_ITEM_ID
1835        AND  A.OPERATION_SEQUENCE_NUM=B.OPERATION_SEQUENCE;
1836 */
1837 
1838 CURSOR mtl_srl_num_csr(p_org_id In NUMBER,
1839                        p_inv_id IN NUMBER,
1840                        p_serial_number IN VARCHAR2) IS
1841    SELECT current_subinventory_code, current_locator_id
1842    FROM mtl_serial_numbers
1843    WHERE serial_number = p_serial_number
1844      AND current_organization_id = p_org_id
1845      AND inventory_item_id = p_inv_id
1846      AND current_status = 3;
1847 
1848 -- Default Subinventory.
1849 CURSOR wip_params_cur (p_org_id IN NUMBER) IS
1850    SELECT default_pull_supply_subinv, default_pull_supply_locator_id
1851    FROM wip_parameters
1852    WHERE organization_id = p_org_id;
1853 
1854  CURSOR workorder_released_date_csr(p_wip_entity_id IN NUMBER) IS
1855  SELECT DATE_RELEASED FROM WIP_DISCRETE_JOBS
1856  WHERE WIP_ENTITY_ID = p_wip_entity_id;
1857 
1858 -- Lot Number
1859 CURSOR mtl_lot_num_csr (p_org_id In NUMBER,
1860                         p_inventory_item_id IN NUMBER,
1861                         p_lot_number        IN VARCHAR2) IS
1862    SELECT 'x'
1863    FROM mtl_lot_numbers
1864    WHERE organization_id = p_org_id
1865      AND inventory_item_id = p_inventory_item_id
1866      AND lot_number = p_lot_number
1867      AND nvl(disable_flag,2) = 2;
1868 
1869 -- fix for bug# 5172147.
1870 -- check if disposition exists.
1871 -- commented out org_id to fix bug# 6120115.
1872 CURSOR disposition_cur (p_disposition_id in NUMBER,
1873                         p_workorder_id in NUMBER,
1874                         p_inventory_item_id IN NUMBER,
1875                         --p_org_id IN NUMBER,
1876                         p_serial_num IN VARCHAR2,
1877                         p_revision IN VARCHAR2,
1878                         p_lotNumber IN VARCHAR2) IS
1879 
1880 SELECT disposition_id
1881    FROM AHL_MTL_RET_DISPOSITIONS_V a
1882    WHERE WORKORDER_ID = p_workorder_id
1883    AND   a.disposition_id = p_disposition_id
1884    AND   INVENTORY_ITEM_ID = p_inventory_item_id
1885    --AND   ORGANIZATION_ID = p_org_id
1886    AND   nvl(SERIAL_NUMBER,'x')=NVL(p_serial_num,nvl(SERIAL_NUMBER,'x'))
1887    AND   nvl(LOT_NUMBER,'x')=NVL(p_lotNumber,nvl(lot_number,'x'))
1888    AND   nvl(ITEM_REVISION,'x')=NVL(p_revision,nvl(ITEM_REVISION,'x'));
1889    -- commented workorder_operation_id condition.
1890    -- disposition created against a material issue will not have this value
1891    -- populated.
1892    --AND   WORKORDER_OPERATION_ID is not null;
1893 
1894 -- Added for FP bug# 5903318.
1895 -- validate create_wo_option.
1896 CURSOR create_wo_cur(p_lookup_code IN VARCHAR2, p_lookup_type IN VARCHAR2) IS
1897    SELECT meaning
1898    FROM FND_LOOKUP_VALUES_VL
1899    WHERE lookup_type = p_lookup_type
1900      AND lookup_code = p_lookup_code
1901      AND ENABLED_FLAG = 'Y'
1902      AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
1903      AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));
1904 
1905  l_curr_subinventory_code       mtl_serial_numbers.current_subinventory_code%TYPE;
1906  l_curr_locator_id              NUMBER;
1907  l_primary_uom_code             mtl_system_items.primary_uom_code%TYPE;
1908  l_quantity                     NUMBER;
1909  l_concatenated_segments        mtl_system_items_kfv.concatenated_segments%TYPE;
1910  l_visit_id                     NUMBER;
1911  l_def_supply_subinv            wip_parameters.default_pull_supply_subinv%TYPE;
1912  l_def_supply_locator_id        NUMBER;
1913 
1914  L_SCHED_START_DATE             DATE;
1915 
1916  l_workorder_released_date      DATE;
1917 
1918  l_junk                         VARCHAR2(1);
1919  l_disposition_id               NUMBER;
1920 
1921  -- Added for FP bug# 5903318.
1922  l_fnd_meaning                  fnd_lookup_values_vl.meaning%TYPE;
1923 
1924  -- Added for ER# 5854712.
1925  l_inv_locator_id               NUMBER;
1926  l_project_id                   NUMBER;
1927  l_project_task_id              NUMBER;
1928  l_subinventory_code            mtl_item_locations.subinventory_code%TYPE;
1929  l_project_locator_id           NUMBER;
1930 
1931 
1932 BEGIN
1933 
1934         x_return_status := FND_API.G_RET_STS_SUCCESS;
1935 
1936         IF G_DEBUG='Y' THEN
1937                   AHL_DEBUG_PUB.enable_debug;
1938           AHL_DEBUG_PUB.debug('Ahl Validating TxnType...['||to_Char(p_x_ahl_mtltxn_rec.Transaction_Type_Id)||']');
1939         END IF;
1940 
1941         -- Validate transaction type id(should be one of wip conponent issue or return
1942         IF(p_x_ahl_mtltxn_rec.Transaction_Type_Id <> WIP_CONSTANTS.RETCOMP_TYPE AND
1943            p_x_ahl_mtltxn_rec.Transaction_Type_Id <> WIP_CONSTANTS.ISSCOMP_TYPE ) THEN
1944             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_TXNTYPE');
1945             FND_MSG_PUB.ADD;
1946             x_return_status := FND_API.G_RET_STS_ERROR;
1947         END IF;
1948         -- transaction quantity should be +ve always. Negative quantities are not
1949         -- supported currently.
1950         IF G_DEBUG='Y' THEN
1951           AHL_DEBUG_PUB.debug('Validating quantity...['||to_Char(p_x_ahl_mtltxn_rec.Quantity)||']');
1952         END IF;
1953 
1954         IF(nvl(p_x_ahl_mtltxn_rec.Quantity,0) <= 0) THEN
1955             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_QTY');
1956             FND_MESSAGE.Set_Token('QUANTITY',p_x_ahl_mtltxn_rec.Quantity);
1957             FND_MSG_PUB.ADD;
1958             x_return_status := FND_API.G_RET_STS_ERROR;
1959         END IF;
1960 
1961         IF G_DEBUG='Y' THEN
1962           AHL_DEBUG_PUB.debug('Validating Wip_Entity_id['
1963           ||to_char(p_x_ahl_mtltxn_rec.Organization_ID)||','
1964           ||to_Char(p_x_ahl_mtltxn_rec.Workorder_ID)
1965         ||','||to_Char(p_x_ahl_mtltxn_rec.Wip_Entity_Id)||']');
1966 
1967 
1968         END IF;
1969 
1970         -- Validate the Wip_job_id and workorder_operation_Id
1971         OPEN AHL_WIPJOB_CUR(p_x_ahl_mtltxn_rec.Organization_ID, p_x_ahl_mtltxn_rec.Workorder_ID, p_x_ahl_mtltxn_rec.Wip_Entity_Id);
1972         FETCH AHL_WIPJOB_CUR INTO l_job_status, l_visit_id, l_inv_locator_id,
1973                                   l_project_id, l_project_task_id, l_subinventory_code;
1974         IF(AHL_WIPJOB_CUR%NOTFOUND) THEN
1975             IF G_DEBUG='Y' THEN
1976                       AHL_DEBUG_PUB.debug('JOB validation failed');
1977             END IF;
1978             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WIP_ENTITY');
1979             if(p_x_ahl_mtltxn_rec.Wip_Entity_Id = FND_API.G_MISS_NUM) THEN
1980                 p_x_ahl_mtltxn_rec.Wip_Entity_Id := NULL;
1981             END IF;
1982             FND_MESSAGE.Set_Token('WIP_ENTITY',p_x_ahl_mtltxn_rec.Wip_Entity_Id);
1983             FND_MSG_PUB.ADD;
1984             x_return_status := FND_API.G_RET_STS_ERROR;
1985             CLOSE AHL_WIPJOB_CUR;
1986             RETURN;
1987         ELSE
1988             -- Assign visit ID to mtl_txn_rec.
1989             -- Added post 11.5.10.
1990             IF (p_x_ahl_mtltxn_rec.target_visit_id IS NULL OR
1991                 p_x_ahl_mtltxn_rec.target_visit_id = FND_API.G_MISS_NUM) THEN
1992                   p_x_ahl_mtltxn_rec.target_visit_id := l_visit_id;
1993             END IF;
1994                         --
1995 
1996             IF G_DEBUG='Y' THEN
1997                   AHL_DEBUG_PUB.debug('JOB validation success['||l_job_status||']');
1998             END IF;
1999             IF(l_job_status <> C_JOB_RELEASED
2000                            AND l_job_status <> C_JOB_PENDING_QA
2001                            AND l_job_status <> C_JOB_COMPLETE
2002                            AND l_job_status <> C_JOB_PARTS_HOLD) THEN
2003                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_JOB_STATUS');
2004                 FND_MESSAGE.Set_Token('STATUS',l_job_status);
2005                 FND_MSG_PUB.ADD;
2006                 x_return_status := FND_API.G_RET_STS_ERROR;
2007             END IF;
2008         END IF;
2009         CLOSE AHL_WIPJOB_CUR;
2010 
2011         IF G_DEBUG='Y' THEN
2012             AHL_DEBUG_PUB.debug('Validating Workorder operation Id ['||to_Char(p_x_ahl_mtltxn_rec.Workorder_ID)||','
2013             ||to_Char(p_x_ahl_mtltxn_rec.Operation_Seq_Num)||','||to_Char(p_x_ahl_mtltxn_rec.Workorder_Operation_Id)||']');
2014         END IF;
2015 
2016 
2017         -- Validate the Workorder Id and Operation Seq num
2018         OPEN AHL_WORKORDER_OPER_CUR(p_x_ahl_mtltxn_rec.Workorder_ID,
2019                             p_x_ahl_mtltxn_rec.Operation_Seq_Num,
2020                             p_x_ahl_mtltxn_rec.Workorder_Operation_Id);
2021         FETCH AHL_WORKORDER_OPER_CUR INTO l_Count;
2022         IF(AHL_WORKORDER_OPER_CUR%NOTFOUND) THEN
2023             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WORKORDER_OP');
2024             FND_MESSAGE.Set_Token('WO',p_x_ahl_mtltxn_rec.Workorder_Id);
2025             FND_MESSAGE.Set_Token('SEQ',p_x_ahl_mtltxn_rec.Operation_Seq_Num);
2026             FND_MESSAGE.Set_Token('OP',p_x_ahl_mtltxn_rec.Workorder_Operation_Id);
2027             FND_MSG_PUB.ADD;
2028             x_return_status := FND_API.G_RET_STS_ERROR;
2029         END IF;
2030         CLOSE AHL_WORKORDER_OPER_CUR;
2031 
2032         IF G_DEBUG='Y' THEN
2033           AHL_DEBUG_PUB.debug('Validating item_id['||to_Char(p_x_ahl_mtltxn_rec.Organization_ID)||','||to_Char(p_x_ahl_mtltxn_rec.Inventory_Item_Id)||']');
2034         END IF;
2035 
2036         If  p_x_ahl_mtltxn_rec.transaction_type_id= WIP_CONSTANTS.RETCOMP_TYPE
2037         and p_x_ahl_mtltxn_rec.Ahl_mtltxn_Id is null
2038         then
2039 
2040             Validate_item_duplic
2041             (
2042                 p_x_ahl_mtltxn_rec
2043             );
2044 
2045         End if;
2046 
2047 
2048        /*
2049         OPEN TRANSACTION_DATE_CUR(
2050                             p_x_ahl_mtltxn_rec.Workorder_Operation_Id,
2051                             p_x_ahl_mtltxn_rec.Workorder_ID,
2052                             p_x_ahl_mtltxn_rec.INVENTORY_ITEM_ID
2053                             );
2054         FETCH TRANSACTION_DATE_CUR INTO L_SCHED_START_DATE;
2055         IF  TRANSACTION_DATE_CUR%FOUND
2056         THEN
2057             IF  L_SCHED_START_DATE > p_x_ahl_mtltxn_rec.TRANSACTION_DATE
2058             THEN
2059                 FND_MESSAGE.Set_Name('AHL','AHL_COM_INVALID_TRANSACTION_DATE');
2060                 --FND_MESSAGE.Set_Token('FIELD',p_x_ahl_mtltxn_rec.Inventory_Item_Id);
2061                 FND_MSG_PUB.ADD;
2062 
2063             END IF;
2064         END IF;
2065         CLOSE TRANSACTION_DATE_CUR;
2066         */
2067 
2068 
2069     -- Validate Item id
2070     OPEN AHL_ITEM_ID_CUR(p_x_ahl_mtltxn_rec.Organization_ID,
2071                 p_x_ahl_mtltxn_rec.Inventory_Item_Id);
2072     FETCH AHL_ITEM_ID_CUR INTO l_serial_Control, l_lot_control, l_revision_control, l_location_control,
2073                            x_eam_item_type_id, l_primary_uom_code,
2074                                    l_concatenated_segments;
2075     IF(AHL_ITEM_ID_CUR%NOTFOUND) THEN
2076         FND_MESSAGE.Set_Name('AHL','AHL_COM_INVALID_ITEM');
2077         if(p_x_ahl_mtltxn_rec.Inventory_Item_Id = FND_API.G_MISS_NUM) THEN
2078             p_x_ahl_mtltxn_rec.Inventory_Item_Id := NULL;
2079         END IF;
2080         FND_MESSAGE.Set_Token('FIELD',p_x_ahl_mtltxn_rec.Inventory_Item_Id);
2081         FND_MSG_PUB.ADD;
2082         x_return_status := FND_API.G_RET_STS_ERROR;
2083         CLOSE AHL_ITEM_ID_CUR;
2084         -- Skip the rest of the validations.
2085         RETURN;
2086     END IF;
2087     CLOSE AHL_ITEM_ID_CUR;
2088 
2089 
2090     -- default project locator if move_to_project flag is checked.(ER 5854712).
2091     -- For return txns only.
2092     IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE)
2093         AND (p_x_ahl_mtltxn_rec.move_to_project_flag = 'Y') THEN
2094              IF (l_inv_locator_id IS NOT NULL) THEN
2095                  IF G_DEBUG='Y' THEN
2096                    AHL_DEBUG_PUB.debug('Defaulting from Visit Locator['||l_inv_locator_id||','|| l_project_id ||',' || l_project_task_id || ']');
2097                  END IF;
2098                  PJM_PROJECT_LOCATOR.Get_DefaultProjectLocator(
2099                          p_organization_id => p_x_ahl_mtltxn_rec.organization_id,
2100                          p_locator_id      => l_inv_locator_id,
2101                          p_project_id      => l_project_id,
2102                          p_task_id         => l_project_task_id,
2103                          p_project_locator_id => l_project_locator_id);
2104                  IF (l_project_locator_id IS NULL) THEN
2105                      FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOCATOR');
2106                      FND_MESSAGE.Set_Token('LOC',l_inv_locator_id);
2107                      FND_MSG_PUB.ADD;
2108                      RAISE FND_API.G_EXC_ERROR;
2109                  ELSE
2110                      p_x_ahl_mtltxn_rec.locator_id := l_project_locator_id;
2111                      p_x_ahl_mtltxn_rec.subinventory_name := l_subinventory_code;
2112                  END IF;
2113              ELSE
2114                -- move_to_project_flag error.
2115                FND_MESSAGE.Set_Name('AHL','AHL_PRD_MOVEPRJ_FLAG_INVALID');
2116                FND_MSG_PUB.ADD;
2117              END IF;
2118 
2119     END IF; -- p_x_ahl_mtltxn_rec.Locator_Id.move_to_project_flag = 'Y'
2120 
2121 
2122     -- Added Post 11.5.10: Default subinventory.
2123     --
2124     IF G_DEBUG='Y' THEN
2125       AHL_DEBUG_PUB.debug('Defaulting SubInv/Locator['||p_x_ahl_mtltxn_rec.Subinventory_Name||',' ||
2126              p_x_ahl_mtltxn_rec.Locator_id || ']');
2127         END IF;
2128         OPEN wip_params_cur(p_x_ahl_mtltxn_rec.Organization_ID);
2129         FETCH wip_params_cur INTO l_def_supply_subinv, l_def_supply_locator_id;
2130         IF (wip_params_cur%FOUND) THEN
2131            IF ((p_x_ahl_mtltxn_rec.Subinventory_Name IS NULL OR
2132                p_x_ahl_mtltxn_rec.Subinventory_Name = FND_API.G_MISS_CHAR) AND
2133               l_def_supply_subinv IS NOT NULL) THEN
2134               p_x_ahl_mtltxn_rec.Subinventory_Name := l_def_supply_subinv;
2135            END IF;
2136 
2137            -- Locator.
2138            -- Added check for ER 5854712 - support dynamic locator creation.
2139            -- default only when both locator ID and Segments are null.
2140            IF ((p_x_ahl_mtltxn_rec.Locator_id IS NULL OR
2141                p_x_ahl_mtltxn_rec.Locator_id = FND_API.G_MISS_NUM) AND
2142                (p_x_ahl_mtltxn_rec.Locator_Segments IS NULL OR
2143                 p_x_ahl_mtltxn_rec.Locator_Segments = FND_API.G_MISS_CHAR) AND
2144                l_def_supply_locator_id IS NOT NULL) THEN
2145               p_x_ahl_mtltxn_rec.Locator_id := l_def_supply_locator_id;
2146            END IF;
2147 
2148         END IF;
2149         CLOSE  wip_params_cur;
2150 
2151 
2152     IF G_DEBUG='Y' THEN
2153       AHL_DEBUG_PUB.debug('Validating serial num(control, srl_num)['||to_Char(l_serial_Control)||','||p_x_ahl_mtltxn_rec.Serial_Number||']');
2154         END IF;
2155 
2156     -- If the item is of serial controlled check if the serial numebr is null
2157     IF((p_x_ahl_mtltxn_rec.Serial_Number IS NULL
2158          OR p_x_ahl_mtltxn_rec.Serial_Number = FND_API.G_MISS_CHAR)
2159          AND (nvl(l_serial_Control,0) <> nvl(C_NO_SERIAL_CONTROL,0)) ) THEN
2160         FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_SRLNUM');
2161         FND_MESSAGE.Set_Token('SER',p_x_ahl_mtltxn_rec.Serial_Number);
2162         FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2163         FND_MSG_PUB.ADD;
2164         x_return_status := FND_API.G_RET_STS_ERROR;
2165     END IF;
2166 
2167     IF (p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL AND
2168          p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR AND
2169          nvl(l_serial_Control,1) = 1) THEN
2170         FND_MESSAGE.Set_Name('AHL','AHL_PRD_SRLNUM_NOTMAND');
2171         FND_MESSAGE.Set_Token('SER',p_x_ahl_mtltxn_rec.Serial_Number);
2172         FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2173         FND_MSG_PUB.ADD;
2174         x_return_status := FND_API.G_RET_STS_ERROR;
2175     END IF;
2176 
2177     -- Added for FP bug# 5903318.
2178     IF G_DEBUG='Y' THEN
2179       AHL_DEBUG_PUB.debug('Validating Create WO Option['||p_x_ahl_mtltxn_rec.create_wo_option ||']');
2180     END IF;
2181 
2182     -- Validate Create WO Option lookup code.
2183     IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
2184        IF (p_x_ahl_mtltxn_rec.create_wo_option IS NULL OR
2185            p_x_ahl_mtltxn_rec.create_wo_option = FND_API.G_MISS_CHAR) THEN
2186           IF (nvl(l_serial_Control,0) = C_NO_SERIAL_CONTROL) THEN
2187              p_x_ahl_mtltxn_rec.create_wo_option := 'CREATE_SR_NO';
2188           ELSE
2189              -- serialized.
2190              p_x_ahl_mtltxn_rec.create_wo_option := 'CREATE_WO_NO';
2191           END IF;
2192        ELSE
2193           -- validate lookup code.
2194           OPEN create_wo_cur(p_x_ahl_mtltxn_rec.create_wo_option, 'AHL_SR_WO_CREATE_OPTIONS');
2195           FETCH create_wo_cur INTO l_fnd_meaning;
2196           IF (create_wo_cur%NOTFOUND) THEN
2197              FND_MESSAGE.Set_Name('AHL','AHL_PRD_INV_LOOKUP');
2198              FND_MESSAGE.Set_Token('LCODE',p_x_ahl_mtltxn_rec.create_wo_option);
2199              FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2200              FND_MSG_PUB.ADD;
2201              x_return_status := FND_API.G_RET_STS_ERROR;
2202           END IF;
2203           CLOSE create_wo_cur;
2204        END IF;
2205 
2206        IF G_DEBUG='Y' THEN
2207          AHL_DEBUG_PUB.debug('After Defaulting Create WO Option['||p_x_ahl_mtltxn_rec.create_wo_option ||']');
2208        END IF;
2209 
2210        -- Check if create_wo_option is valid based on l_serial_Control.
2211        IF (nvl(l_serial_Control,0) = C_NO_SERIAL_CONTROL ) THEN
2212           -- non-serial.
2213           IF (p_x_ahl_mtltxn_rec.create_wo_option = 'CREATE_WO_NO') THEN
2214             FND_MESSAGE.Set_Name('AHL','AHL_PRD_NONSRL_WO_OPT');
2215             FND_MESSAGE.Set_Token('WO_OPT',l_fnd_meaning);
2216             FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2217             FND_MSG_PUB.ADD;
2218             x_return_status := FND_API.G_RET_STS_ERROR;
2219               END IF;
2220        END IF;
2221     END IF;
2222     -- End changes for FP bug# 5903318.
2223 
2224     IF G_DEBUG='Y' THEN
2225       AHL_DEBUG_PUB.debug('Validating lot num(control, srl_num)['||to_Char(l_lot_Control)||','||p_x_ahl_mtltxn_rec.serial_Number||']');
2226     END IF;
2227 
2228         -- If the item is of lot controlled check if the lot number is null
2229         IF((p_x_ahl_mtltxn_rec.Lot_Number IS NULL
2230              OR p_x_ahl_mtltxn_rec.Lot_Number = FND_API.G_MISS_CHAR)
2231              AND (l_lot_Control <> C_NO_LOT_CONTROL) ) THEN
2232             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOT');
2233             FND_MESSAGE.Set_Token('LOT',p_x_ahl_mtltxn_rec.Lot_Number);
2234                         FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2235             FND_MSG_PUB.ADD;
2236             x_return_status := FND_API.G_RET_STS_ERROR;
2237         END IF;
2238                 -- validate lot number.
2239                 IF ((p_x_ahl_mtltxn_rec.Lot_Number IS NOT NULL AND
2240                      p_x_ahl_mtltxn_rec.Lot_Number <> FND_API.G_MISS_CHAR)
2241                      AND (l_lot_Control <> C_NO_LOT_CONTROL) ) THEN
2242                    OPEN mtl_lot_num_csr(p_x_ahl_mtltxn_rec.organization_id,
2243                         p_x_ahl_mtltxn_rec.inventory_item_id,
2244                         p_x_ahl_mtltxn_rec.Lot_Number);
2245                    FETCH mtl_lot_num_csr INTO l_junk;
2246                    IF (mtl_lot_num_csr%NOTFOUND) THEN
2247                      FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOT');
2248                      FND_MESSAGE.Set_Token('LOT',p_x_ahl_mtltxn_rec.Lot_Number);
2249                      FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2250                      FND_MSG_PUB.ADD;
2251                      x_return_status := FND_API.G_RET_STS_ERROR;
2252                    END IF;
2253                    CLOSE mtl_lot_num_csr;
2254                 END IF;
2255 
2256                 -- raise error if item is not lot controlled.
2257                 IF ((p_x_ahl_mtltxn_rec.Lot_Number IS NOT NULL AND
2258                      p_x_ahl_mtltxn_rec.Lot_Number <> FND_API.G_MISS_CHAR)
2259                      AND (l_lot_Control = C_NO_LOT_CONTROL) ) THEN
2260                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_LOT_NOTNULL');
2261                         FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2262                         FND_MSG_PUB.ADD;
2263                         x_return_status := FND_API.G_RET_STS_ERROR;
2264                 END IF;
2265 
2266         -- If the locator controlled is true at the item level or sub inventory level
2267         -- check if the locator id is given or not.
2268         /****************************************************************
2269          This vlaidation happens in the MTL API, so we do not need it here
2270 
2271         IF G_DEBUG='Y' THEN
2272           AHL_DEBUG_PUB.debug('Validating locator(control, srl_num)['||to_Char(l_location_Control)||','||to_Char(p_x_ahl_mtltxn_rec.Locator_Id)||']');
2273 
2274     END IF;
2275 
2276         IF(p_x_ahl_mtltxn_rec.Locator_Id IS NULL
2277              OR p_x_ahl_mtltxn_rec.Locator_Id = FND_API.G_MISS_NUM) THEN
2278             IF (l_location_Control <> C_NO_LOCATOR_CONTROL) THEN
2279                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOCATOR');
2280                 if(p_x_ahl_mtltxn_rec.Locator_Id = FND_API.G_MISS_NUM) THEN
2281                     p_x_ahl_mtltxn_rec.Locator_Id := NULL;
2282                 END IF;
2283                 FND_MESSAGE.Set_Token('LOC',p_x_ahl_mtltxn_rec.Locator_Id);
2284                 FND_MSG_PUB.ADD;
2285                 x_return_status := FND_API.G_RET_STS_ERROR;
2286             END IF;
2287         ELSE
2288         ****************************************************************/
2289                 IF (p_x_ahl_mtltxn_rec.Locator_Id IS NOT NULL AND
2290                     p_x_ahl_mtltxn_rec.Locator_Id <> FND_API.G_MISS_NUM) THEN
2291             OPEN AHL_LOCATOR_CUR(p_x_ahl_mtltxn_rec.Organization_ID,
2292                                 p_x_ahl_mtltxn_rec.Locator_Id,
2293                                 p_x_ahl_mtltxn_rec.Subinventory_Name);
2294             FETCH AHL_LOCATOR_CUR INTO l_Count;
2295             IF(AHL_LOCATOR_CUR%NOTFOUND) THEN
2296                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOCATOR');
2297                 if(p_x_ahl_mtltxn_rec.Locator_Id = FND_API.G_MISS_NUM) THEN
2298                     p_x_ahl_mtltxn_rec.Locator_Id := NULL;
2299                 END IF;
2300                 FND_MESSAGE.Set_Token('LOC',p_x_ahl_mtltxn_rec.Locator_Id);
2301                 FND_MSG_PUB.ADD;
2302                 x_return_status := FND_API.G_RET_STS_ERROR;
2303             END IF;
2304             CLOSE AHL_LOCATOR_CUR;
2305         END IF;
2306 
2307         IF G_DEBUG='Y' THEN
2308           AHL_DEBUG_PUB.debug('Validating revision['||p_x_ahl_mtltxn_rec.Revision||']');
2309                 END IF;
2310 
2311         -- Tamal: Bug #4091154: Begin
2312         -- If item is revision-controlled, then verify revision is NOT NULL and is valid
2313         -- If item is not revision-controlled, then verify revision is NULL
2314         IF (nvl(l_revision_control, -1) = 2)
2315         THEN
2316             IF (p_x_ahl_mtltxn_rec.Revision IS NULL OR p_x_ahl_mtltxn_rec.Revision = FND_API.G_MISS_CHAR)
2317             THEN
2318             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_REVISION');
2319             FND_MESSAGE.Set_Token('REVISION',p_x_ahl_mtltxn_rec.Revision);
2320             FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2321             FND_MSG_PUB.ADD;
2322             x_return_status := FND_API.G_RET_STS_ERROR;
2323             ELSE
2324             OPEN AHL_REVISION_CUR
2325             (
2326                 p_x_ahl_mtltxn_rec.Organization_ID,
2327                 p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2328                 p_x_ahl_mtltxn_rec.Revision
2329             );
2330             FETCH AHL_REVISION_CUR INTO l_Count;
2331             IF (AHL_REVISION_CUR%NOTFOUND)
2332             THEN
2333                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_REVISION');
2334                         FND_MESSAGE.Set_Token('REVISION',p_x_ahl_mtltxn_rec.Revision);
2335                 FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2336                         FND_MSG_PUB.ADD;
2337                         x_return_status := FND_API.G_RET_STS_ERROR;
2338             END IF;
2339             CLOSE AHL_REVISION_CUR;
2340             END IF;
2341         ELSE
2342             IF (p_x_ahl_mtltxn_rec.Revision IS NOT NULL AND p_x_ahl_mtltxn_rec.Revision <> FND_API.G_MISS_CHAR)
2343             THEN
2344             FND_MESSAGE.Set_Name('AHL','AHL_PRD_REVNUM_NOTMAND');
2345             FND_MESSAGE.Set_Token('REV',p_x_ahl_mtltxn_rec.Revision);
2346             FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2347             FND_MSG_PUB.ADD;
2348             x_return_status := FND_API.G_RET_STS_ERROR;
2349             END IF;
2350         END IF;
2351             -- Tamal: Bug #4091154: End
2352 
2353         --Reason should be valid
2354         IF(p_x_ahl_mtltxn_rec.Reason_Id IS NOT NULL AND
2355             p_x_ahl_mtltxn_rec.Reason_Id <> FND_API.G_MISS_NUM) THEN
2356             OPEN AHL_REASON_CUR(p_x_ahl_mtltxn_rec.Reason_Id);
2357             FETCH AHL_REASON_CUR INTO l_Count;
2358             IF(AHL_REASON_CUR%NOTFOUND) THEN
2359                FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVLD_REASON');
2360                FND_MESSAGE.Set_Token('REASON',p_x_ahl_mtltxn_rec.Revision);
2361                FND_MSG_PUB.ADD;
2362                x_return_status := FND_API.G_RET_STS_ERROR;
2363             END IF;
2364             CLOSE AHL_REASON_CUR;
2365         END IF;
2366 
2367         IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
2368             --Condition Validation
2369             OPEN Condition_Cur(p_x_ahl_mtltxn_rec.Condition);
2370             FETCH Condition_Cur INTO l_Count;
2371             IF(Condition_Cur%NOTFOUND) THEN
2372                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_COND_INVALID');
2373                 if(p_x_ahl_mtltxn_rec.Condition = FND_API.G_MISS_NUM) THEN
2374                     p_x_ahl_mtltxn_rec.Condition := NULL;
2375                 END IF;
2376                 FND_MESSAGE.Set_Token('CODE',p_x_ahl_mtltxn_rec.Condition);
2377                 FND_MSG_PUB.ADD;
2378                 x_return_status := FND_API.G_RET_STS_ERROR;
2379             END IF;
2380             CLOSE Condition_Cur;
2381 
2382             IF G_DEBUG='Y' THEN
2383                  AHL_DEBUG_PUB.debug('Validating Condition/Subinv['||p_x_ahl_mtltxn_rec.Condition||','||p_x_ahl_mtltxn_rec.Subinventory_Name||']');
2384                 END IF;
2385 
2386             -- Check if the Condition matches the Sub inventory status
2387             -- in case of unserviceable and MRB
2388             AHL_PRD_UTIL_PKG.Validate_Material_Status(p_x_ahl_mtltxn_rec.Organization_Id,
2389                                      p_x_ahl_mtltxn_rec.Subinventory_Name,
2390                                      p_x_ahl_mtltxn_rec.Condition,
2391                                      l_return_Status);
2392                         IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
2393                           x_return_status := FND_API.G_RET_STS_ERROR;
2394                         END IF;
2395 
2396         ELSE
2397             IF G_DEBUG='Y' THEN
2398                    AHL_DEBUG_PUB.debug('Validating Subinv['||p_x_ahl_mtltxn_rec.Subinventory_Name||']');
2399                     END IF;
2400 
2401             -- Sub inventory  validation
2402             AHL_PRD_UTIL_PKG.Validate_Material_Status(p_x_ahl_mtltxn_rec.Organization_Id,
2403                                      p_x_ahl_mtltxn_rec.Subinventory_Name,
2404                                      NULL,
2405                                      l_return_Status);
2406             IF G_DEBUG='Y' THEN
2407                 AHL_DEBUG_PUB.debug('After Validating Subinv['||p_x_ahl_mtltxn_rec.Subinventory_Name||','||x_return_Status || ']');
2408                         END IF;
2409 
2410                         IF (l_return_Status <>  FND_API.G_RET_STS_SUCCESS) THEN
2411                           x_return_status := FND_API.G_RET_STS_ERROR;
2412                         END IF;
2413         END IF;
2414 
2415          --If the Transaction_type_id is WIP RETURN
2416     IF (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.RETCOMP_TYPE) THEN
2417 
2418 
2419              --If the item is trackkable check if the parent item
2420              --exists for the item, if exists return error : AHL_MTL_TXN_NOT_ALLOWED
2421 
2422             IF (Is_Item_Trackable(p_x_ahl_mtltxn_rec.Organization_Id,
2423                                         p_x_ahl_mtltxn_rec.Inventory_Item_Id)) THEN
2424 
2425                     IF G_DEBUG='Y' THEN
2426                       AHL_DEBUG_PUB.debug('selecting wip location id..');
2427                     END IF;
2428                     -- R12: Fix for bug# 5221513
2429                     -- IB team have asked us to remove the location validation to fix the issue.
2430                     /*
2431                     OPEN CSI_LOCATION_CUR(p_x_ahl_mtltxn_rec.Organization_Id);
2432                     FETCH CSI_LOCATION_CUR INTO l_wip_location;
2433                     IF(CSI_LOCATION_CUR%NOTFOUND) THEN
2434                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_CSI_INSTALL_ERROR');
2435                         FND_MSG_PUB.ADD;
2436                         x_return_status := FND_API.G_RET_STS_ERROR;
2437                     END IF;
2438                     CLOSE CSI_LOCATION_CUR;
2439                     IF G_DEBUG='Y' THEN
2440                       AHL_DEBUG_PUB.debug('wip location id['||to_char(l_wip_location)||']');
2441                     END IF;
2442                     */
2443 
2444                    IF (p_x_ahl_mtltxn_rec.Serial_Number IS NULL
2445                         OR p_x_ahl_mtltxn_rec.Serial_Number = FND_API.G_MISS_CHAR) THEN
2446 
2447                            -- Non serialized item:
2448 
2449                            l_sql := 'SELECT INSTANCE_ID FROM CSI_ITEM_INSTANCES CII ';
2450                            l_sql := l_sql || ' WHERE 1=1';
2451                            --l_sql := l_Sql || ' AND INV_MASTER_ORGANIZATION_ID=:b1';
2452                            l_sql := l_sql || ' AND INVENTORY_ITEM_ID =:b2' ;
2453                            l_sql := l_sql || ' AND WIP_JOB_ID=:b3';
2454                            --l_sql := l_sql || ' AND INV_SUBINVENTORY_NAME=:b4' ;
2455                            -- commenting our location check to fix bug# 5221513.
2456                            --l_sql := l_sql || ' AND LOCATION_TYPE_CODE=''WIP''' ;
2457                            --l_sql := l_sql || ' AND LOCATION_ID=:b7 ';
2458                            -- Fix for bug# 4074091. -- ORA-1422 error.
2459                            l_sql := l_sql || ' AND ROWNUM < 2 ';
2460                            -- End changes for bug fix.
2461 
2462                            l_sql := l_sql || ' AND ACTIVE_START_DATE <=SYSDATE ';
2463                            l_sql := l_sql || ' AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE>SYSDATE))';
2464                            l_sql := l_sql || ' AND NOT EXISTS (SELECT null FROM CSI_II_RELATIONSHIPS CIR ';
2465                            l_sql := l_sql || ' WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID ';
2466                            l_sql := l_sql || ' AND CIR.RELATIONSHIP_TYPE_CODE = ''COMPONENT-OF''';
2467                            l_sql := l_sql || ' AND ((CIR.ACTIVE_START_DATE IS NULL) OR (CIR.ACTIVE_START_DATE <= SYSDATE))';
2468                            l_sql := l_sql || ' AND ((CIR.ACTIVE_END_DATE IS NULL) OR (CIR.ACTIVE_END_DATE > SYSDATE)) )';
2469 
2470                            IF(p_x_ahl_mtltxn_rec.Revision IS NOT NULL
2471                                 AND p_x_ahl_mtltxn_rec.Revision <> FND_API.G_MISS_CHAR) THEN
2472                                   --l_sql := l_sql || ' AND INVENTORY_REVISION='''||p_x_ahl_mtltxn_rec.Revision||'''';
2473                                   l_sql := l_sql || ' AND INVENTORY_REVISION=:b5';
2474                                                   l_revision_flag := TRUE;
2475                            END IF;
2476                            IF(p_x_ahl_mtltxn_rec.Lot_Number IS NOT NULL
2477                                 AND p_x_ahl_mtltxn_rec.Lot_Number <> FND_API.G_MISS_CHAR) THEN
2478                                   --l_sql := l_sql || ' AND LOT_NUMBER='''||p_x_ahl_mtltxn_rec.Lot_Number||'''';
2479                                   l_sql := l_sql || ' AND LOT_NUMBER=:b6';
2480                                                   l_lot_flag := TRUE;
2481                            END IF;
2482 
2483                            BEGIN
2484                             IF G_DEBUG='Y' THEN
2485                                 AHL_DEBUG_PUB.debug('Validating instance:item/wipjob/subinv['
2486                                        ||to_Char(p_x_ahl_mtltxn_rec.Inventory_Item_Id)||','
2487                                        ||to_Char(p_x_ahl_mtltxn_rec.Wip_Entity_Id)||']');
2488 
2489                                 AHL_DEBUG_PUB.debug('['||p_x_ahl_mtltxn_rec.Subinventory_Name||']');
2490                                 AHL_DEBUG_PUB.debug('[Length of sql string:'||length(l_sql)||']');
2491                                 AHL_DEBUG_PUB.debug('[1:'||substr(l_sql,1,240)||']');
2492                                 AHL_DEBUG_PUB.debug('[2:'||substr(l_sql,241,240)||']');
2493                                 AHL_DEBUG_PUB.debug('[3:'||substr(l_sql,481,240)||']');
2494                             END IF;
2495                             -- R12: Fix for bug# 5221513
2496                             -- remove WIP location validation.
2497                             IF (l_revision_flag = TRUE) AND (l_lot_flag = TRUE)
2498                             THEN
2499                                EXECUTE IMMEDIATE l_sql INTO x_Item_Instance_Id
2500                                          USING --p_x_ahl_mtltxn_rec.Organization_Id,
2501                                     p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2502                                     p_x_ahl_mtltxn_rec.Wip_Entity_Id,
2503                                     --, p_x_ahl_mtltxn_rec.Subinventory_Name,
2504                                     --l_wip_location,
2505                                     p_x_ahl_mtltxn_rec.Revision,
2506                                     p_x_ahl_mtltxn_rec.Lot_Number;
2507                             ELSIF (l_revision_flag = TRUE) THEN
2508                                EXECUTE IMMEDIATE l_sql INTO x_Item_Instance_Id
2509                                          USING --p_x_ahl_mtltxn_rec.Organization_Id,
2510                                     p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2511                                     p_x_ahl_mtltxn_rec.Wip_Entity_Id,
2512                                     --, p_x_ahl_mtltxn_rec.Subinventory_Name,
2513                                     --l_wip_location,
2514                                     p_x_ahl_mtltxn_rec.Revision;
2515                             ELSIF (l_lot_flag = TRUE) THEN
2516                                EXECUTE IMMEDIATE l_sql INTO x_Item_Instance_Id
2517                                          USING --p_x_ahl_mtltxn_rec.Organization_Id,
2518                                     p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2519                                     p_x_ahl_mtltxn_rec.Wip_Entity_Id,
2520                                     --, p_x_ahl_mtltxn_rec.Subinventory_Name,
2521                                     --l_wip_location,
2522                                     p_x_ahl_mtltxn_rec.Lot_Number;
2523                             ELSE
2524                                  EXECUTE IMMEDIATE l_sql INTO x_Item_Instance_Id
2525                                  USING --p_x_ahl_mtltxn_rec.Organization_Id,
2526                                     p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2527                                     p_x_ahl_mtltxn_rec.Wip_Entity_Id;
2528                                     --l_wip_location;
2529                                     --, p_x_ahl_mtltxn_rec.Subinventory_Name;
2530                                END IF;
2531                            EXCEPTION
2532                               WHEN NO_DATA_FOUND THEN
2533                                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTL_TXN_NOT_ALLOWED');
2534                                 FND_MSG_PUB.ADD;
2535                                 x_return_status := FND_API.G_RET_STS_ERROR;
2536                            END;
2537       p_x_ahl_mtltxn_rec.Item_Instance_ID := x_Item_Instance_Id;
2538 
2539       ELSE
2540                            -- Serialized item...
2541 
2542        IF G_DEBUG='Y' THEN
2543           AHL_DEBUG_PUB.debug('Validating instance:item/wipjob/srl['||to_Char(p_x_ahl_mtltxn_rec.Inventory_Item_Id)||','
2544            ||to_Char(p_x_ahl_mtltxn_rec.Wip_Entity_Id)||','
2545           ||p_x_ahl_mtltxn_rec.Serial_Number||']');
2546        END IF;
2547 
2548        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
2549          fnd_log.string
2550          (
2551                 fnd_log.level_statement,
2552                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2553                 'p_x_ahl_mtltxn_rec.Inventory_Item_Id : ' || p_x_ahl_mtltxn_rec.Inventory_Item_Id
2554          );
2555          fnd_log.string
2556          (
2557                 fnd_log.level_statement,
2558                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2559                 'p_x_ahl_mtltxn_rec.Wip_Entity_Id : ' || p_x_ahl_mtltxn_rec.Wip_Entity_Id
2560          );
2561          fnd_log.string
2562          (
2563                 fnd_log.level_statement,
2564                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2565                 'p_x_ahl_mtltxn_rec.Serial_Number : ' || p_x_ahl_mtltxn_rec.Serial_Number
2566          );
2567          /*
2568          fnd_log.string
2569          (
2570                 fnd_log.level_statement,
2571                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2572                 'l_wip_location : ' || l_wip_location
2573          );*/
2574        END IF;
2575 
2576          OPEN CSI_SER_ITEM_CUR( p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2577                                                   p_x_ahl_mtltxn_rec.Wip_Entity_Id,
2578                                                   p_x_ahl_mtltxn_rec.Serial_Number);
2579                                                   --l_wip_location);
2580        FETCH CSI_SER_ITEM_CUR INTO x_Item_Instance_Id;
2581        IF(CSI_SER_ITEM_CUR%NOTFOUND) THEN
2582                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTL_TXN_NOT_ALLOWED');
2583                 FND_MSG_PUB.ADD;
2584                 x_return_status := FND_API.G_RET_STS_ERROR;
2585          END IF;
2586        CLOSE CSI_SER_ITEM_CUR;
2587          p_x_ahl_mtltxn_rec.Item_Instance_ID := x_Item_Instance_Id;
2588       END IF;
2589 
2590 
2591                 --If the 'Condition' is MRB and the QA_COLLECTION_ID is null return
2592                 --the Error AHL_NO_QA_RESULTS
2593                 --only in case the return is not tied to a disposition.
2594 
2595                 IF (p_x_ahl_mtltxn_rec.Condition = G_AHL_MRB_CONDITION AND
2596                     p_x_ahl_mtltxn_rec.disposition_id IS NULL) THEN
2597 
2598                     AHL_QA_RESULTS_PVT.get_qa_plan
2599                         (
2600                            p_api_version   => 1.0,
2601                            p_init_msg_list => FND_API.G_False,
2602                            p_commit => FND_API.G_FALSE,
2603                            p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2604                            p_default => FND_API.G_FALSE,
2605                            p_module_type => 'JSP',
2606                            p_organization_id => p_x_ahl_mtltxn_rec.Organization_Id,
2607                            p_transaction_number => 2004,
2608                            p_col_trigger_value => fnd_profile.value('AHL_MRB_DISP_PLAN_TYPE'),
2609                            x_return_status => l_return_status,
2610                            x_msg_count => l_msg_count,
2611                            x_msg_data => l_msg_data,
2612                            x_plan_id  => l_plan_id
2613                          );
2614                     IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2615                          l_plan_id := null;
2616                     END If;
2617 
2618                     IF ((l_plan_id is not null) AND
2619                         (p_x_ahl_mtltxn_rec.Qa_Collection_Id = FND_API.G_MISS_NUM OR
2620                           p_x_ahl_mtltxn_rec.Qa_Collection_Id IS NULL)) THEN
2621                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_NO_QA_RESULTS');
2622                         FND_MSG_PUB.ADD;
2623                         x_return_status := FND_API.G_RET_STS_ERROR;
2624                     END IF;
2625                 END IF;
2626 
2627                 IF(p_x_ahl_mtltxn_rec.Problem_Code IS NOT NULL
2628                    AND p_x_ahl_mtltxn_rec.Problem_Code <> FND_API.G_MISS_CHAR) THEN
2629 
2630                     IF G_DEBUG='Y' THEN
2631                        AHL_DEBUG_PUB.debug('Validating problem code['||p_x_ahl_mtltxn_rec.Problem_Code||']');
2632                     END IF;
2633 
2634                     OPEN PROBLEM_CODE_LKUP_CUR(p_x_ahl_mtltxn_rec.Problem_Code) ;
2635                     FETCH PROBLEM_CODE_LKUP_CUR INTO l_count;
2636                     IF(PROBLEM_CODE_LKUP_CUR%NOTFOUND) THEN
2637                         FND_MESSAGE.Set_Name('AHL','AHL_PRD_PROBLEM_CODE_INVALID');
2638                         FND_MESSAGE.Set_Token('CODE',p_x_ahl_mtltxn_rec.Problem_Code);
2639                         FND_MSG_PUB.ADD;
2640                         x_return_status := FND_API.G_RET_STS_ERROR;
2641                     END IF;
2642                     CLOSE PROBLEM_CODE_LKUP_CUR;
2643                 END IF;
2644 
2645             END IF; -- End of If for trackkable item check
2646     ELSE -- if it is a material issue
2647         -- find out instance id if possible : here (fix for bug number 4089691)
2648         -- Added trackable item check to fix bug# 6331012.
2649         IF (p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL
2650             AND p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR
2651             AND Is_Item_Trackable(p_x_ahl_mtltxn_rec.Organization_Id,
2652                                   p_x_ahl_mtltxn_rec.Inventory_Item_Id)) THEN
2653              OPEN CSI_ISSUE_SER_ITEM_CUR( p_x_ahl_mtltxn_rec.Inventory_Item_Id,p_x_ahl_mtltxn_rec.Serial_Number );
2654              FETCH CSI_ISSUE_SER_ITEM_CUR INTO  p_x_ahl_mtltxn_rec.Item_Instance_ID;
2655              IF(CSI_ISSUE_SER_ITEM_CUR%NOTFOUND) THEN
2656                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTL_TXN_NOT_ALLOWED');
2657                 FND_MSG_PUB.ADD;
2658                 x_return_status := FND_API.G_RET_STS_ERROR;
2659              END IF;
2660              CLOSE CSI_ISSUE_SER_ITEM_CUR;
2661         END IF;
2662     END IF; -- End of IF for WIP Return Check.
2663 
2664 
2665         --If the serial number is not null and the quantity is <>1  return the
2666         --Error AHL_INVALID_SRL_QTY
2667 
2668             IF G_DEBUG='Y' THEN
2669           AHL_DEBUG_PUB.debug('Validating serial num/qty['||p_x_ahl_mtltxn_rec.quantity||']');
2670                 END IF;
2671 
2672         IF ((p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR) AND
2673             (p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL) AND
2674                      nvl(l_serial_Control,1) <> 1)  THEN
2675                    IF (p_x_ahl_mtltxn_rec.uom IS NOT NULL AND
2676                        p_x_ahl_mtltxn_rec.uom <> l_primary_uom_code) THEN
2677                          -- convert qty to primary quantity.
2678                          l_quantity := inv_convert.inv_um_convert
2679                               (item_id        => p_x_ahl_mtltxn_rec.Inventory_Item_Id,
2680                                precision      => 6,
2681                                from_quantity  => p_x_ahl_mtltxn_rec.Quantity,
2682                                from_unit      => p_x_ahl_mtltxn_rec.uom,
2683                                to_unit        => l_primary_uom_code,
2684                                from_name      => NULL,
2685                                to_name        => NULL );
2686 
2687                          IF (l_quantity <> 1) THEN
2688                             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_ITEM_QTY');
2689                             FND_MESSAGE.Set_Token('PRIM_UOM',l_primary_uom_code);
2690                             FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2691                             FND_MSG_PUB.ADD;
2692                             x_return_status := FND_API.G_RET_STS_ERROR;
2693                          END IF;
2694                    ELSE
2695                      -- qty in primary uom.
2696              IF (p_x_ahl_mtltxn_rec.Quantity <> 1) THEN
2697             FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_ITEM_QTY');
2698                         FND_MESSAGE.Set_Token('PRIM_UOM',l_primary_uom_code);
2699                         FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2700             FND_MSG_PUB.ADD;
2701             x_return_status := FND_API.G_RET_STS_ERROR;
2702                      END IF;
2703                    END IF; -- uom code.
2704         END IF; -- serial num.
2705 
2706             IF G_DEBUG='Y' THEN
2707           AHL_DEBUG_PUB.debug('Validating serial subinv, loc['||p_x_ahl_mtltxn_rec.Serial_Number||']');
2708                 END IF;
2709 
2710                 -- For issue txn with serial number, validate if subinventory and locator match
2711                 -- that from mtl_serial_numbers.
2712                 IF (p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL) AND
2713                    (p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR) AND
2714                    (nvl(l_serial_Control,0) <> 1) AND
2715                    (p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.ISSCOMP_TYPE) THEN
2716                    OPEN mtl_srl_num_csr(p_x_ahl_mtltxn_rec.Organization_ID,
2717                                         p_x_ahl_mtltxn_rec.Inventory_Item_id,
2718                                         p_x_ahl_mtltxn_rec.Serial_Number);
2719                    FETCH mtl_srl_num_csr INTO l_curr_subinventory_code, l_curr_locator_id;
2720                    IF (mtl_srl_num_csr%FOUND) THEN
2721 
2722                  IF G_DEBUG='Y' THEN
2723                 AHL_DEBUG_PUB.debug('Validating serial subinv['||p_x_ahl_mtltxn_rec.subinventory_Name||']');
2724                      END IF;
2725 
2726                      IF (p_x_ahl_mtltxn_rec.subinventory_Name IS NOT NULL AND
2727                          p_x_ahl_mtltxn_rec.subinventory_Name <> FND_API.G_MISS_CHAR AND
2728                          p_x_ahl_mtltxn_rec.subinventory_Name <> l_curr_subinventory_code) THEN
2729                              FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_SUB_CODE');
2730                              FND_MESSAGE.Set_Token('CODE',l_curr_subinventory_code);
2731                              FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2732                              FND_MESSAGE.Set_Token('SER',p_x_ahl_mtltxn_rec.Serial_Number);
2733                              FND_MSG_PUB.ADD;
2734                              x_return_status := FND_API.G_RET_STS_ERROR;
2735                      END IF;
2736 
2737                  IF G_DEBUG='Y' THEN
2738                 AHL_DEBUG_PUB.debug('Validating serial subinv['||p_x_ahl_mtltxn_rec.subinventory_Name||']');
2739                      END IF;
2740 
2741                      IF (p_x_ahl_mtltxn_rec.locator_id IS NOT NULL AND
2742                          p_x_ahl_mtltxn_rec.locator_id <> FND_API.G_MISS_NUM AND
2743                          l_curr_locator_id IS NOT NULL AND
2744                          p_x_ahl_mtltxn_rec.locator_id <> l_curr_locator_id) THEN
2745                            FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_LOC_CODE');
2746                            --FND_MESSAGE.Set_Token('CODE',l_curr_locator_id);
2747                            FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2748                            FND_MESSAGE.Set_Token('SER',p_x_ahl_mtltxn_rec.Serial_Number);
2749                            FND_MSG_PUB.ADD;
2750                            x_return_status := FND_API.G_RET_STS_ERROR;
2751                      END IF;
2752                    ELSE
2753                      -- serial number not found.
2754                      FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_SRLNUM');
2755                      FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
2756                      FND_MESSAGE.Set_Token('SER',p_x_ahl_mtltxn_rec.Serial_Number);
2757                      FND_MSG_PUB.ADD;
2758                      x_return_status := FND_API.G_RET_STS_ERROR;
2759                    END IF;
2760 
2761                    CLOSE mtl_srl_num_csr;
2762                 END IF;
2763 
2764             IF G_DEBUG='Y' THEN
2765               AHL_DEBUG_PUB.debug('Validating transaction date['||p_x_ahl_mtltxn_rec.transaction_date||']');
2766             END IF;
2767 
2768                 -- Validate transaction date.
2769                 IF (p_x_ahl_mtltxn_rec.transaction_date IS NULL OR
2770                     p_x_ahl_mtltxn_rec.transaction_date = FND_API.G_MISS_DATE) THEN
2771                    p_x_ahl_mtltxn_rec.transaction_date := SYSDATE;
2772                 /*
2773                 * defaulting the time component to 23:59:59(for past dates) and systime for current date to fix bug#4096941
2774                 */
2775                 ELSIF(trunc(p_x_ahl_mtltxn_rec.transaction_date) = trunc(SYSDATE))THEN
2776                    p_x_ahl_mtltxn_rec.transaction_date := SYSDATE;
2777                 ELSIF(trunc(p_x_ahl_mtltxn_rec.transaction_date) < trunc(SYSDATE))THEN
2778                    p_x_ahl_mtltxn_rec.transaction_date := trunc(p_x_ahl_mtltxn_rec.transaction_date) + 86399/86400;
2779                 ELSE
2780                    IF (p_x_ahl_mtltxn_rec.transaction_date > SYSDATE) THEN
2781 
2782                      IF G_DEBUG='Y' THEN
2783                       AHL_DEBUG_PUB.debug('Error in txn date');
2784                      END IF;
2785                      FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_TXN_DATE');
2786                      FND_MESSAGE.Set_Token('DATE',p_x_ahl_mtltxn_rec.transaction_date);
2787                      FND_MSG_PUB.ADD;
2788                      x_return_status := FND_API.G_RET_STS_ERROR;
2789                    END IF;
2790 
2791                 END IF;
2792                 /*
2793                 * adding release date validation(txns date should be > release date) to fix bug#4096941
2794                 */
2795                 OPEN workorder_released_date_csr(p_x_ahl_mtltxn_rec.Wip_Entity_Id);
2796                 FETCH workorder_released_date_csr INTO l_workorder_released_date;
2797                 IF(workorder_released_date_csr%NOTFOUND)THEN
2798                   FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WIP_ENTITY');
2799                   IF(p_x_ahl_mtltxn_rec.Wip_Entity_Id = FND_API.G_MISS_NUM) THEN
2800                      p_x_ahl_mtltxn_rec.Wip_Entity_Id := NULL;
2801                   END IF;
2802                   FND_MESSAGE.Set_Token('WIP_ENTITY',p_x_ahl_mtltxn_rec.Wip_Entity_Id);
2803                   FND_MSG_PUB.ADD;
2804                   x_return_status := FND_API.G_RET_STS_ERROR;
2805                 ELSE
2806                   IF G_DEBUG='Y' THEN
2807                        AHL_DEBUG_PUB.debug('transaction date['||to_char(p_x_ahl_mtltxn_rec.transaction_date,'dd-mon-yyyy hh24:mi:ss') ||']');
2808                        AHL_DEBUG_PUB.debug('workorder release date['||to_char(l_workorder_released_date,'dd-mon-yyyy hh24:mi:ss') ||']');
2809                    END IF;
2810                   IF(l_workorder_released_date > p_x_ahl_mtltxn_rec.transaction_date)THEN
2811                     IF G_DEBUG='Y' THEN
2812                        AHL_DEBUG_PUB.debug('release date is greater than transaction date');
2813                      END IF;
2814                     FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_TXN_REL_DT');
2815                     FND_MESSAGE.Set_Token('TXNS_DATE',to_char(p_x_ahl_mtltxn_rec.transaction_date,'dd-MON-yyyy hh24:mi:ss'));
2816                     FND_MESSAGE.Set_Token('REL_DATE',to_char(l_workorder_released_date,'dd-MON-yyyy hh24:mi:ss'));
2817                     FND_MSG_PUB.ADD;
2818                     x_return_status := FND_API.G_RET_STS_ERROR;
2819                   END IF;
2820                 END IF;
2821                 CLOSE workorder_released_date_csr;
2822 
2823       -- validate disposition ID.
2824       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2825           fnd_log.string
2826 		 (
2827                    fnd_log.level_statement,
2828 		   'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2829 		   'Validating disposition ID'
2830 		 );
2831       END IF;
2832 
2833       -- validate disposition id.
2834       IF (p_x_ahl_mtltxn_rec.disposition_id IS NOT NULL AND
2835           p_x_ahl_mtltxn_rec.disposition_id <> FND_API.G_MISS_NUM) THEN
2836 
2837          -- chk if disposition exists.
2838          OPEN disposition_cur (  p_x_ahl_mtltxn_rec.disposition_id,
2839                                  p_x_ahl_mtltxn_rec.workorder_id,
2840                                  p_x_ahl_mtltxn_rec.Inventory_Item_id,
2841                                  --p_x_ahl_mtltxn_rec.Organization_ID,
2842                                  p_x_ahl_mtltxn_rec.Serial_Number,
2843                                  p_x_ahl_mtltxn_rec.Revision,
2844                                  p_x_ahl_mtltxn_rec.Lot_Number);
2845          FETCH disposition_cur INTO l_disposition_id;
2846          IF (disposition_cur%NOTFOUND) THEN
2847            FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTL_DISP_INVALID');
2848            FND_MESSAGE.Set_Token('DISP_ID',p_x_ahl_mtltxn_rec.disposition_id);
2849            FND_MSG_PUB.ADD;
2850            x_return_status := FND_API.G_RET_STS_ERROR;
2851          END IF;
2852          CLOSE disposition_cur;
2853       END IF; -- -- p_x_ahl_mtltxn_rec.disposition_id
2854 
2855       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2856           fnd_log.string
2857 		 (
2858                    fnd_log.level_statement,
2859 		   'ahl.plsql.AHL_PRD_MTLTXN_PVT.Validate_Txn_Rec',
2860 		   'Disposition ID:' || p_x_ahl_mtltxn_rec.disposition_id
2861 		 );
2862       END IF;
2863 
2864         IF G_DEBUG='Y' THEN
2865           AHL_DEBUG_PUB.debug('after validations api ret_status['||x_return_status||']');
2866 
2867         END IF;
2868 
2869 
2870 END VALIDATE_TXN_REC;
2871 
2872 /********************************************************************************
2873 This procedure will process the material tranasction record. The records are
2874 inserted into interface tables and the API is called to process the transaction.
2875 
2876 ********************************************************************************/
2877 
2878 /* Tamal [R12 APPSPERF fixes]
2879  * R12 Drop 4 - SQL ID: 14400039
2880  * Bug #4918991
2881  * Since the following procedure has no functional footprint at the moment, commenting out the procedure
2882  * Additionally marking the SQL ID as Obsolete in sql_repos...
2883  */
2884 
2885 /*
2886 PROCEDURE INSERT_MTL_TXN_TEMP
2887     (
2888         p_api_version        IN            NUMBER     := 1.0,
2889         p_init_msg_list      IN            VARCHAR2   := FND_API.G_FALSE,
2890         p_commit             IN            VARCHAR2   := FND_API.G_FALSE,
2891         p_validation_level   IN            NUMBER     := FND_API.G_VALID_LEVEL_FULL,
2892         p_default            IN            VARCHAR2   := FND_API.G_FALSE,
2893         p_module_type        IN            VARCHAR2   := NULL,
2894         p_x_ahl_mtltxn_rec   IN OUT NOCOPY Ahl_Mtltxn_Rec_Type,
2895         x_txn_Hdr_Id         OUT NOCOPY        NUMBER,
2896         x_txn_Tmp_id         OUT NOCOPY        NUMBER,
2897         x_return_status      OUT NOCOPY           VARCHAR2,
2898         x_msg_count          OUT NOCOPY           NUMBER,
2899         x_msg_data           OUT NOCOPY           VARCHAR2
2900     )
2901 IS
2902 l_Process_Flag VARCHAR2(1);
2903 l_Validation_required VARCHAR2(1);
2904 l_txn_action NUMBER;
2905 l_txn_source_type NUMBER;
2906 l_transaction_Mode NUMBER;
2907 l_Srl_Txn_Tmp_Id   NUMBER;
2908 l_mmtt_rec mtl_material_transactions_temp%ROWTYPE;
2909 l_msnt_rec mtl_serial_numbers_temp%ROWTYPE;
2910 l_mtlt_rec mtl_transaction_lots_temp%ROWTYPE;
2911 
2912 l_transaction_reference mtl_material_transactions_temp.transaction_reference%TYPE;
2913 
2914 CURSOR ACCT_PERIOD_CUR(P_org_Id NUMBER) IS
2915 SELECT ACCT_PERIOD_ID from org_acct_periods
2916 where organization_id = p_org_id and open_flag = 'Y'
2917 AND TRUNC(SYSDATE) BETWEEN TRUNC(PERIOD_START_DATE) AND TRUNC(SCHEDULE_CLOSE_DATE);
2918 
2919 CURSOR TRX_ACTION_CUR(p_type_Id NUMBER) IS
2920 SELECT TRANSACTION_ACTION_ID,TRANSACTION_SOURCE_TYPE_ID
2921 from MTL_TRANSACTION_TYPES
2922 where TRANSACTION_TYPE_ID = p_type_Id;
2923 
2924 BEGIN
2925     l_Process_Flag := 'W';
2926     l_Validation_required  := '1';
2927     l_transaction_Mode := 2;
2928     l_txn_action := 1;
2929 
2930     OPEN ACCT_PERIOD_CUR(p_x_ahl_mtltxn_rec.Organization_Id);
2931     FETCH ACCT_PERIOD_CUR INTO l_mmtt_rec.ACCT_PERIOD_ID;
2932     IF(ACCT_PERIOD_CUR%NOTFOUND) THEN
2933         IF G_DEBUG='Y' THEN
2934           AHL_DEBUG_PUB.debug('Did not find the account period for org('||p_x_ahl_mtltxn_rec.Organization_Id||')');
2935 
2936     END IF;
2937         CLOSE ACCT_PERIOD_CUR;
2938         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2939     END IF;
2940     CLOSE ACCT_PERIOD_CUR;
2941 
2942     OPEN TRX_ACTION_CUR(p_x_ahl_mtltxn_rec.Transaction_Type_Id);
2943     FETCH TRX_ACTION_CUR INTO l_txn_action, l_txn_source_type;
2944     IF(TRX_ACTION_CUR%NOTFOUND) THEN
2945         IF G_DEBUG='Y' THEN
2946           AHL_DEBUG_PUB.debug('Did not find the Txn Type');
2947 
2948     END IF;
2949         CLOSE TRX_ACTION_CUR;
2950         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2951     END IF;
2952     CLOSE TRX_ACTION_CUR;
2953 
2954     l_mmtt_rec.SOURCE_CODE := 'AHL' ;
2955     l_mmtt_rec.SOURCE_LINE_ID := 1;
2956     l_mmtt_rec.TRANSACTION_MODE := l_transaction_Mode;
2957 
2958         IF (p_x_ahl_mtltxn_rec.transaction_reference = FND_API.G_MISS_CHAR) THEN
2959            l_transaction_reference := NULL;
2960         ELSE
2961            l_transaction_reference := p_x_ahl_mtltxn_rec.transaction_reference;
2962         END IF;
2963 
2964     l_mmtt_rec.LOCK_FLAG := '';
2965     l_mmtt_rec.LAST_UPDATE_DATE := SYSDATE;
2966     l_mmtt_rec.LAST_UPDATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
2967     l_mmtt_rec.CREATION_DATE := SYSDATE;
2968     l_mmtt_rec.CREATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
2969     l_mmtt_rec.LAST_UPDATE_LOGIN := FND_GLOBAL.LOGIN_ID; --p_x_ahl_mtltxn_rec.Last_Update_Login;
2970     --l_mmtt_rec.PROGRAM_APPLICATION_ID :=
2971     --l_mmtt_rec.PROGRAM_ID :=
2972     --l_mmtt_rec.PROGRAM_UPDATE_DATE :=
2973     l_mmtt_rec.INVENTORY_ITEM_ID := p_x_ahl_mtltxn_rec.Inventory_Item_Id;
2974     if(p_x_ahl_mtltxn_rec.Revision IS NOT NULL
2975         AND p_x_ahl_mtltxn_rec.Revision <> FND_API.G_MISS_CHAR) THEN
2976         l_mmtt_rec.REVISION := p_x_ahl_mtltxn_rec.Revision;
2977     END IF;
2978     l_mmtt_rec.ORGANIZATION_ID := p_x_ahl_mtltxn_rec.Organization_Id;
2979     l_mmtt_rec.SUBINVENTORY_CODE := p_x_ahl_mtltxn_rec.Subinventory_Name;
2980     IF(p_x_ahl_mtltxn_rec.Locator_Id IS NOT NULL
2981         AND p_x_ahl_mtltxn_rec.Locator_Id <> FND_API.G_MISS_NUM) THEN
2982         l_mmtt_rec.LOCATOR_ID := p_x_ahl_mtltxn_rec.Locator_Id;
2983     END IF;
2984     if(p_x_ahl_mtltxn_rec.Transaction_Type_Id = WIP_CONSTANTS.ISSCOMP_TYPE) THEN
2985         l_mmtt_rec.TRANSACTION_QUANTITY := - p_x_ahl_mtltxn_rec.Quantity;
2986         l_mmtt_rec.PRIMARY_QUANTITY :=  - p_x_ahl_mtltxn_rec.Quantity;
2987     ELSE
2988         l_mmtt_rec.TRANSACTION_QUANTITY := p_x_ahl_mtltxn_rec.Quantity;
2989         l_mmtt_rec.PRIMARY_QUANTITY := p_x_ahl_mtltxn_rec.Quantity;
2990     END IF;
2991     l_mmtt_rec.TRANSACTION_UOM := p_x_ahl_mtltxn_rec.Uom;
2992     l_mmtt_rec.TRANSACTION_TYPE_ID := p_x_ahl_mtltxn_rec.Transaction_Type_Id;
2993     l_mmtt_rec.TRANSACTION_ACTION_ID :=l_txn_action;
2994     l_mmtt_rec.TRANSACTION_SOURCE_TYPE_ID := l_txn_source_type;
2995     l_mmtt_rec.TRANSACTION_DATE := p_x_ahl_mtltxn_rec.Transaction_Date;
2996     --l_mmtt_rec.ACCT_PERIOD_ID := 2266;
2997     l_mmtt_rec.TRANSACTION_SOURCE_ID := p_x_ahl_mtltxn_rec.Wip_Entity_Id;
2998 --      l_mmtt_rec.DISTRIBUTION_ACCOUNT_ID :=
2999     l_mmtt_rec.TRANSACTION_REFERENCE := l_transaction_reference;
3000 --      l_mmtt_rec.REQUISITION_LINE_ID :=
3001 --      l_mmtt_rec.REQUISITION_DISTRIBUTION_ID :=
3002     IF(p_x_ahl_mtltxn_rec.Reason_Id IS NOT NULL
3003         AND p_x_ahl_mtltxn_rec.Reason_Id <> FND_API.G_MISS_NUM) THEN
3004         l_mmtt_rec.REASON_ID :=p_x_ahl_mtltxn_rec.Reason_Id;
3005     END IF;
3006     --l_mmtt_rec.LOT_NUMBER := p_lot_number;
3007     --l_mmtt_rec.LOT_EXPIRATION_DATE :=
3008     --l_mmtt_rec.SERIAL_NUMBER := p_srl_number;
3009     l_mmtt_rec.WIP_ENTITY_TYPE := WIP_CONSTANTS.DISCRETE;
3010     l_mmtt_rec.WIP_SUPPLY_TYPE := 3;
3011     l_mmtt_rec.OPERATION_SEQ_NUM := p_x_ahl_mtltxn_rec.Operation_Seq_Num;
3012     --l_mmtt_rec.ITEM_LOCATION_CONTROL_CODE :=
3013     l_mmtt_rec.PROCESS_FLAG := l_Process_Flag;
3014     IF(p_x_ahl_mtltxn_rec.ATTRIBUTE_CATEGORY IS NOT NULL
3015         AND p_x_ahl_mtltxn_rec.ATTRIBUTE_CATEGORY <> FND_API.G_MISS_CHAR) THEN
3016         l_mmtt_rec.ATTRIBUTE_CATEGORY := p_x_ahl_mtltxn_rec.ATTRIBUTE_CATEGORY;
3017         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE1 IS NOT NULL
3018             AND p_x_ahl_mtltxn_rec.ATTRIBUTE1 <> FND_API.G_MISS_CHAR) THEN
3019             l_mmtt_rec.ATTRIBUTE1         := p_x_ahl_mtltxn_rec.ATTRIBUTE1;
3020         END IF;
3021         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE2 IS NOT NULL
3022             AND p_x_ahl_mtltxn_rec.ATTRIBUTE2 <> FND_API.G_MISS_CHAR) THEN
3023             l_mmtt_rec.ATTRIBUTE2         := p_x_ahl_mtltxn_rec.ATTRIBUTE2;
3024         END IF;
3025         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE3 IS NOT NULL
3026             AND p_x_ahl_mtltxn_rec.ATTRIBUTE3 <> FND_API.G_MISS_CHAR) THEN
3027             l_mmtt_rec.ATTRIBUTE3         := p_x_ahl_mtltxn_rec.ATTRIBUTE3;
3028         END IF;
3029         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE4 IS NOT NULL
3030             AND p_x_ahl_mtltxn_rec.ATTRIBUTE4 <> FND_API.G_MISS_CHAR) THEN
3031             l_mmtt_rec.ATTRIBUTE4         := p_x_ahl_mtltxn_rec.ATTRIBUTE4;
3032         END IF;
3033         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE5 IS NOT NULL
3034             AND p_x_ahl_mtltxn_rec.ATTRIBUTE5 <> FND_API.G_MISS_CHAR) THEN
3035             l_mmtt_rec.ATTRIBUTE5         := p_x_ahl_mtltxn_rec.ATTRIBUTE5;
3036         END IF;
3037         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE6 IS NOT NULL
3038             AND p_x_ahl_mtltxn_rec.ATTRIBUTE6 <> FND_API.G_MISS_CHAR) THEN
3039             l_mmtt_rec.ATTRIBUTE6         := p_x_ahl_mtltxn_rec.ATTRIBUTE6;
3040         END IF;
3041         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE7 IS NOT NULL
3042             AND p_x_ahl_mtltxn_rec.ATTRIBUTE7 <> FND_API.G_MISS_CHAR) THEN
3043             l_mmtt_rec.ATTRIBUTE7         := p_x_ahl_mtltxn_rec.ATTRIBUTE7;
3044         END IF;
3045         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE8 IS NOT NULL
3046             AND p_x_ahl_mtltxn_rec.ATTRIBUTE8 <> FND_API.G_MISS_CHAR) THEN
3047             l_mmtt_rec.ATTRIBUTE8         := p_x_ahl_mtltxn_rec.ATTRIBUTE8;
3048         END IF;
3049         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE9 IS NOT NULL
3050             AND p_x_ahl_mtltxn_rec.ATTRIBUTE9 <> FND_API.G_MISS_CHAR) THEN
3051             l_mmtt_rec.ATTRIBUTE9         := p_x_ahl_mtltxn_rec.ATTRIBUTE9;
3052         END IF;
3053         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE10 IS NOT NULL
3054             AND p_x_ahl_mtltxn_rec.ATTRIBUTE10 <> FND_API.G_MISS_CHAR) THEN
3055             l_mmtt_rec.ATTRIBUTE10        := p_x_ahl_mtltxn_rec.ATTRIBUTE10;
3056         END IF;
3057         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE11 IS NOT NULL
3058             AND p_x_ahl_mtltxn_rec.ATTRIBUTE11 <> FND_API.G_MISS_CHAR) THEN
3059             l_mmtt_rec.ATTRIBUTE11        := p_x_ahl_mtltxn_rec.ATTRIBUTE11;
3060         END IF;
3061         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE12 IS NOT NULL
3062             AND p_x_ahl_mtltxn_rec.ATTRIBUTE12 <> FND_API.G_MISS_CHAR) THEN
3063             l_mmtt_rec.ATTRIBUTE12        := p_x_ahl_mtltxn_rec.ATTRIBUTE12;
3064         END IF;
3065         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE13 IS NOT NULL
3066             AND p_x_ahl_mtltxn_rec.ATTRIBUTE13 <> FND_API.G_MISS_CHAR) THEN
3067             l_mmtt_rec.ATTRIBUTE13        := p_x_ahl_mtltxn_rec.ATTRIBUTE13;
3068         END IF;
3069         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE14 IS NOT NULL
3070             AND p_x_ahl_mtltxn_rec.ATTRIBUTE14 <> FND_API.G_MISS_CHAR) THEN
3071             l_mmtt_rec.ATTRIBUTE14        := p_x_ahl_mtltxn_rec.ATTRIBUTE14;
3072         END IF;
3073         IF(p_x_ahl_mtltxn_rec.ATTRIBUTE15 IS NOT NULL
3074             AND p_x_ahl_mtltxn_rec.ATTRIBUTE15 <> FND_API.G_MISS_CHAR) THEN
3075             l_mmtt_rec.ATTRIBUTE15        := p_x_ahl_mtltxn_rec.ATTRIBUTE15;
3076         END IF;
3077     END IF;
3078 
3079     IF G_DEBUG='Y' THEN
3080           AHL_DEBUG_PUB.debug('inserting the mmtt..');
3081     END IF;
3082 
3083     inv_util.insert_mmtt(p_api_version => 1,
3084                         p_mmtt_rec =>l_mmtt_rec,
3085                         x_trx_header_id => x_Txn_hdr_id,
3086                         x_trx_temp_id => x_Txn_Tmp_Id,
3087                         x_return_status => x_return_status,
3088                         x_msg_count =>x_msg_count,
3089                         x_msg_data => x_msg_data);
3090 
3091     IF G_DEBUG='Y' THEN
3092           AHL_DEBUG_PUB.debug('inserted in mmtt..ret_status['||x_return_status||']');
3093     END IF;
3094     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3095         FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3096         FND_MESSAGE.Set_Token('MSG',x_msg_data);
3097         FND_MSG_PUB.ADD;
3098         RAISE  FND_API.G_EXC_ERROR;
3099     END  IF;
3100 
3101     IF(p_x_ahl_mtltxn_rec.Lot_Number <> FND_API.G_MISS_CHAR AND
3102         p_x_ahl_mtltxn_rec.Lot_Number IS NOT NULL AND
3103         p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR AND
3104         p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL) THEN
3105 
3106         --Item is under Lot and Serial Control
3107         --Generate serial transaction Temp id.
3108         SELECT Mtl_Material_Transactions_S.nextval
3109         INTO l_Srl_Txn_Tmp_Id
3110         FROM DUAL;
3111 
3112 
3113 
3114         l_mtlt_rec.Transaction_Temp_Id  := x_Txn_Tmp_Id;
3115         l_mtlt_rec.Serial_Transaction_Temp_Id:= l_Srl_Txn_Tmp_Id;
3116         l_mtlt_rec.Lot_Number                 := p_x_ahl_mtltxn_rec.Lot_Number;
3117 
3118         -- Lot expiration date needs to  be selected.
3119 
3120         --l_mtlt_rec.Lot_Expiration_Date          := p_x_ahl_mtltxn_rec.Lot_Expiration_Date;
3121         l_mtlt_rec.Transaction_Quantity   := p_x_ahl_mtltxn_rec.Quantity;
3122         l_mtlt_rec.Primary_Quantity   := p_x_ahl_mtltxn_rec.Quantity;
3123 
3124         l_mtlt_rec.LAST_UPDATE_DATE := SYSDATE;
3125         l_mtlt_rec.LAST_UPDATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3126         l_mtlt_rec.CREATION_DATE := SYSDATE;
3127         l_mtlt_rec.CREATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3128         l_mtlt_rec.LAST_UPDATE_LOGIN := FND_GLOBAL.LOGIN_ID; --p_x_ahl_mtltxn_rec.Last_Update_Login;
3129 
3130         l_msnt_rec.Transaction_Temp_Id := l_Srl_Txn_Tmp_Id;
3131         l_msnt_rec.Fm_Serial_Number    := p_x_ahl_mtltxn_rec.Serial_Number;
3132         l_msnt_rec.To_Serial_Number    := p_x_ahl_mtltxn_rec.Serial_Number;
3133         l_msnt_rec.LAST_UPDATE_DATE := SYSDATE;
3134         l_msnt_rec.LAST_UPDATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3135         l_msnt_rec.CREATION_DATE := SYSDATE;
3136         l_msnt_rec.CREATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3137         l_msnt_rec.LAST_UPDATE_LOGIN := FND_GLOBAL.LOGIN_ID; --p_x_ahl_mtltxn_rec.Last_Update_Login;
3138 
3139         IF G_DEBUG='Y' THEN
3140           AHL_DEBUG_PUB.debug('inserting  in mtlt..');
3141     END IF;
3142 
3143         inv_util.insert_mtlt(p_api_version => 1,
3144                         p_mtlt_rec =>l_mtlt_rec,
3145                         x_return_status => x_return_status,
3146                         x_msg_count =>x_msg_count,
3147                         x_msg_data => x_msg_data);
3148         IF G_DEBUG='Y' THEN
3149           AHL_DEBUG_PUB.debug('inserted in mtlt..ret_status['||x_return_status||']');
3150     END IF;
3151         IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3152             FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3153             FND_MESSAGE.Set_Token('MSG',x_msg_data);
3154             FND_MSG_PUB.ADD;
3155             RAISE  FND_API.G_EXC_ERROR;
3156         END  IF;
3157         IF G_DEBUG='Y' THEN
3158           AHL_DEBUG_PUB.debug('inserting  in msnt..');
3159 
3160     END IF;
3161         inv_util.insert_msnt(p_api_version => 1,
3162                         p_msnt_rec =>l_msnt_rec,
3163                         x_return_status => x_return_status,
3164                         x_msg_count =>x_msg_count,
3165                         x_msg_data => x_msg_data);
3166 
3167         IF G_DEBUG='Y' THEN
3168           AHL_DEBUG_PUB.debug('inserted in msnt..ret_status['||x_return_status||']');
3169 
3170     END IF;
3171 
3172         IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3173             FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3174             FND_MESSAGE.Set_Token('MSG',x_msg_data);
3175             FND_MSG_PUB.ADD;
3176             RAISE  FND_API.G_EXC_ERROR;
3177         END  IF;
3178 
3179     ELSIF (p_x_ahl_mtltxn_rec.Lot_Number <> FND_API.G_MISS_CHAR AND
3180        p_x_ahl_mtltxn_rec.Lot_Number IS NOT NULL ) THEN
3181             --Item is under Lot control
3182             l_mtlt_rec.Transaction_Temp_Id        := x_Txn_Tmp_Id;
3183             l_mtlt_rec.Lot_Number                 := p_x_ahl_mtltxn_rec.Lot_Number;
3184             --l_mtlt_rec.Lot_Expiration_Date          := p_x_ahl_mtltxn_rec.Lot_Expiration_Date;
3185             l_mtlt_rec.Transaction_Quantity       := p_x_ahl_mtltxn_rec.Quantity;
3186             l_mtlt_rec.Primary_Quantity       := p_x_ahl_mtltxn_rec.Quantity;
3187             l_mtlt_rec.LAST_UPDATE_DATE := SYSDATE;
3188             l_mtlt_rec.LAST_UPDATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3189             l_mtlt_rec.CREATION_DATE := SYSDATE;
3190             l_mtlt_rec.CREATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3191             l_mtlt_rec.LAST_UPDATE_LOGIN := FND_GLOBAL.LOGIN_ID; --p_x_ahl_mtltxn_rec.Last_Update_Login;
3192 
3193             IF G_DEBUG='Y' THEN
3194           AHL_DEBUG_PUB.debug('inserting  in mtlt..');
3195 
3196     END IF;
3197             inv_util.insert_mtlt(p_api_version => 1,
3198                             p_mtlt_rec =>l_mtlt_rec,
3199                             x_return_status => x_return_status,
3200                             x_msg_count =>x_msg_count,
3201                             x_msg_data => x_msg_data);
3202             IF G_DEBUG='Y' THEN
3203       AHL_DEBUG_PUB.debug('inserted in mtlt..ret_status['||x_return_status||']');
3204 
3205     END IF;
3206             IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3207                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3208                 FND_MESSAGE.Set_Token('MSG',x_msg_data);
3209                 FND_MSG_PUB.ADD;
3210                 RAISE  FND_API.G_EXC_ERROR;
3211             END  IF;
3212 
3213     ELSIF (p_x_ahl_mtltxn_rec.Serial_Number <> FND_API.G_MISS_CHAR AND
3214             p_x_ahl_mtltxn_rec.Serial_Number IS NOT NULL) THEN
3215             -- Item is under serial control
3216             l_msnt_rec.Transaction_Temp_Id      := x_Txn_Tmp_Id;
3217             l_msnt_rec.Fm_Serial_Number         := p_x_ahl_mtltxn_rec.Serial_Number;
3218             l_msnt_rec.To_Serial_Number         := p_x_ahl_mtltxn_rec.Serial_Number;
3219             l_msnt_rec.LAST_UPDATE_DATE := SYSDATE;
3220             l_msnt_rec.LAST_UPDATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3221             l_msnt_rec.CREATION_DATE := SYSDATE;
3222             l_msnt_rec.CREATED_BY := FND_GLOBAL.USER_ID; --p_x_ahl_mtltxn_rec.Last_Updated_By;
3223             l_msnt_rec.LAST_UPDATE_LOGIN := FND_GLOBAL.LOGIN_ID; --p_x_ahl_mtltxn_rec.Last_Update_Login;
3224 
3225             IF G_DEBUG='Y' THEN
3226           AHL_DEBUG_PUB.debug('inserting  in msnt..');
3227 
3228     END IF;
3229 
3230             inv_util.insert_msnt(p_api_version => 1,
3231                                         p_msnt_rec =>l_msnt_rec,
3232                                         x_return_status => x_return_status,
3233                                         x_msg_count =>x_msg_count,
3234                                         x_msg_data => x_msg_data);
3235             IF G_DEBUG='Y' THEN
3236           AHL_DEBUG_PUB.debug('inserted in msnt..ret_status['||x_return_status||']');
3237 
3238     END IF;
3239 
3240             IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3241                 FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3242                 FND_MESSAGE.Set_Token('MSG',x_msg_data);
3243                 FND_MSG_PUB.ADD;
3244                 RAISE  FND_API.G_EXC_ERROR;
3245             END  IF;
3246     END IF;
3247 END INSERT_MTL_TXN_TEMP;
3248 */
3249 
3250 /*****************************************************************
3251 This function returns true if the item is trackable and false if not.
3252 
3253 ******************************************************************/
3254 FUNCTION IS_ITEM_TRACKABLE(p_Org_Id IN NUMBER, p_Item_Id IN NUMBER) RETURN BOOLEAN
3255 IS
3256 l_count NUMBER;
3257 ret boolean;
3258 -- Query to check if item is trakkable
3259 CURSOR Item_tr_Cur(p_org_Id NUMBER, p_item_Id NUMBER) IS
3260     SELECT 1
3261     FROM MTL_SYSTEM_ITEMS_B
3262     WHERE INVENTORY_ITEM_ID = p_Item_Id
3263     AND ORGANIZATION_ID = p_Org_Id
3264     AND COMMS_NL_TRACKABLE_FLAG = 'Y'
3265     AND ENABLED_FLAG = 'Y'
3266     AND ((START_DATE_ACTIVE IS NULL) OR (START_DATE_ACTIVE <= SYSDATE))
3267     AND ((END_DATE_ACTIVE IS NULL) OR (END_DATE_ACTIVE >= SYSDATE));
3268 
3269 BEGIN
3270 
3271     l_Count := 0;
3272     ret := FALSE;
3273     OPEN Item_Tr_Cur(p_org_Id, p_item_Id);
3274     FETCH Item_Tr_Cur into l_Count;
3275     IF (Item_Tr_Cur%NOTFOUND) THEN
3276         ret := FALSE;
3277     ELSE
3278         ret := TRUE;
3279     END IF;
3280 
3281     CLOSE Item_Tr_Cur;
3282     RETURN ret;
3283 END IS_ITEM_TRACKABLE;
3284 
3285 /***************************************************
3286 This procedure inserts record in the AHL_SCHEDULE_MATERIALS table
3287 TBD to be corrected.
3288 ************************************************/
3289 PROCEDURE Insert_Sch_Mtl_Row(
3290     p_mtl_txn_Rec        IN            Ahl_Mtltxn_Rec_Type,
3291     x_return_status      OUT NOCOPY           VARCHAR2,
3292     x_msg_count          OUT NOCOPY           NUMBER,
3293     x_msg_data           OUT NOCOPY           VARCHAR2,
3294     x_ahl_sch_mtl_id     OUT NOCOPY        NUMBER)
3295 IS
3296 Material_Tbl AHL_PP_MATERIALS_PVT.Req_Material_Tbl_Type ;
3297 x_tmp VARCHAR2(10);
3298 l_project_id NUMBER;
3299 l_project_Task_id NUMBER ;
3300 l_Visit_Id NUMBER;
3301 l_visit_task_Id NUMBER;
3302 l_Item_Desc VARCHAR2(240);
3303 l_quantity  NUMBER;
3304 l_primary_uom  ahl_schedule_materials.UOM%TYPE;
3305 
3306 -- QWuey to select the work order dependent data to be passed to Schedule materials API.
3307 CURSOR Workop_Det_Cur(p_wo_id NUMBER) IS
3308 SELECT B.VISIT_ID,C.VISIT_TASK_ID,B.PROJECT_ID,C.PROJECT_TASK_ID
3309 FROM AHL_WORKORDERS A, AHL_VISITS_B B, AHL_VISIT_TASKS_B C
3310 WHERE A.WORKORDER_ID = p_wo_id
3311 AND A.VISIT_TASK_ID = C.VISIT_TASK_ID
3312 AND C.VISIT_ID = B.VISIT_ID;
3313 --Query to select the item desccription
3314 CURSOR Item_Desc_Cur(p_org_id NUMBER, p_item_id NUMBER) IS
3315 SELECT DESCRIPTION
3316 FROM MTL_SYSTEM_ITEMS_KFV
3317 WHERE ORGANIZATION_ID = p_org_id
3318 AND INVENTORY_ITEM_ID = p_item_id;
3319 
3320 BEGIN
3321 
3322     IF G_DEBUG='Y' THEN
3323           AHL_DEBUG_PUB.debug('Entered Insert_Sch_Mtl_Row');
3324 
3325     END IF;
3326     OPEN Workop_Det_Cur( p_mtl_txn_Rec.Workorder_Id);
3327     FETCH Workop_Det_Cur INTO l_Visit_Id,l_visit_task_Id,l_project_id,l_project_Task_id;
3328     IF(Workop_Det_Cur%NOTFOUND) THEN
3329         FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_WO_OP');
3330         FND_MSG_PUB.ADD;
3331         CLOSE Workop_Det_Cur;
3332         RAISE  FND_API.G_EXC_ERROR;
3333     END IF;
3334     CLOSE Workop_Det_Cur;
3335     IF G_DEBUG='Y' THEN
3336           AHL_DEBUG_PUB.debug('Selected the work order paramters');
3337           AHL_DEBUG_PUB.debug('l_Visit_Id['||l_Visit_Id||']');
3338           AHL_DEBUG_PUB.debug('l_visit_task_Id['||l_visit_task_Id||']');
3339           AHL_DEBUG_PUB.debug('l_project_id['||l_project_id||']');
3340           AHL_DEBUG_PUB.debug('l_project_Task_id['||l_project_Task_id||']');
3341           AHL_DEBUG_PUB.debug('p_mtl_txn_Rec.Workorder_Operation_Id['||p_mtl_txn_Rec.Workorder_Operation_Id||']');
3342 
3343     END IF;
3344 
3345     OPEN Item_Desc_Cur( p_mtl_txn_Rec.Organization_id, p_mtl_txn_Rec.Inventory_Item_Id);
3346     FETCH Item_Desc_Cur INTO l_Item_Desc;
3347     IF(Item_Desc_Cur%NOTFOUND) THEN
3348         FND_MESSAGE.Set_Name('AHL','AHL_COM_INVALID_ITEM');
3349         FND_MESSAGE.Set_Token('FIELD',p_mtl_txn_Rec.Inventory_Item_Id);
3350         FND_MSG_PUB.ADD;
3351         CLOSE Item_Desc_Cur;
3352         RAISE  FND_API.G_EXC_ERROR;
3353     END IF;
3354     CLOSE Item_Desc_Cur;
3355     IF G_DEBUG='Y' THEN
3356           AHL_DEBUG_PUB.debug('Selected the Item description');
3357 
3358     END IF;
3359 
3360         -- Get Primary UOM for the item.
3361         l_primary_uom := AHL_LTP_MTL_REQ_PVT.Get_Primary_UOM(p_inventory_item_id => p_mtl_txn_Rec.Inventory_Item_Id,
3362                                                      p_inventory_org_id => p_mtl_txn_Rec.Organization_id);
3363 
3364         l_quantity :=  p_mtl_txn_Rec.Quantity;
3365         -- Convert quantity to primary UOM if p_mtl_txn_Rec.uom is not.
3366         IF (l_primary_uom <> p_mtl_txn_Rec.uom) THEN
3367           l_quantity := AHL_LTP_MTL_REQ_PVT.Get_Primary_UOM_Qty(p_mtl_txn_Rec.Inventory_Item_Id,
3368                                     p_mtl_txn_Rec.uom,
3369                                 p_mtl_txn_Rec.Quantity);
3370         END IF;
3371 
3372     --Material_Tbl(0).OBJECT_VERSION_NUMBER   := 1;
3373     Material_Tbl(0).INVENTORY_ITEM_ID       := p_mtl_txn_Rec.Inventory_Item_Id;
3374     --Material_Tbl(0).SCHEDULE_DESIGNATOR   :=
3375     Material_Tbl(0).VISIT_ID                := l_Visit_Id;
3376     --Material_Tbl(0).VISIT_START_DATE      :=
3377     Material_Tbl(0).VISIT_TASK_ID           := l_visit_task_Id;
3378     Material_Tbl(0).ORGANIZATION_ID         := p_mtl_txn_Rec.Organization_Id;
3379     --Material_Tbl(0).SCHEDULED_DATE        :=
3380     --Material_Tbl(0).REQUEST_ID            :=
3381     --Material_Tbl(0).PROCESS_STATUS        :=
3382     --Material_Tbl(0).ERROR_MESSAGE         :=
3383     --Material_Tbl(0).TRANSACTION_ID        :=
3384     --Material_Tbl(0).CONCATENATED_SEGMENTS   :=
3385     --Material_Tbl(0).ITEM_DESCRIPTION      :=
3386     --Material_Tbl(0).RT_OPER_MATERIAL_ID   :=
3387     -- Fix bug# 6598809. Pass requested quantity as 0.
3388     --Material_Tbl(0).REQUESTED_QUANTITY      := l_quantity;
3389     Material_Tbl(0).REQUESTED_QUANTITY      := 0;
3390     Material_Tbl(0).REQUESTED_DATE          := SYSDATE;
3391     Material_Tbl(0).UOM_CODE    := l_primary_Uom;
3392     --Material_Tbl(0).SCHEDULED_QUANTITY    := ;
3393     --Material_Tbl(0).JOB_NUMBER            :=
3394     Material_Tbl(0).WORKORDER_ID            := p_mtl_txn_Rec.Workorder_Id;
3395     Material_Tbl(0).OPERATION_SEQUENCE      := p_mtl_txn_Rec.Operation_Seq_Num;
3396     Material_Tbl(0).WORKORDER_OPERATION_ID  := p_mtl_txn_Rec.Workorder_Operation_Id;
3397     --Material_Tbl(0).ITEM_GROUP_ID         :=
3398     --Material_Tbl(0).PROGRAM_ID            :=
3399     --Material_Tbl(0).PROGRAM_UPDATE_DATE   :=
3400     --Material_Tbl(0).LAST_UPDATED_DATE     := SYSDATE;
3401     Material_Tbl(0).DESCRIPTION             := l_Item_Desc;
3402     --Material_Tbl(0).DEPARTMENT_ID         :=
3403     Material_Tbl(0).PROJECT_TASK_ID         := l_project_Task_id;
3404     Material_Tbl(0).PROJECT_ID              := l_project_id;
3405     --Material_Tbl(0).Req_Material_Rec_Type  :=
3406 
3407 
3408     IF G_DEBUG='Y' THEN
3409           AHL_DEBUG_PUB.debug('Calling AHL_PP_MATERIALS_PVT.Create_Material_Reqst...');
3410 
3411     END IF;
3412      AHL_PP_MATERIALS_PVT.Create_Material_Reqst(p_api_version => 1.0,
3413                                                 p_x_req_material_tbl  => Material_Tbl,
3414                                                 --p_interface_flag  => 'N',
3415                                                 p_interface_flag  => NULL,
3416                                                 x_job_return_status => x_tmp,
3417                                                 x_return_status     => x_return_status,
3418                                                 x_msg_count         => x_msg_count,
3419                                                 x_msg_data          => x_msg_data);
3420     IF G_DEBUG='Y' THEN
3421           AHL_DEBUG_PUB.debug('after the call AHL_PP_MATERIALS_PVT.Create_Material_Reqst');
3422 
3423     END IF;
3424     IF G_DEBUG='Y' THEN
3425           AHL_DEBUG_PUB.debug('x_return_status['||x_return_status||']');
3426           AHL_DEBUG_PUB.debug('x_msg_data['||x_msg_data||']');
3427 
3428     END IF;
3429     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3430         FND_MESSAGE.Set_Name('AHL','AHL_PRD_SCHMTLAPI_ERROR');
3431         FND_MESSAGE.Set_Token('MSG',x_msg_data);
3432         FND_MSG_PUB.ADD;
3433         RAISE  FND_API.G_EXC_ERROR;
3434     END  IF;
3435 
3436     /* will be updated after wip api is successful - modified for bug fix 5499575.
3437         -- Update Completed quantity.
3438         Update ahl_schedule_materials
3439         set completed_quantity = l_quantity
3440         where scheduled_material_id = Material_Tbl(0).schedule_material_id;
3441     */
3442 
3443 END Insert_Sch_Mtl_Row;
3444 
3445 
3446 /****************************************************
3447 This procedure will create the service API record from the input material txn
3448 record data.
3449 *****************************************************/
3450 PROCEDURE Populate_Srvc_Rec(
3451         p_item_instance_id  NUMBER,
3452         p_srvc_rec OUT NOCOPY AHL_PRD_NONROUTINE_PVT.Sr_task_Rec_type,
3453         p_x_ahl_mtltxn_rec IN Ahl_Mtltxn_Rec_Type)
3454 IS
3455 
3456 BEGIN
3457 
3458 
3459     --p_srvc_rec.TYPE_ID           := FND_PROFILE.value(C_AHL_DEF_SR_TYPE);
3460     p_srvc_rec.SUMMARY             := p_x_ahl_mtltxn_rec.SR_SUMMARY;
3461     --p_srvc_rec.CONTACT_TYPE      := 'EMPLOYEE';
3462     p_srvc_rec.PROBLEM_CODE    := p_x_ahl_mtltxn_rec.Problem_Code;
3463     p_srvc_rec.VISIT_ID        := p_x_ahl_mtltxn_rec.Target_Visit_Id;
3464     --p_srvc_rec.DURATION          := FND_PROFILE.value(C_AHL_DEF_TASK_EST_DURATION);
3465     p_srvc_rec.INSTANCE_ID      := p_item_instance_id;
3466     p_srvc_rec.ORIGINATING_WO_ID  := p_x_ahl_mtltxn_rec.Workorder_Id;
3467     p_srvc_rec.OPERATION_TYPE  := 'CREATE';
3468     p_srvc_rec.source_program_code  := 'AHL_NONROUTINE';
3469 
3470     -- set create wo option.
3471     IF (p_x_ahl_mtltxn_rec.create_wo_option = 'CREATE_RELEASE_WO') THEN
3472         p_srvc_rec.WO_Create_flag := 'Y';
3473         p_srvc_rec.WO_Release_flag := 'Y';
3474     ELSIF (p_x_ahl_mtltxn_rec.create_wo_option = 'CREATE_WO') THEN
3475         p_srvc_rec.WO_Create_flag := 'Y';
3476         p_srvc_rec.WO_Release_flag := 'N';
3477     ELSIF (p_x_ahl_mtltxn_rec.create_wo_option = 'CREATE_WO_NO') THEN
3478         p_srvc_rec.WO_Create_flag := 'N';
3479         p_srvc_rec.WO_Release_flag := 'N';
3480     END IF;
3481     -- End: Added for bug# 5903318.
3482 
3483     -- Added for ER#
3484     p_srvc_rec.move_qty_to_nr_workorder := 'N';
3485     p_srvc_rec.instance_quantity := p_x_ahl_mtltxn_rec.quantity;
3486 
3487 
3488     IF G_DEBUG='Y' THEN
3489           AHL_DEBUG_PUB.debug('p_srvc_rec.SUMMARY['||p_srvc_rec.SUMMARY||']');
3490           AHL_DEBUG_PUB.debug('PROBLEM_CODE['||p_srvc_rec.PROBLEM_CODE||']');
3491           AHL_DEBUG_PUB.debug('p_srvc_rec.VISIT_ID['||p_srvc_rec.VISIT_ID||']');
3492           AHL_DEBUG_PUB.debug('p_srvc_rec.INSTANCE_ID['||p_srvc_rec.INSTANCE_ID||']');
3493           AHL_DEBUG_PUB.debug('p_srvc_rec.ORIGINATING_WO_ID['||p_srvc_rec.ORIGINATING_WO_ID||']');
3494           AHL_DEBUG_PUB.debug('p_srvc_rec.WO_Create_flag['||p_srvc_rec.WO_Create_flag||']');
3495           AHL_DEBUG_PUB.debug('p_srvc_rec.WO_Release_flag['||p_srvc_rec.WO_Release_flag||']');
3496           AHL_DEBUG_PUB.debug('p_srvc_rec.instance_quantity['||p_srvc_rec.instance_quantity||']');
3497           AHL_DEBUG_PUB.debug('p_srvc_rec.move_qty_to_nr_workorder['||p_srvc_rec.move_qty_to_nr_workorder||']');
3498 
3499     END IF;
3500 
3501 
3502 END Populate_Srvc_Rec;
3503 
3504 /*********************************************************************
3505 This procedure will insert the interface records.
3506 
3507 *********************************************************************/
3508 
3509 PROCEDURE INSERT_MTL_TXN_INTF
3510     (
3511         p_x_ahl_mtl_txn_rec     IN OUT NOCOPY   AHL_MTLTXN_REC_TYPE,
3512         p_eam_item_type_id      IN              NUMBER,
3513         p_x_txn_hdr_id          IN OUT NOCOPY   NUMBER,
3514         p_x_txn_intf_id         IN OUT NOCOPY   NUMBER,
3515         p_reservation_flag      IN              VARCHAR2,
3516         x_return_status            OUT NOCOPY   VARCHAR2
3517     )
3518 IS
3519 l_Process_Flag          VARCHAR2(1);
3520 l_Validation_required   VARCHAR2(1);
3521 l_transaction_Mode      NUMBER;
3522 l_source_code           VARCHAR2(240);
3523 l_source_line_id        NUMBER;
3524 l_txn_tmp_id            NUMBER;
3525 l_Source_Header_Id      NUMBER;
3526 l_lot_expiration_Date   DATE;
3527 l_txn_action            NUMBER;
3528 l_txn_source_type       NUMBER;
3529 l_qty                   NUMBER;
3530 l_reservation_flag      VARCHAR2(1);
3531 
3532 -- added to support dynamic locator creation.
3533 l_mti_seglist           fnd_flex_ext.SegmentArray;
3534 
3535 l_loop_count            NUMBER;
3536 
3537 CURSOR TRX_ACTION_CUR(p_type_Id NUMBER) IS
3538 SELECT TRANSACTION_ACTION_ID,TRANSACTION_SOURCE_TYPE_ID
3539 from MTL_TRANSACTION_TYPES
3540 where TRANSACTION_TYPE_ID = p_type_Id;
3541 
3542 BEGIN
3543 
3544     l_Process_Flag := '1';
3545     l_Validation_required  := '1';
3546     l_transaction_Mode := 2;
3547     l_source_code := 'AHL';
3548     l_source_line_id := 1;
3549     l_Source_Header_Id := 1;
3550 
3551 
3552     x_return_status := FND_API.G_RET_STS_SUCCESS;
3553 
3554     OPEN TRX_ACTION_CUR(p_x_ahl_mtl_txn_rec.Transaction_Type_Id);
3555     FETCH TRX_ACTION_CUR INTO l_txn_action, l_txn_source_type;
3556     IF(TRX_ACTION_CUR%NOTFOUND) THEN
3557         IF G_DEBUG='Y' THEN
3558           AHL_DEBUG_PUB.debug('Did not find the Txn Type');
3559         END IF;
3560         CLOSE TRX_ACTION_CUR;
3561         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3562     END IF;
3563     CLOSE TRX_ACTION_CUR;
3564 
3565 
3566     IF(p_x_txn_hdr_id IS NULL) THEN
3567         SELECT Mtl_Material_Transactions_S.nextval
3568         INTO p_x_txn_hdr_id
3569         FROM DUAL;
3570         IF G_DEBUG='Y' THEN
3571           AHL_DEBUG_PUB.debug('Header id created..['||p_x_txn_hdr_id||']');
3572         END IF;
3573     END IF;
3574 
3575     l_loop_count := 0;
3576 
3577     WHILE (l_loop_count < p_x_ahl_mtl_txn_rec.Quantity) LOOP
3578 
3579        SELECT Mtl_Material_Transactions_S.nextval
3580        INTO p_x_txn_intf_id
3581        FROM DUAL;
3582 
3583        IF G_DEBUG='Y' THEN
3584              AHL_DEBUG_PUB.debug('Interface id created..['||p_x_txn_intf_id||']');
3585        END IF;
3586 
3587        if(p_x_ahl_mtl_txn_rec.Revision = FND_API.G_MISS_CHAR) THEN
3588            p_x_ahl_mtl_txn_rec.Revision := NULL;
3589        END IF;
3590        IF(p_x_ahl_mtl_txn_rec.Locator_Id = FND_API.G_MISS_NUM) THEN
3591            p_x_ahl_mtl_txn_rec.Locator_Id := NULL;
3592        END IF;
3593        if(p_x_ahl_mtl_txn_rec.Transaction_Type_Id = WIP_CONSTANTS.ISSCOMP_TYPE) THEN
3594             IF (p_eam_item_type_id = WIP_CONSTANTS.rebuild_item_type AND p_x_ahl_mtl_txn_rec.Quantity > 1) THEN
3595                l_qty := - 1;
3596                l_loop_count := l_loop_count + 1;
3597             ELSE
3598                l_qty := - p_x_ahl_mtl_txn_rec.Quantity;
3599                l_loop_count := p_x_ahl_mtl_txn_rec.Quantity + 1;
3600             END IF;
3601        ELSE
3602             IF (p_eam_item_type_id = WIP_CONSTANTS.rebuild_item_type AND p_x_ahl_mtl_txn_rec.Quantity > 1) THEN
3603                l_qty := 1;
3604                l_loop_count := l_loop_count + 1;
3605             ELSE
3606                l_qty :=  p_x_ahl_mtl_txn_rec.Quantity;
3607                l_loop_count := p_x_ahl_mtl_txn_rec.Quantity + 1;
3608             END IF;
3609        END IF;
3610        IF G_DEBUG='Y' THEN
3611            AHL_DEBUG_PUB.debug('Loop Count is..['||l_loop_count||']');
3612            AHL_DEBUG_PUB.debug('l_qty is..['||l_qty||']');
3613        END IF;
3614 
3615        IF( p_x_ahl_mtl_txn_rec.Reason_Id = FND_API.G_MISS_NUM) THEN
3616            p_x_ahl_mtl_txn_rec.Reason_Id := NULL;
3617        END IF;
3618        IF( p_x_ahl_mtl_txn_rec.Serial_number = FND_API.G_MISS_CHAR) THEN
3619            p_x_ahl_mtl_txn_rec.Serial_number := NULL;
3620        END IF;
3621        IF( p_x_ahl_mtl_txn_rec.Lot_number = FND_API.G_MISS_CHAR) THEN
3622            p_x_ahl_mtl_txn_rec.Lot_number := NULL;
3623        END IF;
3624        IF (p_x_ahl_mtl_txn_rec.ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR) THEN
3625            p_x_ahl_mtl_txn_rec.ATTRIBUTE_CATEGORY := NULL;
3626        END IF;
3627        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE1 = FND_API.G_MISS_CHAR) THEN
3628            p_x_ahl_mtl_txn_rec.ATTRIBUTE1 := NULL;
3629        END IF;
3630        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE2 = FND_API.G_MISS_CHAR) THEN
3631            p_x_ahl_mtl_txn_rec.ATTRIBUTE2 := NULL;
3632        END IF;
3633        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE3 = FND_API.G_MISS_CHAR) THEN
3634            p_x_ahl_mtl_txn_rec.ATTRIBUTE3 := NULL;
3635        END IF;
3636        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE4 = FND_API.G_MISS_CHAR) THEN
3637            p_x_ahl_mtl_txn_rec.ATTRIBUTE4 := NULL;
3638        END IF;
3639        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE5 = FND_API.G_MISS_CHAR) THEN
3640            p_x_ahl_mtl_txn_rec.ATTRIBUTE5 := NULL;
3641        END IF;
3642        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE6 = FND_API.G_MISS_CHAR) THEN
3643            p_x_ahl_mtl_txn_rec.ATTRIBUTE6 := NULL;
3644        END IF;
3645        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE7 = FND_API.G_MISS_CHAR) THEN
3646            p_x_ahl_mtl_txn_rec.ATTRIBUTE7 := NULL;
3647        END IF;
3648        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE8 = FND_API.G_MISS_CHAR) THEN
3649            p_x_ahl_mtl_txn_rec.ATTRIBUTE8 := NULL;
3650        END IF;
3651        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE9 = FND_API.G_MISS_CHAR) THEN
3652            p_x_ahl_mtl_txn_rec.ATTRIBUTE9 := NULL;
3653        END IF;
3654        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE10 = FND_API.G_MISS_CHAR) THEN
3655            p_x_ahl_mtl_txn_rec.ATTRIBUTE10 := NULL;
3656        END IF;
3657        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE11 = FND_API.G_MISS_CHAR) THEN
3658            p_x_ahl_mtl_txn_rec.ATTRIBUTE11 := NULL;
3659        END IF;
3660        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE12 = FND_API.G_MISS_CHAR) THEN
3661            p_x_ahl_mtl_txn_rec.ATTRIBUTE12 := NULL;
3662        END IF;
3663        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE13 = FND_API.G_MISS_CHAR) THEN
3664            p_x_ahl_mtl_txn_rec.ATTRIBUTE13 := NULL;
3665        END IF;
3666        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE14 = FND_API.G_MISS_CHAR) THEN
3667            p_x_ahl_mtl_txn_rec.ATTRIBUTE14 := NULL;
3668        END IF;
3669        IF(p_x_ahl_mtl_txn_rec.ATTRIBUTE15 = FND_API.G_MISS_CHAR) THEN
3670            p_x_ahl_mtl_txn_rec.ATTRIBUTE15 := NULL;
3671        END IF;
3672 
3673        IF(p_x_ahl_mtl_txn_rec.transaction_reference = FND_API.G_MISS_CHAR) THEN
3674            p_x_ahl_mtl_txn_rec.transaction_reference := NULL;
3675        END IF;
3676 
3677        IF G_DEBUG='Y' THEN
3678            AHL_DEBUG_PUB.debug('Before dynamic chk:loc segs:ID' || p_x_ahl_mtl_txn_rec.Locator_Segments || ':' ||  p_x_ahl_mtl_txn_rec.Locator_Id);
3679        END IF;
3680 
3681        -- Added for FP ER 6447935
3682        -- support dynamic locator creation if allowed.
3683        -- inv/wip will validate. We will just split and pass the locator segments.
3684 
3685        -- initialze mti locator segment values.
3686        FOR i IN 1..20 LOOP
3687           l_mti_seglist(i) := null;
3688        END LOOP;
3689 
3690        IF (p_x_ahl_mtl_txn_rec.Locator_Id IS NULL AND
3691            p_x_ahl_mtl_txn_rec.Locator_Segments IS NOT NULL) THEN
3692             Get_MTL_LocatorSegs (p_concat_segs  => p_x_ahl_mtl_txn_rec.Locator_Segments,
3693                                  p_organization_id => p_x_ahl_mtl_txn_rec.organization_id,
3694                                  p_x_mti_seglist  => l_mti_seglist,
3695                                  x_return_status => x_return_status);
3696 
3697             IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3698                 RAISE FND_API.G_EXC_ERROR;
3699             ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3700                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3701             END IF;
3702 
3703        END IF;
3704 
3705        --If the lot controlled inventory record is not null insert reocrds
3706        -- into transaction lots interface table.
3707 
3708        IF (p_x_ahl_mtl_txn_rec.Lot_Number IS NOT NULL) THEN
3709 
3710             IF(p_x_ahl_mtl_txn_rec.Serial_Number IS NOT NULL) THEN
3711                 SELECT Mtl_Material_Transactions_S.nextval
3712                 INTO l_txn_tmp_id
3713                 FROM DUAL;
3714             ELSE
3715                 l_txn_tmp_id := p_x_txn_intf_id;
3716             END IF;
3717 
3718             IF G_DEBUG='Y' THEN
3719             AHL_DEBUG_PUB.debug('insertng the lot record,interface id,tempid['
3720                              ||to_char(p_x_txn_intf_id)||','
3721                              ||to_char(l_txn_tmp_id)||']');
3722             END IF;
3723             INSERT INTO  MTL_TRANSACTION_LOTS_INTERFACE
3724                   ( TRANSACTION_INTERFACE_ID ,
3725                     SOURCE_CODE ,
3726                     SOURCE_LINE_ID ,
3727                     LAST_UPDATE_DATE ,
3728                     LAST_UPDATED_BY ,
3729                     CREATION_DATE ,
3730                     CREATED_BY ,
3731                     LAST_UPDATE_LOGIN ,
3732                     LOT_NUMBER ,
3733                     LOT_EXPIRATION_DATE ,
3734                     TRANSACTION_QUANTITY ,
3735                     PRIMARY_QUANTITY,
3736                     SERIAL_TRANSACTION_TEMP_ID
3737                     )
3738             VALUES(p_x_txn_intf_id,
3739                     l_Source_Code,
3740                     l_Source_Line_Id,
3741                     sysdate,
3742                     FND_GLOBAL.USER_ID,
3743                     sysdate,
3744                     FND_GLOBAL.USER_ID,
3745                     FND_GLOBAL.LOGIN_ID,
3746                     p_x_ahl_mtl_txn_rec.Lot_Number,
3747                     l_lot_expiration_Date,
3748                     l_qty,
3749                     l_qty,
3750                     l_txn_tmp_id);
3751        END IF;
3752 
3753        --If the serial controlled rec is not null then insert records
3754        -- into the serial numbers interface table
3755        IF (p_x_ahl_mtl_txn_rec.Serial_Number IS NOT NULL) THEN
3756 
3757            IF (p_x_ahl_mtl_txn_rec.Lot_Number IS NULL) THEN
3758               l_txn_tmp_id := p_x_txn_intf_id;
3759            END IF;
3760 
3761            IF G_DEBUG='Y' THEN
3762              AHL_DEBUG_PUB.debug('insertng the serial record,interface id['
3763                                           ||to_char(l_txn_tmp_id)||']');
3764            END IF;
3765            INSERT INTO MTL_SERIAL_NUMBERS_INTERFACE (
3766                TRANSACTION_INTERFACE_ID, SOURCE_CODE, SOURCE_LINE_ID,
3767                LAST_UPDATE_DATE, LAST_UPDATED_BY, CREATION_DATE,
3768                CREATED_BY, LAST_UPDATE_LOGIN, FM_SERIAL_NUMBER,
3769                TO_SERIAL_NUMBER, PROCESS_FLAG)
3770            VALUES ( l_txn_tmp_id,
3771                     l_source_code,
3772                     l_source_line_id,
3773                     SYSDATE,
3774                     FND_GLOBAL.USER_ID,
3775                     SYSDATE,
3776                     FND_GLOBAL.USER_ID,
3777                     FND_GLOBAL.LOGIN_ID,
3778                     p_x_ahl_mtl_txn_rec.Serial_Number,
3779                     p_x_ahl_mtl_txn_rec.Serial_Number,
3780                     l_Process_Flag );
3781        END IF;
3782 
3783 
3784 
3785        IF G_DEBUG='Y' THEN
3786           AHL_DEBUG_PUB.debug('insertng the txn record,header id,interface id['
3787                                   ||to_char(p_x_txn_hdr_id)||','
3788                                   ||to_char(p_x_txn_intf_id)||']');
3789        END IF;
3790 
3791        INSERT INTO  MTL_TRANSACTIONS_INTERFACE
3792 
3793           ( TRANSACTION_INTERFACE_ID ,           TRANSACTION_HEADER_ID ,
3794             SOURCE_CODE ,                        SOURCE_LINE_ID ,
3795             SOURCE_HEADER_ID,                    PROCESS_FLAG ,
3796             VALIDATION_REQUIRED ,                TRANSACTION_MODE ,
3797             LAST_UPDATE_DATE ,                   LAST_UPDATED_BY ,
3798             CREATION_DATE ,                      CREATED_BY ,
3799             LAST_UPDATE_LOGIN ,                  INVENTORY_ITEM_ID ,
3800             ORGANIZATION_ID ,                    TRANSACTION_QUANTITY ,
3801             PRIMARY_QUANTITY ,                   TRANSACTION_UOM ,
3802             TRANSACTION_DATE ,                   SUBINVENTORY_CODE ,
3803             LOCATOR_ID ,                         TRANSACTION_TYPE_ID ,
3804             REVISION ,                           TRANSACTION_REFERENCE ,
3805             WIP_ENTITY_TYPE ,                    OPERATION_SEQ_NUM,
3806             TRANSACTION_SOURCE_TYPE_ID,          TRANSACTION_SOURCE_ID,
3807             TRX_SOURCE_LINE_ID,
3808             ATTRIBUTE_CATEGORY,                      ATTRIBUTE1,
3809             ATTRIBUTE2,                              ATTRIBUTE3,
3810             ATTRIBUTE4,                              ATTRIBUTE5,
3811             ATTRIBUTE6,                              ATTRIBUTE7,
3812             ATTRIBUTE8,                              ATTRIBUTE9,
3813             ATTRIBUTE10,                             ATTRIBUTE11,
3814             ATTRIBUTE12,                             ATTRIBUTE13,
3815             ATTRIBUTE14,                             ATTRIBUTE15,
3816             RELIEVE_RESERVATIONS_FLAG,
3817             REASON_ID,
3818             LOC_SEGMENT1,                            LOC_SEGMENT2,
3819             LOC_SEGMENT3,                            LOC_SEGMENT4,
3820             LOC_SEGMENT5,                            LOC_SEGMENT6,
3821             LOC_SEGMENT7,                            LOC_SEGMENT8,
3822             LOC_SEGMENT9,                            LOC_SEGMENT10,
3823             LOC_SEGMENT11,                           LOC_SEGMENT12,
3824             LOC_SEGMENT13,                           LOC_SEGMENT14,
3825             LOC_SEGMENT15,                           LOC_SEGMENT16,
3826             LOC_SEGMENT17,                           LOC_SEGMENT18,
3827             LOC_SEGMENT19,                           LOC_SEGMENT20)
3828        values  (p_x_txn_intf_id,                        p_x_txn_hdr_id,
3829          l_Source_Code,                              l_Source_Line_Id,
3830          l_Source_Header_Id,                         l_Process_Flag,
3831          l_Validation_required ,                     l_transaction_Mode,
3832          sysdate,                                    FND_GLOBAL.USER_ID,
3833          sysdate,                                    FND_GLOBAL.USER_ID,
3834          FND_GLOBAL.LOGIN_ID,                        p_x_ahl_mtl_txn_rec.Inventory_Item_Id,
3835          p_x_ahl_mtl_txn_rec.Organization_Id,        l_qty,
3836          l_qty,                                      p_x_ahl_mtl_txn_rec.Uom,
3837          p_x_ahl_mtl_txn_rec.Transaction_Date,       p_x_ahl_mtl_txn_rec.Subinventory_Name,
3838          p_x_ahl_mtl_txn_rec.Locator_Id,             p_x_ahl_mtl_txn_rec.Transaction_Type_Id,
3839          p_x_ahl_mtl_txn_rec.Revision,               p_x_ahl_mtl_txn_rec.Transaction_Reference,
3840          WIP_CONSTANTS.DISCRETE,                     p_x_ahl_mtl_txn_rec.Operation_Seq_Num,
3841          l_txn_source_type,                          p_x_ahl_mtl_txn_rec.Wip_Entity_id,
3842          p_x_ahl_mtl_txn_rec.Operation_Seq_Num,   -- TRX_SOURCE_LINE_ID (needed for relieving reservations)
3843          p_x_ahl_mtl_txn_rec.Attribute_Category,     p_x_ahl_mtl_txn_rec.Attribute1,
3844          p_x_ahl_mtl_txn_rec.Attribute2,             p_x_ahl_mtl_txn_rec.Attribute3,
3845          p_x_ahl_mtl_txn_rec.Attribute4,             p_x_ahl_mtl_txn_rec.Attribute5,
3846          p_x_ahl_mtl_txn_rec.Attribute6,             p_x_ahl_mtl_txn_rec.Attribute7,
3847          p_x_ahl_mtl_txn_rec.Attribute8,             p_x_ahl_mtl_txn_rec.Attribute9,
3848          p_x_ahl_mtl_txn_rec.Attribute10,            p_x_ahl_mtl_txn_rec.Attribute11,
3849          p_x_ahl_mtl_txn_rec.Attribute12,            p_x_ahl_mtl_txn_rec.Attribute13,
3850          p_x_ahl_mtl_txn_rec.Attribute14,            p_x_ahl_mtl_txn_rec.Attribute15,
3851          p_reservation_flag,  -- relieve reservations flag.
3852          p_x_ahl_mtl_txn_rec.reason_id,
3853          l_mti_seglist(1),                               l_mti_seglist(2),
3854          l_mti_seglist(3),                               l_mti_seglist(4),
3855          l_mti_seglist(5),                               l_mti_seglist(6),
3856          l_mti_seglist(7),                               l_mti_seglist(8),
3857          l_mti_seglist(9),                               l_mti_seglist(10),
3858          l_mti_seglist(11),                              l_mti_seglist(12),
3859          l_mti_seglist(13),                              l_mti_seglist(14),
3860          l_mti_seglist(15),                              l_mti_seglist(16),
3861          l_mti_seglist(17),                              l_mti_seglist(18),
3862          l_mti_seglist(19),                              l_mti_seglist(20)
3863              ) ;
3864     END LOOP; -- WHILE (l_loop_count
3865 
3866 
3867     IF G_DEBUG='Y' THEN
3868        AHL_DEBUG_PUB.debug('Transaction_source type['||l_txn_source_type||']');
3869        AHL_DEBUG_PUB.debug('Transaction_source Id['||p_x_ahl_mtl_txn_rec.Wip_Entity_id||']');
3870     END IF;
3871 
3872 EXCEPTION
3873          WHEN OTHERS THEN
3874            x_return_status := FND_API.G_RET_STS_ERROR;
3875                IF G_DEBUG='Y' THEN
3876           AHL_DEBUG_PUB.debug('Exception inserting into mtl_txn interface' || SQLCODE);
3877               AHL_DEBUG_PUB.debug('SQLERRM:' || SQLERRM);
3878 
3879            END IF;
3880            FND_MESSAGE.Set_Name('AHL','AHL_PRD_MTLTXN_ERROR');
3881            FND_MESSAGE.Set_Token('MSG',SQLERRM);
3882            FND_MESSAGE.Set_Token('ITEM',p_x_ahl_mtl_txn_rec.Inventory_Item_Id);
3883            FND_MESSAGE.Set_Token('WO_NAME',p_x_ahl_mtl_txn_rec.workorder_id);
3884            FND_MSG_PUB.ADD;
3885                RAISE FND_API.G_EXC_ERROR;
3886 
3887 END INSERT_MTL_TXN_INTF;
3888 
3889 /* This is a funciton used by the front queries which
3890 populate the table data. This gets the issued quantity
3891 for rhe given workorder id and item */
3892 Function GET_ISSUED_QTY(P_ORG_ID IN NUMBER, P_ITEM_ID IN NUMBER, P_WORKORDER_OP_ID IN NUMBER) RETURN NUMBER
3893 as
3894     l_iss_qty NUMBER:=0;
3895 BEGIN
3896 
3897     -- Tamal: Bug #4095376: Begin
3898     -- The following line will be needed in the case net quantity issued is to be displayed, instead of entire issued quantity
3899     -- SELECT sum(nvl(decode(TRANSACTION_TYPE_ID, 35, QUANTITY, 43, -QUANTITY, 0), 0))
3900     SELECT sum(nvl(QUANTITY, 0))
3901     INTO l_iss_qty
3902     FROM AHL_WORKORDER_MTL_TXNS
3903     WHERE ORGANIZATION_ID = P_ORG_ID
3904     AND INVENTORY_ITEM_ID = P_ITEM_ID
3905     AND WORKORDER_OPERATION_ID = P_WORKORDER_OP_ID
3906     -- The following line will NOT be needed in the case net quantity issued is to be displayed
3907     AND TRANSACTION_TYPE_ID = 35;
3908     -- Tamal: Bug #4095376: End
3909 
3910     return nvl(l_iss_qty,0);
3911 
3912 END GET_ISSUED_QTY;
3913 
3914 Function GET_WORKORD_LEVEL_QTY(
3915              p_wid           IN NUMBER,
3916              p_item_id       IN NUMBER,
3917              p_org_id        IN NUMBER,
3918              p_lotnum        IN VARCHAR2,
3919              p_rev           IN VARCHAR2,
3920              p_serial_number IN VARCHAR2
3921              )
3922 RETURN NUMBER
3923 As
3924 issued NUMBER;
3925 CURSOR CUR_GET_WOID_LEVEL_QTY IS
3926 SELECT SUM(nvl(QUANTITY,0))
3927 FROM AHL_WORKORDER_MTL_TXNS A
3928 ,AHL_WORKORDER_OPERATIONS_V B
3929 WHERE A.ORGANIZATION_ID       = p_org_id
3930 AND A.INVENTORY_ITEM_ID       = p_item_id
3931 AND NVL(A.lot_number,'X')=NVL(p_lotnum,NVL(A.lot_number,'X'))
3932 AND NVL(A.revision,'X')=NVL(p_rev,NVL(A.REVISION,'X'))
3933 AND NVL(A.serial_number,'X')=NVL(p_serial_number,NVL(A.SERIAL_NUMBER,'X'))
3934 AND A.TRANSACTION_TYPE_ID=35
3935 AND A.ORGANIZATION_ID = B.organization_id
3936 AND A.workorder_operation_id =B.workorder_operation_id
3937 AND B.workorder_id = p_wid;
3938 
3939 BEGIN
3940     OPEN CUR_GET_WOID_LEVEL_QTY;
3941     FETCH CUR_GET_WOID_LEVEL_QTY INTO issued;
3942     IF(CUR_GET_WOID_LEVEL_QTY%NOTFOUND) THEN
3943         issued := 0;
3944     END IF;
3945     CLOSE CUR_GET_WOID_LEVEL_QTY;
3946     return issued;
3947 END GET_WORKORD_LEVEL_QTY;
3948 
3949 -- JKJAIN FP ER # 6436303 - start
3950 -- JKJAIN removed p_lotnum,p_rev,p_serial_number for Bug # 7587902
3951 --------------------------------------------------------------------------------
3952  	 -- Function for returning net quantity of material available with
3953  	 -- a workorder.
3954  	 -- Net Total Quantity = Total Quantity Issued - Total quantity returned
3955  	 -- Balaji added this function for OGMA ER # 5948868.
3956  	 --------------------------------------------------------------------------------------
3957 
3958  	 Function GET_WORKORD_NET_QTY(
3959  	              p_wid           IN NUMBER,
3960  	              p_item_id       IN NUMBER,
3961  	              p_org_id        IN NUMBER
3962  	              )
3963  	 RETURN NUMBER
3964  	 As
3965 
3966  	 -- Local variables
3967  	 l_issue_qty NUMBER;
3968  	 l_rtn_qty NUMBER;
3969  	 l_net_qty NUMBER;
3970 
3971  	 -- Cursors
3972  	 -- cursor for getting total issued quantity
3973  	 CURSOR CUR_GET_WO_ISSUE_QTY
3974  	 IS
3975  	 SELECT  SUM(nvl(QUANTITY,0))
3976  	 FROM    AHL_WORKORDER_MTL_TXNS A ,
3977 -- 	         AHL_WORKORDER_OPERATIONS_V B
3978 --           JKJAIN BUG # 7587902
3979 			 AHL_WORKORDER_OPERATIONS B
3980  	 WHERE   A.ORGANIZATION_ID        = p_org_id
3981  	     AND A.INVENTORY_ITEM_ID      = p_item_id
3982  	     AND A.TRANSACTION_TYPE_ID    =35
3983 -- 	     AND A.ORGANIZATION_ID        = B.organization_id
3984  	     AND A.workorder_operation_id =B.workorder_operation_id
3985  	     AND B.workorder_id           = p_wid;
3986 
3987  	 -- cursor for getting total returned quantity
3988  	 CURSOR CUR_GET_WO_RET_QTY
3989  	 IS
3990  	 SELECT  SUM(nvl(QUANTITY,0))
3991  	 FROM    AHL_WORKORDER_MTL_TXNS A ,
3992 -- 	         AHL_WORKORDER_OPERATIONS_V B
3993 --           JKJAIN BUG # 7587902
3994             AHL_WORKORDER_OPERATIONS B
3995  	 WHERE   A.ORGANIZATION_ID        = p_org_id
3996  	     AND A.INVENTORY_ITEM_ID      = p_item_id
3997  	     AND A.TRANSACTION_TYPE_ID    =43
3998 -- 	     AND A.ORGANIZATION_ID        = B.organization_id
3999  	     AND A.workorder_operation_id =B.workorder_operation_id
4000  	     AND B.workorder_id           = p_wid;
4001 
4002  	 BEGIN
4003  	         OPEN CUR_GET_WO_ISSUE_QTY;
4004  	         FETCH CUR_GET_WO_ISSUE_QTY INTO l_issue_qty;
4005  	         CLOSE CUR_GET_WO_ISSUE_QTY;
4006 
4007  	         IF l_issue_qty IS NULL
4008  	         THEN
4009  	            l_issue_qty := 0;
4010  	         END IF;
4011 
4012  	         OPEN CUR_GET_WO_RET_QTY;
4013  	         FETCH CUR_GET_WO_RET_QTY INTO l_rtn_qty;
4014  	         CLOSE CUR_GET_WO_RET_QTY;
4015 
4016  	         IF l_rtn_qty IS NULL
4017  	         THEN
4018  	            l_rtn_qty := 0;
4019  	         END IF;
4020 
4021  	         l_net_qty := l_issue_qty - l_rtn_qty;
4022 
4023 -- JKJAIN BUG # 7587902
4024 -- 	         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4025 -- 	              fnd_log.string
4026 -- 	                  (
4027 -- 	                     fnd_log.level_statement,
4028 -- 	                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_WORKORD_NET_QTY',
4029 -- 	                     'l_net_qty -> ' || l_net_qty
4030 -- 	                  );
4031 -- 	         END IF;
4032 
4033  	         return l_net_qty;
4034 
4035  	 END GET_WORKORD_NET_QTY;
4036  -- JKJAIN FP ER # 6436303 - end
4037 
4038 /* this function is used by the front end queries which
4039 populate the table data. This gets the onhand quantity for an
4040 item */
4041 
4042 function GET_ONHAND(P_ORG_ID IN NUMBER, P_ITEM_ID IN NUMBER) RETURN NUMBER
4043 IS
4044 onhand NUMBER;
4045 CURSOR Q1(p_org_id NUMBER, p_itme_Id NUMBER) IS
4046 SELECT SUM(TRANSACTION_QUANTITY)
4047 FROM MTL_ONHAND_QUANTITIES
4048 WHERE ORGANIZATION_ID = p_org_id
4049 AND INVENTORY_ITEM_ID = p_item_id;
4050 BEGIN
4051     OPEN Q1(P_ORG_ID,P_ITEM_ID);
4052     FETCH Q1 INTO onhand;
4053     IF(Q1%NOTFOUND) THEN
4054         onhand := 0;
4055     END IF;
4056     CLOSE Q1;
4057     return onhand;
4058 END GET_ONHAND;
4059 
4060 procedure dumpInput(p_x_ahl_mtltxn_tbl  IN      AHL_MTLTXN_TBL_TYPE) IS
4061 BEGIN
4062 
4063   IF G_DEBUG='Y' THEN
4064     AHL_DEBUG_PUB.DEBUG('INPUTS TO THE PROC ARE ...');
4065 
4066     IF (p_x_ahl_mtltxn_tbl.COUNT > 0) THEN
4067          FOR i IN p_x_ahl_mtltxn_tbl.FIRST..p_x_ahl_mtltxn_tbl.LAST  LOOP
4068 
4069           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Ahl_mtltxn_Id:'||p_x_ahl_mtltxn_tbl(i).Ahl_mtltxn_Id);
4070           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Workorder_Id:'||p_x_ahl_mtltxn_tbl(i).Workorder_Id);
4071           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Inventory_Item_Id:'||p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id);
4072           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Inventory_Item_Segments:'||p_x_ahl_mtltxn_tbl(i).Inventory_Item_Segments);
4073           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Revision:'||p_x_ahl_mtltxn_tbl(i).Revision);
4074           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Organization_Id:'||p_x_ahl_mtltxn_tbl(i).Organization_Id);
4075           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Condition:'||p_x_ahl_mtltxn_tbl(i).Condition);
4076           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Condition_desc:'||p_x_ahl_mtltxn_tbl(i).Condition_desc);
4077           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Subinventory_Name:'||p_x_ahl_mtltxn_tbl(i).Subinventory_Name);
4078           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Locator_Id:'||p_x_ahl_mtltxn_tbl(i).Locator_Id);
4079           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Locator_Segments:'||p_x_ahl_mtltxn_tbl(i).Locator_Segments);
4080           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Quantity:'||p_x_ahl_mtltxn_tbl(i).Quantity);
4081           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Uom:'||p_x_ahl_mtltxn_tbl(i).Uom);
4082           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Uom_Desc:'||p_x_ahl_mtltxn_tbl(i).Uom_Desc);
4083           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Transaction_Type_Id:'||p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id);
4084           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Transaction_Type_Name:'||p_x_ahl_mtltxn_tbl(i).Transaction_Type_Name);
4085           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Transaction_Reference:'||p_x_ahl_mtltxn_tbl(i).Transaction_Reference);
4086           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Wip_Entity_Id:'||p_x_ahl_mtltxn_tbl(i).Wip_Entity_Id);
4087           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Operation_Seq_Num:'||p_x_ahl_mtltxn_tbl(i).Operation_Seq_Num);
4088           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Serial_Number:'||p_x_ahl_mtltxn_tbl(i).Serial_Number);
4089           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Lot_Number:'||p_x_ahl_mtltxn_tbl(i).Lot_Number);
4090           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Reason_Id:'||p_x_ahl_mtltxn_tbl(i).Reason_Id);
4091           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Reason_Name:'||p_x_ahl_mtltxn_tbl(i).Reason_Name);
4092           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Problem_Code:'||p_x_ahl_mtltxn_tbl(i).Problem_Code);
4093           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Problem_Code_Meaning:'||p_x_ahl_mtltxn_tbl(i).Problem_Code_Meaning);
4094 
4095           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Target_Visit_Id:'||p_x_ahl_mtltxn_tbl(i).Target_Visit_Id);
4096 
4097           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Sr_Summary:'||p_x_ahl_mtltxn_tbl(i).Sr_Summary);
4098 
4099           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Qa_Collection_Id:'||p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id);
4100 
4101           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').Workorder_operation_Id:'||p_x_ahl_mtltxn_tbl(i).Workorder_operation_Id);
4102 
4103           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE_CATEGORY:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE_CATEGORY);
4104 
4105           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE1:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE1);
4106 
4107           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE2:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE2);
4108 
4109           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE3:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE3);
4110 
4111           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE4:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE4);
4112 
4113           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE5:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE5);
4114 
4115           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE6:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE6);
4116 
4117           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE7:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE7);
4118 
4119           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE8:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE8);
4120 
4121           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE9:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE9);
4122 
4123           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE10:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE10);
4124 
4125           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE11:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE11);
4126 
4127           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE12:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE12);
4128 
4129           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE13:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE13);
4130 
4131           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE14:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE14);
4132 
4133           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').ATTRIBUTE15:'||p_x_ahl_mtltxn_tbl(i).ATTRIBUTE15);
4134           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').transaction_date:'||p_x_ahl_mtltxn_tbl(i).transaction_date);
4135           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').recepient_id:'||p_x_ahl_mtltxn_tbl(i).recepient_id);
4136           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').recepient_name:'||p_x_ahl_mtltxn_tbl(i).recepient_name);
4137           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').disposition_id:'||p_x_ahl_mtltxn_tbl(i).disposition_id);
4138           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').disposition_name:'||p_x_ahl_mtltxn_tbl(i).disposition_name);
4139           AHL_DEBUG_PUB.debug('p_x_ahl_mtltxn_tbl('||i||').move_to_project_flag:'||p_x_ahl_mtltxn_tbl(i).move_to_project_flag);
4140       END LOOP;
4141     END IF; -- p_x_ahl_mtltxn_tbl.COUNT
4142   END IF;
4143 END dumpInput;
4144 
4145 Procedure CALCULATE_QTY
4146 (
4147     p_wo_id     IN NUMBER,
4148     p_item_id   IN NUMBER,
4149     p_org_id    IN NUMBER,
4150     p_lot_num   IN VARCHAR2,
4151     p_rev_num   IN VARCHAR2,
4152     p_serial_num    IN VARCHAR2,
4153     p_wo_op_id  IN NUMBER,
4154     x_qty           OUT NOCOPY NUMBER
4155 )
4156 IS
4157     l_rev_flag      VARCHAR2(1) := 'N';
4158     l_lot_flag      VARCHAR2(1) := 'N';
4159     l_serial_flag   VARCHAR2(1) := 'N';
4160 
4161     CURSOR  GetItemDet(c_inv_item_id IN NUMBER, c_org_id IN NUMBER)
4162     IS
4163     SELECT
4164         SERIAL_NUMBER_CONTROL_CODE,
4165         LOT_CONTROL_CODE,
4166         REVISION_QTY_CONTROL_CODE
4167     FROM
4168         MTL_SYSTEM_ITEMS_B
4169     WHERE
4170         inventory_item_id=c_inv_item_id
4171         AND ORGANIZATION_ID=c_org_id;
4172 
4173     l_item_rec      GetItemDet%rowtype;
4174     l_iss_qty       NUMBER:=0;
4175     l_rtn_qty       NUMBER:=0;
4176     l_disp_qty      NUMBER:=0;
4177     l_net_qty       NUMBER:=0;
4178 
4179 BEGIN
4180 
4181     OPEN GetItemDet (p_item_id, p_org_id);
4182     FETCH GetItemDet into l_item_rec;
4183     IF GetItemDet%found
4184     THEN
4185         IF l_item_rec.LOT_CONTROL_CODE = 2 THEN
4186             l_lot_flag:='Y';
4187         END IF;
4188 
4189         IF l_item_rec.REVISION_QTY_CONTROL_CODE = 2 THEN
4190             l_rev_flag:='Y';
4191         END IF;
4192 
4193         IF l_item_rec.SERIAL_NUMBER_CONTROL_CODE <> 1 THEN
4194             l_serial_flag:='Y';
4195         END IF;
4196     END IF;
4197     CLOSE GetItemDet;
4198 
4199 
4200     SELECT SUM(NVL(a.primary_uom_qty,0)) INTO l_iss_qty
4201     FROM
4202         AHL_WORKORDER_MTL_TXNS a,
4203         AHL_WORKORDER_OPERATIONS b
4204     WHERE
4205         a.workorder_operation_id=b.workorder_operation_id
4206         AND a.transaction_type_id=35
4207         AND b.workorder_id=p_wo_id
4208         AND a.inventory_item_id=p_item_id
4209         AND a.organization_id=p_org_id
4210         AND nvl(a.serial_number,'X') = nvl(decode(l_serial_flag, 'Y', p_serial_num, a.serial_number),'X')
4211         AND nvl(a.lot_number,'X') = nvl(decode(l_lot_flag, 'Y', p_lot_num, a.lot_number),'X')
4212         AND nvl(a.revision,'X') = nvl(decode(l_rev_flag, 'Y', p_rev_num, a.revision),'X')
4213         AND a.workorder_operation_id=nvl(p_wo_op_id, a.workorder_operation_id);
4214 
4215     SELECT SUM(NVL(a.primary_uom_qty,0)) INTO l_rtn_qty
4216     FROM
4217         AHL_WORKORDER_MTL_TXNS a,
4218         AHL_WORKORDER_OPERATIONS b
4219     WHERE
4220         a.workorder_operation_id=b.workorder_operation_id
4221         AND a.transaction_type_id=43
4222         AND b.workorder_id=p_wo_id
4223         AND a.inventory_item_id=p_item_id
4224         AND a.organization_id=p_org_id
4225         AND nvl(a.serial_number,'X') = nvl(decode(l_serial_flag, 'Y', p_serial_num, a.serial_number),'X')
4226         AND nvl(a.lot_number,'X') = nvl(decode(l_lot_flag, 'Y', p_lot_num, a.lot_number),'X')
4227         AND nvl(a.revision,'X') = nvl(decode(l_rev_flag, 'Y', p_rev_num, a.revision),'X')
4228         AND a.workorder_operation_id=nvl(p_wo_op_id, a.workorder_operation_id);
4229 
4230     /* Tamal [R12 APPSPERF fixes]
4231      * R12 Drop 4 - SQL ID: 14400506
4232      * Bug #4918991
4233      */
4234     SELECT SUM(NVL(a.net_quantity,0)) INTO l_disp_qty
4235     FROM
4236         AHL_MTL_RET_DISPOSITIONS_V a,
4237         AHL_WORKORDERS b
4238     WHERE
4239         a.workorder_id=b.workorder_id
4240         AND b.master_workorder_flag = 'N'
4241         AND b.status_code NOT IN ('17' , '22')
4242         AND b.workorder_id=p_wo_id
4243         AND a.inventory_item_id=p_item_id
4244         --AND a.organization_id=p_org_id
4245         AND nvl(a.serial_number,'X') = nvl(decode(l_serial_flag, 'Y', p_serial_num, a.serial_number),'X')
4246         AND nvl(a.lot_number,'X') = nvl(decode(l_lot_flag, 'Y', p_lot_num, a.lot_number),'X')
4247         AND nvl(a.item_revision,'X') = nvl(decode(l_rev_flag, 'Y', p_rev_num, a.item_revision),'X')
4248         AND a.workorder_operation_id=nvl(p_wo_op_id, a.workorder_operation_id);
4249 
4250     x_qty := nvl(l_iss_qty, 0) - nvl(l_rtn_qty, 0) - nvl(l_disp_qty, 0);
4251 
4252 END CALCULATE_QTY;
4253 
4254 PROCEDURE getDispositionReturn
4255           (
4256             p_x_ahl_prd_mtl_txn_tbl     IN OUT  NOCOPY Ahl_Mtltxn_Tbl_Type,
4257             P_prd_Mtltxn_criteria_rec   IN            Prd_Mtltxn_criteria_rec
4258            )AS
4259 
4260    -- pick organization from Visit table. Disp. view returns master org.
4261    CURSOR GetDispDet
4262           (
4263              p_job_number   IN VARCHAR2,
4264              p_visit_number IN NUMBER,
4265              p_priority     IN NUMBER,
4266              p_dept_name    IN VARCHAR2,
4267              p_org_name     IN VARCHAR2,
4268              p_item         IN VARCHAR2,
4269              p_incident_number IN VARCHAR2,
4270              p_disposition_name IN VARCHAR2
4271            ) IS
4272 
4273 /* Tamal [R12 APPSPERF fixes]
4274  * R12 Drop 4 - SQL ID: 14400778
4275  * Bug #4918991
4276  */
4277 SELECT
4278     D.WORKORDER_ID,
4279     D.WORKORDER_NAME,
4280     V.ORGANIZATION_ID,
4281     D.WORKORDER_OPERATION_ID,
4282     O.OPERATION_SEQUENCE_NUM,
4283     D.ITEM_NUMBER,
4284     D.INVENTORY_ITEM_ID,
4285     D.ITEM_DESC,
4286     D.IMMEDIATE_DISPOSITION_CODE,
4287     D.DISPOSITION_ID,
4288     D.IMMEDIATE_TYPE,
4289     D.CONDITION_CODE,
4290     D.CONDITION_ID,
4291     D.SERIAL_NUMBER,
4292     D.UOM,
4293     UOM.UNIT_OF_MEASURE,
4294     WO_STS.MEANING JOB_STATUS_MEANING,
4295     D.LOT_NUMBER,
4296     D.ITEM_REVISION,
4297     D.COLLECTION_ID,
4298     D.INSTANCE_ID,
4299     WIP.DEFAULT_PULL_SUPPLY_SUBINV,
4300     WIP.DEFAULT_PULL_SUPPLY_LOCATOR_ID,
4301     L.CONCATENATED_SEGMENTS,
4302     --SYSDATE,
4303     D.QUANTITY, --GOES TO THE ISSUE QTY UI
4304     D.NET_QUANTITY,  --GOES TO THE RETURN QTY
4305 	-- JKJAIN FP ER # 6436303 - start
4306  	AHL_PRD_MTLTXN_PVT.GET_WORKORD_NET_QTY(D.WORKORDER_ID,D.INVENTORY_ITEM_ID,V.ORGANIZATION_ID) Wo_Net_Total_Qty,
4307  	-- JKJAIN FP ER # 6436303 - end
4308    W.wip_entity_id,
4309     (select inv_locator_id from ahl_visits_b where visit_id = w.visit_id) inv_locator_id
4310 FROM
4311     AHL_MTL_RET_DISPOSITIONS_V D,
4312     AHL_WORKORDERS W,
4313     (SELECT LOOKUP_CODE, MEANING FROM FND_LOOKUP_VALUES WHERE LOOKUP_TYPE = 'AHL_JOB_STATUS' AND LANGUAGE= USERENV('LANG')) WO_STS,
4314     AHL_VISITS_B V,
4315     AHL_VISIT_TASKS_B VT,
4316     CS_INCIDENTS_ALL_B C,
4317     WIP_DISCRETE_JOBS WDJ,
4318     (SELECT ORGANIZATION_ID, NAME FROM HR_ALL_ORGANIZATION_UNITS_TL WHERE LANGUAGE = USERENV('LANG')) ORG,
4319     BOM_DEPARTMENTS B,
4320     AHL_WORKORDER_OPERATIONS O,
4321     MTL_UNITS_OF_MEASURE_VL UOM,
4322     WIP_PARAMETERS WIP,
4323     MTL_ITEM_LOCATIONS_KFV L
4324 WHERE
4325     D.WORKORDER_ID = W.WORKORDER_ID AND
4326     W.MASTER_WORKORDER_FLAG = 'N' AND
4327     W.STATUS_CODE NOT IN ('17', '22', '5','7','12') AND
4328     W.STATUS_CODE = WO_STS.LOOKUP_CODE AND
4329     O.WORKORDER_OPERATION_ID (+) = D.WORKORDER_OPERATION_ID AND
4330     O.WORKORDER_ID (+) = D.WORKORDER_ID AND
4331     D.UOM = UOM.UOM_CODE AND
4332     WIP.ORGANIZATION_ID = L.ORGANIZATION_ID(+) AND
4333     WIP.DEFAULT_PULL_SUPPLY_LOCATOR_ID = L.INVENTORY_LOCATION_ID(+) AND
4334     WIP.ORGANIZATION_ID = V.ORGANIZATION_ID AND
4335     W.VISIT_TASK_ID = VT.VISIT_TASK_ID AND
4336     V.VISIT_ID = VT.VISIT_ID AND
4337     V.SERVICE_REQUEST_ID = C.INCIDENT_ID(+) AND
4338     WDJ.WIP_ENTITY_ID = W.WIP_ENTITY_ID AND
4339     WDJ.OWNING_DEPARTMENT = B.DEPARTMENT_ID(+) AND
4340     V.ORGANIZATION_ID = ORG.ORGANIZATION_ID AND
4341     D.IMMEDIATE_TYPE LIKE NVL(p_disposition_name, D.IMMEDIATE_TYPE) AND
4342     D.ITEM_NUMBER LIKE NVL(p_item, D.ITEM_NUMBER) AND
4343     NVL(C.INCIDENT_NUMBER,'X') LIKE NVL(p_incident_number, NVL(C.INCIDENT_NUMBER,'X')) AND
4344     W.WORKORDER_NAME LIKE NVL(p_job_number, W.WORKORDER_NAME) AND
4345     UPPER(ORG.NAME) LIKE UPPER(NVL(p_org_name, ORG.NAME)) AND
4346     NVL(WDJ.PRIORITY,0) = NVL(p_priority, NVL(WDJ.PRIORITY,0)) AND
4347     V.VISIT_NUMBER = NVL(p_visit_number, V.VISIT_NUMBER) AND
4348     UPPER(B.DESCRIPTION) LIKE UPPER(NVL(p_dept_name, B.DESCRIPTION));
4349 
4350     -- check if issued instance has been installed / validate instance.
4351     CURSOR chk_inst_relationship_csr (p_INVENTORY_ITEM_ID IN NUMBER,
4352                                       p_wip_entity_id IN NUMBER,
4353                                       p_ITEM_Revision IN VARCHAR2,
4354                                       p_lot_number IN VARCHAR2,
4355                                       p_Serial_Number IN VARCHAR2) IS
4356         SELECT 'x'
4357         FROM  CSI_ITEM_INSTANCES CII
4358         WHERE CII.inventory_item_id = p_INVENTORY_ITEM_ID
4359           AND nvl(cii.inventory_revision,'1') = nvl(p_ITEM_Revision, '1')
4360           AND nvl(cii.lot_number, '1') = nvl(p_lot_number, '1')
4361           AND nvl(cii.serial_number,'1') = nvl(p_serial_number, '1')
4362           AND CII.ACTIVE_START_DATE <= SYSDATE
4363           AND ((CII.ACTIVE_END_DATE IS NULL) OR (CII.ACTIVE_END_DATE > SYSDATE))
4364           AND CII.QUANTITY > 0
4365           AND CII.LOCATION_TYPE_CODE = 'WIP'
4366           AND CII.WIP_JOB_ID = p_wip_entity_id
4367           AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
4368                           WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
4369                             AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
4370                             AND NVL(CIR.ACTIVE_START_DATE,SYSDATE) <= SYSDATE AND
4371                             (CIR.ACTIVE_END_DATE IS NULL OR CIR.ACTIVE_END_DATE > SYSDATE));
4372 
4373    l_index      NUMBER;
4374    l_valid_flag BOOLEAN;
4375    l_junk       VARCHAR2(1);
4376 
4377    -- sracha: added for bug fix 6328554.
4378    l_index_start NUMBER;
4379 
4380 BEGIN
4381     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
4382         fnd_log.string
4383         (
4384             fnd_log.level_procedure,
4385             'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn.begin',
4386             'At the start of PLSQL procedure'
4387         );
4388     END IF;
4389 
4390     l_index   :=p_x_ahl_prd_mtl_txn_tbl.count;
4391     l_index_start := l_index;
4392 
4393     FOR  l_disp_rec IN GetDispDet
4394          (
4395              p_job_number      => P_prd_Mtltxn_criteria_rec.JOB_NUMBER,
4396              p_visit_number    => P_prd_Mtltxn_criteria_rec.VISIT_NUMBER,
4397              p_priority        => P_prd_Mtltxn_criteria_rec.PRIORITY,
4398              p_dept_name       => P_prd_Mtltxn_criteria_rec.DEPARTMENT_NAME,
4399              p_org_name        => P_prd_Mtltxn_criteria_rec.ORGANIZATION_NAME,
4400              p_item            => P_prd_Mtltxn_criteria_rec.CONCATENATED_SEGMENTS,
4401              p_incident_number => P_prd_Mtltxn_criteria_rec.INCIDENT_NUMBER,
4402              p_disposition_name=> P_prd_Mtltxn_criteria_rec.DISPOSITION_NAME
4403          )
4404      LOOP
4405             l_valid_flag := TRUE;
4406             IF (Is_Item_Trackable(l_disp_rec.organization_id, l_disp_rec.INVENTORY_ITEM_ID)) THEN
4407                 -- validate instance location.
4408                 OPEN chk_inst_relationship_csr (l_disp_rec.INVENTORY_ITEM_ID,
4409                                                 l_disp_rec.wip_entity_id,
4410                                                 l_disp_rec.ITEM_Revision,
4411                                                 l_disp_rec.lot_number,
4412                                                 l_disp_rec.Serial_Number);
4413                 FETCH chk_inst_relationship_csr INTO l_junk;
4414                 IF (chk_inst_relationship_csr%NOTFOUND) THEN
4415                      l_valid_flag := FALSE;
4416                 END IF;
4417                 CLOSE chk_inst_relationship_csr;
4418 
4419                 -- sracha: Added for bug# 6328554.
4420                 -- Check for duplicate dispositions for the same instance.
4421                 -- Occurs in case of multiple removals in IB tree case.
4422                 IF (l_valid_flag) AND (l_index > l_index_start) THEN
4423                   FOR i IN l_index_start..p_x_ahl_prd_mtl_txn_tbl.LAST LOOP
4424                     IF (l_disp_rec.INVENTORY_ITEM_ID = p_x_ahl_prd_mtl_txn_tbl(i).inventory_item_id) AND
4425                        (nvl(l_disp_rec.Serial_Number,'1') = nvl(p_x_ahl_prd_mtl_txn_tbl(i).Serial_Number,'1') AND
4426                         nvl(l_disp_rec.ITEM_Revision,'1') = nvl(p_x_ahl_prd_mtl_txn_tbl(i).Revision,'1') AND
4427                         nvl(l_disp_rec.lot_number,'1') = nvl(p_x_ahl_prd_mtl_txn_tbl(i).lot_number,'1')) THEN
4428  	               l_valid_flag := FALSE;
4429  	               EXIT;
4430                     END IF;
4431  	          END LOOP;
4432  	        END IF; -- (l_valid_flag) AND l_index > l_index_start
4433  	    END IF; -- Is_Item_Trackable
4434 
4435             IF (l_valid_flag) THEN
4436                p_x_ahl_prd_mtl_txn_tbl(l_index).workorder_id:=l_disp_rec.workorder_id;
4437                p_x_ahl_prd_mtl_txn_tbl(l_index).workorder_name:=l_disp_rec.workorder_name;
4438                p_x_ahl_prd_mtl_txn_tbl(l_index).Organization_Id:=l_disp_rec.Organization_Id;
4439                p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_operation_Id:=l_disp_rec.Workorder_operation_Id;
4440                p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Segments:=l_disp_rec.ITEM_NUMBER;
4441                p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Id:=l_disp_rec.INVENTORY_ITEM_ID;
4442                p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Description:=l_disp_rec.ITEM_DESC;
4443                p_x_ahl_prd_mtl_txn_tbl(l_index).disposition_name:=l_disp_rec.IMMEDIATE_TYPE;
4444                p_x_ahl_prd_mtl_txn_tbl(l_index).disposition_id:=l_disp_rec.disposition_id;
4445                p_x_ahl_prd_mtl_txn_tbl(l_index).Condition:=l_disp_rec.CONDITION_ID;
4446                p_x_ahl_prd_mtl_txn_tbl(l_index).Condition_desc:=l_disp_rec.CONDITION_CODE;
4447                p_x_ahl_prd_mtl_txn_tbl(l_index).Serial_Number:=l_disp_rec.Serial_Number;
4448                p_x_ahl_prd_mtl_txn_tbl(l_index).Quantity:=l_disp_rec.quantity;
4449                p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Quantity:=l_disp_rec.Net_quantity;
4450 			   -- JKJAIN FP ER # 6436303 - start
4451 			   p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Total_Qty:=l_disp_rec.Wo_Net_Total_Qty;
4452 			   -- JKJAIN FP ER # 6436303 - end
4453                p_x_ahl_prd_mtl_txn_tbl(l_index).Uom:=l_disp_rec.Uom;
4454                p_x_ahl_prd_mtl_txn_tbl(l_index).Uom_DESC:=l_disp_rec.UNIT_OF_MEASURE;
4455                p_x_ahl_prd_mtl_txn_tbl(l_index).Lot_Number:=l_disp_rec.Lot_Number;
4456                p_x_ahl_prd_mtl_txn_tbl(l_index).Revision:=l_disp_rec.ITEM_Revision;
4457                p_x_ahl_prd_mtl_txn_tbl(l_index).Qa_Collection_Id:=l_disp_rec.COLLECTION_ID;
4458                p_x_ahl_prd_mtl_txn_tbl(l_index).Subinventory_Name:=l_disp_rec.DEFAULT_PULL_SUPPLY_SUBINV;
4459                p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Id:=l_disp_rec.DEFAULT_PULL_SUPPLY_LOCATOR_ID;
4460                p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Segments:=l_disp_rec.concatenated_segments;
4461                --p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date   :=l_disp_rec.SYSDATE;
4462                p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date   :=SYSDATE;
4463 
4464                -- ER 5854712- servicable locator.
4465                IF (l_disp_rec.inv_locator_id IS NULL) THEN
4466                   p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '0';
4467                ELSE
4468                   p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '1';
4469                END IF;
4470 
4471                l_index:=l_index+1;
4472 
4473                IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4474                    fnd_log.string
4475                    (
4476                      fnd_log.level_statement,
4477                      'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4478                      'l_disp_rec.workorder_name: ' || l_disp_rec.workorder_name
4479                    );
4480                    fnd_log.string
4481                    (
4482                      fnd_log.level_statement,
4483                      'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4484                      'l_disp_rec.workorder_id: ' || l_disp_rec.workorder_id
4485                    );
4486                    fnd_log.string
4487                    (
4488                      fnd_log.level_statement,
4489                      'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4490                      'l_disp_rec.disposition_id: ' || l_disp_rec.disposition_id
4491                    );
4492                    fnd_log.string
4493                    (
4494                      fnd_log.level_statement,
4495                      'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4496                      'l_disp_rec.ITEM_NUMBER: ' || l_disp_rec.ITEM_NUMBER
4497                    );
4498                    fnd_log.string
4499                    (
4500                      fnd_log.level_statement,
4501                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4502                     'l_disp_rec.serial_number: ' || l_disp_rec.serial_number
4503                    );
4504                    fnd_log.string
4505                    (
4506                      fnd_log.level_statement,
4507                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4508                     'l_disp_rec.ISSUEQTY: ' || l_disp_rec.quantity
4509                    );
4510                    fnd_log.string
4511                    (
4512                      fnd_log.level_statement,
4513                      'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn',
4514                      'Net Qty: ' || l_disp_rec.Net_Quantity
4515                    );
4516                END IF; -- fnd_log.level_statement
4517 
4518             END IF;
4519 
4520     END LOOP;
4521 
4522     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
4523         fnd_log.string
4524         (
4525             fnd_log.level_procedure,
4526             'ahl.plsql.AHL_PRD_MTLTXN_PVT.getDispositionReturn.begin',
4527             'At the start of PLSQL procedure'
4528         );
4529     END IF;
4530 END  getDispositionReturn;
4531 
4532 
4533 PROCEDURE getMtlTxnsReturns(
4534             p_x_ahl_prd_mtl_txn_tbl  IN OUT  NOCOPY Ahl_Mtltxn_Tbl_Type,
4535             P_prd_Mtltxn_criteria_rec in Prd_Mtltxn_criteria_rec
4536             ) AS
4537 
4538    CURSOR getMtlTxnsReturnsCur
4539            (
4540              p_job_number   IN VARCHAR2,
4541              p_visit_number IN NUMBER,
4542              p_priority     IN NUMBER,
4543              p_dept_name    IN VARCHAR2,
4544              p_org_name     IN VARCHAR2,
4545              p_item         IN VARCHAR2,
4546              p_incident_number IN VARCHAR2
4547            ) IS
4548 
4549 /* Tamal [R12 APPSPERF fixes]
4550  * R12 Drop 4 - SQL ID: 14401324
4551  * Bug #4918991
4552  */
4553 SELECT DISTINCT
4554     W.WORKORDER_ID,
4555     T.ORGANIZATION_ID,
4556     T.INVENTORY_ITEM_ID,
4557     T.SERIAL_NUMBER,
4558     T.LOT_NUMBER,
4559     T.REVISION,
4560     T.INSTANCE_ID,   -- added to fix FP bug# 5172147.
4561     W.WIP_ENTITY_ID,  -- added to filter chk_inst_relationship_csr for wip_job_id.
4562     (select inv_locator_id from ahl_visits_b where visit_id = w.visit_id) inv_locator_id
4563 FROM
4564     AHL_WORKORDER_MTL_TXNS T,
4565     MTL_SYSTEM_ITEMS_KFV I,
4566     AHL_WORKORDERS W,
4567     AHL_VISITS_B V,
4568     AHL_VISIT_TASKS_B VT,
4569     CS_INCIDENTS_ALL_B C,
4570     WIP_DISCRETE_JOBS WDJ,
4571     INV_ORGANIZATION_NAME_V ORG,
4572     BOM_DEPARTMENTS B,
4573     AHL_WORKORDER_OPERATIONS O
4574 WHERE
4575     T.ORGANIZATION_ID = V.ORGANIZATION_ID
4576     AND T.WORKORDER_OPERATION_ID = O.WORKORDER_OPERATION_ID
4577     AND W.WORKORDER_ID = O.WORKORDER_ID
4578     AND T.TRANSACTION_TYPE_ID = 35
4579     AND T.INVENTORY_ITEM_ID = I.INVENTORY_ITEM_ID
4580     AND T.ORGANIZATION_ID = I.ORGANIZATION_ID
4581     AND W.VISIT_TASK_ID = VT.VISIT_TASK_ID
4582     AND VT.VISIT_ID = V.VISIT_ID
4583     AND V.SERVICE_REQUEST_ID = C.INCIDENT_ID(+)
4584     AND WDJ.WIP_ENTITY_ID = W.WIP_ENTITY_ID
4585     AND WDJ.OWNING_DEPARTMENT = B.DEPARTMENT_ID (+)
4586     AND V.ORGANIZATION_ID = ORG.ORGANIZATION_ID
4587     AND W.STATUS_CODE NOT IN ('5','7','12')
4588     AND I.ENABLED_FLAG = 'Y'
4589     AND ((I.START_DATE_ACTIVE IS NULL) OR (I.START_DATE_ACTIVE <= SYSDATE))
4590     AND ((I.END_DATE_ACTIVE IS NULL) OR (I.END_DATE_ACTIVE >= SYSDATE))
4591     AND I.CONCATENATED_SEGMENTS LIKE NVL(p_item,I.CONCATENATED_SEGMENTS)
4592     AND UPPER(ORG.ORGANIZATION_NAME) LIKE UPPER(NVL(p_org_name,ORG.ORGANIZATION_NAME))
4593     AND UPPER(B.DESCRIPTION) LIKE UPPER(NVL(p_dept_name,B.DESCRIPTION))
4594     AND UPPER(NVL(C.INCIDENT_NUMBER,'X')) LIKE UPPER(NVL(p_incident_number,NVL(C.INCIDENT_NUMBER,'X')))
4595     AND NVL(WDJ.PRIORITY,0) = NVL(p_priority,NVL(WDJ.PRIORITY,0))
4596     AND V.VISIT_NUMBER = NVL(p_visit_number,V.VISIT_NUMBER)
4597     AND UPPER(W.WORKORDER_NAME) LIKE UPPER(NVL(p_job_number,W.WORKORDER_NAME));
4598 
4599    --Query to validate disp
4600 
4601    CURSOR CHECK_DISPITEM_CUR
4602          (
4603               c_wid in number,
4604               c_itemId NUMBER,
4605               --c_org_id IN NUMBER,
4606               c_sno in varchar2,
4607               c_rev in varchar2,
4608               c_lotNumber in varchar2
4609          ) IS
4610 /* Tamal [R12 APPSPERF fixes]
4611  * R12 Drop 4 - SQL ID: 14401875
4612  * Bug #4918991
4613  * BTW there is no code change here, the ahl_mtl_ret_dispositions_v view has been tuned for performance
4614  */
4615 SELECT 'T'
4616 FROM AHL_MTL_RET_DISPOSITIONS_V A
4617 WHERE
4618     WORKORDER_ID = c_wid AND
4619     INVENTORY_ITEM_ID = c_itemId AND
4620     --ORGANIZATION_ID = c_org_id AND
4621     NVL(SERIAL_NUMBER, 'X') = NVL(c_sno, NVL(SERIAL_NUMBER, 'X')) AND
4622     NVL(LOT_NUMBER, 'X') = NVL(c_lotNumber, NVL(LOT_NUMBER, 'X')) AND
4623     NVL(ITEM_REVISION, 'X') = NVL(c_rev, NVL(ITEM_REVISION, 'X')) AND
4624     WORKORDER_OPERATION_ID IS NOT NULL;
4625 
4626 
4627    CURSOR mtlOpRtns
4628          (
4629                c_wid in number,
4630                --c_wopId  IN NUMBER,
4631                c_itemId NUMBER,
4632                c_org_id IN NUMBER,
4633                c_sno in varchar2,
4634                c_rev in varchar2,
4635                c_lotNumber in varchar2
4636           ) IS
4637 /* Tamal [R12 APPSPERF fixes]
4638  * R12 Drop 4 - SQL ID: 14401907
4639  * Bug #4918991
4640  */
4641 SELECT DISTINCT
4642     WO.WORKORDER_ID,
4643     WO.WORKORDER_NAME JOB_NUMBER ,
4644     VST.ORGANIZATION_ID,
4645     TXNS.WORKORDER_OPERATION_ID,
4646     WO_OP.OPERATION_SEQUENCE_NUM,
4647     MTL.CONCATENATED_SEGMENTS,
4648     TXNS.INVENTORY_ITEM_ID,
4649     MTL.DESCRIPTION,
4650     TXNS.SERIAL_NUMBER ,
4651     AHL_PRD_MTLTXN_PVT.GET_ISSUED_QTY(TXNS.ORGANIZATION_ID, TXNS.INVENTORY_ITEM_ID,TXNS.WORKORDER_OPERATION_ID) ISSUEQTY,
4652 -- JKJAIN FP ER # 6436303 - start
4653  	AHL_PP_MATERIALS_PVT.GET_NET_QTY(TXNS.ORGANIZATION_ID, TXNS.INVENTORY_ITEM_ID,TXNS.WORKORDER_OPERATION_ID) Net_Total_Qty,
4654 -- JKJAIN FP ER # 6436303 - end
4655     TXNS.UOM,
4656     UOM.UNIT_OF_MEASURE,
4657     TXNS.RECEPIENT_ID,
4658     PER.FULL_NAME,
4659     WO_STS.MEANING JOB_STATUS_MEANING,
4660     TXNS.LOT_NUMBER,
4661     TXNS.REVISION,
4662     WIP.DEFAULT_PULL_SUPPLY_SUBINV,
4663     WIP.DEFAULT_PULL_SUPPLY_LOCATOR_ID,
4664     --MTL_LOC.CONCATENATED_SEGMENTS LOCATOR
4665     --Fix for bug number 5903275
4666     inv_project.GET_LOCSEGS(WIP.DEFAULT_PULL_SUPPLY_LOCATOR_ID, WIP.organization_id) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
4667 	            || INV_ProjectLocator_PUB.get_project_number(MTL_LOC.segment19) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
4668             || INV_ProjectLocator_PUB.get_task_number(MTL_LOC.segment20) LOCATOR,
4669     --SYSDATE
4670     (select inv_locator_id from ahl_visits_b where visit_id = vst.visit_id) inv_locator_id
4671 FROM
4672     AHL_WORKORDER_MTL_TXNS TXNS,
4673     AHL_WORKORDERS WO,
4674     (SELECT LOOKUP_CODE, MEANING FROM FND_LOOKUP_VALUES WHERE LOOKUP_TYPE = 'AHL_JOB_STATUS' AND LANGUAGE= USERENV('LANG')) WO_STS,
4675     AHL_VISIT_TASKS_B VST_TASK,
4676     AHL_VISITS_B VST,
4677     AHL_WORKORDER_OPERATIONS WO_OP,
4678     MTL_SYSTEM_ITEMS_KFV MTL,
4679     MTL_UNITS_OF_MEASURE_VL UOM,
4680     -- modified to retrieve segment19 and 20 from base table to fix bug# 6611033.
4681     --MTL_ITEM_LOCATIONS_KFV MTL_LOC,
4682     MTL_ITEM_LOCATIONS MTL_LOC,
4683     WIP_PARAMETERS WIP,
4684     PER_ALL_PEOPLE_F PER
4685 WHERE
4686     TXNS.TRANSACTION_TYPE_ID = 35 AND
4687     TXNS.INVENTORY_ITEM_ID = MTL.INVENTORY_ITEM_ID AND
4688     TXNS.ORGANIZATION_ID = MTL.ORGANIZATION_ID AND
4689     TXNS.WORKORDER_OPERATION_ID = WO_OP.WORKORDER_OPERATION_ID AND
4690     WO_OP.WORKORDER_ID = WO.WORKORDER_ID AND
4691     TXNS.ORGANIZATION_ID = VST.ORGANIZATION_ID AND
4692     TXNS.UOM = UOM.UOM_CODE AND
4693     --MTL_LOC setup is optional(bug# 6761128).
4694     --MTL_LOC.ORGANIZATION_ID = VST.ORGANIZATION_ID AND
4695     VST.ORGANIZATION_ID = WIP.ORGANIZATION_ID AND
4696     WO.STATUS_CODE = WO_STS.LOOKUP_CODE AND
4697     WO.VISIT_TASK_ID = VST_TASK.VISIT_TASK_ID AND
4698     VST.VISIT_ID = VST_TASK.VISIT_ID AND
4699     WO.MASTER_WORKORDER_FLAG = 'N' AND
4700     WO.STATUS_CODE NOT IN ('17', '22') AND
4701     WIP.ORGANIZATION_ID = MTL_LOC.ORGANIZATION_ID (+) AND
4702     WIP.DEFAULT_PULL_SUPPLY_LOCATOR_ID = MTL_LOC.INVENTORY_LOCATION_ID (+) AND
4703     TXNS.RECEPIENT_ID = PER.PERSON_ID (+) AND
4704 
4705     WO.WORKORDER_ID = c_wid AND
4706     MTL.INVENTORY_ITEM_ID =c_itemid AND
4707     NVL(TXNS.SERIAL_NUMBER,'X') = NVL(c_SNO, NVL(TXNS.SERIAL_NUMBER,'X')) AND
4708     NVL(TXNS.LOT_NUMBER,'X') = NVL(c_lotNumber, NVL(TXNS.LOT_NUMBER,'X')) AND
4709     NVL(TXNS.REVISION,'X') = NVL(c_rev, NVL(TXNS.REVISION,'X')) AND
4710     TXNS.ORGANIZATION_ID = c_ORG_ID;
4711 
4712      CURSOR mtlWoRtns
4713             (
4714                 c_wid in number,
4715                 c_itemId NUMBER,
4716                 c_org_id IN NUMBER,
4717                 c_sno in varchar2,
4718                 c_rev in varchar2,
4719                 c_lotNumber in varchar2
4720             ) IS
4721 /* Tamal [R12 APPSPERF fixes]
4722  * R12 Drop 4 - SQL ID: 14402096
4723  * Bug #4918991
4724  */
4725 SELECT DISTINCT
4726     E.WORKORDER_ID,
4727     E.WORKORDER_NAME JOB_NUMBER,
4728     V.ORGANIZATION_ID,
4729     B.CONCATENATED_SEGMENTS ,
4730     A.INVENTORY_ITEM_ID,
4731     B.DESCRIPTION,
4732     A.SERIAL_NUMBER ,
4733     AHL_PRD_MTLTXN_PVT.GET_WORKORD_LEVEL_QTY(c_wid, c_itemid, c_ORG_ID, c_lotNumber, c_rev, c_SNO) issWoQty,
4734  -- JKJAIN FP ER # 6436303 - start
4735  	AHL_PRD_MTLTXN_PVT.GET_WORKORD_NET_QTY(c_wid,c_itemid,c_ORG_ID) Wo_Net_Total_Qty,
4736 -- JKJAIN FP ER # 6436303 - end
4737     A.UOM ,
4738     UOM.unit_of_measure,
4739     WO_STS.MEANING JOB_STATUS_MEANING,
4740     A.LOT_NUMBER,
4741     A.REVISION,
4742     W.DEFAULT_PULL_SUPPLY_SUBINV,
4743     W.DEFAULT_PULL_SUPPLY_LOCATOR_ID,
4744     --D.CONCATENATED_SEGMENTS Locator
4745     -- Fix for bug number 5903275
4746     inv_project.GET_LOCSEGS(W.DEFAULT_PULL_SUPPLY_LOCATOR_ID, W.organization_id) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
4747 	                || INV_ProjectLocator_PUB.get_project_number(D.segment19) || fnd_flex_ext.get_delimiter('INV', 'MTLL',  101)
4748             || INV_ProjectLocator_PUB.get_task_number(D.segment20) LOCATOR,
4749     --SYSDATE
4750     (select inv_locator_id from ahl_visits_b where visit_id = E.visit_id) inv_locator_id
4751 FROM
4752     AHL_WORKORDER_MTL_TXNS A,
4753     MTL_SYSTEM_ITEMS_KFV B,
4754     MTL_UNITS_OF_MEASURE_VL UOM,
4755     -- modified to retrieve segment19 and 20 from base table to fix bug# 6611033.
4756     --MTL_ITEM_LOCATIONS_KFV D,
4757     MTL_ITEM_LOCATIONS D,
4758     AHL_WORKORDERS E,
4759     (SELECT LOOKUP_CODE, MEANING FROM FND_LOOKUP_VALUES WHERE LOOKUP_TYPE = 'AHL_JOB_STATUS' AND LANGUAGE= USERENV('LANG')) WO_STS,
4760     AHL_VISITS_B V,
4761     AHL_VISIT_TASKS_B VT,
4762     AHL_WORKORDER_OPERATIONS F,
4763     WIP_PARAMETERS W
4764 WHERE
4765     A.INVENTORY_ITEM_ID=B.INVENTORY_ITEM_ID
4766     AND A.WORKORDER_OPERATION_ID=F.WORKORDER_OPERATION_ID
4767     AND A.ORGANIZATION_ID=B.ORGANIZATION_ID
4768     AND A.ORGANIZATION_ID=V.ORGANIZATION_ID
4769     AND A.TRANSACTION_TYPE_ID=35
4770     AND A.uom=UOM.uom_code
4771     --MTL_LOC setup is optional(bug# 6761128).
4772     --AND D.organization_id=V.organization_id
4773     AND F.WORKORDER_ID=E.WORKORDER_ID
4774     AND E.VISIT_TASK_ID = VT.VISIT_TASK_ID
4775     AND E.MASTER_WORKORDER_FLAG = 'N'
4776     AND E.STATUS_CODE NOT IN ('17', '22')
4777     AND E.STATUS_CODE = WO_STS.LOOKUP_CODE
4778     AND VT.VISIT_ID = V.VISIT_ID
4779     AND V.ORGANIZATION_ID=W.ORGANIZATION_ID
4780     AND W.organization_id = D.organization_id(+)
4781     AND W.default_pull_supply_locator_id =D.inventory_location_id(+)
4782 
4783     AND E.workorder_id = c_wid
4784     AND B.INVENTORY_ITEM_ID = c_itemid
4785     AND NVL(A.SERIAL_NUMBER, 'X') = NVL(c_SNO ,NVL(A.SERIAL_NUMBER, 'X'))
4786     AND NVL(A.lot_number, 'X') = NVL(c_lotNumber ,NVL(A.LOT_NUMBER, 'X'))
4787     AND NVL(A.revision, 'X') = NVL(c_rev ,NVL(A.REVISION, 'X'))
4788     AND A.organization_id = c_ORG_ID;
4789 
4790     -- check if issued instance has been installed / validate instance.
4791     -- and is located in the wip job.
4792     CURSOR chk_inst_relationship_csr (p_instance_id IN NUMBER,
4793                                       p_wip_entity_id IN NUMBER) IS
4794        SELECT 'x'
4795        FROM  CSI_ITEM_INSTANCES CII
4796        WHERE INSTANCE_ID = p_instance_id
4797          AND ACTIVE_START_DATE <= SYSDATE
4798          AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE > SYSDATE))
4799          AND QUANTITY > 0
4800          AND LOCATION_TYPE_CODE = 'WIP'
4801          AND WIP_JOB_ID = p_wip_entity_id
4802          AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
4803                          WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
4804                            AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
4805                            AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE) AND NVL(ACTIVE_END_DATE,SYSDATE));
4806 
4807       l_index      NUMBER := p_x_ahl_prd_mtl_txn_tbl.count;
4808       l_qty       NUMBER  := 0;
4809       l_opseq_flag varchar2(1);
4810       l_junk       varchar2(1);
4811       l_valid_flag BOOLEAN;
4812 
4813 BEGIN
4814    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
4815         fnd_log.string
4816         (
4817             fnd_log.level_procedure,
4818             'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns.begin',
4819             'At the start of PLSQL procedure'
4820         );
4821     END IF;
4822     FOR l_mtlTxn_rec IN getMtlTxnsReturnsCur
4823         (
4824              p_job_number      => P_prd_Mtltxn_criteria_rec.JOB_NUMBER,
4825              p_visit_number    => P_prd_Mtltxn_criteria_rec.VISIT_NUMBER,
4826              p_priority        => P_prd_Mtltxn_criteria_rec.PRIORITY,
4827              p_dept_name       => P_prd_Mtltxn_criteria_rec.DEPARTMENT_NAME,
4828              p_org_name        => P_prd_Mtltxn_criteria_rec.ORGANIZATION_NAME,
4829              p_item            => P_prd_Mtltxn_criteria_rec.CONCATENATED_SEGMENTS,
4830              p_incident_number => P_prd_Mtltxn_criteria_rec.INCIDENT_NUMBER
4831      )LOOP
4832 
4833        l_valid_flag := TRUE;
4834        -- check if instance id has been installed.
4835        IF (l_mtlTxn_rec.instance_id IS NOT NULL) THEN
4836           OPEN chk_inst_relationship_csr (l_mtlTxn_rec.instance_id, l_mtlTxn_rec.wip_entity_id);
4837           FETCH chk_inst_relationship_csr INTO l_junk;
4838           IF (chk_inst_relationship_csr%NOTFOUND) THEN
4839                l_valid_flag := FALSE;
4840           END IF;
4841           CLOSE chk_inst_relationship_csr;
4842        END IF;
4843 
4844        IF (l_valid_flag) THEN
4845           OPEN CHECK_DISPITEM_CUR(
4846             c_wid           => l_mtlTxn_rec.Workorder_Id,
4847             c_itemId        => l_mtlTxn_rec.Inventory_Item_Id,
4848             --c_org_id        => l_mtlTxn_rec.Organization_Id,
4849             c_sno           => l_mtlTxn_rec.Serial_Number,
4850             c_rev           => l_mtlTxn_rec.Revision,
4851             c_lotNumber     => l_mtlTxn_rec.Lot_Number
4852           );
4853           FETCH CHECK_DISPITEM_CUR into l_opseq_flag;
4854           IF CHECK_DISPITEM_CUR%FOUND THEN
4855             l_opseq_flag :='T';
4856           ELSE
4857             l_opseq_flag :='F';
4858           END IF;
4859           CLOSE CHECK_DISPITEM_CUR;
4860 
4861           IF (l_opseq_flag = 'T') THEN -- Fetch material operations returs
4862             FOR l_mtloprtns_rec IN   mtlOpRtns (
4863                c_wid           => l_mtlTxn_rec.Workorder_Id,
4864 --             c_wopId         => l_mtlTxn_rec.Workorder_operation_id,
4865                c_itemId        => l_mtlTxn_rec.Inventory_Item_Id,
4866                c_org_id        => l_mtlTxn_rec.Organization_Id,
4867                c_sno           => l_mtlTxn_rec.Serial_Number,
4868                c_rev           => l_mtlTxn_rec.Revision,
4869                c_lotNumber     => l_mtlTxn_rec.Lot_Number)
4870             LOOP
4871               CALCULATE_QTY(
4872                   p_wo_id   => l_mtloprtns_rec.Workorder_Id,
4873                   p_item_id => l_mtloprtns_rec.Inventory_Item_Id,
4874                   p_org_id  => l_mtloprtns_rec.Organization_Id,
4875                   p_lot_num => l_mtloprtns_rec.Lot_Number,
4876                   p_rev_num => l_mtloprtns_rec.Revision,
4877                   p_serial_num => l_mtloprtns_rec.Serial_Number,
4878                   x_qty => l_qty,
4879                   p_wo_op_id    => l_mtloprtns_rec.Workorder_operation_Id
4880                   );
4881 
4882               IF (l_qty >0) THEN
4883                 p_x_ahl_prd_mtl_txn_tbl(l_index).workorder_id       :=l_mtloprtns_rec.workorder_id;
4884                 p_x_ahl_prd_mtl_txn_tbl(l_index).Organization_Id    :=l_mtloprtns_rec.Organization_Id;
4885                 p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Name     :=l_mtloprtns_rec.JOB_NUMBER;
4886                 p_x_ahl_prd_mtl_txn_tbl(l_index).Operation_Seq_Num  :=l_mtloprtns_rec.OPERATION_SEQUENCE_NUM;
4887                 p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_operation_Id:=l_mtloprtns_rec.Workorder_operation_Id;
4888                 p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Segments:=l_mtloprtns_rec.CONCATENATED_SEGMENTS;
4889                 p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Id  :=l_mtloprtns_rec.INVENTORY_ITEM_ID;
4890                 p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Description:=l_mtloprtns_rec.DESCRIPTION;
4891                 p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status   :=l_mtloprtns_rec.JOB_STATUS_MEANING;
4892                 p_x_ahl_prd_mtl_txn_tbl(l_index).Serial_Number      :=l_mtloprtns_rec.Serial_Number;
4893                 p_x_ahl_prd_mtl_txn_tbl(l_index).Quantity           :=l_mtloprtns_rec.ISSUEQTY;
4894 				-- JKJAIN FP ER # 6436303- start
4895  	            p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Total_Qty      :=l_mtloprtns_rec.Net_Total_Qty;
4896  	            -- JKJAIN FP ER # 6436303- end
4897                 p_x_ahl_prd_mtl_txn_tbl(l_index).Uom                :=l_mtloprtns_rec.Uom;
4898                 p_x_ahl_prd_mtl_txn_tbl(l_index).Uom_Desc           :=l_mtloprtns_rec.UNIT_OF_MEASURE;
4899                 p_x_ahl_prd_mtl_txn_tbl(l_index).recepient_name     :=l_mtloprtns_rec.FULL_NAME;
4900                 p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status   :=l_mtloprtns_rec.JOB_STATUS_MEANING;
4901                 p_x_ahl_prd_mtl_txn_tbl(l_index).Lot_Number         :=l_mtloprtns_rec.Lot_Number;
4902                 p_x_ahl_prd_mtl_txn_tbl(l_index).Revision           :=l_mtloprtns_rec.Revision;
4903                 p_x_ahl_prd_mtl_txn_tbl(l_index).Subinventory_Name  :=l_mtloprtns_rec.DEFAULT_PULL_SUPPLY_SUBINV;
4904                 p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Id         :=l_mtloprtns_rec.DEFAULT_PULL_SUPPLY_LOCATOR_ID;
4905                 p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Segments   :=l_mtloprtns_rec.Locator;
4906                 --p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date   :=l_mtloprtns_rec.SYSDATE;
4907                 p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date   :=SYSDATE;
4908 
4909                 --ER 5854712. retrieve visit locator.
4910                 IF (l_mtloprtns_rec.inv_locator_id IS NULL) THEN
4911                    p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '0';
4912                 ELSE
4913                    p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '1';
4914                 END IF;
4915 
4916                 l_index:=l_index+1;
4917               END IF;
4918             END LOOP;
4919         ELSE -- Fetch material workorder returns
4920 
4921            FOR l_mtlWoRtns_rec IN mtlWoRtns(
4922             c_wid           => l_mtlTxn_rec.Workorder_Id,
4923             c_itemId        => l_mtlTxn_rec.Inventory_Item_Id,
4924             c_org_id        => l_mtlTxn_rec.Organization_Id,
4925             c_sno           => l_mtlTxn_rec.Serial_Number,
4926             c_rev           => l_mtlTxn_rec.Revision,
4927             c_lotNumber     => l_mtlTxn_rec.Lot_Number)
4928            LOOP
4929              IF (l_mtlTxn_rec.instance_id IS NULL) THEN
4930                 -- only non-serialized case.
4931                 CALCULATE_QTY(
4932                   p_wo_id   => l_mtlWoRtns_rec.Workorder_Id,
4933                   p_item_id => l_mtlWoRtns_rec.Inventory_Item_Id,
4934                   p_org_id  => l_mtlWoRtns_rec.Organization_Id,
4935                   p_lot_num => l_mtlWoRtns_rec.Lot_Number,
4936                   p_rev_num => l_mtlWoRtns_rec.Revision,
4937                   p_serial_num => l_mtlWoRtns_rec.Serial_Number,
4938                   x_qty => l_qty,
4939                   p_wo_op_id    => null
4940                 );
4941              ELSE
4942                 -- serialized
4943                 l_qty := 1;
4944              END IF;
4945 
4946              IF (l_qty > 0) THEN
4947               p_x_ahl_prd_mtl_txn_tbl(l_index).workorder_id           :=l_mtlWoRtns_rec.workorder_id;
4948               p_x_ahl_prd_mtl_txn_tbl(l_index).Organization_Id        :=l_mtlWoRtns_rec.Organization_Id;
4949               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Name         :=l_mtlWoRtns_rec.JOB_NUMBER;
4950               --p_x_ahl_prd_mtl_txn_tbl(l_index).Operation_Seq_Num      :=l_mtlWoRtns_rec.OPERATION_SEQUENCE_NUM;
4951               --p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_operation_Id :=l_mtlWoRtns_rec.Workorder_operation_Id;
4952               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Segments:=l_mtlWoRtns_rec.CONCATENATED_SEGMENTS;
4953               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Id      :=l_mtlWoRtns_rec.INVENTORY_ITEM_ID;
4954               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Description:=l_mtlWoRtns_rec.DESCRIPTION;
4955               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status       :=l_mtlWoRtns_rec.JOB_STATUS_MEANING;
4956               p_x_ahl_prd_mtl_txn_tbl(l_index).Serial_Number          :=l_mtlWoRtns_rec.Serial_Number;
4957               p_x_ahl_prd_mtl_txn_tbl(l_index).Quantity               :=l_mtlWoRtns_rec.issWoQty;
4958 			  -- JKJAIN FP ER # 6436303- start
4959  	          p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Total_Qty          :=l_mtlWoRtns_rec.Wo_Net_Total_Qty;
4960  	          -- JKJAIN FP ER # 6436303- end
4961               p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Quantity           :=l_qty;
4962               p_x_ahl_prd_mtl_txn_tbl(l_index).Uom                    :=l_mtlWoRtns_rec.Uom;
4963               p_x_ahl_prd_mtl_txn_tbl(l_index).Uom_Desc               :=l_mtlWoRtns_rec.UNIT_OF_MEASURE;
4964               --p_x_ahl_prd_mtl_txn_tbl(l_index).recepient_name       :=l_mtlWoRtns_rec.FULL_NAME;
4965               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status       :=l_mtlWoRtns_rec.JOB_STATUS_MEANING;
4966               p_x_ahl_prd_mtl_txn_tbl(l_index).Lot_Number             :=l_mtlWoRtns_rec.Lot_Number;
4967               p_x_ahl_prd_mtl_txn_tbl(l_index).Revision               :=l_mtlWoRtns_rec.Revision;
4968               p_x_ahl_prd_mtl_txn_tbl(l_index).Subinventory_Name      :=l_mtlWoRtns_rec.DEFAULT_PULL_SUPPLY_SUBINV;
4969               p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Id             :=l_mtlWoRtns_rec.DEFAULT_PULL_SUPPLY_LOCATOR_ID;
4970               p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Segments       :=l_mtlWoRtns_rec.Locator;
4971               --p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date       :=l_mtlWoRtns_rec.SYSDATE;
4972               p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date       :=SYSDATE;
4973 
4974               -- ER 5854712.
4975               IF (l_mtlWoRtns_rec.inv_locator_id IS NULL) THEN
4976                  p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '0';
4977               ELSE
4978                  p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '1';
4979               END IF;
4980 
4981               l_index:=l_index+1;
4982 
4983               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4984                   fnd_log.string
4985                   (
4986                     fnd_log.level_statement,
4987                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns',
4988                     'l_mtlWoRtns_rec.workorder_id: ' || l_mtlWoRtns_rec.workorder_id
4989                   );
4990                   fnd_log.string
4991                   (
4992                     fnd_log.level_statement,
4993                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns',
4994                     'l_mtlWoRtns_rec.job_number: ' || l_mtlWoRtns_rec.job_number
4995                   );
4996                   fnd_log.string
4997                   (
4998                     fnd_log.level_statement,
4999                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns',
5000                     'l_mtlWoRtns_rec.CONCATENATED_SEGMENTS: ' || l_mtlWoRtns_rec.CONCATENATED_SEGMENTS
5001                   );
5002                   fnd_log.string
5003                   (
5004                     fnd_log.level_statement,
5005                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns',
5006                     'l_mtlWoRtns_rec.serial_number: ' || l_mtlWoRtns_rec.serial_number
5007                   );
5008                   fnd_log.string
5009                   (
5010                     fnd_log.level_statement,
5011                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns',
5012                     'l_mtlWoRtns_rec.issWoQty: ' || l_mtlWoRtns_rec.issWoQty
5013                   );
5014                   fnd_log.string
5015                   (
5016                     fnd_log.level_statement,
5017                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.l_mtlWoRtns_rec',
5018                     'l_mtlWoRtns_rec.Net_Quantity: ' || l_qty
5019                   );
5020 
5021               END IF; -- debug messages.
5022 
5023              END IF;
5024            END LOOP;
5025          END IF;
5026        END IF; -- l_valid_flag
5027     END LOOP;
5028 
5029     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5030         fnd_log.string
5031         (
5032             fnd_log.level_procedure,
5033             'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlTxnsReturns.end',
5034             'At the end of PLSQL procedure'
5035         );
5036     END IF;
5037 
5038 END getMtlTxnsReturns;
5039 
5040 -- Added for FP bug# 5903256.
5041 -- This procedure will retrieve all trackable parts in the job that
5042 -- have not been issued into the wo and that do not have an associated
5043 -- disposition.
5044 PROCEDURE getMtlNotIssued ( p_x_ahl_prd_mtl_txn_tbl   IN OUT  NOCOPY Ahl_Mtltxn_Tbl_Type,
5045                             p_prd_Mtltxn_criteria_rec IN Prd_Mtltxn_criteria_rec) IS
5046 
5047     -- Added for bug fix 6594140.
5048     -- get tracked items in a workorder.
5049     CURSOR get_tracked_inst_csr(
5050                                 p_job_number   IN VARCHAR2,
5051                                 p_visit_number IN NUMBER,
5052                                 p_priority     IN NUMBER,
5053                                 p_dept_name    IN VARCHAR2,
5054                                 p_org_name     IN VARCHAR2,
5055                                 p_item         IN VARCHAR2,
5056                                 p_incident_number IN VARCHAR2) IS
5057        SELECT  W.WORKORDER_ID,
5058                W.job_number,
5059                W.job_status_meaning,
5060                I.Description,
5061                W.ORGANIZATION_ID,
5062                csi.INVENTORY_ITEM_ID,
5063                I.concatenated_segments,
5064                csi.SERIAL_NUMBER ,
5065                csi.LOT_NUMBER,
5066                csi.INVENTORY_REVISION REVISION,
5067                csi.INSTANCE_ID,
5068                W.WIP_ENTITY_ID,
5069                csi.quantity,
5070                csi.Unit_Of_measure UOM,
5071                UOM.unit_of_measure,
5072                P.DEFAULT_PULL_SUPPLY_SUBINV,
5073                P.DEFAULT_PULL_SUPPLY_LOCATOR_ID,
5074                inv_project.GET_LOCSEGS(P.DEFAULT_PULL_SUPPLY_LOCATOR_ID, W.organization_id)|| '.'
5075                ||
5076                DECODE(D.segment19,NULL,NULL,inv_project.GET_PROJECT_NUMBER(D.segment19)) || '.'
5077                ||
5078                DECODE(D.segment20,NULL,NULL,inv_project.GET_TASK_NUMBER(D.segment20)) Locator,
5079                (select inv_locator_id from ahl_visits_b where visit_id = w.visit_id) inv_locator_id
5080        FROM
5081                CSI_ITEM_INSTANCES CSI,
5082                MTL_SYSTEM_ITEMS_KFV I,
5083                AHL_SEARCH_WORKORDERS_v W,
5084                WIP_PARAMETERS P,
5085                MTL_UNITS_OF_MEASURE_VL UOM,
5086                MTL_ITEM_LOCATIONS D,
5087                MTL_PARAMETERS MP
5088        WHERE
5089              csi.inventory_item_id = I.inventory_item_id
5090        AND   W.organization_id = MP.organization_id
5091        AND   csi.inv_master_organization_id  = mp.master_organization_id
5092        AND   MP.organization_id = I.organization_id
5093        AND   CSI.WIP_JOB_ID = W.WIP_ENTITY_ID
5094        AND   CSI.LOCATION_TYPE_CODE = 'WIP'
5095        AND   W.organization_id = P.organization_id
5096        AND   CSI.Unit_Of_Measure = UOM.UOM_CODE
5097        AND   P.default_pull_supply_locator_id = D.inventory_location_id(+)
5098        AND   P.organization_id = D.organization_id(+)
5099        AND   I.ENABLED_FLAG = 'Y'
5100        AND   W.JOB_STATUS_CODE NOT IN ('5','7','12')
5101        AND   ((I.START_DATE_ACTIVE IS NULL) OR (I.START_DATE_ACTIVE <= SYSDATE))
5102        AND   ((I.END_DATE_ACTIVE IS NULL) OR (I.END_DATE_ACTIVE >= SYSDATE))
5103        AND   UPPER(I.concatenated_segments) LIKE UPPER(nvl(p_item,I.concatenated_segments))
5104        AND   UPPER(W.ORGANIZATION_NAME) LIKE UPPER(NVL(p_org_name,W.ORGANIZATION_NAME))
5105        AND   UPPER(W.DEPARTMENT_NAME) LIKE UPPER(NVL(p_dept_name,W.DEPARTMENT_NAME))
5106        AND   UPPER(NVL(W.INCIDENT_NUMBER,'x')) LIKE UPPER(NVL(p_incident_number,NVL(W.INCIDENT_NUMBER,'x')))
5107        AND   NVL(W.PRIORITY,0) = NVL(p_priority,NVL(W.PRIORITY,0))
5108        AND   W.VISIT_NUMBER = NVL(p_visit_number,W.VISIT_NUMBER)
5109        AND   UPPER(W.JOB_NUMBER) LIKE UPPER(NVL(p_job_number,W.job_number))
5110        AND   NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
5111                          WHERE CIR.SUBJECT_ID = CSI.INSTANCE_Id
5112                            AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
5113                            AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE)
5114                            AND NVL(ACTIVE_END_DATE,SYSDATE))
5115        /* fix for bug# 	6310766: extra row being displayed with 0 qty
5116           -- split this query into two to handle serialized and non-serialized items.
5117        AND   NOT EXISTS (SELECT 'x'
5118                          from ahl_workorder_mtl_txns txn, AHL_WORKORDER_OPERATIONS o
5119                          where txn.workorder_operation_id = o.workorder_operation_id
5120                            and o.workorder_id = w.workorder_id
5121                            and txn.instance_id = csi.instance_id
5122                            and txn.TRANSACTION_TYPE_ID    = 35)
5123        */
5124        -- for serialized items
5125        AND   NOT EXISTS (SELECT 'x'
5126                          from ahl_workorder_mtl_txns txn, AHL_WORKORDER_OPERATIONS o
5127                          where txn.workorder_operation_id = o.workorder_operation_id
5128                            and o.workorder_id = w.workorder_id
5129                            and txn.instance_id = csi.instance_id
5130                            and txn.TRANSACTION_TYPE_ID    = 35
5131                            and txn.serial_number is not null
5132                            -- in case part number or serialnumber changed.
5133                            --and txn.serial_number = csi.serial_number
5134                            --and txn.inventory_item_id = csi.inventory_item_id
5135                         )
5136        -- for non-serialized items
5137        AND   NOT EXISTS (SELECT 'x'
5138                          from ahl_workorder_mtl_txns txn, AHL_WORKORDER_OPERATIONS o
5139                          where txn.workorder_operation_id = o.workorder_operation_id
5140                            and o.workorder_id = w.workorder_id
5141                            and txn.TRANSACTION_TYPE_ID    = 35
5142                            and txn.serial_number is null
5143                            and txn.inventory_item_id = csi.inventory_item_id
5144                            and nvl(txn.REVISION, 'x') = nvl(csi.inventory_revision,'x')
5145                            and nvl(txn.lot_number,'x') = nvl(csi.lot_number,'x')
5146                         )
5147        AND CSI.ACTIVE_START_DATE     <= SYSDATE
5148        AND ((CSI.ACTIVE_END_DATE IS NULL) OR (CSI.ACTIVE_END_DATE > SYSDATE))
5149        AND CSI.quantity > 0;
5150 
5151        -- Check existence of disposition.
5152       CURSOR ahl_disp_csr (p_workorder_id IN NUMBER,
5153                            p_instance_id  IN NUMBER) IS
5154         SELECT 'X'
5155         FROM AHL_MTL_RET_DISPOSITIONS_V disp
5156         WHERE disp.WORKORDER_ID= p_WORKORDER_ID
5157           AND disp.instance_id = p_instance_id;
5158 
5159       l_index      NUMBER := p_x_ahl_prd_mtl_txn_tbl.count;
5160       l_junk       varchar2(1);
5161 
5162 BEGIN
5163 
5164     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5165                 fnd_log.string
5166                 (
5167                         fnd_log.level_procedure,
5168                         'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued.Begin',
5169                         'At the Start of PLSQL procedure'
5170                 );
5171     END IF;
5172 
5173     FOR l_mtl_txn_rec IN get_tracked_inst_csr(
5174              p_job_number      => P_prd_Mtltxn_criteria_rec.JOB_NUMBER,
5175              p_visit_number    => P_prd_Mtltxn_criteria_rec.VISIT_NUMBER,
5176              p_priority        => P_prd_Mtltxn_criteria_rec.PRIORITY,
5177              p_dept_name       => P_prd_Mtltxn_criteria_rec.DEPARTMENT_NAME,
5178              p_org_name        => P_prd_Mtltxn_criteria_rec.ORGANIZATION_NAME,
5179              p_item            => P_prd_Mtltxn_criteria_rec.CONCATENATED_SEGMENTS,
5180              p_incident_number => P_prd_Mtltxn_criteria_rec.INCIDENT_NUMBER)
5181 
5182     LOOP
5183        -- check if disposition exists.
5184        OPEN ahl_disp_csr(l_mtl_txn_rec.workorder_id, l_mtl_txn_rec.instance_id);
5185        FETCH ahl_disp_csr INTO l_junk;
5186        IF (ahl_disp_csr%NOTFOUND) THEN
5187               -- add instance to search results.
5188               p_x_ahl_prd_mtl_txn_tbl(l_index).workorder_id :=l_mtl_txn_rec.workorder_id;
5189               p_x_ahl_prd_mtl_txn_tbl(l_index).Organization_Id :=l_mtl_txn_rec.Organization_Id;
5190               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Name :=l_mtl_txn_rec.JOB_NUMBER;
5191               --p_x_ahl_prd_mtl_txn_tbl(l_index).Operation_Seq_Num :=l_mtl_txn_rec.OPERATION_SEQUENCE_NUM;
5192               --p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_operation_Id :=l_mtl_txn_rec.Workorder_operation_Id;
5193               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Segments:=l_mtl_txn_rec.CONCATENATED_SEGMENTS;
5194               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Id :=l_mtl_txn_rec.INVENTORY_ITEM_ID;
5195               p_x_ahl_prd_mtl_txn_tbl(l_index).Inventory_Item_Description:=l_mtl_txn_rec.DESCRIPTION;
5196               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status :=l_mtl_txn_rec.JOB_STATUS_MEANING;
5197               p_x_ahl_prd_mtl_txn_tbl(l_index).Serial_Number :=l_mtl_txn_rec.Serial_Number;
5198               p_x_ahl_prd_mtl_txn_tbl(l_index).Quantity :=0;
5199               p_x_ahl_prd_mtl_txn_tbl(l_index).Net_Quantity :=l_mtl_txn_rec.Quantity;
5200               p_x_ahl_prd_mtl_txn_tbl(l_index).Uom :=l_mtl_txn_rec.Uom;
5201               p_x_ahl_prd_mtl_txn_tbl(l_index).Uom_Desc :=l_mtl_txn_rec.UNIT_OF_MEASURE;
5202               p_x_ahl_prd_mtl_txn_tbl(l_index).Workorder_Status :=l_mtl_txn_rec.JOB_STATUS_MEANING;
5203               p_x_ahl_prd_mtl_txn_tbl(l_index).Lot_Number :=l_mtl_txn_rec.Lot_Number;
5204               p_x_ahl_prd_mtl_txn_tbl(l_index).Revision :=l_mtl_txn_rec.Revision;
5205               p_x_ahl_prd_mtl_txn_tbl(l_index).Subinventory_Name :=l_mtl_txn_rec.DEFAULT_PULL_SUPPLY_SUBINV;
5206               p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Id :=l_mtl_txn_rec.DEFAULT_PULL_SUPPLY_LOCATOR_ID;
5207               p_x_ahl_prd_mtl_txn_tbl(l_index).Locator_Segments :=l_mtl_txn_rec.Locator;
5208               p_x_ahl_prd_mtl_txn_tbl(l_index).Transaction_Date :=SYSDATE;
5209               -- ER 5854712.
5210               IF (l_mtl_txn_rec.inv_locator_id IS NULL) THEN
5211                  p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '0';
5212               ELSE
5213                  p_x_ahl_prd_mtl_txn_tbl(l_index).visit_locator_flag := '1';
5214               END IF;
5215 
5216               l_index:=l_index+1;
5217 
5218               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5219                   fnd_log.string
5220                   (
5221                     fnd_log.level_statement,
5222                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued',
5223                     'l_mtl_txn_rec.workorder_id: ' || l_mtl_txn_rec.workorder_id
5224                   );
5225                   fnd_log.string
5226                   (
5227                     fnd_log.level_statement,
5228                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued',
5229                     'l_mtl_txn_rec.job_number: ' || l_mtl_txn_rec.job_number
5230                   );
5231                   fnd_log.string
5232                   (
5233                     fnd_log.level_statement,
5234                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued',
5235                     'l_mtl_txn_rec.CONCATENATED_SEGMENTS: ' || l_mtl_txn_rec.CONCATENATED_SEGMENTS
5236                   );
5237                   fnd_log.string
5238                   (
5239                     fnd_log.level_statement,
5240                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued',
5241                     'l_mtl_txn_rec.ISSUEQTY is zero '
5242                   );
5243                   fnd_log.string
5244                   (
5245                     fnd_log.level_statement,
5246                     'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued',
5247                     'l_mtl_txn_rec.Net Qty: ' || l_mtl_txn_rec.Quantity
5248                   );
5249               END IF;  -- debug messages.
5250 
5251        END IF;
5252        CLOSE ahl_disp_csr;
5253 
5254     END LOOP;
5255 
5256     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5257                 fnd_log.string
5258                 (
5259                         fnd_log.level_procedure,
5260                         'ahl.plsql.AHL_PRD_MTLTXN_PVT.getMtlNotIssued.end',
5261                         'At the end of PLSQL procedure'
5262                 );
5263     END IF;
5264 
5265 END getMtlNotIssued;
5266 
5267 --Material txns search api. Called from Material txn return UI.
5268 PROCEDURE GET_MTL_TRANS_RETURNS(
5269             p_api_version                   IN            NUMBER     := 1.0,
5270             p_init_msg_list                 IN            VARCHAR2   := FND_API.G_FALSE,
5271             p_commit                        IN            VARCHAR2   := FND_API.G_FALSE,
5272             p_validation_level              IN            NUMBER     := FND_API.G_VALID_LEVEL_FULL,
5273             p_default                       IN            VARCHAR2   := FND_API.G_FALSE,
5274             p_module_type                   IN            VARCHAR2   := NULL,
5275             x_return_status                 OUT NOCOPY           VARCHAR2,
5276             x_msg_count                     OUT NOCOPY           NUMBER,
5277             x_msg_data                      OUT NOCOPY           VARCHAR2,
5278             P_prd_Mtltxn_criteria_rec       IN            Prd_Mtltxn_criteria_rec,
5279             x_ahl_mtltxn_tbl                IN OUT NOCOPY Ahl_Mtltxn_Tbl_Type
5280             )AS
5281 
5282      l_api_name                  CONSTANT VARCHAR2(30) := 'GET_MTL_TRANS_RETURNS';
5283      l_api_version          CONSTANT NUMBER       := 1.0;
5284      l_ahl_prd_mtl_txn_tbl       Ahl_Mtltxn_Tbl_Type;
5285 
5286 BEGIN
5287      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5288         fnd_log.string
5289         (
5290             fnd_log.level_procedure,
5291             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURN.begin',
5292             'At the start of PLSQL procedure'
5293         );
5294      END IF;
5295      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5296          fnd_log.string
5297          (
5298                 fnd_log.level_statement,
5299                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5300                 'P_prd_Mtltxn_criteria_rec.JOB_NUMBER : ' || P_prd_Mtltxn_criteria_rec.JOB_NUMBER
5301          );
5302          fnd_log.string
5303          (
5304                 fnd_log.level_statement,
5305                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5306                 'P_prd_Mtltxn_criteria_rec.ORGANIZATION_NAME : ' || P_prd_Mtltxn_criteria_rec.ORGANIZATION_NAME
5307          );
5308          fnd_log.string
5309          (
5310                 fnd_log.level_statement,
5311                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5312                 'P_prd_Mtltxn_criteria_rec.PRIORITY : ' || P_prd_Mtltxn_criteria_rec.PRIORITY
5313          );
5314          fnd_log.string
5315          (
5316                 fnd_log.level_statement,
5317                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5318                 'P_prd_Mtltxn_criteria_rec.VISIT_NUMBER : ' || P_prd_Mtltxn_criteria_rec.VISIT_NUMBER
5319          );
5320          fnd_log.string
5321          (
5322                 fnd_log.level_statement,
5323                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5324                 'P_prd_Mtltxn_criteria_rec.DEPARTMENT_NAME : ' || P_prd_Mtltxn_criteria_rec.DEPARTMENT_NAME
5325          );
5326          fnd_log.string
5327          (
5328                 fnd_log.level_statement,
5329                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5330                 'P_prd_Mtltxn_criteria_rec.CONCATENATED_SEGMENTS : ' || P_prd_Mtltxn_criteria_rec.CONCATENATED_SEGMENTS
5331          );
5332          fnd_log.string
5333          (
5334                 fnd_log.level_statement,
5335                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5336                 'P_prd_Mtltxn_criteria_rec.DISPOSITION_NAME : ' || P_prd_Mtltxn_criteria_rec.DISPOSITION_NAME
5337          );
5338          fnd_log.string
5339          (
5340                 fnd_log.level_statement,
5341                 'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5342                 'P_prd_Mtltxn_criteria_rec.INCIDENT_NUMBER : ' || P_prd_Mtltxn_criteria_rec.INCIDENT_NUMBER
5343          );
5344 
5345      END IF;
5346      -- Standard start of API savepoint
5347      SAVEPOINT GET_MTL_TRANS_RETURNS_PVT;
5348 
5349      -- Standard call to check for call compatibility
5350      IF NOT FND_API.Compatible_API_Call
5351             (l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5352         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5353      END IF;
5354      -- Initialize message list if p_init_msg_list is set to TRUE
5355      IF FND_API.To_Boolean(p_init_msg_list) THEN
5356         FND_MSG_PUB.Initialize;
5357      END IF;
5358 
5359      -- Initialize API return status to success
5360      x_return_status := FND_API.G_RET_STS_SUCCESS;
5361      IF(P_prd_Mtltxn_criteria_rec.DISPOSITION_NAME IS NULL)THEN
5362        getMtlTxnsReturns
5363             (
5364             p_x_ahl_prd_mtl_txn_tbl   => x_ahl_mtltxn_tbl,
5365             P_prd_Mtltxn_criteria_rec => p_Prd_Mtltxn_criteria_rec
5366             );
5367 
5368        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5369            fnd_log.string
5370            (
5371             fnd_log.level_statement,
5372             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS', 'After getMtlTxnsReturns x_ahl_mtltxn_tbl.count : ' || x_ahl_mtltxn_tbl.count
5373            );
5374         END IF;
5375 
5376         getDispositionReturn
5377             (
5378             p_x_ahl_prd_mtl_txn_tbl   => x_ahl_mtltxn_tbl,
5379             P_prd_Mtltxn_criteria_rec => p_Prd_Mtltxn_criteria_rec
5380             );
5381 
5382        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5383            fnd_log.string
5384            (
5385             fnd_log.level_statement,
5386             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS', 'After getDispositionReturn x_ahl_mtltxn_tbl.count : ' || x_ahl_mtltxn_tbl.count
5387            );
5388         END IF;
5389 
5390       ELSE
5391         getDispositionReturn
5392             (
5393             p_x_ahl_prd_mtl_txn_tbl   => x_ahl_mtltxn_tbl,
5394             P_prd_Mtltxn_criteria_rec => p_Prd_Mtltxn_criteria_rec
5395             );
5396 
5397        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5398            fnd_log.string
5399            (
5400             fnd_log.level_statement,
5401             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS', 'After getDispositionReturn x_ahl_mtltxn_tbl.count : ' || x_ahl_mtltxn_tbl.count
5402            );
5403         END IF;
5404       END IF;
5405 
5406       -- get trackable items that have not been issued and not in the diposition
5407       -- list. Added for FP Bug# 5925805. It is possible to have tracked items in
5408       -- a job without a disposition and a material issue.
5409       -- bug fix# 6594140.
5410 
5411       getMtlNotIssued
5412             (
5413             p_x_ahl_prd_mtl_txn_tbl   => x_ahl_mtltxn_tbl,
5414             p_prd_Mtltxn_criteria_rec => p_Prd_Mtltxn_criteria_rec
5415             );
5416 
5417       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5418              fnd_log.string
5419                  (
5420                             fnd_log.level_statement,
5421                             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURNS',
5422                             'After getMtlNotIssued x_ahl_mtltxn_tbl.count : ' || x_ahl_mtltxn_tbl.count
5423                  );
5424       END IF;
5425 
5426       IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5427         fnd_log.string
5428         (
5429             fnd_log.level_procedure,
5430             'ahl.plsql.AHL_PRD_MTLTXN_PVT.GET_MTL_TRANS_RETURN.end',
5431             'At the end of PLSQL procedure'
5432         );
5433       END IF;
5434 
5435       --
5436 EXCEPTION
5437     WHEN FND_API.G_EXC_ERROR THEN
5438         x_return_status := FND_API.G_RET_STS_ERROR;
5439         Rollback to GET_MTL_TRANS_RETURNS_PVT;
5440         FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5441         p_data  => x_msg_data,
5442         p_encoded => fnd_api.g_false);
5443 
5444 
5445     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5446         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5447         Rollback to GET_MTL_TRANS_RETURNS_PVT;
5448         FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5449         p_data  => x_msg_data,
5450         p_encoded => fnd_api.g_false);
5451 
5452     WHEN OTHERS THEN
5453         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5454         Rollback to GET_MTL_TRANS_RETURNS_PVT;
5455         fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
5456         p_procedure_name => 'GET_MTL_TRANS_RETURNS',
5457         p_error_text     => SQLERRM);
5458         FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5459         p_data  => x_msg_data,
5460         p_encoded => fnd_api.g_false);
5461 
5462 END GET_MTL_TRANS_RETURNS;
5463 
5464 /*
5465 PROCEDURE SHOW_MTX_ERRORS
5466 AS
5467 x_row MTL_TRANSACTIONS_INTERFACE%rowtype;
5468 CURSOR CL
5469 IS
5470 select * into x_row
5471 from MTL_TRANSACTIONS_INTERFACE;
5472 begin
5473 return;
5474             FOR CLREC IN CL
5475             LOOP
5476                 IF CLREC.error_code IS NOT NULL
5477                 THEN
5478                     FND_MESSAGE.Set_Name('AHL','AHL_COM_GENERIC_ERROR');
5479                                 FND_MESSAGE.Set_Token('MESSAGE',CLREC.error_code);
5480                     FND_MSG_PUB.ADD;
5481                 END IF;
5482             END LOOP;
5483 end;
5484 */
5485 
5486 
5487 -- R12: Serial Reservation enhancements.
5488 -- Added procedure to relieve reservation when user is issuing a reserved serial
5489 -- number against a different workorder.
5490 PROCEDURE Relieve_Serial_Reservation(p_ahl_mtl_txn_rec  IN            AHL_MTLTXN_REC_TYPE,
5491                                      x_reservation_flag IN OUT NOCOPY VARCHAR2,
5492                                      x_return_status    IN OUT NOCOPY VARCHAR2
5493                                     )
5494 IS
5495   -- get the demand_source_header_id and demand_source_line_id for the serial number.
5496   CURSOR get_scheduled_mater_csr (p_serial_number     IN VARCHAR2,
5497                                   p_inventory_item_id IN NUMBER,
5498                                   p_organization_id   IN NUMBER) IS
5499     SELECT rsv.DEMAND_SOURCE_LINE_DETAIL schedule_material_id, rsv.demand_source_header_id,
5500            rsv.demand_source_line_id, rsv.demand_source_type_id
5501     FROM  mtl_serial_numbers msn, mtl_reservations rsv
5502     WHERE msn.reservation_id = rsv.reservation_id
5503       AND msn.serial_number = p_serial_number
5504       AND msn.current_organization_id = p_organization_id
5505       AND msn.inventory_item_id = p_inventory_item_id;
5506 
5507   l_schedule_material_id    NUMBER;
5508   l_demand_source_header_id NUMBER;
5509   l_demand_source_line_id   NUMBER;
5510   l_demand_source_type_id   NUMBER;
5511   l_msg_count               NUMBER;
5512   l_msg_data                VARCHAR2(2000);
5513 
5514 BEGIN
5515 
5516   -- initialize out parameters.
5517   x_return_status := FND_API.G_RET_STS_SUCCESS;
5518   x_reservation_flag := 'N';
5519 
5520   -- check if serial reservation exists against a different workorder.
5521   OPEN get_scheduled_mater_csr (p_ahl_mtl_txn_rec.serial_number,
5522                                 p_ahl_mtl_txn_rec.inventory_item_id,
5523                                 p_ahl_mtl_txn_rec.organization_id);
5524   FETCH get_scheduled_mater_csr INTO l_schedule_material_id,
5525                                      l_demand_source_header_id,
5526                                      l_demand_source_line_id,
5527                                      l_demand_source_type_id;
5528   IF (get_scheduled_mater_csr%FOUND) THEN
5529      -- match l_demand_source_header_id and l_demand_source_line_id.
5530      IF (l_demand_source_header_id = p_ahl_mtl_txn_rec.wip_entity_id
5531          AND l_demand_source_line_id = p_ahl_mtl_txn_rec.operation_seq_num
5532          AND l_demand_source_type_id = INV_RESERVATION_GLOBAL.G_SOURCE_TYPE_WIP) THEN
5533 
5534          -- valid reservation for the workorder.
5535          x_reservation_flag := 'Y';
5536 
5537      ELSE
5538         -- relieve reservation against l_demand_source_header_id.
5539 
5540         AHL_RSV_RESERVATIONS_PVT.RELIEVE_RESERVATION(
5541                     p_api_version           => 1.0,
5542                     p_init_msg_list         => FND_API.G_FALSE,
5543                     p_commit                => FND_API.G_FALSE,
5544                     p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
5545                     p_module_type           => NULL,
5546                     x_return_status         => x_return_status,
5547                     x_msg_count             => l_msg_count,
5548                     x_msg_data              => l_msg_data,
5549                     p_scheduled_material_id => l_schedule_material_id,
5550                     p_serial_number         => p_ahl_mtl_txn_rec.serial_number
5551                    );
5552 
5553         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
5554           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5555         ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
5556           RAISE FND_API.G_EXC_ERROR;
5557         END IF;
5558 
5559      END IF; -- l_demand_source_header_id <>
5560 
5561   END IF; -- get_scheduled_mater_csr%FOUND
5562   CLOSE get_scheduled_mater_csr;
5563 
5564 END Relieve_Serial_Reservation;
5565 
5566 -- Added for pre processing(FP bug# 5903207).
5567 PROCEDURE Perform_MtlTxn_Pre( p_x_ahl_mtltxn_tbl IN OUT NOCOPY AHL_MTLTXN_TBL_TYPE,
5568                               x_msg_count        IN OUT NOCOPY NUMBER,
5569                               x_msg_data         IN OUT NOCOPY VARCHAR2,
5570                               x_return_status    IN OUT NOCOPY VARCHAR2) IS
5571 
5572   l_x_material_txn_tbl  AHL_PRD_MATERIAL_TXN_PUB.Ahl_Material_Txn_Tbl_Type;
5573 
5574 BEGIN
5575    -- copy to l_x_material_txn_tbl record structure.
5576    IF (p_x_ahl_mtltxn_tbl.COUNT > 0) THEN
5577      FOR i IN p_x_ahl_mtltxn_tbl.FIRST..p_x_ahl_mtltxn_tbl.LAST LOOP
5578 
5579           l_x_material_txn_tbl(i).Workorder_Id            := p_x_ahl_mtltxn_tbl(i).Workorder_Id;
5580           l_x_material_txn_tbl(i).Workorder_Name          := p_x_ahl_mtltxn_tbl(i).Workorder_Name;
5581           l_x_material_txn_tbl(i).Operation_Seq_Num       := p_x_ahl_mtltxn_tbl(i).Operation_Seq_Num;
5582           l_x_material_txn_tbl(i).Transaction_Type_Id     := p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id;
5583           l_x_material_txn_tbl(i).Transaction_Type_Name   := p_x_ahl_mtltxn_tbl(i).Transaction_Type_Name;
5584 
5585           l_x_material_txn_tbl(i).Inventory_Item_Id       := p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id;
5586           l_x_material_txn_tbl(i).Inventory_Item_Segments := p_x_ahl_mtltxn_tbl(i).Inventory_Item_Segments;
5587           l_x_material_txn_tbl(i).Item_Instance_Number    := p_x_ahl_mtltxn_tbl(i).Item_Instance_Number;
5588           l_x_material_txn_tbl(i).Item_Instance_ID        := p_x_ahl_mtltxn_tbl(i).Item_Instance_ID;
5589           l_x_material_txn_tbl(i).Revision                := p_x_ahl_mtltxn_tbl(i).Revision;
5590           l_x_material_txn_tbl(i).Condition               := p_x_ahl_mtltxn_tbl(i).Condition;
5591           l_x_material_txn_tbl(i).Condition_desc          := p_x_ahl_mtltxn_tbl(i).Condition_desc;
5592           l_x_material_txn_tbl(i).Subinventory_Name       := p_x_ahl_mtltxn_tbl(i).Subinventory_Name;
5593           l_x_material_txn_tbl(i).Locator_Id              := p_x_ahl_mtltxn_tbl(i).Locator_Id;
5594           l_x_material_txn_tbl(i).Locator_Segments        := p_x_ahl_mtltxn_tbl(i).Locator_Segments;
5595           l_x_material_txn_tbl(i).Quantity                := p_x_ahl_mtltxn_tbl(i).Quantity;
5596           l_x_material_txn_tbl(i).Uom_Code                := p_x_ahl_mtltxn_tbl(i).Uom;
5597           l_x_material_txn_tbl(i).Unit_Of_Measure         := p_x_ahl_mtltxn_tbl(i).Uom_Desc;
5598           l_x_material_txn_tbl(i).Serial_Number           := p_x_ahl_mtltxn_tbl(i).Serial_Number;
5599           l_x_material_txn_tbl(i).Lot_Number              := p_x_ahl_mtltxn_tbl(i).Lot_Number;
5600           l_x_material_txn_tbl(i).Transaction_Date        := p_x_ahl_mtltxn_tbl(i).Transaction_Date;
5601           l_x_material_txn_tbl(i).Transaction_Reference   := p_x_ahl_mtltxn_tbl(i).Transaction_Reference;
5602           l_x_material_txn_tbl(i).recepient_id            := p_x_ahl_mtltxn_tbl(i).recepient_id;
5603           l_x_material_txn_tbl(i).recepient_name          := p_x_ahl_mtltxn_tbl(i).recepient_name;
5604           l_x_material_txn_tbl(i).disposition_id          := p_x_ahl_mtltxn_tbl(i).disposition_id;
5605 
5606           -- Target visit is currently not used.
5607           --p_x_material_txn_tbl(i).Target_Visit_Id       := p_x_ahl_mtltxn_tbl(i).Target_Visit_Id;
5608           --p_x_material_txn_tbl(i).Target_Visit_Num      := p_x_ahl_mtltxn_tbl(i).Target_Visit_Num;
5609 
5610           l_x_material_txn_tbl(i).Reason_Id               := p_x_ahl_mtltxn_tbl(i).Reason_Id;
5611           l_x_material_txn_tbl(i).Reason_Name             := p_x_ahl_mtltxn_tbl(i).Reason_Name;
5612           l_x_material_txn_tbl(i).Problem_Code            := p_x_ahl_mtltxn_tbl(i).Problem_Code;
5613           l_x_material_txn_tbl(i).Problem_Code_Meaning    := p_x_ahl_mtltxn_tbl(i).Problem_Code_Meaning;
5614           l_x_material_txn_tbl(i).Sr_Summary              := p_x_ahl_mtltxn_tbl(i).Sr_Summary;
5615           l_x_material_txn_tbl(i).Qa_Collection_Id        := p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id;
5616 
5617           l_x_material_txn_tbl(i).ATTRIBUTE_CATEGORY      := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE_CATEGORY;
5618           l_x_material_txn_tbl(i).ATTRIBUTE1              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE1;
5619           l_x_material_txn_tbl(i).ATTRIBUTE2              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE2;
5620           l_x_material_txn_tbl(i).ATTRIBUTE3              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE3;
5621           l_x_material_txn_tbl(i).ATTRIBUTE4              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE4;
5622           l_x_material_txn_tbl(i).ATTRIBUTE5              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE5;
5623           l_x_material_txn_tbl(i).ATTRIBUTE6              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE6;
5624           l_x_material_txn_tbl(i).ATTRIBUTE7              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE7;
5625           l_x_material_txn_tbl(i).ATTRIBUTE8              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE8;
5626           l_x_material_txn_tbl(i).ATTRIBUTE9              := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE9;
5627           l_x_material_txn_tbl(i).ATTRIBUTE10             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE10;
5628           l_x_material_txn_tbl(i).ATTRIBUTE11             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE11;
5629           l_x_material_txn_tbl(i).ATTRIBUTE12             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE12;
5630           l_x_material_txn_tbl(i).ATTRIBUTE13             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE13;
5631           l_x_material_txn_tbl(i).ATTRIBUTE14             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE14;
5632           l_x_material_txn_tbl(i).ATTRIBUTE15             := p_x_ahl_mtltxn_tbl(i).ATTRIBUTE15;
5633      END LOOP;
5634 
5635      -- call user hook api.
5636      AHL_PRD_MATERIAL_TXN_CUHK.Perform_MtlTxn_Pre(
5637                       p_x_material_txn_tbl => l_x_material_txn_tbl,
5638                       x_msg_count => x_msg_count,
5639                       x_msg_data => x_msg_data,
5640                       x_return_status => x_return_status);
5641 
5642      IF (x_return_status = FND_API.G_RET_STS_SUCCESS AND l_x_material_txn_tbl.count > 0) THEN
5643        FOR i IN l_x_material_txn_tbl.FIRST..l_x_material_txn_tbl.LAST LOOP
5644 
5645           p_x_ahl_mtltxn_tbl(i).Workorder_Id            := l_x_material_txn_tbl(i).Workorder_Id;
5646           p_x_ahl_mtltxn_tbl(i).Workorder_Name          := l_x_material_txn_tbl(i).Workorder_Name;
5647           p_x_ahl_mtltxn_tbl(i).Operation_Seq_Num       := l_x_material_txn_tbl(i).Operation_Seq_Num;
5648           p_x_ahl_mtltxn_tbl(i).Transaction_Type_Id     := l_x_material_txn_tbl(i).Transaction_Type_Id;
5649           p_x_ahl_mtltxn_tbl(i).Transaction_Type_Name   := l_x_material_txn_tbl(i).Transaction_Type_Name;
5650 
5651           p_x_ahl_mtltxn_tbl(i).Inventory_Item_Id       := l_x_material_txn_tbl(i).Inventory_Item_Id;
5652           p_x_ahl_mtltxn_tbl(i).Inventory_Item_Segments := l_x_material_txn_tbl(i).Inventory_Item_Segments;
5653           p_x_ahl_mtltxn_tbl(i).Item_Instance_Number    := l_x_material_txn_tbl(i).Item_Instance_Number;
5654           p_x_ahl_mtltxn_tbl(i).Item_Instance_ID        := l_x_material_txn_tbl(i).Item_Instance_ID;
5655           p_x_ahl_mtltxn_tbl(i).Revision                := l_x_material_txn_tbl(i).Revision;
5656           p_x_ahl_mtltxn_tbl(i).Condition               := l_x_material_txn_tbl(i).Condition;
5657           p_x_ahl_mtltxn_tbl(i).Condition_desc          := l_x_material_txn_tbl(i).Condition_desc;
5658           p_x_ahl_mtltxn_tbl(i).Subinventory_Name       := l_x_material_txn_tbl(i).Subinventory_Name;
5659           p_x_ahl_mtltxn_tbl(i).Locator_Id              := l_x_material_txn_tbl(i).Locator_Id;
5660           p_x_ahl_mtltxn_tbl(i).Locator_Segments        := l_x_material_txn_tbl(i).Locator_Segments;
5661           p_x_ahl_mtltxn_tbl(i).Quantity                := l_x_material_txn_tbl(i).Quantity;
5662           p_x_ahl_mtltxn_tbl(i).Uom                     := l_x_material_txn_tbl(i).Uom_code;
5663           p_x_ahl_mtltxn_tbl(i).Uom_Desc               := l_x_material_txn_tbl(i).Unit_of_measure;
5664           p_x_ahl_mtltxn_tbl(i).Serial_Number           := l_x_material_txn_tbl(i).Serial_Number;
5665           p_x_ahl_mtltxn_tbl(i).Lot_Number              := l_x_material_txn_tbl(i).Lot_Number;
5666           p_x_ahl_mtltxn_tbl(i).Transaction_Date        := l_x_material_txn_tbl(i).Transaction_Date;
5667           p_x_ahl_mtltxn_tbl(i).Transaction_Reference   := l_x_material_txn_tbl(i).Transaction_Reference;
5668           p_x_ahl_mtltxn_tbl(i).recepient_id            := l_x_material_txn_tbl(i).recepient_id;
5669           p_x_ahl_mtltxn_tbl(i).recepient_name          := l_x_material_txn_tbl(i).recepient_name;
5670           p_x_ahl_mtltxn_tbl(i).disposition_id          := l_x_material_txn_tbl(i).disposition_id;
5671 
5672           -- Target visit is currently not used.
5673           --p_x_ahl_mtltxn_tbl(i).Target_Visit_Id       := l_x_material_txn_tbl(i).Target_Visit_Id;
5674           --p_x_ahl_mtltxn_tbl(i).Target_Visit_Num      := l_x_material_txn_tbl(i).Target_Visit_Num;
5675 
5676           p_x_ahl_mtltxn_tbl(i).Reason_Id               := l_x_material_txn_tbl(i).Reason_Id;
5677           p_x_ahl_mtltxn_tbl(i).Reason_Name             := l_x_material_txn_tbl(i).Reason_Name;
5678           p_x_ahl_mtltxn_tbl(i).Problem_Code            := l_x_material_txn_tbl(i).Problem_Code;
5679           p_x_ahl_mtltxn_tbl(i).Problem_Code_Meaning    := l_x_material_txn_tbl(i).Problem_Code_Meaning;
5680           p_x_ahl_mtltxn_tbl(i).Sr_Summary              := l_x_material_txn_tbl(i).Sr_Summary;
5681           p_x_ahl_mtltxn_tbl(i).Qa_Collection_Id        := l_x_material_txn_tbl(i).Qa_Collection_Id;
5682 
5683           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE_CATEGORY      := l_x_material_txn_tbl(i).ATTRIBUTE_CATEGORY;
5684           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE1              := l_x_material_txn_tbl(i).ATTRIBUTE1;
5685           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE2              := l_x_material_txn_tbl(i).ATTRIBUTE2;
5686           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE3              := l_x_material_txn_tbl(i).ATTRIBUTE3;
5687           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE4              := l_x_material_txn_tbl(i).ATTRIBUTE4;
5688           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE5              := l_x_material_txn_tbl(i).ATTRIBUTE5;
5689           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE6              := l_x_material_txn_tbl(i).ATTRIBUTE6;
5690           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE7              := l_x_material_txn_tbl(i).ATTRIBUTE7;
5691           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE8              := l_x_material_txn_tbl(i).ATTRIBUTE8;
5692           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE9              := l_x_material_txn_tbl(i).ATTRIBUTE9;
5693           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE10             := l_x_material_txn_tbl(i).ATTRIBUTE10;
5694           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE11             := l_x_material_txn_tbl(i).ATTRIBUTE11;
5695           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE12             := l_x_material_txn_tbl(i).ATTRIBUTE12;
5696           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE13             := l_x_material_txn_tbl(i).ATTRIBUTE13;
5697           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE14             := l_x_material_txn_tbl(i).ATTRIBUTE14;
5698           p_x_ahl_mtltxn_tbl(i).ATTRIBUTE15             := l_x_material_txn_tbl(i).ATTRIBUTE15;
5699        END LOOP; -- l_x_material_txn_tbl.FIRST
5700      END IF; -- x_return_status.
5701    END IF;
5702 END Perform_MtlTxn_Pre;
5703 
5704 
5705 -- Added for post processing (FP bug# 5903207).
5706 PROCEDURE Perform_MtlTxn_Post( p_ahl_mtltxn_tbl   IN AHL_MTLTXN_TBL_TYPE,
5707                                x_msg_count        IN OUT NOCOPY NUMBER,
5708                                x_msg_data         IN OUT NOCOPY VARCHAR2,
5709                                x_return_status    IN OUT NOCOPY VARCHAR2) IS
5710 
5711   l_material_txn_tbl  AHL_PRD_MATERIAL_TXN_PUB.Ahl_Material_Txn_Tbl_Type;
5712 
5713 BEGIN
5714 
5715    -- copy to l_x_material_txn_tbl record structure.
5716    IF (p_ahl_mtltxn_tbl.COUNT > 0) THEN
5717      FOR i IN p_ahl_mtltxn_tbl.FIRST..p_ahl_mtltxn_tbl.LAST LOOP
5718 
5719           l_material_txn_tbl(i).Workorder_Id            := p_ahl_mtltxn_tbl(i).Workorder_Id;
5720           l_material_txn_tbl(i).Workorder_Name          := p_ahl_mtltxn_tbl(i).Workorder_Name;
5721           l_material_txn_tbl(i).Operation_Seq_Num       := p_ahl_mtltxn_tbl(i).Operation_Seq_Num;
5722           l_material_txn_tbl(i).Transaction_Type_Id     := p_ahl_mtltxn_tbl(i).Transaction_Type_Id;
5723           l_material_txn_tbl(i).Transaction_Type_Name   := p_ahl_mtltxn_tbl(i).Transaction_Type_Name;
5724 
5725           l_material_txn_tbl(i).Inventory_Item_Id       := p_ahl_mtltxn_tbl(i).Inventory_Item_Id;
5726           l_material_txn_tbl(i).Inventory_Item_Segments := p_ahl_mtltxn_tbl(i).Inventory_Item_Segments;
5727           l_material_txn_tbl(i).Item_Instance_Number    := p_ahl_mtltxn_tbl(i).Item_Instance_Number;
5728           l_material_txn_tbl(i).Item_Instance_ID        := p_ahl_mtltxn_tbl(i).Item_Instance_ID;
5729           l_material_txn_tbl(i).Revision                := p_ahl_mtltxn_tbl(i).Revision;
5730           l_material_txn_tbl(i).Condition               := p_ahl_mtltxn_tbl(i).Condition;
5731           l_material_txn_tbl(i).Condition_desc          := p_ahl_mtltxn_tbl(i).Condition_desc;
5732           l_material_txn_tbl(i).Subinventory_Name       := p_ahl_mtltxn_tbl(i).Subinventory_Name;
5733           l_material_txn_tbl(i).Locator_Id              := p_ahl_mtltxn_tbl(i).Locator_Id;
5734           l_material_txn_tbl(i).Locator_Segments        := p_ahl_mtltxn_tbl(i).Locator_Segments;
5735           l_material_txn_tbl(i).Quantity                := p_ahl_mtltxn_tbl(i).Quantity;
5736           l_material_txn_tbl(i).Uom_Code                := p_ahl_mtltxn_tbl(i).Uom;
5737           l_material_txn_tbl(i).Unit_Of_Measure         := p_ahl_mtltxn_tbl(i).Uom_Desc;
5738           l_material_txn_tbl(i).Serial_Number           := p_ahl_mtltxn_tbl(i).Serial_Number;
5739           l_material_txn_tbl(i).Lot_Number              := p_ahl_mtltxn_tbl(i).Lot_Number;
5740           l_material_txn_tbl(i).Transaction_Date        := p_ahl_mtltxn_tbl(i).Transaction_Date;
5741           l_material_txn_tbl(i).Transaction_Reference   := p_ahl_mtltxn_tbl(i).Transaction_Reference;
5742           l_material_txn_tbl(i).recepient_id            := p_ahl_mtltxn_tbl(i).recepient_id;
5743           l_material_txn_tbl(i).recepient_name          := p_ahl_mtltxn_tbl(i).recepient_name;
5744           l_material_txn_tbl(i).disposition_id          := p_ahl_mtltxn_tbl(i).disposition_id;
5745 
5746           -- Target visit is currently not used.
5747           --p_material_txn_tbl(i).Target_Visit_Id       := p_ahl_mtltxn_tbl(i).Target_Visit_Id;
5748           --p_material_txn_tbl(i).Target_Visit_Num      := p_ahl_mtltxn_tbl(i).Target_Visit_Num;
5749 
5750           l_material_txn_tbl(i).Reason_Id               := p_ahl_mtltxn_tbl(i).Reason_Id;
5751           l_material_txn_tbl(i).Reason_Name             := p_ahl_mtltxn_tbl(i).Reason_Name;
5752           l_material_txn_tbl(i).Problem_Code            := p_ahl_mtltxn_tbl(i).Problem_Code;
5753           l_material_txn_tbl(i).Problem_Code_Meaning    := p_ahl_mtltxn_tbl(i).Problem_Code_Meaning;
5754           l_material_txn_tbl(i).Sr_Summary              := p_ahl_mtltxn_tbl(i).Sr_Summary;
5755           l_material_txn_tbl(i).Qa_Collection_Id        := p_ahl_mtltxn_tbl(i).Qa_Collection_Id;
5756 
5757           l_material_txn_tbl(i).ATTRIBUTE_CATEGORY      := p_ahl_mtltxn_tbl(i).ATTRIBUTE_CATEGORY;
5758           l_material_txn_tbl(i).ATTRIBUTE1              := p_ahl_mtltxn_tbl(i).ATTRIBUTE1;
5759           l_material_txn_tbl(i).ATTRIBUTE2              := p_ahl_mtltxn_tbl(i).ATTRIBUTE2;
5760           l_material_txn_tbl(i).ATTRIBUTE3              := p_ahl_mtltxn_tbl(i).ATTRIBUTE3;
5761           l_material_txn_tbl(i).ATTRIBUTE4              := p_ahl_mtltxn_tbl(i).ATTRIBUTE4;
5762           l_material_txn_tbl(i).ATTRIBUTE5              := p_ahl_mtltxn_tbl(i).ATTRIBUTE5;
5763           l_material_txn_tbl(i).ATTRIBUTE6              := p_ahl_mtltxn_tbl(i).ATTRIBUTE6;
5764           l_material_txn_tbl(i).ATTRIBUTE7              := p_ahl_mtltxn_tbl(i).ATTRIBUTE7;
5765           l_material_txn_tbl(i).ATTRIBUTE8              := p_ahl_mtltxn_tbl(i).ATTRIBUTE8;
5766           l_material_txn_tbl(i).ATTRIBUTE9              := p_ahl_mtltxn_tbl(i).ATTRIBUTE9;
5767           l_material_txn_tbl(i).ATTRIBUTE10             := p_ahl_mtltxn_tbl(i).ATTRIBUTE10;
5768           l_material_txn_tbl(i).ATTRIBUTE11             := p_ahl_mtltxn_tbl(i).ATTRIBUTE11;
5769           l_material_txn_tbl(i).ATTRIBUTE12             := p_ahl_mtltxn_tbl(i).ATTRIBUTE12;
5770           l_material_txn_tbl(i).ATTRIBUTE13             := p_ahl_mtltxn_tbl(i).ATTRIBUTE13;
5771           l_material_txn_tbl(i).ATTRIBUTE14             := p_ahl_mtltxn_tbl(i).ATTRIBUTE14;
5772           l_material_txn_tbl(i).ATTRIBUTE15             := p_ahl_mtltxn_tbl(i).ATTRIBUTE15;
5773 
5774      END LOOP;
5775 
5776      AHL_PRD_MATERIAL_TXN_CUHK.Perform_MtlTxn_Post( p_material_txn_tbl => l_material_txn_tbl,
5777                                                     x_msg_count => x_msg_count,
5778                                                     x_msg_data => x_msg_data,
5779                                                     x_return_status => x_return_status);
5780    END IF;
5781 
5782 
5783 END Perform_MtlTxn_Post;
5784 
5785 
5786 -- Added for FP ER 6447935 - dynamic locator support.
5787 -- breakup input locator concatenated segments to populate MTI.
5788 PROCEDURE Get_MTL_LocatorSegs (p_concat_segs     IN VARCHAR2,
5789                                p_organization_id IN NUMBER,
5790                                p_x_mti_seglist   IN OUT NOCOPY fnd_flex_ext.SegmentArray,
5791                                x_return_status      OUT NOCOPY VARCHAR2)
5792 
5793 IS
5794 
5795       l_flex_nseg      NUMBER;
5796       l_flex_seglist   fnd_flex_key_api.segment_list;
5797       l_fftype         fnd_flex_key_api.flexfield_type;
5798       l_ffstru         fnd_flex_key_api.structure_type;
5799       l_segment_type   fnd_flex_key_api.segment_type;
5800       l_delim          VARCHAR2(1);
5801 
5802       l_loc_nseg     number;
5803       l_loc_seglist  fnd_flex_ext.SegmentArray;
5804       l_mti_seglist  fnd_flex_ext.SegmentArray;
5805       l_concat_seg_IDs VARCHAR2(4000);
5806 
5807       l_valid_flag    BOOLEAN;
5808 
5809 BEGIN
5810 
5811    IF G_DEBUG='Y' THEN
5812       AHL_DEBUG_PUB.DEBUG('Start Procedure:Splitting locator concatenated segments:' || p_concat_segs, 'Get_MTL_LocatorSegs');
5813    END IF;
5814 
5815    -- initialize status to success.
5816    x_return_status := FND_API.G_RET_STS_SUCCESS;
5817 
5818    -- set mfg_organization_id profile - bug# 6010795.
5819    fnd_profile.put('MFG_ORGANIZATION_ID', p_organization_id);
5820 
5821    l_mti_seglist := p_x_mti_seglist;
5822 
5823    fnd_flex_key_api.set_session_mode('seed_data');
5824 
5825    -- find flex field type
5826    l_fftype := fnd_flex_key_api.find_flexfield('INV', 'MTLL');
5827 
5828    -- find flex structure type
5829    l_ffstru := fnd_flex_key_api.find_structure(l_fftype, 101);
5830 
5831    -- find segment list for the key flex field
5832    fnd_flex_key_api.get_segments(l_fftype, l_ffstru, TRUE, l_flex_nseg, l_flex_seglist);
5833 
5834    -- find segment delimiter
5835    l_delim := l_ffstru.segment_separator;
5836 
5837    IF G_DEBUG='Y' THEN
5838      AHL_DEBUG_PUB.DEBUG('Before Loc Seg validate:Profile mfg_organization_id:'  || fnd_profile.value('MFG_ORGANIZATION_ID') );
5839    END IF;
5840 
5841    -- validate locator segments.
5842    l_valid_flag := fnd_flex_keyval.validate_segs(
5843                            operation                    => 'CHECK_COMBINATION'
5844                          , appl_short_name              => 'INV'
5845                          , key_flex_code                => 'MTLL'
5846                          , structure_number             => 101
5847                          , concat_segments              => p_concat_segs
5848                          , values_or_ids                => 'V'
5849                          , data_set                     => p_organization_id
5850                    );
5851 
5852    IF NOT(l_valid_flag) THEN
5853       FND_MESSAGE.Set_Name('AHL','AHL_INPUT_NUM_LOC_SEGS_INVALID');
5854       FND_MESSAGE.Set_Token('LOC_SEG',p_concat_segs);
5855       FND_MSG_PUB.ADD;
5856       x_return_status := FND_API.G_RET_STS_ERROR;
5857       RETURN;
5858    END IF;
5859 
5860    -- get IDs for the concatenated segments as MTI validates IDs.
5861    l_concat_seg_IDs := fnd_flex_keyval.concatenated_ids;
5862 
5863    -- breakup locator concat IDs into segments.
5864    l_loc_nseg := fnd_flex_ext.breakup_segments (l_concat_seg_IDs, l_delim, l_loc_seglist);
5865 
5866    /*
5867    -- validate if enabled segments equal to input locator segments.
5868    -- if not, raise error and return.
5869    IF (l_loc_nseg <> l_flex_nseg) THEN
5870       IF G_DEBUG='Y' THEN
5871          AHL_DEBUG_PUB.DEBUG('FND Enabled Segments:' || l_flex_nseg);
5872          AHL_DEBUG_PUB.DEBUG('FND Enabled Segments:' || l_loc_nseg);
5873       END IF;
5874 
5875       FND_MESSAGE.Set_Name('AHL','AHL_INPUT_NUM_LOC_SEGS_INVALID');
5876       FND_MESSAGE.Set_Token('LOC_NUM',l_flex_nseg);
5877       FND_MESSAGE.Set_Token('LOC_SEG',p_concat_segs);
5878       FND_MSG_PUB.ADD;
5879       x_return_status := FND_API.G_RET_STS_ERROR;
5880       RETURN;
5881    END IF;
5882    */
5883 
5884    -- get the corresponding column for all segments
5885    --
5886    -- 'To_number(Substr(l_segment_type.column_name, 8))' gives the
5887    -- number of the segment i.e. 1 - 20 which is used as index to
5888    -- populate the corresponding columns from segments array.
5889    --
5890    FOR l_loop IN 1..l_flex_nseg LOOP
5891 
5892       l_segment_type := fnd_flex_key_api.find_segment(l_fftype, l_ffstru, l_flex_seglist(l_loop));
5893       --dbms_output.put_line('l_segment_type is : ' || l_segment_type.column_name);
5894 
5895       l_mti_seglist(To_number(Substr(l_segment_type.column_name, 8))) := l_loc_seglist(l_loop);
5896 
5897    END LOOP;
5898 
5899    -- assign out parameter.
5900    p_x_mti_seglist := l_mti_seglist;
5901 
5902    IF G_DEBUG='Y' THEN
5903       FOR i IN 1..20 LOOP
5904         --dbms_output.put_line('Segs final(' || i || ') : ' || l_mti_seglist(i));
5905         AHL_DEBUG_PUB.DEBUG('Segs final(' || i || ') : ' || p_x_mti_seglist(i), 'Get_MTL_LocatorSegs');
5906       END LOOP;
5907       AHL_DEBUG_PUB.DEBUG('End of procedure', 'Get_MTL_LocatorSegs');
5908    END IF;
5909 
5910 END Get_MTL_LocatorSegs;
5911 
5912 
5913 END AHL_PRD_MTLTXN_PVT ;