DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_MM_MTL_MGT_PVT

Source


1 PACKAGE BODY AHL_MM_MTL_MGT_PVT AS
2 /* $Header: AHLVMMGB.pls 120.0.12020000.3 2013/01/03 09:30:28 sansatpa noship $*/
3   ------------------------------------
4   -- Common constants and variables --
5   ------------------------------------
6   l_log_current_level NUMBER      := fnd_log.g_current_runtime_level;
7   l_log_statement     NUMBER      := fnd_log.level_statement;
8   l_log_procedure     NUMBER      := fnd_log.level_procedure;
9   l_log_error         NUMBER      := fnd_log.level_error;
10   l_log_unexpected    NUMBER      := fnd_log.level_unexpected;
11   l_log_exception     NUMBER      := fnd_log.level_exception;
12   G_DEBUG             VARCHAR2(1) := AHL_DEBUG_PUB.is_log_enabled;
13 
14   G_DELIVERY_DETAIL_ID  NUMBER;
15 
16   -- changes by debadey
17   -- Logging
18   G_DEBUG_LINE_NUM NUMBER          := 0;
19 
20   -- Constants
21   C_DIRECT_NETWORK 	 NUMBER := 1;
22   C_INTRANSIT_NETWORK    NUMBER := 2;
23   C_INTRANSIT_SHIPMENT   NUMBER := 21;
24   C_DIRECT_INTERORG_TXFR NUMBER := 03;
25 
26   --Declare any types used by the procedure
27   TYPE transaction_intf_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
28   -- Record type for storing shipping id
29   TYPE Shipping_Id_Rec_Type
30   IS RECORD (source_org_id  NUMBER,
31              dest_org_id    NUMBER,
32 			       shipment_num    NUMBER
33 			      );
34 
35   TYPE Shipping_Id_Tbl_Type IS TABLE OF Shipping_Id_Rec_Type;
36   ship_id_tbl Shipping_Id_Tbl_Type;
37   -- end of changes by debadey
38   ------------------------------------------------------------------------------------
39 
40   -- added by sansatpa
41 
42   PROCEDURE CREATE_INTERNAL_ORDER(
43     P_API_VERSION    IN NUMBER,
44     P_INIT_MSG_LIST  IN VARCHAR2 DEFAULT FND_API.G_FALSE,
45     P_COMMIT         IN VARCHAR2 DEFAULT FND_API.G_FALSE,
46     P_SCH_MTL_ID     IN NUMBER,
47     P_SOURCE_ORG        IN NUMBER,
48     P_SOURCE_SUB_INV_TBL    IN OAF_VARCHAR2_TABLE_100,
49     P_SOURCE_LOCATOR_TBL    IN OAF_NUMBER_TABLE,
50     P_QUANTITY          IN NUMBER,
51     P_FM_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
52     P_TO_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
53     P_QUANTITY_TBL      IN OAF_NUMBER_TABLE,
54     X_REQUISITION_NUM OUT NOCOPY    VARCHAR2,
55     X_REQUISITION_HDR_ID OUT NOCOPY NUMBER,
56     X_INT_ORDER_NUM OUT NOCOPY      NUMBER,
57     X_INT_ORDER_HDR_ID OUT NOCOPY   NUMBER,
58     X_RESERVATION_ID OUT NOCOPY     NUMBER,
59     X_MSG_COUNT OUT NOCOPY          NUMBER,
60     X_MSG_DATA OUT NOCOPY           VARCHAR2,
61     X_RETURN_STATUS OUT NOCOPY      VARCHAR2);
62 
63 
64   PROCEDURE CREATE_RESERVATION_IR(
65     p_SCHEDULED_MATERIAL_ID IN NUMBER,
66     p_internal_req_hdr_id   IN NUMBER,
67     p_internal_req_line_id  IN NUMBER,
68     P_REQUIRED_QUANTITY     IN NUMBER,
69     x_reservation_id OUT NOCOPY NUMBER,
70     x_msg_count OUT NOCOPY      NUMBER,
71     X_MSG_DATA OUT NOCOPY       VARCHAR2,
72     X_RETURN_STATUS OUT NOCOPY  VARCHAR2);
73 
74 
75   PROCEDURE PICK_RELEASE(
76     P_API_VERSION        IN NUMBER,
77     P_INIT_MSG_LIST      IN VARCHAR2 DEFAULT FND_API.G_FALSE,
78     P_COMMIT             IN VARCHAR2 DEFAULT FND_API.G_FALSE,
79     P_ORDER_HEADER_ID    IN NUMBER, -- the ISO header is
80     P_ORDER_LINE_ID      IN NUMBER, -- the iso line id
81     P_FM_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
82     P_TO_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
83     P_QUANTITY_TBL       IN OAF_NUMBER_TABLE,                    -- The total quantity of serials present is serial tables passed
84     P_PICKING_RULE_ID    IN NUMBER DEFAULT NULL,                 -- If not pass the required details
85     P_SOURCE_LOCATOR_TBL IN OAF_NUMBER_TABLE DEFAULT NULL,       -- the supply Locator
86     P_SOURCE_SUB_INV_TBL IN OAF_VARCHAR2_TABLE_100 DEFAULT NULL, -- the Supply Sub inventory
87     P_PICK_FROM_ORG      IN NUMBER DEFAULT NULL,                 -- the supply org
88     X_MSG_COUNT OUT NOCOPY     NUMBER,
89     X_MSG_DATA OUT NOCOPY      VARCHAR2,
90     X_RETURN_STATUS OUT NOCOPY VARCHAR2 );
91 
92     PROCEDURE PICK_RELEASE_CONFIRM(
93     P_API_VERSION       IN NUMBER,
94     P_INIT_MSG_LIST     IN VARCHAR2 DEFAULT FND_API.G_FALSE,
95     P_COMMIT            IN VARCHAR2 DEFAULT FND_API.G_FALSE,
96     P_ORDER_HEADER_ID   IN NUMBER, -- the ISO header is
97     P_ORDER_LINE_ID     IN NUMBER, -- the iso line id
98     P_FM_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
99     P_TO_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
100     P_QUANTITY_TBL      IN OAF_NUMBER_TABLE,      -- The total quantity of serials present is serial tables passed
101     P_PICKING_RULE_ID   IN NUMBER DEFAULT NULL,   -- If not pass the required details
102     P_PICK_FROM_LOCATOR IN NUMBER DEFAULT NULL,   -- the supply Locator
103     P_PICK_FROM_SUBINV  IN VARCHAR2 DEFAULT NULL, -- the Supply Sub inventory
104     P_PICK_FROM_ORG     IN NUMBER DEFAULT NULL,   -- the supply org
105     X_MSG_COUNT OUT NOCOPY     NUMBER,
106     X_MSG_DATA OUT NOCOPY      VARCHAR2,
107     X_RETURN_STATUS OUT NOCOPY VARCHAR2 );
108 
109     -- changes by sansatpa ends
110 
111 
112   ---------------------------------------------------------------------------------------------------------
113   -- Declare Procedures --
114   ---------------------------------------------------------------------------------------------------------
115   -- Start of Comments --
116   --  Procedure name    : Check_Availability
117   --  Type        : Private
118   --  Function    : This procedure calls ATP to check if inventory item is available
119   --                for the cMRO Workoder/Operation demand.
120   --  Pre-reqs    :
121   --  Parameters  :
122   --
123   --  Standard OUT Parameters :
124   --      x_return_status         OUT             VARCHAR2                Required
125   --
126   --  Check_Material_Aval Parameters :
127   --      p_schedule_material_id_tbl        : Table containing Schedule material requirement id of the demand.
128   --      x_mtl_avl_schld_tbl               : AHL_MM_MTL_MGT_PVT.Mtl_Avl_Schld_Rec
129   --
130 PROCEDURE CHECK_AVAILABILITY(
131   P_API_VERSION               IN NUMBER,
132   P_INIT_MSG_LIST             IN VARCHAR2 := FND_API.G_FALSE,
133   P_COMMIT                    IN VARCHAR2 := FND_API.G_FALSE,
134   P_MODULE_TYPE               IN VARCHAR2 := NULL,
135   P_VALIDATION_LEVEL          IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
136   P_SCHEDULE_MATERIAL_ID_TBL  IN NUMBER_TABLE_TYPE,
137   X_MTL_AVL_SCHLD_TBL         OUT NOCOPY AHL_MM_MTL_MGT_PVT.MTL_AVL_SCHLD_TBL,
138   X_RETURN_STATUS             OUT NOCOPY VARCHAR2,
139   X_MSG_COUNT                 OUT NOCOPY NUMBER,
140   X_MSG_DATA                  OUT NOCOPY VARCHAR2)
141 IS
142   CURSOR CHECK_AVAILABILITY_CSR(P_SCHEDULE_MATERIAL_ID NUMBER)
143   IS
144     SELECT VISIT_ID,
145       INVENTORY_ITEM_ID,
146       REQUESTED_QUANTITY,
147       REQUESTED_DATE,
148       SCHEDULED_MATERIAL_ID,
149       NVL(COMPLETED_QUANTITY,0) COMPLETED_QUANTITY
150     FROM AHL_SCHEDULE_MATERIALS
151     WHERE SCHEDULED_MATERIAL_ID = P_SCHEDULE_MATERIAL_ID;
152 
153   CURSOR RESERVED_QTY_CSR(P_SCHEDULE_MATERIAL_ID NUMBER)
154   IS
155   SELECT DEMAND_SOURCE_LINE_DETAIL,
156     NVL(SUM(MRV.PRIMARY_RESERVATION_QUANTITY),0) RESERVED_QTY
157   FROM MTL_RESERVATIONS MRV
158   WHERE DEMAND_SOURCE_LINE_DETAIL = P_SCHEDULE_MATERIAL_ID
159     AND MRV. EXTERNAL_SOURCE_CODE   = 'AHL'
160   GROUP BY DEMAND_SOURCE_LINE_DETAIL;
161 
162   P_RESERVED_QUANTITY NUMBER;
163 
164   P_X_MATERIAL_AVL_TBL AHL_LTP_MATRL_AVAL_PUB.MATERIAL_AVAILABILITY_TBL;
165 
166   L_API_VERSION          CONSTANT NUMBER        := 1.0;
167   L_API_NAME             CONSTANT VARCHAR2(30)  := 'CHECK_AVAILABILITY';
168   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
169 
170 BEGIN
171 
172   SAVEPOINT MM_CHECK_AVAILABILITY_SP;
173   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
174     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure CHECK_AVAILABILITY');
175   END IF;
176 
177   -- Initialize API return status to success
178   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
179 
180   -- Standard call to check for call compatibility.
181   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
182     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
183   END IF;
184 
185   FOR I IN 1 .. P_SCHEDULE_MATERIAL_ID_TBL.COUNT
186   LOOP
187     P_RESERVED_QUANTITY := 0;
188     FOR RESERVED_QTY_RTV IN RESERVED_QTY_CSR(P_SCHEDULE_MATERIAL_ID_TBL(I))
189     LOOP
190       P_RESERVED_QUANTITY := RESERVED_QTY_RTV.RESERVED_QTY;
191     END LOOP;
192 
193     FOR CHECK_AVAILABILITY IN CHECK_AVAILABILITY_CSR(P_SCHEDULE_MATERIAL_ID_TBL(I))
194     LOOP
195       P_X_MATERIAL_AVL_TBL(I).VISIT_ID             := CHECK_AVAILABILITY.VISIT_ID;
196       P_X_MATERIAL_AVL_TBL(I).INVENTORY_ITEM_ID    := CHECK_AVAILABILITY.INVENTORY_ITEM_ID;
197       P_X_MATERIAL_AVL_TBL(I).QUANTITY             := CHECK_AVAILABILITY.REQUESTED_QUANTITY - (CHECK_AVAILABILITY.COMPLETED_QUANTITY + P_RESERVED_QUANTITY);
198       P_X_MATERIAL_AVL_TBL(I).REQ_ARRIVAL_DATE     := CHECK_AVAILABILITY.REQUESTED_DATE;
199       P_X_MATERIAL_AVL_TBL(I).SCHEDULE_MATERIAL_ID := CHECK_AVAILABILITY.SCHEDULED_MATERIAL_ID;
200     END LOOP;
201   END LOOP;
202 
203 
204   AHL_LTP_MATRL_AVAL_PVT.CHECK_MATERIAL_AVAL ( P_API_VERSION => P_API_VERSION ,P_INIT_MSG_LIST => P_INIT_MSG_LIST,P_COMMIT=>P_COMMIT,P_VALIDATION_LEVEL => P_VALIDATION_LEVEL,
205                 P_X_MATERIAL_AVL_TBL => P_X_MATERIAL_AVL_TBL, X_RETURN_STATUS => X_RETURN_STATUS, X_MSG_COUNT => X_MSG_COUNT, X_MSG_DATA => X_MSG_DATA);
206 
207   FOR I IN 1 .. P_X_MATERIAL_AVL_TBL.COUNT
208   LOOP
209     X_MTL_AVL_SCHLD_TBL(I).SCHEDULE_MATERIAL_ID := P_X_MATERIAL_AVL_TBL(I).SCHEDULE_MATERIAL_ID;
210     X_MTL_AVL_SCHLD_TBL(I).AVAILABLE_QUANTITY   := P_X_MATERIAL_AVL_TBL(I).QUANTITY_AVAILABLE;
211     X_MTL_AVL_SCHLD_TBL(I).AVL_SCH_DATE         := P_X_MATERIAL_AVL_TBL(I).SCHEDULED_DATE;
212     X_MTL_AVL_SCHLD_TBL(I).ERROR_CODE           := P_X_MATERIAL_AVL_TBL(I).ERROR_CODE;
213     IF(P_X_MATERIAL_AVL_TBL(I).QUANTITY = 0 ) THEN
214       FND_MESSAGE.SET_NAME('AHL','AHL_MM_CHK_SCH_QTY_ERR');
215       FND_MESSAGE.SET_TOKEN('ITEM_NAME',  P_X_MATERIAL_AVL_TBL(I).ITEM);
216       X_MTL_AVL_SCHLD_TBL(I).ERROR_MESSAGE := FND_MESSAGE.GET();
217     ELSIF(P_X_MATERIAL_AVL_TBL(I).ERROR_CODE <> 0) THEN
218       FND_MESSAGE.SET_NAME('AHL','AHL_MM_CHK_SCH_INFO');
219       FND_MESSAGE.SET_TOKEN('ITEM_NAME',  P_X_MATERIAL_AVL_TBL(I).ITEM);
220       FND_MESSAGE.SET_TOKEN('ATP_MSG', P_X_MATERIAL_AVL_TBL(I).ERROR_MESSAGE);
221       X_MTL_AVL_SCHLD_TBL(I).ERROR_MESSAGE := FND_MESSAGE.GET();
222     END IF;
223   END LOOP;
224 
225 EXCEPTION
226   WHEN FND_API.G_EXC_ERROR THEN
227     ROLLBACK TO MM_CHECK_AVAILABILITY_SP;
228     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
229     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
230       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
231 
232   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
233     ROLLBACK TO MM_CHECK_AVAILABILITY_SP;
234     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
235     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
236     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
237 
238   WHEN OTHERS THEN
239     ROLLBACK TO MM_CHECK_AVAILABILITY_SP;
240     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
241     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
242       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
243     END IF;
244     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
245     P_COUNT => X_MSG_COUNT,
246     P_DATA  => X_MSG_DATA);
247 
248 END CHECK_AVAILABILITY;
249 
250 
251 ---------------------------------------------------------------------------------------------------------
252 -- Declare Procedures --
253 ---------------------------------------------------------------------------------------------------------
254 -- Start of Comments --
255 --  Procedure name    : SCHEDULE_MATERIALS
256 --  Type        : Private
257 --  Function    : This procedure calls ATP to schedule the material requirement
258 --                for the cMRO Workoder/Operation demand.
259 --  Pre-reqs    :
260 --  Parameters  :
261 --
262 --  Standard OUT Parameters :
263 --      x_return_status         OUT             VARCHAR2                Required
264 --
265 --  Check_Material_Aval Parameters :
266 --      p_schedule_material_id_tbl  : Table containing Schedule material requirement id of the demand.
267 --      x_mtl_avl_schld_tbl         : Table containing output against schedule material req id
268 --
269 PROCEDURE SCHEDULE_MATERIALS(
270   P_API_VERSION               IN NUMBER,
271   P_INIT_MSG_LIST             IN VARCHAR2 := FND_API.G_FALSE,
272   P_COMMIT                    IN VARCHAR2 := FND_API.G_FALSE,
273   P_MODULE_TYPE               IN VARCHAR2 := NULL,
274   P_VALIDATION_LEVEL          IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
275   P_SCHEDULE_MATERIAL_ID_TBL  IN NUMBER_TABLE_TYPE,
276   X_MTL_AVL_SCHLD_TBL         OUT NOCOPY AHL_MM_MTL_MGT_PVT.MTL_AVL_SCHLD_TBL,
277   X_RETURN_STATUS             OUT NOCOPY VARCHAR2,
278   X_MSG_COUNT                 OUT NOCOPY NUMBER,
279   X_MSG_DATA                  OUT NOCOPY VARCHAR2 )
280 IS
281   CURSOR SCHEDULE_MATERIALS_CSR(P_SCHEDULE_MATERIAL_ID NUMBER)
282   IS
283     SELECT VISIT_ID,
284       VISIT_TASK_ID,
285       SCHEDULED_MATERIAL_ID,
286       REQUESTED_QUANTITY,
287       NVL(COMPLETED_QUANTITY,0) COMPLETED_QUANTITY
288     FROM AHL_SCHEDULE_MATERIALS
289     WHERE SCHEDULED_MATERIAL_ID = P_SCHEDULE_MATERIAL_ID;
290 
291   P_X_MATERIAL_AVL_TBL AHL_LTP_MATRL_AVAL_PUB.PLANNED_MATRL_TBL;
292 
293   CURSOR ERROR_MESSAGE_CUR(C_ERROR_CODE IN NUMBER)
294   IS
295    SELECT meaning
296      FROM mfg_lookups
297     WHERE LOOKUP_TYPE = 'MTL_DEMAND_INTERFACE_ERRORS'
298   AND LOOKUP_CODE = C_ERROR_CODE;
299 
300   CURSOR RESERVED_QTY_CSR(P_SCHEDULE_MATERIAL_ID NUMBER)
301   IS
302   SELECT DEMAND_SOURCE_LINE_DETAIL,
303     NVL(SUM(MRV.PRIMARY_RESERVATION_QUANTITY),0) RESERVED_QTY
304   FROM MTL_RESERVATIONS MRV
305   WHERE DEMAND_SOURCE_LINE_DETAIL = P_SCHEDULE_MATERIAL_ID
306     AND MRV. EXTERNAL_SOURCE_CODE   = 'AHL'
307   GROUP BY DEMAND_SOURCE_LINE_DETAIL;
308 
309   P_RESERVED_QUANTITY NUMBER;
310 
311 
312   ERROR_MESSAGE_REC  ERROR_MESSAGE_CUR%ROWTYPE;
313 
314   L_API_VERSION          CONSTANT NUMBER        := 1.0;
315   L_API_NAME             CONSTANT VARCHAR2(30)  := 'SCHEDULE_MATERIALS';
316   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
317 
318 BEGIN
319 
320   SAVEPOINT MM_SCHEDULE_MATERIALS_SP;
321   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
322     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure SCHEDULE_MATERIALS');
323   END IF;
324 
325   -- Initialize API return status to success
326   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
327 
328   -- Standard call to check for call compatibility.
329   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
330     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
331   END IF;
332 
333   FOR I IN 1 .. P_SCHEDULE_MATERIAL_ID_TBL.COUNT
334   LOOP
335     P_RESERVED_QUANTITY := 0;
336     FOR RESERVED_QTY_RTV IN RESERVED_QTY_CSR(P_SCHEDULE_MATERIAL_ID_TBL(I))
337     LOOP
338       P_RESERVED_QUANTITY := RESERVED_QTY_RTV.RESERVED_QTY;
339     END LOOP;
340 
341     FOR SCHEDULE_MATERIALS IN SCHEDULE_MATERIALS_CSR(P_SCHEDULE_MATERIAL_ID_TBL(I))
342     LOOP
343       P_X_MATERIAL_AVL_TBL(I).VISIT_ID             := SCHEDULE_MATERIALS.VISIT_ID;
344       P_X_MATERIAL_AVL_TBL(I).VISIT_TASK_ID        := SCHEDULE_MATERIALS.VISIT_TASK_ID;
345       P_X_MATERIAL_AVL_TBL(I).SCHEDULE_MATERIAL_ID := SCHEDULE_MATERIALS.SCHEDULED_MATERIAL_ID;
346       P_X_MATERIAL_AVL_TBL(I).REQUIRED_QUANTITY    := SCHEDULE_MATERIALS.REQUESTED_QUANTITY - (SCHEDULE_MATERIALS.COMPLETED_QUANTITY + P_RESERVED_QUANTITY);
347     END LOOP;
348   END LOOP;
349   AHL_LTP_MATRL_AVAL_PVT.SCHEDULE_PLANNED_MATRLS( P_API_VERSION => P_API_VERSION , P_X_PLANNED_MATRL_TBL => P_X_MATERIAL_AVL_TBL, X_RETURN_STATUS => X_RETURN_STATUS, X_MSG_COUNT => X_MSG_COUNT, X_MSG_DATA => X_MSG_DATA);
350 
351   FOR I IN 1 .. P_X_MATERIAL_AVL_TBL.COUNT
352   LOOP
353     X_MTL_AVL_SCHLD_TBL(I).SCHEDULE_MATERIAL_ID := P_X_MATERIAL_AVL_TBL(I).SCHEDULE_MATERIAL_ID;
354     X_MTL_AVL_SCHLD_TBL(I).AVAILABLE_QUANTITY   := P_X_MATERIAL_AVL_TBL(I).QUANTITY_AVAILABLE;
355 
356     IF (SIGN(TRUNC(P_X_MATERIAL_AVL_TBL(I).SCHEDULED_DATE)- TRUNC(P_X_MATERIAL_AVL_TBL(I).REQUESTED_DATE)) = 1) THEN
357       X_MTL_AVL_SCHLD_TBL(I).AVL_SCH_DATE         := P_X_MATERIAL_AVL_TBL(I).SCHEDULED_DATE;
358     END IF;
359 
360     X_MTL_AVL_SCHLD_TBL(I).ERROR_CODE           := P_X_MATERIAL_AVL_TBL(I).ERROR_CODE;
361 
362     IF (P_X_MATERIAL_AVL_TBL(I).SCHEDULED_DATE IS NULL) THEN
363       FND_MESSAGE.SET_NAME('AHL','AHL_MM_CHK_SCH_QTY_ERR');
364       FND_MESSAGE.SET_TOKEN('ITEM_NAME',  P_X_MATERIAL_AVL_TBL(I).ITEM_DESCRIPTION);
365       X_MTL_AVL_SCHLD_TBL(I).ERROR_MESSAGE := FND_MESSAGE.GET();
366       X_MTL_AVL_SCHLD_TBL(I).ERROR_CODE           := -1;
367     ELSIF(P_X_MATERIAL_AVL_TBL(I).ERROR_CODE <> 0) THEN
368       OPEN ERROR_MESSAGE_CUR(P_X_MATERIAL_AVL_TBL(I).ERROR_CODE);
369         FETCH ERROR_MESSAGE_CUR INTO ERROR_MESSAGE_REC;
370       CLOSE ERROR_MESSAGE_CUR;
371       FND_MESSAGE.SET_NAME('AHL','AHL_MM_CHK_SCH_INFO');
372       FND_MESSAGE.SET_TOKEN('ITEM_NAME',  P_X_MATERIAL_AVL_TBL(I).ITEM_DESCRIPTION);
373       FND_MESSAGE.SET_TOKEN('ATP_MSG', ERROR_MESSAGE_REC.MEANING);
374       X_MTL_AVL_SCHLD_TBL(I).ERROR_MESSAGE := FND_MESSAGE.GET();
375       ERROR_MESSAGE_REC.MEANING := NULL;
376     END IF;
377 
378   END LOOP;
379 
380 EXCEPTION
381   WHEN FND_API.G_EXC_ERROR THEN
382     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
383     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
384     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
385       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
386 
387   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
388     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
389     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
390     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
391     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
392 
393   WHEN OTHERS THEN
394     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
395     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
396     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
397       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
398     END IF;
399     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
400     P_COUNT => X_MSG_COUNT,
401     P_DATA  => X_MSG_DATA);
402 END SCHEDULE_MATERIALS;
403 ---------------------------------------------------------------------------------------------------------
404 -- Declare Procedures --
405 ---------------------------------------------------------------------------------------------------------
406 -- Start of Comments --
407 --  Procedure name    : Schedule_Visit_Materials
408 --  Type        : Public
409 --  Function    : This procedure calls ATP to schedule all material requirements in a visit.
410 --
411 --  Pre-reqs    :
412 --  Parameters  :
413 --
414 --  Standard IN  Parameters :
415 --      p_api_version                   IN      NUMBER                Required
416 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
417 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
418 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
419 --         Based on this flag, the API will set the default attributes.
420 --      p_module_type                   In      VARCHAR2     Default  NULL
421 --         This will be null.
422 --  Standard OUT Parameters :
423 --      x_return_status                 OUT     VARCHAR2               Required
424 --      x_msg_count                     OUT     NUMBER                 Required
425 --      x_msg_data                      OUT     VARCHAR2               Required
426 --
427 --  Schedule_Visit_Materials Parameters :
428 --         p_visit_id                    IN      : Number,Required : Visit ID
429 --         x_mtl_avl_schld_tbl           OUT     : Table containing output against schedule material req id
430 --
431 PROCEDURE SCHEDULE_VISIT_MATERIALS(
432   P_API_VERSION      IN NUMBER,
433   P_INIT_MSG_LIST    IN VARCHAR2 := FND_API.G_FALSE,
434   P_COMMIT           IN VARCHAR2 := FND_API.G_FALSE,
435   P_MODULE_TYPE      IN VARCHAR2 := NULL,
436   P_VALIDATION_LEVEL IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
437   P_VISIT_ID         IN NUMBER,
438   X_MTL_AVL_SCHLD_TBL OUT NOCOPY AHL_MM_MTL_MGT_PVT.MTL_AVL_SCHLD_TBL,
439   X_RETURN_STATUS OUT NOCOPY VARCHAR2,
440   X_MSG_COUNT OUT NOCOPY     NUMBER,
441   X_MSG_DATA OUT NOCOPY      VARCHAR2 )
442 IS
443   L_API_VERSION          CONSTANT NUMBER        := 1.0;
444   L_API_NAME             CONSTANT VARCHAR2(30)  := 'SCHEDULE_VISIT_MATERIALS';
445   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
446 
447   CURSOR SCHEDULE_MATERIAL_ID_CSR(L_VISIT_ID NUMBER)
448   IS
449     SELECT SCHEDULED_MATERIAL_ID
450     FROM AHL_SCHEDULE_MATERIALS
451     WHERE VISIT_ID = L_VISIT_ID;
452 
453   P_SCHEDULE_MATERIAL_ID_TBL  NUMBER_TABLE_TYPE;
454   L_LOOP_COUNTER NUMBER;
455 
456 BEGIN
457   SAVEPOINT MM_SCHEDULE_VISIT_MATERIALS;
458   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
459     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure SCHEDULE_MATERIALS');
460   END IF;
461 
462   -- Initialize API return status to success
463   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
464 
465   -- Standard call to check for call compatibility.
466   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
467     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
468   END IF;
469 
470   L_LOOP_COUNTER := 1;
471   FOR SCHEDULE_MATERIAL_ID IN SCHEDULE_MATERIAL_ID_CSR(P_VISIT_ID)
472   LOOP
473     P_SCHEDULE_MATERIAL_ID_TBL(L_LOOP_COUNTER) := SCHEDULE_MATERIAL_ID.SCHEDULED_MATERIAL_ID;
474     L_LOOP_COUNTER := L_LOOP_COUNTER + 1;
475   END LOOP;
476 
477   SCHEDULE_MATERIALS(
478   P_API_VERSION               => P_API_VERSION,
479   P_INIT_MSG_LIST             =>  P_INIT_MSG_LIST,
480   P_COMMIT                    => P_COMMIT,
481   P_MODULE_TYPE               => P_MODULE_TYPE,
482   P_VALIDATION_LEVEL          => P_VALIDATION_LEVEL,
483   P_SCHEDULE_MATERIAL_ID_TBL  => P_SCHEDULE_MATERIAL_ID_TBL,
484   X_MTL_AVL_SCHLD_TBL         => X_MTL_AVL_SCHLD_TBL,
485   X_RETURN_STATUS             => X_RETURN_STATUS,
486   X_MSG_COUNT                 => X_MSG_COUNT,
487   X_MSG_DATA                  => X_MSG_DATA);
488 
489 EXCEPTION
490   WHEN FND_API.G_EXC_ERROR THEN
491     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
492     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
493     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
494       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
495 
496   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
497     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
498     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
499     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
500     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
501 
502   WHEN OTHERS THEN
503     ROLLBACK TO MM_SCHEDULE_MATERIALS_SP;
504     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
505     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
506       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
507     END IF;
508     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
509     P_COUNT => X_MSG_COUNT,
510     P_DATA  => X_MSG_DATA);
511 END Schedule_Visit_Materials;
512 
513 ---------------------------------------------------------------------------------------------------------
514 -- ARUNJK:: Adding the following function for Available Quantity
515 ---------------------------------------------------------------------------------------------------------
516 --  Function name : Get_Available_Quantity
517 --  Type           : Public
518 --  Usage          : This function accepts the Inventory Item Id and work order id and
519 --                      returns the Availabile quantity of the given Item
520 --
521 --  Parameters :
522 --         P_INVENTORY_ITEM_ID  IN  NUMBER
523 --         P_WORKORDER_ID      IN NUMBER
524 --
525 --  Return:
526 --         l_available_Quantity             NUMBER
527 --
528 FUNCTION GET_AVAILABLE_QUANTITY(
529     P_INVENTORY_ITEM_ID IN NUMBER,
530     P_WORKORDER_ID      IN NUMBER )
531   RETURN NUMBER
532 IS
533   L_AVAILABLE_QUANTITY NUMBER := 0;
534 BEGIN
535   RETURN L_AVAILABLE_QUANTITY;
536 END GET_AVAILABLE_QUANTITY;
537 
538 ---------------------------------------------------------------------------------------------------------
539 -- AJPRASAN:: Adding the following function for Available Date calculation of a demand
540 ---------------------------------------------------------------------------------------------------------
541 --  Procedure name : Get_Available_Date
542 --  Type           : Public
543 --  Usage          : This function goes through all reservations for a particular demand
544 --                   and if the reservations can satisfy the total quantity of the demand,
545 --                   this returns the latest available date among all reserved quantities.
546 --                   Else it returns NULL.
547 --
548 --  Parameters :
549 --         p_scheduled_material_id  IN  NUMBER
550 --
551 --  Return:
552 --         l_available_date             DATE
553 --
554 FUNCTION Get_Available_Date (
555    p_scheduled_material_id    IN  NUMBER
556 )
557 RETURN DATE
558 IS
559 
560 --Local variables
561    l_api_name         CONSTANT VARCHAR2(30) := 'Get_Available_Date';
562    l_full_name        CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
563    l_debug            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
564    l_available_date   DATE;
565    l_reserved_qty     NUMBER;
566    l_req_qty          NUMBER;
567 
568 BEGIN
569 
570     IF (l_log_procedure >= l_log_current_level) THEN
571         FND_LOG.string(FND_LOG.level_procedure, L_DEBUG || '.begin','At the start of PLSQL procedure');
572     END IF;
573 
574     -- Query to fetch the requested quantity for the demand
575     SELECT requested_quantity
576       INTO l_req_qty
577       FROM ahl_schedule_materials ASM
578      WHERE ASM.scheduled_material_id = p_scheduled_material_id;
579 
580     -- Query to fetch total reserved quantity and max available date
581     SELECT MAX(ALL_RESERVATIONS.AVAILABLE_DATE) MAX_AVAILABLE_DATE,
582            SUM(ALL_RESERVATIONS.RESERVED_QTY) TOTAL_RESERVED_QTY
583       INTO l_available_date,
584            l_reserved_qty
585     FROM
586     (
587          --Inventory Reservation
588          SELECT sysdate AVAILABLE_DATE,
589                 RESERVATION.reservation_quantity RESERVED_QTY
590            FROM mtl_reservations RESERVATION
591           WHERE RESERVATION.supply_source_type_id = 13 /*g_source_type_inv = 13*/
592             AND RESERVATION.demand_source_line_detail = p_scheduled_material_id
593 
594        UNION ALL
595 
596          --ISO
597          SELECT ORDER_LINE.schedule_arrival_date AVAILABLE_DATE,
598                 RESERVATION.reservation_quantity RESERVED_QTY
599            FROM po_requisition_headers_all POREQ_HEAD,
600                 po_requisition_lines_all POREQ_LINE,
601                 oe_order_headers_all ORDER_HEAD,
602                 oe_order_lines_all ORDER_LINE,
603                 mtl_reservations RESERVATION
604           WHERE POREQ_HEAD.requisition_header_id = ORDER_HEAD.source_document_id
605             AND ORDER_HEAD.header_id = ORDER_LINE.header_id
606             AND POREQ_HEAD.requisition_header_id = POREQ_LINE.requisition_header_id
607             AND POREQ_LINE.item_id = RESERVATION.inventory_item_id
608             AND RESERVATION.supply_source_type_id = 7 /*g_source_type_internal_req = 7*/
609             AND RESERVATION.demand_source_line_detail = p_scheduled_material_id
610 
611        UNION ALL
612 
613          --WO to WO
614          SELECT WIP.scheduled_completion_date AVAILABLE_DATE,
615                 RESERVATION.reservation_quantity RESERVED_QTY
616            FROM mtl_reservations RESERVATION,
617                 wip_discrete_jobs WIP
618           WHERE WIP.wip_entity_id = RESERVATION.supply_source_header_id
619             AND RESERVATION.supply_source_type_id = 5 /*g_source_type_wip = 5*/
620             AND RESERVATION.demand_source_line_detail = p_scheduled_material_id
621     ) ALL_RESERVATIONS;
622 
623     --Return NULL if the total requested quantity is not reserved
624     IF(l_req_qty <> l_reserved_qty) THEN
625         l_available_date := NULL;
626     END IF;
627 
628     IF (l_log_procedure >= l_log_current_level) THEN
629         fnd_log.string(l_log_procedure, L_DEBUG || '.end', 'At the end of PL SQL procedure');
630     END IF;
631 
632     RETURN l_available_date;
633 
634 END Get_Available_Date;
635 
636 ---------------------------------------------------------------------------------------------------------
637 -- AJPRASAN:: Adding the following function for creating Move Orders
638 ---------------------------------------------------------------------------------------------------------
639 --  Procedure name : CREATE_MOVE_ORDER
640 --  Type           : Public
641 --  Usage          : This function create a move order for the serial numbers passed in p_supply_tbl_type.
642 --                   It creates and allocates the proper serial numbers and returns all the MO headers.
643 --                   Later the user can go to the forms UI and perform the transaction.
644 --
645 --  IN Parameters :
646 --       p_scheduled_material_id NUMBER, Required
647 --       p_supply_tbl_type       Serial_Tbl_Type, Required: The table containing the list of
648 --                                                          supply serials and their location
649 --
650 --  OUT Parameters :
651 --       x_mo_hdr_id             number, containing MO header ID with which the user can transact later
652 --       x_mo_lines_tbl          number_table_type, Containing the list of all line IDs for MOs
653 --
654 PROCEDURE CREATE_MOVE_ORDER(
655    p_api_version           IN  NUMBER,
656    p_init_msg_list         IN  VARCHAR2  := FND_API.G_FALSE,
657    p_commit                IN  VARCHAR2  := FND_API.G_FALSE,
658    p_validation_level      IN  NUMBER    := FND_API.G_VALID_LEVEL_FULL,
659 
660    p_scheduled_material_id IN  NUMBER,
661    p_supply_tbl_type       IN  Supply_Tbl_Type,
662    x_mo_hdr_id             OUT NOCOPY NUMBER,
663    x_mo_lines_tbl          OUT NOCOPY number_table_type,
664 
665    x_return_status         OUT NOCOPY VARCHAR2,
666    x_msg_count             OUT NOCOPY NUMBER,
667    x_msg_data              OUT NOCOPY VARCHAR2
668 )
669 
670 
671 IS
672 
673    L_API_VERSION          CONSTANT NUMBER        := 1.0;
674    L_API_NAME             CONSTANT VARCHAR2(30)  := 'CREATE_MOVE_ORDER';
675    L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
676 
677    l_rsr_type             INV_RESERVATION_GLOBAL.mtl_reservation_tbl_type;
678    l_from_hdr_rec         INV_MOVE_ORDER_PUB.trohdr_rec_type;
679    l_from_line_tbl        INV_MOVE_ORDER_PUB.trolin_tbl_type;
680    l_to_hdr_rec           INV_MOVE_ORDER_PUB.trohdr_rec_type;
681    l_to_line_tbl          INV_MOVE_ORDER_PUB.trolin_tbl_type;
682    x_hdr_val_rec          INV_MOVE_ORDER_PUB.trohdr_val_rec_type;
683    x_line_val_tbl         INV_MOVE_ORDER_PUB.trolin_val_tbl_type;
684    l_trolin_tbl           INV_MOVE_ORDER_PUB.trolin_tbl_type;
685    l_trolin_rec           INV_MOVE_ORDER_PUB.trolin_rec_type;
686    l_mo_line_dtl_tbl      INV_MO_LINE_DETAIL_UTIL.g_mmtt_tbl_type;
687 
688    l_inv_item_id          NUMBER;
689    l_org_id               NUMBER;
690    l_dmd_subinv_code      VARCHAR2(10);
691    l_dmd_loc_id           NUMBER;
692    l_dmd_req_date         DATE;
693    l_aog                  VARCHAR2(1);
694 
695    l_qty_detailed         NUMBER;
696    l_return_status        VARCHAR2(1);
697    l_uom                  VARCHAR2(3);
698    l_old_rsrv_id          NUMBER;
699    l_reservation_id_tbl   AHL_MM_RESERVATIONS_PVT.number_table_type;
700    l_serial_number_tbl    AHL_MM_RESERVATIONS_PVT.serial_number_tbl_type;
701 
702    l_temp_txn_id          NUMBER;
703    l_fm_serial            VARCHAR2(30);
704    l_to_serial            VARCHAR2(30);
705    l_mark_serial_success  NUMBER;
706 
707 BEGIN
708 
709    -- Standard start of API savepoint
710    SAVEPOINT CREATE_MOVE_ORDER_SP;
711    IF (l_log_procedure >= l_log_current_level) THEN
712        FND_LOG.string(l_log_procedure, L_DEBUG || '.begin',
713                       'At the start of the PLSQL procedure CREATE_MOVE_ORDER');
714    END IF;
715 
716    -- Initialize API return status to success
717    x_return_status := FND_API.G_RET_STS_SUCCESS;
718 
719    -- Standard call to check for call compatibility.
720    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
721        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
722    END IF;
723 
724    --Get the primary demand details from ASM ID
725    SELECT ASM.inventory_item_id,
726           ASM.organization_id,
727           ASM.requested_date,
728 	  ASM.aog_flag,
729           LOC.subinventory_code,
730           LOC.inventory_location_id,
731           ITEMS.primary_uom_code
732      INTO l_inv_item_id,
733           l_org_id,
734           l_dmd_req_date,
735 	        l_aog,
736           l_dmd_subinv_code,
737           l_dmd_loc_id,
738           l_uom
739      FROM mtl_system_items_b ITEMS,
740           ahl_schedule_materials ASM,
741           ahl_visits_b VST,
742           mtl_item_locations LOC
743     WHERE ITEMS.inventory_item_id = ASM.inventory_item_id
744       AND ITEMS.organization_id = ASM.organization_id
745       AND ASM.visit_id = VST.visit_id
746       AND VST.inv_locator_id = LOC.inventory_location_id (+)
747       AND ASM.scheduled_material_id = p_scheduled_material_id;
748 
749    --Throw error when the demand is not AOG
750    IF(l_aog <> 'Y') THEN
751        IF (l_log_statement >= l_log_current_level) THEN
752           FND_LOG.string(l_log_statement, L_DEBUG,
753                          'The demand is not AOG');
754        END IF;
755 
756        FND_MESSAGE.set_name('AHL','AHL_MM_NO_MO_AOG');
757        FND_MSG_PUB.add;
758        RAISE FND_API.G_EXC_ERROR;
759    END IF;
760 
761    --Throw error when demand location is not defined
762    IF(l_dmd_loc_id IS NULL) THEN
763        IF (l_log_statement >= l_log_current_level) THEN
764           FND_LOG.string(l_log_statement, L_DEBUG,
765                          'Visit Locator is not defined to create move order');
766        END IF;
767 
768        FND_MESSAGE.set_name('AHL','AHL_MM_NO_LOCATOR');
769        FND_MSG_PUB.add;
770        RAISE FND_API.G_EXC_ERROR;
771    END IF;
772 
773    --Throw error if supply and demand locators are same
774    FOR i in p_supply_tbl_type.FIRST .. p_supply_tbl_type.LAST
775    LOOP
776        IF (p_supply_tbl_type(i).Supply_Locator_Id = l_dmd_loc_id) THEN
777            FND_MESSAGE.set_name('AHL','AHL_MM_SAME_LOCATOR');
778            FND_MSG_PUB.add;
779            RAISE FND_API.G_EXC_ERROR;
780        END IF;
781    END LOOP;
782 
783    --Start populating header record
784    l_from_hdr_rec.date_required       := l_dmd_req_date;
785    l_from_hdr_rec.header_status       := INV_GLOBALS.G_TO_STATUS_PREAPPROVED;
786    l_from_hdr_rec.organization_id     := l_org_id;
787    l_from_hdr_rec.status_date         := SYSDATE; --Last date status was changed
788    l_from_hdr_rec.transaction_type_id := INV_GLOBALS.G_TYPE_TRANSFER_ORDER_SUBXFR;
789 
790    /*
791    -- Move order types
792    G_MOVE_ORDER_REQUISITION      CONSTANT NUMBER           := 1;
793    G_MOVE_ORDER_REPLENISHMENT    CONSTANT NUMBER           := 2;
794    G_MOVE_ORDER_PICK_WAVE        CONSTANT NUMBER           := 3;
795    G_MOVE_ORDER_RECEIPT          CONSTANT NUMBER           := 4;
796    G_MOVE_ORDER_MFG_PICK         CONSTANT NUMBER           := 5;
797    G_MOVE_ORDER_WIP_ISSUE        CONSTANT NUMBER           := 5;
798    G_MOVE_ORDER_PUT_AWAY         CONSTANT NUMBER           := 6;
799    G_MOVE_ORDER_BACKFLUSH        CONSTANT NUMBER           := 7;
800    G_MOVE_ORDER_SYSTEM           CONSTANT NUMBER           := 8;
801    */
802    l_from_hdr_rec.move_order_type        := INV_GLOBALS.G_MOVE_ORDER_REQUISITION;
803    l_from_hdr_rec.db_flag                := FND_API.G_TRUE;
804    l_from_hdr_rec.operation              := INV_GLOBALS.G_OPR_CREATE;
805    l_from_hdr_rec.description            := 'Move Order for Demand ID: ' || p_scheduled_material_id;
806 
807    --Loop begins
808    FOR i in p_supply_tbl_type.FIRST .. p_supply_tbl_type.LAST
809 
810    LOOP
811 
812        --Get the reservation ID for the serial to be moved, if any
813        SELECT reservation_id
814          INTO l_old_rsrv_id
815          FROM MTL_SERIAL_NUMBERS
816         WHERE inventory_item_id = l_inv_item_id
817           AND serial_number = p_supply_tbl_type(i).Serial_Number;
818 
819        --Delete the reservation if it is there already, as Move Order is of high priority
820        IF(l_old_rsrv_id IS NOT NULL) THEN
821            l_reservation_id_tbl(1) := l_old_rsrv_id;
822            l_serial_number_tbl(1).inventory_item_id := l_inv_item_id;
823            l_serial_number_tbl(1).serial_number := p_supply_tbl_type(i).Serial_Number;
824 
825            AHL_MM_RESERVATIONS_PVT.CANCEL_RESERVATION(p_api_version          => 1.0
826                                                       , p_init_msg_list      => FND_API.G_FALSE
827                                                       , p_commit             => FND_API.G_FALSE
828                                                       , p_validation_level   => FND_API.G_VALID_LEVEL_FULL
829                                                       , p_module_type        => 'INTERNAL'
830                                                       , x_return_status      => x_return_status
831                                                       , x_msg_count          => x_msg_count
832                                                       , x_msg_data           => x_msg_data
833                                                       , p_serial_number_tbl  => l_serial_number_tbl
834                                                       , p_reservation_id_tbl => l_reservation_id_tbl
835                                                       );
836 
837            --Write in Log and exit loop when deleting reservation fails
838            IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)
839            THEN
840                IF (l_log_statement >= l_log_current_level) THEN
841                   FND_LOG.string(l_log_statement, L_DEBUG,
842                                  'After CANCEL_RESERVATION, Return Status is :' || x_return_status);
843                END IF;
844                RAISE FND_API.G_EXC_ERROR;
845            END IF;
846 
847        END IF; --IF l_old_rsrv_id IS NOT NULL
848 
849        --Start populating lines
850        l_from_line_tbl(i).organization_id           := l_org_id;
851        l_from_line_tbl(i).inventory_item_id         := l_inv_item_id;
852        l_from_line_tbl(i).date_required             := l_dmd_req_date;
853        l_from_line_tbl(i).line_id                   := FND_API.G_MISS_NUM;
854        l_from_line_tbl(i).line_number               := i+1;
855 
856        l_from_line_tbl(i).txn_source_line_detail_id := p_scheduled_material_id;
857        l_from_line_tbl(i).line_status               := INV_GLOBALS.G_TO_STATUS_PREAPPROVED;
858        l_from_line_tbl(i).transaction_type_id       := INV_GLOBALS.G_TYPE_TRANSFER_ORDER_SUBXFR;
859        l_from_line_tbl(i).quantity                  := 1;
860        l_from_line_tbl(i).status_date               := SYSDATE; --Last date status was changed
861        l_from_line_tbl(i).uom_code                  := l_uom;
862 
863        l_from_line_tbl(i).db_flag                := FND_API.g_true;
864        l_from_line_tbl(i).operation              := INV_GLOBALS.g_opr_create;
865        l_from_line_tbl(i).from_subinventory_code := p_supply_tbl_type(i).Supply_Subinv_Code;
866        l_from_line_tbl(i).from_locator_id        := p_supply_tbl_type(i).Supply_Locator_Id;
867        l_from_line_tbl(i).to_subinventory_code   := l_dmd_subinv_code;
868        l_from_line_tbl(i).to_locator_id          := l_dmd_loc_id;
869        l_from_line_tbl(i).serial_number_start    := p_supply_tbl_type(i).Serial_Number;
870        l_from_line_tbl(i).serial_number_end      := p_supply_tbl_type(i).Serial_Number;
871    END LOOP;
872 
873    IF (l_log_statement >= l_log_current_level) THEN
874       FND_LOG.string(l_log_statement,
875                      L_DEBUG,
876                      'Calling INV_MOVE_ORDER_PUB.PROCESS_MOVE_ORDER');
877    END IF;
878 
879    --Used to process move orders (both headers and lines) i.e., to create or update move orders.
880    INV_MOVE_ORDER_PUB.PROCESS_MOVE_ORDER (p_api_version_number => 1.0
881                                           , p_init_msg_list    => FND_API.G_FALSE
882                                           , p_commit           => FND_API.G_FALSE
883                                           , x_return_status    => x_return_status
884                                           , x_msg_count        => x_msg_count
885                                           , x_msg_data         => x_msg_data
886                                           , p_trohdr_rec       => l_from_hdr_rec
887                                           , p_trolin_tbl       => l_from_line_tbl
888                                           , x_trohdr_rec       => l_to_hdr_rec
889                                           , x_trohdr_val_rec   => x_hdr_val_rec
890                                           , x_trolin_tbl       => l_to_line_tbl
891                                           , x_trolin_val_tbl   => x_line_val_tbl
892                                          );
893 
894    --Write in Log and exit loop when creating MO fails
895    IF(x_return_status <> FND_API.G_RET_STS_SUCCESS
896       OR l_to_hdr_rec.header_id IS NULL
897       OR l_to_line_tbl.COUNT <= 0)
898    THEN
899        IF (l_log_statement >= l_log_current_level) THEN
900           FND_LOG.string(l_log_statement, L_DEBUG,
901                          'After PROCESS_MOVE_ORDER, Return Status is :' || x_return_status);
902        END IF;
903        RAISE FND_API.G_EXC_ERROR;
904    END IF;
905 
906    FOR i in p_supply_tbl_type.FIRST .. p_supply_tbl_type.LAST
907    LOOP
908 
909        IF (l_log_statement >= l_log_current_level) THEN
910           FND_LOG.string(l_log_statement, L_DEBUG,
911                          'Calling INV_PPENGINE_PVT.CREATE_SUGGESTIONS');
912        END IF;
913 
914        -- Creates pick suggestions and also suggests serial numbers
915        -- The program will use WMS pick/put rules/strategies, if Oracle WMS is installed
916        -- otherwise, rules in mtl_picking_rules will be used.
917        INV_PPENGINE_PVT.CREATE_SUGGESTIONS (p_api_version           => 1.0
918                                             , p_init_msg_list       => FND_API.G_FALSE
919                                             , p_commit              => FND_API.G_FALSE
920                                             , p_validation_level    => FND_API.G_VALID_LEVEL_FULL
921                                             , x_return_status       => x_return_status
922                                             , x_msg_count           => x_msg_count
923                                             , x_msg_data            => x_msg_data
924                                             , p_transaction_temp_id => l_to_line_tbl(i).line_id
925                                             , p_reservations        => l_rsr_type
926                                             , p_suggest_serial      => FND_API.G_TRUE
927                                             , p_plan_tasks          => FALSE
928                                             , p_quick_pick_flag     => 'N'
929                                             , p_organization_id     => l_org_id
930                                            );
931 
932        --Write in Log and exit loop when create suggestion fails
933        IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)
934        THEN
935            IF (l_log_statement >= l_log_current_level) THEN
936               FND_LOG.string(l_log_statement, L_DEBUG,
937                              'After CREATE_SUGGESTIONS, Return Status is :' || x_return_status);
938            END IF;
939            RAISE FND_API.G_EXC_ERROR;
940        END IF;
941 
942        --Update MTL_TXN_REQUEST_LINES and MTL_MATERIAL_TRANSACTIONS_TEMP tables - START
943        l_trolin_tbl := l_to_line_tbl;
944 
945        IF (l_trolin_tbl(i).return_status <> fnd_api.g_ret_sts_unexp_error
946            AND l_trolin_tbl(i).return_status <> fnd_api.g_ret_sts_error) THEN
947 
948            --Data from MTL_TXN_REQUEST_LINES table
949            l_trolin_rec := inv_trolin_util.query_row (l_trolin_tbl(i).line_id);
950            l_trolin_tbl(i) := l_trolin_rec;
951 
952            --Quantity which has detailed sourcing location
953            l_qty_detailed := l_trolin_tbl(i).quantity_detailed;
954 
955            IF NVL (l_qty_detailed, 0) = 0
956            THEN
957 
958                --Data from MTL_MATERIAL_TRANSACTIONS_TEMP table
959                l_mo_line_dtl_tbl := inv_mo_line_detail_util.query_rows (p_line_id => l_trolin_tbl(i).line_id);
960 
961                /*
962                Indicates if it has to be processed or just saved.
963                NULL or 1: default
964                        2: save only
965                        3: ready to process
966                */
967                l_mo_line_dtl_tbl(i).transaction_status := 2;
968 
969                /*
970                NULL or 1: Online Processing - immediately process records
971                        2: Concurrent Processing - processed by a dedicated txn worker
972                        3: Background Processing - picked up by the txn manager polling process
973                */
974                l_mo_line_dtl_tbl(i).transaction_mode := 1;
975 
976                l_mo_line_dtl_tbl(i).source_line_id := l_trolin_tbl(i).line_id;
977 
978                inv_mo_line_detail_util.update_row (l_return_status, l_mo_line_dtl_tbl(i));
979 
980                SELECT transaction_header_id, transaction_quantity
981                  INTO l_trolin_tbl(i).transaction_header_id, l_trolin_tbl(i).quantity_detailed
982                  FROM MTL_MATERIAL_TRANSACTIONS_TEMP
983                 WHERE move_order_line_id = l_trolin_tbl(i).line_id;
984 
985                l_trolin_tbl(i).last_update_date := SYSDATE;
986                l_trolin_tbl(i).last_update_login := fnd_global.login_id;
987 
988                l_trolin_tbl(i).last_updated_by := fnd_global.user_id;
989                l_trolin_tbl(i).program_id := fnd_global.conc_program_id;
990                l_trolin_tbl(i).program_update_date := SYSDATE;
991                l_trolin_tbl(i).request_id := fnd_global.conc_request_id;
992                l_trolin_tbl(i).program_application_id := fnd_global.prog_appl_id;
993                inv_trolin_util.update_row (l_trolin_tbl (i));
994 
995            END IF; --IF NVL (l_qty_detailed, 0) = 0
996 
997        END IF; --IF (l_trolin_tbl(i).return_status <> fnd_api.g_ret_sts_unexp_error)
998        --Update MTL_TXN_REQUEST_LINES and MTL_MATERIAL_TRANSACTIONS_TEMP tables - END
999 
1000        --Update mtl_serial_numbers_temp with the required Serial Instead of auto assigend serial - START
1001        SELECT MSNT.transaction_temp_id, MSNT.fm_serial_number, MSNT.to_serial_number
1002          INTO l_temp_txn_id, l_fm_serial, l_to_serial
1003          FROM mtl_material_transactions_temp MMTT, mtl_serial_numbers_temp MSNT
1004         WHERE MMTT.transaction_temp_id = MSNT.transaction_temp_id
1005           AND MMTT.move_order_line_id = l_to_line_tbl(i).line_id;
1006 
1007        IF (l_log_statement >= l_log_current_level) THEN
1008           FND_LOG.string(l_log_statement, L_DEBUG,
1009                          'l_temp_txn_id: ' || l_temp_txn_id
1010                          || ', l_fm_serial: ' || l_fm_serial
1011                          || ', l_to_serial: ' || l_to_serial);
1012 
1013           FND_LOG.string(l_log_statement, L_DEBUG,
1014                          'Calling inv_unmark_rsv_serial for serial: ' || l_fm_serial);
1015        END IF;
1016 
1017        SERIAL_CHECK.inv_unmark_rsv_serial (from_serial_number       => l_fm_serial
1018                                              , to_serial_number     => l_to_serial
1019                                              , serial_code          => 2 /*Not used inside unmark function*/
1020                                              , hdr_id               => l_temp_txn_id
1021                                              , temp_id              => l_temp_txn_id
1022                                              , lot_temp_id          => l_temp_txn_id
1023                                              , p_inventory_item_id  => l_inv_item_id
1024                                              , p_update_reservation => 'F'
1025                                              );
1026 
1027        IF (l_log_statement >= l_log_current_level) THEN
1028           FND_LOG.string(l_log_statement, L_DEBUG,
1029                          'Deleting mtl_serial_numbers_temp with temp_txn_id: ' || l_temp_txn_id);
1030        END IF;
1031 
1032        DELETE FROM mtl_serial_numbers_temp WHERE transaction_temp_id = l_temp_txn_id;
1033 
1034        IF (l_log_statement >= l_log_current_level) THEN
1035           FND_LOG.string(l_log_statement, L_DEBUG,
1036                          'Rows deleted from mtl_serial_numbers_temp: ' || SQL%ROWCOUNT);
1037        END IF;
1038 
1039        IF (l_log_statement >= l_log_current_level) THEN
1040            FND_LOG.string(l_log_statement, L_DEBUG,
1041                           'Calling inv_mark_rsv_serial for Serial: ' || p_supply_tbl_type(i).Serial_Number);
1042        END IF;
1043 
1044        SERIAL_CHECK.inv_mark_rsv_serial (from_serial_number     => p_supply_tbl_type(i).Serial_Number
1045                                            , to_serial_number     => p_supply_tbl_type(i).Serial_Number
1046                                            , item_id              => l_inv_item_id
1047                                            , org_id               => l_org_id
1048                                            , hdr_id               => l_temp_txn_id
1049                                            , temp_id              => l_temp_txn_id
1050                                            , lot_temp_id          => l_temp_txn_id
1051                                            , p_reservation_id     => NULL
1052                                            , p_update_reservation => 'F'
1053                                            , success              => l_mark_serial_success
1054                                            );
1055 
1056        --Insert a condition
1057        --only if l_mark_serial_success is success status
1058        --Got 3 for proper condition
1059        --Got -1 for improper condition like - Serial number not present in subinventory and Serial number invalid
1060        --Need to check the meaning of the different values
1061        IF(l_mark_serial_success = 3) THEN
1062 
1063            IF (l_log_statement >= l_log_current_level) THEN
1064                FND_LOG.string(l_log_statement, L_DEBUG,
1065                               'Inserting into mtl_serial_numbers_temp for Serial: '
1066                               || p_supply_tbl_type(i).Serial_Number);
1067            END IF;
1068 
1069            INSERT INTO mtl_serial_numbers_temp(transaction_temp_id
1070                                                  , last_update_date
1071                                                  , last_updated_by
1072                                                  , creation_date
1073                                                  , created_by
1074                                                  , last_update_login
1075                                                  , fm_serial_number
1076                                                  , to_serial_number
1077                                                  , group_header_id
1078                                                  , serial_prefix /*Number of serial numbers in range*/ )
1079                                         VALUES(l_temp_txn_id
1080                                                  , sysdate
1081                                                  , fnd_global.user_id
1082                                                  , sysdate
1083                                                  , fnd_global.user_id
1084                                                  , fnd_global.login_id
1085                                                  , p_supply_tbl_type(i).Serial_Number
1086                                                  , p_supply_tbl_type(i).Serial_Number
1087                                                  , l_temp_txn_id
1088                                                  , '1' );
1089 
1090        ELSE
1091            IF (l_log_statement >= l_log_current_level) THEN
1092               FND_LOG.string(l_log_statement, L_DEBUG,
1093                              'Marking required serial number failed for Serial: '
1094                              || p_supply_tbl_type(i).Serial_Number
1095                              || ' with return status: ' || l_mark_serial_success);
1096            END IF;
1097            RAISE FND_API.G_EXC_ERROR;
1098        END IF;
1099        --Update mtl_serial_numbers_temp with the required Serial Instead of auto assigend serial - END
1100 
1101        --Get the new MO Header ID for this serial
1102        x_mo_lines_tbl(i) := l_trolin_tbl(i).line_id;
1103 
1104     END LOOP; -- Loop ends
1105 
1106     --Remove all header values back on error
1107     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1108        x_mo_lines_tbl.DELETE;
1109     --Populate MO Header ID
1110     ELSE
1111        x_mo_hdr_id := l_to_hdr_rec.header_id;
1112     END IF;
1113 
1114     --Standard check for commit
1115     IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1116        COMMIT;
1117     END IF;
1118 
1119     -- Count and Get messages
1120     FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
1121                                   p_count => x_msg_count,
1122                                   p_data  => x_msg_data);
1123 
1124     IF (l_log_procedure >= l_log_current_level) THEN
1125        FND_LOG.string(l_log_procedure, L_DEBUG || '.End',
1126                       'At the End of the PLSQL procedure CREATE_MOVE_ORDER');
1127     END IF;
1128 
1129 EXCEPTION
1130     WHEN FND_API.G_EXC_ERROR THEN
1131        ROLLBACK TO CREATE_MOVE_ORDER_SP;
1132        x_return_status := FND_API.G_RET_STS_ERROR;
1133        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
1134                                      p_count => x_msg_count,
1135                                      p_data  => x_msg_data);
1136     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1137        ROLLBACK TO CREATE_MOVE_ORDER_SP;
1138        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1139        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
1140                                      p_count => x_msg_count,
1141                                      p_data  => x_msg_data);
1142     WHEN OTHERS THEN
1143        ROLLBACK TO CREATE_MOVE_ORDER_SP;
1144        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1145        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1146            FND_MSG_PUB.add_exc_msg (G_PKG_NAME, L_API_NAME);
1147        END IF;
1148        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
1149                                      p_count => x_msg_count,
1150                                      p_data  => x_msg_data);
1151 
1152 END CREATE_MOVE_ORDER;
1153 
1154 ---------------------------------------------------------------------------------------------------------
1155 -- AJPRASAN:: Adding the following function for Flagging Requirements for ATP Collections
1156 ---------------------------------------------------------------------------------------------------------
1157 --  Procedure name : UPDATE_REQUIREMENTS_FOR_GOP
1158 --  Type           : Public
1159 --  Usage          : This procedure is utilized by the concurrent program (AHLATPFLG),
1160 --                   to flag the material requirements falling within the planning window
1161 --                   defined by the user. It will mark those demands so as to facilitate the
1162 --                   collection of the same by ATP. Later it will call schedule material API to
1163 --                   schedule those demands.
1164 --
1165 --  OUT Parameters :
1166 --      Errbuf  OUT NOCOPY VARCHAR2
1167 --      Retcode OUT NOCOPY NUMBER
1168 --
1169 
1170 PROCEDURE UPDATE_REQUIREMENTS_FOR_GOP(
1171     Errbuf  OUT NOCOPY VARCHAR2,
1172     Retcode OUT NOCOPY NUMBER
1173 ) IS
1174 
1175     --Table of varchar2
1176     TYPE varchar2_table_type IS TABLE OF VARCHAR2(80) INDEX BY BINARY_INTEGER;
1177 
1178     --Define cursors
1179     --Cursor to fetch demands falling within the planning window, which are open
1180     --and also not fetch demands from stage workorders
1181     CURSOR get_demand_details(c_planning_window IN NUMBER) IS
1182     SELECT ASM.SCHEDULED_MATERIAL_ID,
1183            ASM.ATP_FLAG,
1184            WO.WORKORDER_NAME
1185       FROM AHL_SCHEDULE_MATERIALS ASM,
1186            AHL_WORKORDERS WO,
1187            AHL_VISIT_TASKS_B TSK
1188      WHERE (ASM.REQUESTED_QUANTITY - NVL(ASM.COMPLETED_QUANTITY,0) ) > 0
1189        AND ASM.STATUS = 'ACTIVE'
1190        AND ASM.VISIT_TASK_ID = WO.VISIT_TASK_ID
1191        AND WO.STATUS_CODE NOT IN (4, 5, 7, 12)
1192        AND WO.VISIT_TASK_ID = TSK.VISIT_TASK_ID
1193        AND TSK.TASK_TYPE_CODE <> 'STAGE'
1194        AND ASM.REQUESTED_DATE <= SYSDATE + c_planning_window;
1195 
1196     -- Define local variables
1197     l_planning_window     NUMBER;
1198     l_demand_rec          get_demand_details%ROWTYPE;
1199     l_p_sch_mtl_id_tbl    AHL_MM_MTL_MGT_PVT.number_table_type;
1200     l_wo_name_tbl         varchar2_table_type;
1201     l_x_mtl_avl_schld_tbl AHL_MM_MTL_MGT_PVT.mtl_avl_schld_tbl;
1202     i                     NUMBER := 1;
1203     k                     NUMBER := 1;
1204     l_bucket_size         NUMBER := 1000;
1205 
1206     l_msg_count           NUMBER;
1207     l_msg_data            VARCHAR2(2000);
1208     l_return_status       VARCHAR2(1);
1209     l_err_msg             VARCHAR2(2000);
1210     l_msg_index_out       NUMBER;
1211 BEGIN
1212     -- Standard start of API savepoint
1213     SAVEPOINT FLAG_REQUIREMENTS_SP;
1214 
1215     --Initialize error message stack by default
1216     FND_MSG_PUB.Initialize;
1217 
1218     FND_FILE.put_line(FND_FILE.log, 'At the start of the PLSQL procedure UPDATE_REQUIREMENTS_FOR_GOP');
1219 
1220     --Get the profile value
1221     SELECT TO_NUMBER(FND_PROFILE.VALUE('AHL_GOP_ATP_PLANNING_WINDOW'))
1222       INTO l_planning_window
1223       FROM DUAL;
1224 
1225     --If Planning window is not defined, or if its null
1226     IF(l_planning_window IS NULL) THEN
1227         FND_FILE.put_line(FND_FILE.log, 'Planning Window is not defined');
1228         RAISE FND_API.G_EXC_ERROR;
1229     END IF;
1230 
1231     --Revert ATP_FLAG for demands falling outside planning window due to change in required date
1232     UPDATE ahl_schedule_materials
1233        SET ATP_FLAG = 'N'
1234      WHERE status = 'ACTIVE'
1235        AND requested_date > sysdate + l_planning_window
1236        AND ATP_FLAG = 'Y';
1237 
1238     FND_FILE.put_line(FND_FILE.log, 'Number of demands whose ATP_FLAG is reverted back to N:' || SQL%ROWCOUNT);
1239 
1240     --Iterate through the demands falling within the planning window
1241     FOR l_demand_rec IN get_demand_details(l_planning_window)
1242     LOOP
1243         --Update the flag only if it is not updated already
1244         IF(l_demand_rec.atp_flag IS NULL OR l_demand_rec.atp_flag <> 'Y') THEN
1245 
1246             FND_FILE.put_line(FND_FILE.log,
1247                      'Updating ATP flag for ASM ID: ' || l_demand_rec.scheduled_material_id);
1248 
1249             --Update ATP flag of this demand row
1250             UPDATE ahl_schedule_materials
1251                SET ATP_FLAG = 'Y'
1252              WHERE scheduled_material_id = l_demand_rec.scheduled_material_id;
1253 
1254         END IF;
1255 
1256         --Add the demand ID to list of ASM IDs
1257         l_p_sch_mtl_id_tbl(i) := l_demand_rec.scheduled_material_id;
1258 
1259         --Add the WO name to another list
1260         l_wo_name_tbl(i) := l_demand_rec.workorder_name;
1261 
1262         --Increase counter
1263         i := i + 1;
1264 
1265         --Call SCHEDULE_MATERIALS in buckets, say 1000
1266         IF (i = l_bucket_size) THEN
1267             --Call API to schedule material requirement for the same
1268             FND_FILE.put_line(FND_FILE.log, 'Calling schedule_material API for a set of ' || l_bucket_size || ' demands');
1269 
1270             AHL_MM_MTL_MGT_PVT.SCHEDULE_MATERIALS(p_api_version         => 1.0
1271                                                   , p_init_msg_list     => FND_API.G_FALSE
1272                                                   , p_commit            => FND_API.G_FALSE
1273                                                   , p_module_type       => NULL
1274                                                   , p_validation_level  => FND_API.G_VALID_LEVEL_FULL
1275                                                   , p_schedule_material_id_tbl => l_p_sch_mtl_id_tbl
1276                                                   , x_mtl_avl_schld_tbl => l_x_mtl_avl_schld_tbl
1277                                                   , x_return_status     => l_return_status
1278                                                   , x_msg_count         => l_msg_count
1279                                                   , x_msg_data          => l_msg_data
1280                                                   );
1281             IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1282                 fnd_file.put_line(fnd_file.log, 'Error after calling schedule_material API');
1283                 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1284                     RAISE FND_API.G_EXC_ERROR;
1285                 ELSE
1286                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1287                 END IF;
1288             END IF;
1289 
1290             FOR j in l_x_mtl_avl_schld_tbl.FIRST..l_x_mtl_avl_schld_tbl.LAST
1291             LOOP
1292                 --Log only failed cases
1293                 IF (l_x_mtl_avl_schld_tbl(j).ERROR_CODE <> 0) THEN
1294                     fnd_file.put_line(fnd_file.log, 'Workorder: ' || l_wo_name_tbl(k)
1295                                              || ', Available Qty: ' || l_x_mtl_avl_schld_tbl(j).AVAILABLE_QUANTITY
1296                                              || ', Exception Date: ' || l_x_mtl_avl_schld_tbl(j).AVL_SCH_DATE
1297                                              || ', Error Code: ' || l_x_mtl_avl_schld_tbl(j).ERROR_CODE
1298                                              || ', Error Message: ' || l_x_mtl_avl_schld_tbl(j).ERROR_MESSAGE);
1299                 END IF;
1300                 k := k+1;
1301             END LOOP;
1302 
1303             --Clear input and output table after calling
1304             l_p_sch_mtl_id_tbl.DELETE;
1305             l_wo_name_tbl.DELETE;
1306             l_x_mtl_avl_schld_tbl.DELETE;
1307 
1308             --And reset counters
1309             i := 1;
1310             k := 1;
1311 
1312             --Standard check before commit, committing every call to SCHEDULE_MATERIALS
1313             IF(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1314                 --Commit all changes and replace the old savepoint
1315                 COMMIT;
1316                 SAVEPOINT FLAG_REQUIREMENTS_SP;
1317             ELSE
1318                 ROLLBACK TO FLAG_REQUIREMENTS_SP;
1319             END IF;
1320 
1321         END IF; -- END IF (i = l_bucket_size)
1322 
1323     END LOOP; --End iterating the ASM cursor
1324 
1325     --Perform the scheduling for last set of demands, if any
1326     IF(l_p_sch_mtl_id_tbl.COUNT > 0) THEN
1327 
1328         --Call API to schedule material requirement for the same
1329         FND_FILE.put_line(FND_FILE.log, 'Calling schedule_material API for last set of demands');
1330 
1331         AHL_MM_MTL_MGT_PVT.SCHEDULE_MATERIALS(p_api_version         => 1.0
1332                                               , p_init_msg_list     => FND_API.G_FALSE
1333                                               , p_commit            => FND_API.G_FALSE
1334                                               , p_module_type       => NULL
1335                                               , p_validation_level  => FND_API.G_VALID_LEVEL_FULL
1336                                               , p_schedule_material_id_tbl => l_p_sch_mtl_id_tbl
1337                                               , x_mtl_avl_schld_tbl => l_x_mtl_avl_schld_tbl
1338                                               , x_return_status     => l_return_status
1339                                               , x_msg_count         => l_msg_count
1340                                               , x_msg_data          => l_msg_data
1341                                               );
1342 
1343         IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1344             fnd_file.put_line(fnd_file.log, 'Error after calling schedule_material API');
1345             IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1346                 RAISE FND_API.G_EXC_ERROR;
1347             ELSE
1348                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1349             END IF;
1350         END IF;
1351 
1352         FOR j in l_x_mtl_avl_schld_tbl.FIRST..l_x_mtl_avl_schld_tbl.LAST
1353         LOOP
1354             --Log only failed cases
1355             IF (l_x_mtl_avl_schld_tbl(j).ERROR_CODE <> 0) THEN
1356                 fnd_file.put_line(fnd_file.log, 'Workorder: ' || l_wo_name_tbl(k)
1357                                              || ', Available Qty: ' || l_x_mtl_avl_schld_tbl(j).AVAILABLE_QUANTITY
1358                                              || ', Exception Date: ' || l_x_mtl_avl_schld_tbl(j).AVL_SCH_DATE
1359                                              || ', Error Code: ' || l_x_mtl_avl_schld_tbl(j).ERROR_CODE
1360                                              || ', Error Message: ' || l_x_mtl_avl_schld_tbl(j).ERROR_MESSAGE);
1361             END IF;
1362             k := k+1;
1363         END LOOP;
1364 
1365     END IF; -- l_p_sch_mtl_id_tbl IS NOT NULL
1366 
1367     --Standard check before commit
1368     IF(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1369         COMMIT;
1370     ELSE
1371         ROLLBACK TO FLAG_REQUIREMENTS_SP;
1372     END IF;
1373 
1374     fnd_file.put_line(fnd_file.log, 'At the end of PL SQL procedure UPDATE_REQUIREMENTS_FOR_GOP');
1375 
1376 EXCEPTION
1377     WHEN FND_API.G_EXC_ERROR THEN
1378         ROLLBACK TO FLAG_REQUIREMENTS_SP;
1379         retcode := 2;
1380         l_msg_count := Fnd_Msg_Pub.count_msg;
1381 
1382         IF (l_msg_count > 0) THEN
1383             FOR i IN 1..l_msg_count
1384             LOOP
1385                 fnd_msg_pub.get( p_msg_index => i,
1386                              p_encoded => FND_API.G_FALSE,
1387                              p_data => l_err_msg,
1388                              p_msg_index_out => l_msg_index_out);
1389 
1390                 fnd_file.put_line(FND_FILE.LOG, 'Error message-'||l_msg_index_out||':' || l_err_msg);
1391             END LOOP;
1392         END IF;
1393 
1394     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1395          ROLLBACK TO FLAG_REQUIREMENTS_SP;
1396          retcode := 2;
1397          l_msg_count := Fnd_Msg_Pub.count_msg;
1398 
1399          IF (l_msg_count > 0) THEN
1400              FOR i IN 1..l_msg_count
1401              LOOP
1402                  fnd_msg_pub.get( p_msg_index => i,
1403                               p_encoded => FND_API.G_FALSE,
1404                               p_data => l_err_msg,
1405                               p_msg_index_out => l_msg_index_out);
1406 
1407                  fnd_file.put_line(FND_FILE.LOG, 'Error message-'||l_msg_index_out||':' || l_err_msg);
1408              END LOOP;
1409          END IF;
1410 
1411     WHEN OTHERS THEN
1412         ROLLBACK TO FLAG_REQUIREMENTS_SP;
1413         retcode := 2;
1414         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1415             fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
1416                                     p_procedure_name => 'UPDATE_REQUIREMENTS_FOR_GOP',
1417                                     p_error_text => SUBSTR(SQLERRM,1,500));
1418         END IF;
1419 
1420         l_msg_count := Fnd_Msg_Pub.count_msg;
1421         IF (l_msg_count > 0) THEN
1422             FOR i IN 1..l_msg_count
1423             LOOP
1424                 fnd_msg_pub.get( p_msg_index => i,
1425                              p_encoded => FND_API.G_FALSE,
1426                              p_data => l_err_msg,
1427                              p_msg_index_out => l_msg_index_out);
1428 
1429                 fnd_file.put_line(FND_FILE.LOG, 'Error message-'||l_msg_index_out||':' || l_err_msg);
1430             END LOOP;
1431         END IF;
1432 
1433 END UPDATE_REQUIREMENTS_FOR_GOP;
1434 
1435 -------------------------------------------------------------------------------------------------------------
1436 -- sukhwsin:: Added the following procedure for for sending workflow notification when AOG flag gets updated
1437 -------------------------------------------------------------------------------------------------------------
1438 --  Procedure name : Invoke_AOG_Upd_Notification
1439 --  Type           : Public
1440 --  Usage          : This procedure is called from variour places where AOG flag gets updated. It is used to
1441 --                   send workflow notifications upon updation of AOG flag.
1442 --  IN Parameters :
1443 --      p_api_version                   IN      NUMBER                Required
1444 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
1445 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
1446 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
1447 --      p_asm_id                        IN      NUMBER                Required.
1448 --
1449 --  OUT Parameters :
1450 --      x_return_status                 OUT     VARCHAR2               Required
1451 --      x_msg_count                     OUT     NUMBER                 Required
1452 --      x_msg_data                      OUT     VARCHAR2               Required
1453 --
1454 PROCEDURE Invoke_AOG_Upd_Notification(
1455  p_api_version               IN         NUMBER   :=  1.0,
1456  p_init_msg_list             IN         VARCHAR2 := FND_API.G_FALSE,
1457  p_commit                    IN         VARCHAR2 := FND_API.G_FALSE,
1458  p_validation_level          IN         NUMBER   := FND_API.G_VALID_LEVEL_FULL,
1459  p_asm_id_tab                IN         AHL_MM_MTL_MGT_PVT.number_table_type,
1460  x_return_status             OUT NOCOPY VARCHAR2,
1461  x_msg_count                 OUT NOCOPY NUMBER,
1462  x_msg_data                  OUT NOCOPY VARCHAR2
1463 )
1464 IS
1465     ----------------------Local Variable Declaration------------------------
1466     l_api_name        CONSTANT VARCHAR2(30) := 'INVOKE_AOG_UPD_NOTIFICATION';
1467     l_api_version     CONSTANT NUMBER       := 1.0;
1468     l_return_status            VARCHAR2(1);
1469     l_msg_count             NUMBER;
1470     l_msg_data              VARCHAR2(4000);
1471     l_active_flag           VARCHAR2(1);
1472     l_process_name          VARCHAR2(30);
1473     l_item_type             VARCHAR2(8);
1474     l_subject               FND_NEW_MESSAGES.message_text%TYPE;
1475     l_item_key              VARCHAR2(200);
1476     TYPE workorder_dtl_record IS RECORD(workorder_name AHL_WORKORDERS.WORKORDER_NAME%TYPE, asm_ids VARCHAR2(2000));
1477     TYPE workorder_dtl_table IS TABLE OF workorder_dtl_record INDEX BY BINARY_INTEGER;
1478     l_wo_dtl_tab workorder_dtl_table;
1479     l_wo_tab_cnt NUMBER :=0;
1480     TYPE cur_type IS REF CURSOR;
1481     c_wo_dtl cur_type;
1482     l_sql_string            VARCHAR2(2000);
1483     l_asm_id                NUMBER;
1484     l_workorder_name        AHL_WORKORDERS.WORKORDER_NAME%TYPE;
1485 
1486 BEGIN
1487     --------------------Initialize ----------------------------------
1488     -- Standard Start of API savepoint
1489     SAVEPOINT Invoke_AOG_Upd_Notification;
1490     -- Initialize message list if p_init_msg_list is set to TRUE.
1491     IF FND_API.to_boolean(p_init_msg_list)
1492     THEN
1493      FND_MSG_PUB.initialize;
1494     END IF;
1495     --  Initialize API return status to success
1496     x_return_status := FND_API.G_RET_STS_SUCCESS;
1497    -- Standard call to check for call compatibility.
1498    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
1499                                       p_api_version,
1500                                       l_api_name,G_PKG_NAME)
1501    THEN
1502        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1503    END IF;
1504     --------------------Start of Main Logic ----------------------------------
1505    IF (p_asm_id_tab.count = 0) THEN
1506         RETURN;
1507    END IF;
1508 
1509    --Get Workflow Attributes.
1510     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1511         fnd_log.string
1512         (
1513         fnd_log.level_procedure,
1514         'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
1515         'Before calling Ahl_Utility_Pvt.Get_Wf_Process_Name'
1516         );
1517     END IF;
1518     l_return_status := null;
1519     l_item_type := null;
1520     l_process_name := null;
1521     --Get workflow status active or not
1522     AHL_UTILITY_PVT.Get_WF_Process_Name(
1523         p_object        => 'AOG',
1524         x_active        => l_active_flag,
1525         x_process_name  => l_process_name ,
1526         x_item_type     => l_item_type,
1527         x_msg_count     => l_msg_count,
1528         x_msg_data      => l_msg_data,
1529         x_return_status => l_return_status);
1530     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1531         fnd_log.string
1532         (
1533         fnd_log.level_procedure,
1534         'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
1535         'After calling Ahl_Utility_Pvt.Get_Wf_Process_Name, Return Status : '|| l_return_status
1536         );
1537     END IF;
1538     -- if returned with error, don't proceed any further
1539     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1540         x_return_status := l_return_status;
1541         RETURN;
1542     END IF;
1543     -- if the mapping is not active then return normal.
1544     IF (l_active_flag <> 'Y') THEN
1545         IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1546             fnd_log.string
1547             (
1548             fnd_log.level_procedure,
1549             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
1550             'Returning to caller as Workflow is not active, Return Status : S'
1551             );
1552         END IF;
1553         x_return_status := FND_API.G_RET_STS_SUCCESS;
1554         RETURN;
1555     END IF;
1556     --End of Get Workflow attributes.
1557 
1558    --Build asm id string from table of records recieved as parameter.
1559    l_sql_string := 'SELECT wo.workorder_name, asm.scheduled_material_id ' ||
1560                         'FROM ahl_schedule_materials asm, ahl_workorders wo ' ||
1561                         'WHERE ' ||
1562                         'asm.visit_task_id = wo.visit_task_id ' ||
1563                         'AND asm.scheduled_material_id IN ( 0';
1564    FOR i IN p_asm_id_tab.first..p_asm_id_tab.last
1565    LOOP
1566         l_sql_string := l_sql_string || ',' || p_asm_id_tab(i);
1567    END LOOP;
1568    l_sql_string := l_sql_string || ') ORDER BY wo.workorder_name ASC';
1569 
1570    --Build table of distinct workorder and corresponding asm_id string from cursor. This table will be used for calling wf iteratively.
1571    OPEN c_wo_dtl FOR l_sql_string;
1572    LOOP
1573         FETCH c_wo_dtl INTO l_workorder_name, l_asm_id;
1574         EXIT WHEN c_wo_dtl%NOTFOUND;
1575         IF (l_wo_dtl_tab.count = 0 OR l_wo_dtl_tab(l_wo_tab_cnt).workorder_name = l_workorder_name) THEN
1576                 l_wo_dtl_tab(l_wo_tab_cnt).workorder_name := l_workorder_name;
1577                 IF (l_wo_dtl_tab(l_wo_tab_cnt).asm_ids IS NULL ) THEN
1578                         l_wo_dtl_tab(l_wo_tab_cnt).asm_ids := l_asm_id;
1579                 ELSE
1580                         l_wo_dtl_tab(l_wo_tab_cnt).asm_ids := l_wo_dtl_tab(l_wo_tab_cnt).asm_ids || ', ' || l_asm_id;
1581                 END IF;
1582         ELSE
1583                 l_wo_tab_cnt := l_wo_tab_cnt + 1;
1584                 l_wo_dtl_tab(l_wo_tab_cnt).workorder_name := l_workorder_name;
1585                 l_wo_dtl_tab(l_wo_tab_cnt).asm_ids := l_asm_id;
1586         END IF;
1587    END LOOP;
1588    CLOSE c_wo_dtl;
1589 
1590    --Call Notification API based upon contructed table.
1591    FOR k IN l_wo_dtl_tab.FIRST..l_wo_dtl_tab.LAST
1592    LOOP
1593 
1594         fnd_message.set_name('AHL','AHL_MM_AOG_FLAG_WF_SUB'); -- sukhwsin-pending to correct message.
1595         fnd_message.set_token('WORKORDER',l_wo_dtl_tab(k).workorder_name);
1596         l_subject := fnd_message.get;
1597         IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1598             fnd_log.string
1599             (
1600             fnd_log.level_procedure,
1601             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
1602             'Before calling AHL_WF_NOTIFICATION_PVT.Launch_OA_Notification' ||
1603              'l_process_name ' || l_process_name ||
1604              'l_subject ' || l_subject ||
1605              'P_WORKORDER_NAME ' || l_wo_dtl_tab(k).workorder_name ||
1606              'asm_ids ' || l_wo_dtl_tab(k).asm_ids
1607             );
1608         END IF;
1609         -- call AHL_WF_NOTIFICATION_PVT.Launch_OA_Notification
1610         AHL_WF_NOTIFICATION_PVT.Launch_OA_Notification(
1611         p_object        => 'AOG',
1612         p_process_name  => l_process_name,
1613         p_item_type     => l_item_type,
1614         p_subject       => l_subject,
1615         p_oa_function   => 'AHL_MM_AOG_FLAG_NTFCN',
1616         p_param1_name   => 'P_WORKORDER_NAME',
1617         p_param1_value  => TO_CHAR(l_wo_dtl_tab(k).workorder_name),
1618         p_param2_name   => 'P_ASM_IDS',
1619         p_param2_value  => TO_CHAR(l_wo_dtl_tab(k).asm_ids),
1620         x_item_key      => l_item_key,
1621         x_return_status => l_return_status);
1622         IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1623             fnd_log.string
1624             (
1625             fnd_log.level_procedure,
1626             'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
1627             'After calling AHL_WF_NOTIFICATION_PVT.Launch_OA_Notification, Return Status : '|| l_return_status ||
1628             'l_item_key ' || l_item_key
1629             );
1630         END IF;
1631         -- if returned with error, don't proceed any further
1632         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1633             x_return_status := l_return_status;
1634             RETURN;
1635         END IF;
1636    END LOOP;
1637 
1638     l_msg_count := Fnd_Msg_Pub.count_msg;
1639     -- Check the return status of API call.
1640     IF (l_return_status <> 'S' OR l_msg_count > 0) THEN
1641         x_msg_count := l_msg_count;
1642         x_return_status := FND_API.G_RET_STS_ERROR;
1643         RAISE Fnd_Api.G_EXC_ERROR;
1644     END IF;
1645     -- Standard check of p_commit
1646     IF FND_API.TO_BOOLEAN(p_commit) THEN
1647         COMMIT;
1648     END IF;
1649 EXCEPTION
1650  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1651     ROLLBACK TO Invoke_AOG_Upd_Notification;
1652     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1653     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1654                                p_count => x_msg_count,
1655                                p_data  => x_msg_data);
1656 WHEN FND_API.G_EXC_ERROR THEN
1657     ROLLBACK TO Invoke_AOG_Upd_Notification;
1658     X_return_status := FND_API.G_RET_STS_ERROR;
1659     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1660                                p_count => x_msg_count,
1661                                p_data  => X_msg_data);
1662 WHEN OTHERS THEN
1663     ROLLBACK TO Invoke_AOG_Upd_Notification;
1664     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1665     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1666     THEN
1667     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  G_PKG_NAME,
1668                             p_procedure_name  =>  'Invoke_AOG_Upd_Notification',
1669                             p_error_text      => SUBSTR(SQLERRM,1,240));
1670     END IF;
1671     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1672                                p_count => x_msg_count,
1673                                p_data  => X_msg_data);
1674 END Invoke_AOG_Upd_Notification;
1675 
1676 
1677 
1678 -- changes by sansatpa begins - Create Internal Sales orders
1679 
1680 
1681 ---------------------------------------------------------------------------------------------------------
1682 -- SANSATPA:: Adding the following function for creating Internal Sales Orders
1683 ---------------------------------------------------------------------------------------------------------
1684 -----------------------
1685 -- Define procedures --
1686 -----------------------
1687 --  Start of Comments  --
1688 --
1689 --  Procedure name      : CREATE_INTERNAL_SALES_ORDER
1690 --  Type                : Private
1691 --  Description         : This procedure is called for creating Internal Sales Orders.
1692 --  Pre-reqs            :
1693 --
1694 --  Standard IN  Parameters :
1695 --      p_api_version       NUMBER      := 1.0
1696 --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
1697 --      p_commit            VARCHAR2    := FND_API.G_FALSE
1698 --      p_validation_level  NUMBER      := FND_API.G_VALID_LEVEL_FULL
1699 --
1700 --  Standard OUT Parameters :
1701 --      x_return_status     VARCHAR2                                        Required
1702 --      x_msg_count         NUMBER                                          Required
1703 --      x_msg_data          VARCHAR2                                        Required
1704 --
1705 --
1706 --  Procedure --  IN Parameters :
1707 --       P_SCH_MTL_ID NUMBER, Required
1708 --       P_SOURCE_ORG_TBL       OAF_NUMBER_TABLE, Required: The table containing the list of supply Org IDs
1709 --       P_SOURCE_SUB_INV_TBL OAF_VARCHAR2_TABLE_100, Optional
1710 --       P_SOURCE_LOCATORS_TBL OAF_NUMBER_TABLE, Optional
1711 --       P_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The table containing the list of serial numbers
1712 --
1713 --  Procedure --  OUT Parameters :
1714 --       X_REQUISITION_NUM          VARCHAR2: The Internal Requisition Number
1715 --       X_REQUISITION_HDR_ID          NUMBER: The Internal Requisition Header Id
1716 --       X_INT_ORDER_NUM          NUMBER: The Internal Order Number
1717 --       X_INT_ORDER_HDR_ID          NUMBER: The Internal Order Header Id
1718 --       X_RESERVATION_ID          NUMBER: The Reservation Id
1719 --
1720 --  End of Comments  --
1721 PROCEDURE CREATE_INTERNAL_SALES_ORDER(
1722     -- Standard IN params
1723     P_API_VERSION      IN NUMBER,
1724     P_INIT_MSG_LIST    IN VARCHAR2 DEFAULT FND_API.G_FALSE,
1725     P_COMMIT           IN VARCHAR2 DEFAULT FND_API.G_FALSE,
1726     P_VALIDATION_LEVEL IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
1727     -- Standard OUT params
1728     X_MSG_COUNT OUT NOCOPY     NUMBER,
1729     X_MSG_DATA OUT NOCOPY      VARCHAR2,
1730     X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1731     -- Procedure IN, OUT, IN/OUT params
1732     P_SCH_MTL_ID          IN NUMBER,
1733     P_SOURCE_ORG_TBL      IN OAF_NUMBER_TABLE,
1734     P_SOURCE_SUB_INV_TBL  IN OAF_VARCHAR2_TABLE_100,
1735     P_SOURCE_LOCATORS_TBL IN OAF_NUMBER_TABLE,
1736     P_SERIAL_NUM_TBL      IN OAF_VARCHAR2_TABLE_100,
1737     X_REQUISITION_NUM OUT NOCOPY    VARCHAR2,
1738     X_REQUISITION_HDR_ID OUT NOCOPY NUMBER,
1739     X_INT_ORDER_NUM OUT NOCOPY      NUMBER,
1740     X_INT_ORDER_HDR_ID OUT NOCOPY   NUMBER,
1741     X_RESERVATION_ID OUT NOCOPY     NUMBER )
1742 
1743 IS
1744 
1745     L_API_NAME CONSTANT VARCHAR2(80)            := 'AHL_MM_MTL_MGT_PVT.CREATE_INTERNAL_SALES_ORDER';
1746     L_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100  := OAF_VARCHAR2_TABLE_100();
1747     L_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100  := OAF_VARCHAR2_TABLE_100();
1748     L_QUANTITY_TBL OAF_NUMBER_TABLE             := OAF_NUMBER_TABLE();
1749     L_SOURCE_ORG_TBL OAF_NUMBER_TABLE           := OAF_NUMBER_TABLE();
1750     L_SOURCE_SUB_INV_TBL OAF_VARCHAR2_TABLE_100 := OAF_VARCHAR2_TABLE_100();
1751     L_SOURCE_LOCATORS_TBL OAF_NUMBER_TABLE      := OAF_NUMBER_TABLE();
1752     L_CURRENT_SUPPLY_ORG number;
1753     L_CURRENT_SUPPLY_SUB_INV VARCHAR2(10);
1754     L_CURRENT_SUPPLY_LOCATOR NUMBER;
1755     J                        NUMBER;
1756     L_INVENTORY_ITEM         VARCHAR2(80);
1757     L_ISO_ENABLED_FLAG       VARCHAR2(1);
1758 
1759     INVALID_ITEM_TYPE EXCEPTION;
1760 
1761 
1762 BEGIN
1763 
1764     IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
1765       FND_LOG.STRING(G_LEVEL_PROCEDURE, L_API_NAME,'Begin API');
1766     END IF;
1767 
1768     SELECT MSI.SEGMENT1,
1769       MSI.INTERNAL_ORDER_ENABLED_FLAG
1770     INTO L_INVENTORY_ITEM,
1771       L_ISO_ENABLED_FLAG
1772     FROM AHL_SCHEDULE_MATERIALS ASM,
1773       MTL_SYSTEM_ITEMS_B MSI
1774     WHERE ASM.INVENTORY_ITEM_ID         = MSI.INVENTORY_ITEM_ID
1775     AND ASM.ORGANIZATION_ID             = MSI.ORGANIZATION_ID
1776     AND SCHEDULED_MATERIAL_ID           = P_SCH_MTL_ID;
1777 
1778     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1779       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_INVENTORY_ITEM = ' || L_INVENTORY_ITEM || ' has INTERNAL_ORDER_ENABLED_FLAG value - ' || L_ISO_ENABLED_FLAG);
1780     END IF;
1781 
1782     IF('Y' <> L_ISO_ENABLED_FLAG) THEN
1783       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1784         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_INVENTORY_ITEM = ' || L_INVENTORY_ITEM || ' has INTERNAL_ORDER_ENABLED_FLAG value - N. Process can not continue.');
1785       END IF;
1786 
1787       RAISE INVALID_ITEM_TYPE;
1788     END IF;
1789 
1790 
1791     L_SOURCE_ORG_TBL := P_SOURCE_ORG_TBL;
1792 
1793 
1794 	LOOP
1795 
1796 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1797 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME , '---------------------------------');
1798 		END IF;
1799 
1800 		J             := 1;
1801 		L_CURRENT_SUPPLY_ORG := L_SOURCE_ORG_TBL(L_SOURCE_ORG_TBL.first);
1802     L_CURRENT_SUPPLY_SUB_INV := P_SOURCE_SUB_INV_TBL(P_SOURCE_SUB_INV_TBL.first);
1803     L_CURRENT_SUPPLY_LOCATOR := P_SOURCE_LOCATORS_TBL(P_SOURCE_LOCATORS_TBL.FIRST);
1804 
1805 
1806 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1807 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
1808 					' L_CURRENT_SUPPLY_ORG - ' || L_CURRENT_SUPPLY_ORG ||
1809           ' L_CURRENT_SUPPLY_SUB_INV - ' || L_CURRENT_SUPPLY_SUB_INV ||
1810           ' L_CURRENT_SUPPLY_LOCATOR - ' || L_CURRENT_SUPPLY_LOCATOR ||
1811 					', L_SOURCE_ORG_TBL size - ' || L_SOURCE_ORG_TBL.COUNT);
1812 		  end if;
1813 
1814 		FOR I IN L_SOURCE_ORG_TBL.FIRST .. L_SOURCE_ORG_TBL.LAST
1815 		LOOP
1816 
1817 			BEGIN
1818 
1819           IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1820               FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
1821                   ' L_SOURCE_ORG_TBL(' || I || ') - ' || L_SOURCE_ORG_TBL(I));
1822           END IF;
1823 
1824           IF(L_CURRENT_SUPPLY_ORG = L_SOURCE_ORG_TBL(I)) THEN
1825 
1826               L_FM_SERIAL_NUM_TBL.EXTEND;
1827               L_TO_SERIAL_NUM_TBL.EXTEND;
1828               L_QUANTITY_TBL.EXTEND;
1829               L_SOURCE_SUB_INV_TBL.EXTEND;
1830               L_SOURCE_LOCATORS_TBL.EXTEND;
1831               L_FM_SERIAL_NUM_TBL(J)   := P_SERIAL_NUM_TBL(I);
1832               L_TO_SERIAL_NUM_TBL(J)   := P_SERIAL_NUM_TBL(I);
1833               L_QUANTITY_TBL(J)        := 1;
1834               L_SOURCE_SUB_INV_TBL(J)  := P_SOURCE_SUB_INV_TBL(I);
1835               L_SOURCE_LOCATORS_TBL(J) := P_SOURCE_LOCATORS_TBL(I);
1836               J                        := J + 1;
1837 
1838               L_SOURCE_ORG_TBL.DELETE(I);
1839 
1840           END IF;
1841 
1842           EXCEPTION
1843               when no_data_found then
1844               IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1845                 FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
1846                   ' Supply Org data missing from table as already removed');
1847               END IF;
1848 
1849 			END;
1850 
1851 		END LOOP;
1852 
1853     FOR K IN 1 .. L_FM_SERIAL_NUM_TBL.COUNT
1854 		LOOP
1855 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1856 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
1857 					' L_FM_SERIAL_NUM_TBL(' || K || ') - ' || L_FM_SERIAL_NUM_TBL(K) ||
1858 					' L_TO_SERIAL_NUM_TBL(' || K || ') - ' || L_TO_SERIAL_NUM_TBL(K) ||
1859           ' L_SOURCE_SUB_INV_TBL(' || K || ') - ' || L_SOURCE_SUB_INV_TBL(K) ||
1860           ' L_SOURCE_LOCATORS_TBL(' || K || ') - ' || L_SOURCE_LOCATORS_TBL(K) ||
1861 					' L_QUANTITY_TBL(' || K || ') - ' || L_QUANTITY_TBL(K));
1862       END IF;
1863 
1864 		END LOOP;
1865 
1866      -- Call CREATE_INTERNAL_ORDER procedure tio create internal order now
1867 
1868           CREATE_INTERNAL_ORDER(
1869                     P_API_VERSION               => P_API_VERSION,
1870                     P_INIT_MSG_LIST             => P_INIT_MSG_LIST,
1871                     P_COMMIT                    => P_COMMIT,
1872                     P_SCH_MTL_ID                => P_SCH_MTL_ID,
1873                     P_SOURCE_ORG                => L_CURRENT_SUPPLY_ORG,
1874                     P_SOURCE_SUB_INV_TBL        => L_SOURCE_SUB_INV_TBL,
1875                     P_SOURCE_LOCATOR_TBL        => L_SOURCE_LOCATORS_TBL,
1876                     P_QUANTITY                  => L_QUANTITY_TBL.COUNT,
1877                     P_FM_SERIAL_NUM_TBL         => L_FM_SERIAL_NUM_TBL,
1878                     P_TO_SERIAL_NUM_TBL         => L_TO_SERIAL_NUM_TBL,
1879                     P_QUANTITY_TBL              => L_QUANTITY_TBL,
1880                     X_REQUISITION_NUM           => X_REQUISITION_NUM,
1881                     X_REQUISITION_HDR_ID        => X_REQUISITION_HDR_ID,
1882                     X_INT_ORDER_NUM             => X_INT_ORDER_NUM,
1883                     X_INT_ORDER_HDR_ID          => X_INT_ORDER_HDR_ID,
1884                     X_RESERVATION_ID            => X_RESERVATION_ID,
1885                     X_MSG_COUNT                 => X_MSG_COUNT,
1886                     X_MSG_DATA                  => X_MSG_DATA,
1887                     X_RETURN_STATUS             => X_RETURN_STATUS
1888                     );
1889 
1890 
1891     -- Delete the local table data
1892 		L_FM_SERIAL_NUM_TBL.DELETE;
1893     L_TO_SERIAL_NUM_TBL.DELETE;
1894     L_QUANTITY_TBL.DELETE;
1895     L_SOURCE_SUB_INV_TBL.DELETE;
1896     L_SOURCE_LOCATORS_TBL.DELETE;
1897 
1898 
1899 		EXIT
1900 			WHEN L_SOURCE_ORG_TBL.COUNT < 1;
1901 
1902 	END LOOP;
1903 
1904   EXCEPTION
1905   WHEN INVALID_ITEM_TYPE THEN
1906     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1907       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME , ' INVALID_ITEM_TYPE EXCEPTION - Invalid Item Type');
1908     END IF;
1909 
1910     FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_INVLD_ITEM_FOR_ISO');
1911       fnd_message.set_token('ITEM_NAME',L_INVENTORY_ITEM );
1912       FND_MSG_PUB.ADD;
1913       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
1914                                P_DATA    => X_MSG_DATA,
1915                                p_encoded => fnd_api.g_false);
1916     X_RETURN_STATUS := G_RET_STS_ERROR;
1917   WHEN OTHERS THEN
1918     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
1919       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME , ' OTHERS exception.');
1920     END IF;
1921 
1922 
1923 END CREATE_INTERNAL_SALES_ORDER;
1924 
1925 
1926 
1927 ---------------------------------------------------------------------------------------------------------
1928 -- SANSATPA:: Adding the following function for creating Internal Sales Orders
1929 ---------------------------------------------------------------------------------------------------------
1930 -----------------------
1931 -- Define procedures --
1932 -----------------------
1933 --  Start of Comments  --
1934 --
1935 --  Procedure name      : CREATE_INTERNAL_ORDER
1936 --  Type                : Private
1937 --  Description         : This procedure is called for creating Internal Sales Orders.
1938 --  Pre-reqs            :
1939 --
1940 --  Standard IN  Parameters :
1941 --      p_api_version       NUMBER      := 1.0
1942 --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
1943 --      p_commit            VARCHAR2    := FND_API.G_FALSE
1944 --      p_validation_level  NUMBER      := FND_API.G_VALID_LEVEL_FULL
1945 --
1946 --  Standard OUT Parameters :
1947 --      x_return_status     VARCHAR2                                        Required
1948 --      x_msg_count         NUMBER                                          Required
1949 --      x_msg_data          VARCHAR2                                        Required
1950 --
1951 --
1952 --  Procedure --  IN Parameters :
1953 --       P_SCH_MTL_ID NUMBER, Required
1954 --       P_SOURCE_ORG_TBL       OAF_NUMBER_TABLE, Required: The table containing the list of supply Org IDs
1955 --       P_SOURCE_SUB_INV_TBL OAF_NUMBER_TABLE, Optional
1956 --       P_SOURCE_LOCATORS_TBL OAF_NUMBER_TABLE, Optional
1957 --       P_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The table containing the list of serial numbers
1958 --
1959 --  Procedure --  OUT Parameters :
1960 --       X_REQUISITION_NUM          VARCHAR2: The Internal Requisition Number
1961 --       X_REQUISITION_HDR_ID          NUMBER: The Internal Requisition Header Id
1962 --       X_INT_ORDER_NUM          NUMBER: The Internal Order Number
1963 --       X_INT_ORDER_HDR_ID          NUMBER: The Internal Order Header Id
1964 --       X_RESERVATION_ID          NUMBER: The Reservation Id
1965 --
1966 --  End of Comments  --
1967 PROCEDURE CREATE_INTERNAL_ORDER(
1968     P_API_VERSION        IN NUMBER,
1969     P_INIT_MSG_LIST      IN VARCHAR2 DEFAULT FND_API.G_FALSE,
1970     P_COMMIT             IN VARCHAR2 DEFAULT FND_API.G_FALSE,
1971     P_SCH_MTL_ID         IN NUMBER,
1972     P_SOURCE_ORG         IN NUMBER,
1973     P_SOURCE_SUB_INV_TBL IN OAF_VARCHAR2_TABLE_100,
1974     P_SOURCE_LOCATOR_TBL IN OAF_NUMBER_TABLE,
1975     P_QUANTITY           IN NUMBER,
1976     P_FM_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
1977     P_TO_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
1978     P_QUANTITY_TBL       IN OAF_NUMBER_TABLE,
1979     X_REQUISITION_NUM OUT NOCOPY    VARCHAR2,
1980     X_REQUISITION_HDR_ID OUT NOCOPY NUMBER,
1981     X_INT_ORDER_NUM OUT NOCOPY      NUMBER,
1982     X_INT_ORDER_HDR_ID OUT NOCOPY   NUMBER,
1983     X_RESERVATION_ID OUT NOCOPY     NUMBER,
1984     X_MSG_COUNT OUT NOCOPY          NUMBER,
1985     X_MSG_DATA OUT NOCOPY           VARCHAR2,
1986     X_RETURN_STATUS OUT NOCOPY      VARCHAR2)
1987 IS
1988 
1989 l_success          BOOLEAN := TRUE;
1990 x_phase            VARCHAR2(15);
1991 x_status           VARCHAR2(10);
1992 x_dev_phase        VARCHAR2(15);
1993 x_dev_status       VARCHAR2(10);
1994 x_message          VARCHAR2(2000);
1995 l_api_version      CONSTANT NUMBER       := 1.0;
1996 l_api_name         CONSTANT VARCHAR2(80) := 'AHL_MM_MTL_MGT_PVT.CREATE_INTERNAL_ORDER';
1997 l_user_id          NUMBER                := fnd_global.user_id;
1998 l_person_id        NUMBER;
1999 L_CURRENCY_CODE    varchar2(15);
2000 L_PRODUCT_TXN_ID   NUMBER := AHL_MM_PROD_TXN_ID_S.nextval;
2001 L_MATERIAL_ACCOUNT NUMBER;
2002 L_DEMAND_ORG_ID NUMBER;
2003 L_DEMAND_SUBINV_CODE VARCHAR2(10);
2004 L_DEMAND_LOCATOR_ID NUMBER;
2005 l_need_by_date DATE;
2006 L_DESTINATION_OU NUMBER;
2007 L_DESTINATION_LOC_ID  NUMBER;
2008 L_SOURCE_OU           NUMBER;
2009 L_SHIPPING_NETWORK_CODE NUMBER;
2010 L_ISO_REQ_FLAG        NUMBER;
2011 l_request_id          NUMBER;
2012 l_init_msg_list       VARCHAR2(1) := 'F';
2013 l_return_status       VARCHAR2(1);
2014 L_MSG_COUNT           NUMBER;
2015 L_MSG_INDEX_OUT       NUMBER;
2016 L_MSG_DATA            varchar2(2000);
2017 --L_COMMIT              VARCHAR2(1) := 'T';
2018 L_MODULE_TYPE         VARCHAR2(3) := 'OAF';
2019 x_requisition_line_id NUMBER;
2020 l_inventory_item_id   NUMBER;
2021 l_uom_code            VARCHAR2 (3);
2022 l_item_description    VARCHAR2 (240);
2023 X_INT_ORDER_LINE_ID   NUMBER;
2024 L_TRANSACTION_ID      NUMBER;
2025 L_ERROR_MESSAGE       VARCHAR2(2000);
2026 L_MM_TXN_INTERFACE_S_CURVAL NUMBER;
2027 L_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100 := OAF_VARCHAR2_TABLE_100();
2028 L_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100 := OAF_VARCHAR2_TABLE_100();
2029 L_QUANTITY_TBL OAF_NUMBER_TABLE            := OAF_NUMBER_TABLE();
2030 
2031 CREATE_IR_EXC      EXCEPTION;
2032 CREATE_ISO_EXC     EXCEPTION;
2033 CREATE_IR_RSRV_EXC EXCEPTION;
2034 PICK_REL_EXC       EXCEPTION;
2035 NO_CUST_ASSOC      EXCEPTION;
2036 NO_SHIPPING_NETWORK EXCEPTION;
2037 NO_ISO_ENABLED_NETWORK EXCEPTION;
2038 
2039 BEGIN
2040 
2041 FND_GLOBAL.APPS_INITIALIZE(1003259/*TSMITH*/, 62211/*AHL_SUPER_USER_CA_US*/, 867/*APPLICATION ID */);
2042 mo_global.init('AHL');
2043 
2044   IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
2045     Fnd_Log.STRING(G_LEVEL_PROCEDURE, l_api_name,'Begin API');
2046   END IF;
2047 
2048   -- standard check for API compatibility.
2049   IF NOT Fnd_Api.Compatible_API_Call (l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2050     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2051   END IF;
2052   IF Fnd_Api.to_Boolean(p_init_msg_list) THEN
2053     Fnd_Msg_Pub.initialize;
2054   END IF;
2055   x_return_status := G_RET_STS_SUCCESS;
2056 
2057     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2058 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'P_SOURCE_ORG = ' || P_SOURCE_ORG);
2059     END IF;
2060 
2061   -- step 1 - get inv item id
2062   SELECT inventory_item_id, ORGANIZATION_ID, REQUESTED_DATE
2063   INTO l_inventory_item_id, l_demand_org_id, l_need_by_date
2064   FROM AHL_SCHEDULE_MATERIALS
2065   where SCHEDULED_MATERIAL_ID = P_SCH_MTL_ID;
2066   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2067 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_inventory_item_id = ' || l_inventory_item_id);
2068   end if;
2069 
2070 
2071   -- step 2 - Get UOM code for the item
2072   SELECT primary_uom_code,
2073     description
2074   INTO l_uom_code,
2075     l_item_description
2076   FROM mtl_system_items_b
2077   where INVENTORY_ITEM_ID = L_INVENTORY_ITEM_ID
2078   and rownum = 1;
2079     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2080 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_uom_code = ' || l_uom_code);
2081   end if;
2082 
2083 
2084   -- step 3 - Get Source Operationg Unit
2085   SELECT OPERATING_UNIT
2086   INTO L_SOURCE_OU
2087   FROM ORG_ORGANIZATION_DEFINITIONS
2088   WHERE ORGANIZATION_ID = P_SOURCE_ORG;
2089       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2090 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_SOURCE_OU = ' || L_SOURCE_OU);
2091   end if;
2092 
2093 
2094   -- step 4 - Get destination Operationg Unit
2095   SELECT OPERATING_UNIT
2096   INTO L_DESTINATION_OU
2097   FROM ORG_ORGANIZATION_DEFINITIONS
2098   where ORGANIZATION_ID = l_demand_org_id;
2099     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2100 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_DESTINATION_OU = ' || L_DESTINATION_OU);
2101   end if;
2102 
2103 
2104   -- step 5 - get the Internal location id.
2105   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2106 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Getting Internal Location Id');
2107   END IF;
2108 
2109   BEGIN
2110 	  SELECT LOC.LOCATION_ID
2111 	  INTO L_DESTINATION_LOC_ID
2112 	  FROM HR_LOCATIONS_ALL LOC,
2113 		PO_LOCATION_ASSOCIATIONS_ALL PLOC,
2114 		HZ_CUST_ACCOUNTS CUST
2115 	  WHERE LOC.INVENTORY_ORGANIZATION_ID = l_demand_org_id
2116 	  AND LOC.LOCATION_ID                 = PLOC.LOCATION_ID
2117 	  AND PLOC.ORG_ID                     = L_DESTINATION_OU
2118 	  AND PLOC.CUSTOMER_ID                = CUST.CUST_ACCOUNT_ID
2119 	  AND CUST.CUSTOMER_TYPE              = 'I'
2120 	  AND ROWNUM                          = 1;
2121 
2122     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2123           FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_DESTINATION_LOC_ID = ' || L_DESTINATION_LOC_ID);
2124     end if;
2125 	EXCEPTION
2126 	WHEN NO_DATA_FOUND THEN
2127 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2128 				FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'No Data Found Exception for getting Internal Location Id');
2129 		END IF;
2130 	  --L_DESTINATION_LOC_ID := null;
2131 	  --IF(L_DESTINATION_LOC_ID IS NULL) THEN
2132 		RAISE NO_CUST_ASSOC;
2133 	  --END IF;
2134   END;
2135 
2136 
2137   -- step 6 - Get the person_id
2138   SELECT employee_id
2139   INTO l_person_id
2140   FROM fnd_user
2141   where USER_ID = L_USER_ID;
2142     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2143 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_person_id = ' || l_person_id);
2144   end if;
2145 
2146 
2147   -- step 6 - get the currency code for the destination OU.
2148   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2149 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Getting currency code');
2150   END IF;
2151   SELECT currency_code
2152   INTO l_currency_code
2153   FROM gl_sets_of_books,
2154     hr_organization_information
2155   WHERE SET_OF_BOOKS_ID       = ORG_INFORMATION1
2156   AND organization_id         = L_DESTINATION_OU
2157   and ORG_INFORMATION_CONTEXT = 'Accounting Information';
2158    IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2159 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_currency_code = ' || l_currency_code);
2160   end if;
2161 
2162 
2163   -- step 7 - get the material account id.
2164   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2165 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Getting material account Id');
2166   END IF;
2167   SELECT material_account
2168   INTO l_material_account
2169   FROM mtl_parameters
2170   where ORGANIZATION_ID = l_demand_org_id;
2171    IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2172 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_material_account = ' || l_material_account);
2173   end if;
2174 
2175   -- Get the shipping network information and internal order enabled flag value
2176   BEGIN
2177     SELECT INTRANSIT_TYPE, INTERNAL_ORDER_REQUIRED_FLAG
2178     INTO L_SHIPPING_NETWORK_CODE, L_ISO_REQ_FLAG
2179     FROM MTL_SHIPPING_NETWORK_VIEW
2180     WHERE FROM_ORGANIZATION_ID = P_SOURCE_ORG
2181     AND TO_ORGANIZATION_ID = L_DEMAND_ORG_ID;
2182   EXCEPTION
2183   WHEN NO_DATA_FOUND THEN
2184     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2185 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' No Shipping Network found between Demand org: ' || L_DEMAND_ORG_ID || ' and Supply Org: ' || P_SOURCE_ORG);
2186     END IF;
2187     RAISE NO_SHIPPING_NETWORK;
2188   END;
2189 
2190   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2191     FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_SHIPPING_NETWORK_CODE = ' || L_SHIPPING_NETWORK_CODE || ', L_ISO_REQ_FLAG = ' || L_ISO_REQ_FLAG);
2192   END IF;
2193 
2194   IF(L_SHIPPING_NETWORK_CODE IS NOT NULL AND L_ISO_REQ_FLAG <> 1) THEN
2195     RAISE NO_ISO_ENABLED_NETWORK;
2196   END IF;
2197 
2198 
2199    -- Get the demand sub inventory code and locator id value
2200   BEGIN
2201     SELECT MILK.SUBINVENTORY_CODE
2202     INTO L_DEMAND_SUBINV_CODE--, L_DEMAND_LOCATOR_ID
2203     FROM AHL_VISITS_B AVB, MTL_ITEM_LOCATIONS_KFV MILK, AHL_SCHEDULE_MATERIALS ASM
2204     WHERE AVB.INV_LOCATOR_ID = MILK.INVENTORY_LOCATION_ID(+)
2205     AND ASM.VISIT_ID = AVB.VISIT_ID
2206     and ASM.SCHEDULED_MATERIAL_ID = P_SCH_MTL_ID;
2207   EXCEPTION
2208   WHEN NO_DATA_FOUND THEN
2209     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2210 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' No Sub Inventory and Locator details found for the visit. Set demand sub inv and locator value to null.');
2211     END IF;
2212     L_DEMAND_SUBINV_CODE := NULL;
2213     L_DEMAND_LOCATOR_ID := NULL;
2214   END;
2215 
2216   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2217     FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_DEMAND_SUBINV_CODE = ' || L_DEMAND_SUBINV_CODE);
2218   END IF;
2219 
2220 
2221   -- step 8 - insert the records into requisitions interface.
2222  IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2223 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Before inserting into requisitions interface.');
2224   END IF;
2225 
2226   INSERT
2227   INTO po_requisitions_interface_all
2228     (
2229       interface_source_code,       -- AHL
2230       destination_type_code,       -- INVENTORY
2231       authorization_status,        -- APPROVED
2232       PREPARER_ID,                 -- person id of the user name -- l_person_id
2233       quantity,                    -- The demand quantity
2234       DESTINATION_ORGANIZATION_ID, -- L_DEMAND_ORG_ID
2235       DESTINATION_SUBINVENTORY,    -- L_DEMAND_SUBINV_CODE
2236       deliver_to_location_id,      -- destination location id - Location attached through customer
2237       deliver_to_requestor_id,     -- l_person_id
2238       source_type_code,            -- INVENTORY
2239       category_id,                 -- null
2240       item_description,            -- l_item_descriptions(i)
2241       uom_code,                    -- l_uom_codes(i)
2242       unit_price,                  -- null
2243       need_by_date,                -- p_need_by_date
2244       wip_entity_id,               -- null
2245       wip_operation_seq_num,       -- null
2246       charge_account_id,           -- l_material_accounts(i),
2247       variance_account_id,         -- null
2248       item_id,                     -- l_inventory_item_ids(i)
2249       wip_resource_seq_num,        -- null
2250       suggested_vendor_id,         -- null
2251       suggested_vendor_name,       -- null
2252       suggested_vendor_site,       -- null
2253       suggested_vendor_phone,      -- null
2254       suggested_vendor_item_num,   -- null
2255       currency_code,               -- l_currency_code
2256       project_id,                  -- null
2257       task_id,                     -- null
2258       project_accounting_context,  -- null
2259       last_updated_by,             -- l_user_id
2260       last_update_date,            -- sysdate
2261       created_by,                  -- l_user_id
2262       creation_date,               -- sysdate
2263       org_id,                      -- p_destination_ous(i)
2264       REFERENCE_NUM,               -- p_destination_ous(i)
2265       interface_source_line_id,    -- p_product_txn_ids(1) -- sechedule_material_id
2266       source_organization_id
2267     ) -- p_source_orgs(i)
2268     VALUES
2269     (
2270       'AHL',
2271       'INVENTORY',
2272       'APPROVED',
2273       l_person_id,
2274       p_quantity,
2275       L_DEMAND_ORG_ID,
2276       L_DEMAND_SUBINV_CODE,
2277       l_destination_loc_id,
2278       l_person_id,
2279       'INVENTORY',
2280       NULL,
2281       l_item_description,
2282       l_uom_code,
2283       NULL,
2284       l_need_by_date,
2285       NULL,
2286       NULL,
2287       l_material_account,
2288       NULL,
2289       l_inventory_item_id,
2290       NULL,
2291       NULL,
2292       NULL,
2293       NULL,
2294       NULL,
2295       NULL,
2296       l_currency_code,
2297       NULL,
2298       NULL,
2299       NULL,
2300       fnd_global.user_id,
2301       sysdate,
2302       fnd_global.user_id,
2303       SYSDATE,
2304       l_destination_ou,
2305       NULL,
2306       l_product_txn_id,
2307       p_source_org
2308     );
2309   COMMIT;
2310 
2311 
2312   -- step 9 - Call the Requisition Import concurrent program to populate PO_REQUISTION_HEADERS_ALL and PO_REQUISITION_LINES_ALL table
2313   fnd_request.set_org_id (l_destination_ou ) ;
2314   L_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST ( 'PO', 'REQIMPORT', null, null, false,'AHL', null, 'ALL', null ,'N', 'Y' , CHR(0),
2315   null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2316   null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2317   null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2318   null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2319   null, null, null, null, null, null, null, null, null ) ;
2320   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2321 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_request_id for requistion import = ' || l_request_id);
2322   end if;
2323   COMMIT;
2324   l_success := fnd_concurrent.wait_for_request ( request_id => l_request_id, interval => 5, phase => x_phase, status => x_status, dev_phase => x_dev_phase, dev_status => x_dev_status, MESSAGE => x_message ) ;
2325 
2326   IF l_success            <> TRUE THEN
2327     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2328 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' Requisition Import failed ' || x_message);
2329     END IF;
2330     X_MSG_DATA		:= X_MESSAGE;
2331     RAISE CREATE_IR_EXC;
2332   END IF;
2333 
2334   -- Get the IR details
2335   BEGIN
2336     SELECT PRHA.SEGMENT1,         -- req num
2337       PRHA.REQUISITION_HEADER_ID, -- req hdr id
2338       PRLA.REQUISITION_LINE_ID    -- req line id
2339     INTO X_REQUISITION_NUM,
2340       X_REQUISITION_HDR_ID,
2341       X_REQUISITION_LINE_ID
2342     FROM PO_REQUISITION_HEADERS_ALL PRHA,
2343       PO_REQUISITION_LINES_ALL PRLA
2344     WHERE PRHA.REQUISITION_HEADER_ID = PRLA.REQUISITION_HEADER_ID
2345     AND INTERFACE_SOURCE_LINE_ID     = L_PRODUCT_TXN_ID;
2346   EXCEPTION
2347   WHEN NO_DATA_FOUND THEN
2348     RAISE CREATE_IR_EXC;
2349   END;
2350 
2351   -- update INTERFACE_SOURCE_LINE_ID to track which IR got created for which Scheduled material ID
2352   update PO_REQUISITION_HEADERS_ALL set INTERFACE_SOURCE_LINE_ID = P_SCH_MTL_ID where  REQUISITION_HEADER_ID = X_REQUISITION_HDR_ID;
2353 
2354 
2355   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2356 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'For Internal Requisition, x_requisition_num = ' || X_REQUISITION_NUM ||
2357                                                 ', x_requisition_hdr_id = ' || X_REQUISITION_HDR_ID ||
2358                                                   ', x_requisition_line_id = ' || X_REQUISITION_LINE_ID);
2359   END IF;
2360 
2361   -- step 10 - PO Create Internal Sales Order CP starts
2362   fnd_request.set_org_id ( l_destination_ou ) ;
2363   l_request_id := fnd_request.submit_request( 'PO', 'POCISO', NULL, NULL, FALSE );
2364   COMMIT;
2365   L_SUCCESS := FND_CONCURRENT.WAIT_FOR_REQUEST( REQUEST_ID => L_REQUEST_ID, INTERVAL => 3, PHASE => X_PHASE, STATUS => X_STATUS, DEV_PHASE => X_DEV_PHASE, DEV_STATUS => X_DEV_STATUS, MESSAGE => X_MESSAGE );
2366 
2367   IF l_success            <> TRUE THEN
2368     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2369 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' ISO creation failed ' || x_message);
2370     END IF;
2371     X_MSG_DATA		:= X_MESSAGE;
2372     RAISE CREATE_ISO_EXC;
2373   end if;
2374 
2375 
2376   -- step 11 - Order Entry Order Import CP starts
2377   FND_REQUEST.SET_ORG_ID ( L_DESTINATION_OU ) ;
2378   l_request_id := fnd_request.submit_request( 'ONT', 'OEOIMP', NULL, NULL, FALSE, l_destination_ou,10, x_requisition_hdr_id, NULL,'N',1,4,NULL,NULL,NULL,'Y','N','Y',fnd_global.org_id,'Y');
2379   COMMIT;
2380   -- wait for the ISO creation to complete.
2381   L_SUCCESS := FND_CONCURRENT.WAIT_FOR_REQUEST( REQUEST_ID => L_REQUEST_ID, INTERVAL => 3, PHASE => X_PHASE, STATUS => X_STATUS, DEV_PHASE => X_DEV_PHASE, DEV_STATUS => X_DEV_STATUS, MESSAGE => X_MESSAGE );
2382 
2383   IF l_success            <> TRUE THEN
2384     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2385 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' Order Import failed ' || x_message);
2386     END IF;
2387     X_MSG_DATA		:= X_MESSAGE;
2388     RAISE CREATE_ISO_EXC;
2389   end if;
2390 
2391   COMMIT;
2392 
2393   -- get the ISO details
2394   BEGIN
2395     SELECT OOHA.HEADER_ID, -- order header id
2396       OOHA.ORDER_NUMBER,   -- order number
2397       OOLA.LINE_ID         -- order line id
2398     INTO X_INT_ORDER_HDR_ID,
2399       X_INT_ORDER_NUM,
2400       X_INT_ORDER_LINE_ID
2401     FROM PO_REQUISITION_HEADERS_ALL PRHA,
2402       OE_ORDER_HEADERS_ALL OOHA,
2403       OE_ORDER_LINES_ALL OOLA
2404     WHERE PRHA.REQUISITION_HEADER_ID = X_REQUISITION_HDR_ID
2405     AND PRHA.REQUISITION_HEADER_ID   = OOLA.SOURCE_DOCUMENT_ID
2406     AND OOHA.HEADER_ID               = OOLA.HEADER_ID;
2407   EXCEPTION
2408   WHEN NO_DATA_FOUND THEN
2409     RAISE CREATE_ISO_EXC;
2410   END;
2411 
2412     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2413 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'For Internal Order Created, X_INT_ORDER_HDR_ID = ' || X_INT_ORDER_HDR_ID ||
2414                                                 ', X_INT_ORDER_LINE_ID = ' || X_INT_ORDER_LINE_ID ||
2415                                                   ', X_INT_ORDER_NUM = ' || X_INT_ORDER_NUM);
2416     end if;
2417 
2418     -- creating savepoint before creating reservation
2419     --savepoint CREATE_IR_RESERVATION;
2420 
2421 
2422   -- Create Reservation
2423   create_reservation_ir(
2424     P_SCHEDULED_MATERIAL_ID   => P_SCH_MTL_ID,
2425     P_INTERNAL_REQ_HDR_ID     => X_REQUISITION_HDR_ID,
2426     P_INTERNAL_REQ_LINE_ID    => X_REQUISITION_LINE_ID,
2427     P_REQUIRED_QUANTITY       => P_QUANTITY,
2428     X_RESERVATION_ID          => X_RESERVATION_ID,
2429     X_MSG_COUNT			          => X_MSG_COUNT,
2430     X_MSG_DATA				        => X_MSG_DATA,
2431 		x_return_status		        => X_RETURN_STATUS);
2432 
2433     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2434 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'For IR Reservation Created, X_RESERVATION_ID = ' || X_RESERVATION_ID ||
2435                                                 ', X_RETURN_STATUS = ' || X_RETURN_STATUS ||
2436                                                   ', X_INT_ORDER_NUM for int req = ' || X_INT_ORDER_NUM);
2437     end if;
2438 
2439     IF 	X_RETURN_STATUS <> G_RET_STS_SUCCESS
2440 		THEN
2441 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
2442 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' create reservation failed as: '|| X_MSG_DATA);
2443 			end if;
2444 			RAISE CREATE_IR_RSRV_EXC;
2445     end if;
2446 
2447 
2448   -- Insert details into AHL_MM_TXN_INTERFACE table
2449   --L_TRANSACTION_ID := AHL_MM_TXN_INTERFACE_S.CURRVAL;
2450   FORALL X IN P_FM_SERIAL_NUM_TBL.FIRST .. P_FM_SERIAL_NUM_TBL.LAST
2451   INSERT
2452   INTO AHL_MM_TXN_INTERFACE
2453     (
2454       TRANSACTION_ID,
2455       TXN_SOURCE_OBJECT_ID,
2456       TXN_SOURCE_TYPE,
2457       TXN_STATUS,
2458       RESERVATION_ID,
2459       SCHEDULED_MATERIAL_ID,
2460       SERIAL_NUMBER,
2461       ERROR_MESSAGE,
2462       PROCESSING_DATE
2463     )
2464     VALUES
2465     (
2466       AHL_MM_TXN_INTERFACE_S.NEXTVAL,
2467       X_REQUISITION_HDR_ID,
2468       'ISO',
2469       'S',
2470       X_RESERVATION_ID,
2471       P_SCH_MTL_ID,
2472       P_FM_SERIAL_NUM_TBL(X),
2473       NULL,
2474       SYSDATE
2475     );
2476 
2477   COMMIT;
2478 
2479 
2480   -- Call Pick release API to pick release and pick confirm the specifed serials
2481 
2482   -- create savepoint before pick release process
2483   --savepoint PERFORM_PICK_RELEASE;
2484 
2485   PICK_RELEASE(
2486 					 P_API_VERSION			    => 1.0,
2487 					 P_COMMIT				        => FND_API.G_FALSE,
2488 					 P_INIT_MSG_LIST		    => FND_API.G_TRUE,
2489 					 P_ORDER_HEADER_ID      => X_INT_ORDER_HDR_ID,
2490 					 P_ORDER_LINE_ID		    => X_INT_ORDER_LINE_ID,
2491 					 P_FM_SERIAL_NUM_TBL    => P_FM_SERIAL_NUM_TBL,
2492 					 P_TO_SERIAL_NUM_TBL	  => P_TO_SERIAL_NUM_TBL,
2493 					 P_QUANTITY_TBL			    => P_QUANTITY_TBL,
2494 					 P_PICKING_RULE_ID      => null, --l_order_rec.picking_rule_id,
2495 					 P_SOURCE_LOCATOR_TBL	  => P_SOURCE_LOCATOR_TBL,
2496            P_SOURCE_SUB_INV_TBL		=> P_SOURCE_SUB_INV_TBL,
2497 					 P_PICK_FROM_ORG		    => P_SOURCE_ORG,
2498 					 X_MSG_COUNT			      => X_MSG_COUNT,
2499 					 X_MSG_DATA				      => X_MSG_DATA,
2500 					 X_RETURN_STATUS		    => X_RETURN_STATUS
2501 					 );
2502 
2503 
2504     IF 	X_RETURN_STATUS <> G_RET_STS_SUCCESS
2505 	THEN
2506 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2507 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'Pick Release/Confirm failed as: '|| X_MSG_DATA);
2508 		END IF;
2509 
2510       L_ERROR_MESSAGE := X_MSG_DATA;
2511       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2512 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' L_ERROR_MESSAGE: '|| L_ERROR_MESSAGE);
2513 	  END IF;
2514 
2515       L_MM_TXN_INTERFACE_S_CURVAL := AHL_MM_TXN_INTERFACE_S.CURRVAL;
2516       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_PICK_REL_FAIL');
2517       FND_MESSAGE.SET_TOKEN('REQ_NUM',X_REQUISITION_NUM );
2518       FND_MESSAGE.SET_TOKEN('ISO_NUM',X_INT_ORDER_NUM );
2519       FND_MESSAGE.SET_TOKEN('RSRV_ID',X_RESERVATION_ID );
2520       L_ERROR_MESSAGE      := L_ERROR_MESSAGE || ' ' || FND_MESSAGE.GET();
2521 
2522       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2523 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' L_ERROR_MESSAGE: '|| L_ERROR_MESSAGE);
2524       end if;
2525 
2526       --UPDATE AHL_MM_TXN_INTERFACE SET TXN_STATUS = 'E' WHERE TRANSACTION_ID = L_TRANSACTION_ID;
2527       --FORALL X IN P_FM_SERIAL_NUM_TBL.FIRST .. P_FM_SERIAL_NUM_TBL.LAST
2528       UPDATE AHL_MM_TXN_INTERFACE
2529       SET TXN_STATUS = 'E', ERROR_MESSAGE = L_ERROR_MESSAGE
2530       WHERE TRANSACTION_ID BETWEEN (L_MM_TXN_INTERFACE_S_CURVAL - P_QUANTITY + 1) AND L_MM_TXN_INTERFACE_S_CURVAL;
2531 
2532       COMMIT;
2533 
2534 	  RAISE PICK_REL_EXC;
2535     END IF;
2536 
2537 
2538 	IF fnd_api.to_boolean(p_commit)
2539     THEN
2540       COMMIT;
2541     END IF;
2542 
2543 
2544     EXCEPTION
2545 
2546     WHEN NO_CUST_ASSOC THEN
2547     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2548         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'NO_CUST_ASSOC block, Internal customer not defined or not associated to internal location');
2549       END IF;
2550       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_IR_NO_CUST_ASSOC');
2551       FND_MSG_PUB.ADD;
2552       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2553                                P_DATA    => X_MSG_DATA,
2554                                P_ENCODED => FND_API.G_FALSE);
2555       X_RETURN_STATUS := G_RET_STS_ERROR;
2556 
2557       WHEN NO_SHIPPING_NETWORK THEN
2558     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2559         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'NO_SHIPPING_NETWORK block, Shipping network not defined for the org.');
2560       END IF;
2561       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_NO_SHIPPING_NETWORK');
2562       FND_MSG_PUB.ADD;
2563       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2564                                P_DATA    => X_MSG_DATA,
2565                                P_ENCODED => FND_API.G_FALSE);
2566       X_RETURN_STATUS := G_RET_STS_ERROR;
2567 
2568     WHEN NO_ISO_ENABLED_NETWORK THEN
2569     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2570         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'NO_ISO_ENABLED_NETWORK block, Internal Order Enabled flag not selected');
2571       END IF;
2572       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_NO_ISO_ENABLED_NETWORK');
2573       FND_MSG_PUB.ADD;
2574       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2575                                P_DATA    => X_MSG_DATA,
2576                                P_ENCODED => FND_API.G_FALSE);
2577       X_RETURN_STATUS := G_RET_STS_ERROR;
2578 
2579     WHEN CREATE_IR_EXC THEN
2580       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2581         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'CREATE_IR_EXC block, add error message AHL_MM_IR_CREATION_ERR');
2582       END IF;
2583       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_IR_CREATION_ERR');
2584       FND_MSG_PUB.ADD;
2585       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2586                                P_DATA    => X_MSG_DATA,
2587                                p_encoded => fnd_api.g_false);
2588       X_RETURN_STATUS := G_RET_STS_ERROR;
2589       --rollback to RELEASE_SALESORDER;
2590 
2591     WHEN CREATE_ISO_EXC THEN
2592       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2593         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'CREATE_ISO_EXC block, add error message AHL_MM_ISO_CREATION_ERR');
2594       END IF;
2595       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_ISO_CREATION_ERR');
2596       FND_MSG_PUB.ADD;
2597       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2598                                P_DATA    => X_MSG_DATA,
2599                                p_encoded => fnd_api.g_false);
2600       X_RETURN_STATUS := G_RET_STS_ERROR;
2601       --rollback to RELEASE_SALESORDER;
2602 
2603     when CREATE_IR_RSRV_EXC then
2604       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2605         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'CREATE_IR_RSRV_EXC, For IR Reservation Created, X_REQUISITION_NUM = ' || X_REQUISITION_NUM
2606                                                 || ', X_INT_ORDER_NUM for int req = ' || X_INT_ORDER_NUM || ', X_RESERVATION_ID for int req = ' || X_RESERVATION_ID);
2607       END IF;
2608       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_IR_RSRV_ERR');
2609       FND_MESSAGE.SET_TOKEN('REQ_NUM',X_REQUISITION_NUM );
2610       FND_MESSAGE.SET_TOKEN('ISO_NUM',X_INT_ORDER_NUM );
2611       FND_MSG_PUB.ADD;
2612       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2613                                P_DATA    => X_MSG_DATA,
2614                                p_encoded => fnd_api.g_false);
2615       X_RETURN_STATUS := G_RET_STS_ERROR;
2616       --rollback to CREATE_IR_RESERVATION;
2617 
2618     WHEN PICK_REL_EXC THEN
2619       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2620         FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'PICK_REL_EXC, For IR Reservation Created, X_REQUISITION_NUM = ' || X_REQUISITION_NUM
2621                                                 || ', X_INT_ORDER_NUM for int req = ' || X_INT_ORDER_NUM || ', X_RESERVATION_ID for int req = ' || X_RESERVATION_ID);
2622       END IF;
2623       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_PICK_REL_FAIL');
2624       FND_MESSAGE.SET_TOKEN('REQ_NUM',X_REQUISITION_NUM );
2625       FND_MESSAGE.SET_TOKEN('ISO_NUM',X_INT_ORDER_NUM );
2626       FND_MESSAGE.SET_TOKEN('RSRV_ID',X_RESERVATION_ID );
2627       FND_MSG_PUB.ADD;
2628       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2629                                P_DATA    => X_MSG_DATA,
2630                                p_encoded => fnd_api.g_false);
2631       X_RETURN_STATUS := G_RET_STS_ERROR;
2632       --rollback to PERFORM_PICK_RELEASE;
2633 
2634     when OTHERS then
2635       FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_UNKNOWN_ERR');
2636       FND_MSG_PUB.COUNT_AND_GET(P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA);
2637       X_RETURN_STATUS := G_RET_STS_ERROR;
2638       FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
2639                                P_DATA    => X_MSG_DATA,
2640                                p_encoded => fnd_api.g_false);
2641       --rollback to PERFORM_PICK_RELEASE;
2642       --rollback to CREATE_IR_RESERVATION;
2643 
2644 
2645 END CREATE_INTERNAL_ORDER;
2646 
2647 ---------------------------------------------------------------------------------------------------------
2648 -- SANSATPA:: Adding the following procedure for creating reservation for Internal Sales Orders
2649 ---------------------------------------------------------------------------------------------------------
2650 -----------------------
2651 -- Define procedures --
2652 -----------------------
2653 --  Start of Comments  --
2654 --
2655 --  Procedure name      : CREATE_RESERVATION_IR
2656 --  Type                : Private
2657 --  Description         : This procedure is called for creating reservation against the IR.
2658 --  Pre-reqs            :
2659 --
2660 --
2661 --  Standard OUT Parameters :
2662 --      x_return_status     VARCHAR2                                        Required
2663 --      x_msg_count         NUMBER                                          Required
2664 --      x_msg_data          VARCHAR2                                        Required
2665 --
2666 --  Procedure --  IN Parameters :
2667 --       P_SCH_MTL_ID NUMBER, Required
2668 --       P_INTERNAL_REQ_HDR_ID       NUMBER, Required: The IR header Id
2669 --       P_INTERNAL_REQ_LINE_ID NUMBER, Required: The IR line Id
2670 --       P_REQUIRED_QUANTITY NUMBER, Required: The quantity to be reserved
2671 --
2672 --  Procedure --  OUT Parameters :
2673 --       X_RESERVATION_ID          NUMBER: The Reservation Id
2674 --
2675 --  End of Comments  --
2676 PROCEDURE CREATE_RESERVATION_IR(
2677     P_SCHEDULED_MATERIAL_ID IN NUMBER,
2678     P_INTERNAL_REQ_HDR_ID   IN NUMBER,
2679     P_INTERNAL_REQ_LINE_ID  IN NUMBER,
2680     P_REQUIRED_QUANTITY     IN NUMBER,
2681     X_RESERVATION_ID OUT NOCOPY NUMBER,
2682     X_MSG_COUNT OUT NOCOPY      NUMBER,
2683     X_MSG_DATA OUT NOCOPY       VARCHAR2,
2684     X_RETURN_STATUS OUT NOCOPY  VARCHAR2)
2685 IS
2686   l_rsv_rec AHL_MM_RESERVATIONS_PVT.mtl_reservation_rec_type;
2687   L_SERIAL_NUMBER_TBL AHL_MM_RESERVATIONS_PVT.SERIAL_NUMBER_TBL_TYPE;
2688   --L_RESERVATION_ID NUMBER;
2689   l_return_status       VARCHAR2(1);
2690   L_MSG_COUNT           NUMBER;
2691   L_MSG_INDEX_OUT       NUMBER;
2692   L_MSG_DATA            VARCHAR2(2000);
2693 
2694   l_api_name            CONSTANT VARCHAR2(80) := 'AHL_MM_MTL_MGT_PVT.CREATE_RESERVATION_IR';
2695 
2696 BEGIN
2697 
2698   L_RSV_REC.DEMAND_SOURCE_LINE_DETAIL    := P_SCHEDULED_MATERIAL_ID; --<SCHEDULED_MATERIAL_ID from AHL_SCHEDULE_MATERIALS>
2699   l_rsv_rec.supply_source_type_id        := inv_reservation_global.g_source_type_internal_req;
2700   l_rsv_rec.supply_source_header_id      := p_internal_req_hdr_id;
2701   L_RSV_REC.SUPPLY_SOURCE_LINE_ID        := P_INTERNAL_REQ_LINE_ID;
2702   L_RSV_REC.SUPPLY_SOURCE_LINE_DETAIL    := NULL;
2703   L_RSV_REC.PRIMARY_RESERVATION_QUANTITY := P_REQUIRED_QUANTITY;
2704 
2705   AHL_MM_RESERVATIONS_PVT.CREATE_RESERVATION(
2706                                           p_api_version              => 1.0,
2707                                           p_init_msg_list            => 'F',
2708                                           p_commit                   => 'T',
2709                                           p_validation_level         => FND_API.G_VALID_LEVEL_FULL, -- the validation level
2710                                           p_module_type              => 'OAF',
2711                                           x_return_status            => X_RETURN_STATUS,
2712                                           x_msg_count                => X_MSG_COUNT,
2713                                           X_MSG_DATA                 => X_MSG_DATA,
2714                                           P_RSV_REC		               =>	l_rsv_rec,
2715                                           p_serial_number_tbl        => l_serial_number_tbl,
2716                                           X_RESERVATION_ID	         => x_reservation_id);
2717 
2718   IF 	X_RETURN_STATUS <> G_RET_STS_SUCCESS
2719 		THEN
2720 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2721 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'create reservation failed as: '|| X_MSG_DATA);
2722 			END IF;
2723 			RAISE fnd_api.g_exc_error;
2724   end if;
2725 
2726 
2727 
2728   EXCEPTION
2729 	WHEN fnd_api.g_exc_error
2730 	THEN
2731 		x_return_status := G_RET_STS_ERROR;
2732 		FND_MSG_PUB.COUNT_AND_GET(P_COUNT => X_MSG_COUNT,
2733                               p_data  => x_msg_data);
2734 
2735   --commit;
2736 
2737 END CREATE_RESERVATION_IR;
2738 
2739 
2740 ---------------------------------------------------------------------------------------------------------
2741 -- SANSATPA:: Adding the following procedure for pick releasing the selected serials
2742 ---------------------------------------------------------------------------------------------------------
2743 -----------------------
2744 -- Define procedures --
2745 -----------------------
2746 --  Start of Comments  --
2747 --
2748 --  Procedure name      : PICK_RELEASE
2749 --  Type                : Private
2750 --  Description         : This procedure is called for creating Internal Sales Orders.
2751 --  Pre-reqs            :
2752 --
2753 --  Standard IN  Parameters :
2754 --      p_api_version       NUMBER      := 1.0
2755 --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
2756 --      p_commit            VARCHAR2    := FND_API.G_FALSE
2757 --
2758 --  Standard OUT Parameters :
2759 --      x_return_status     VARCHAR2                                        Required
2760 --      x_msg_count         NUMBER                                          Required
2761 --      x_msg_data          VARCHAR2                                        Required
2762 --
2763 --
2764 --  Procedure --  IN Parameters :
2765 --       P_ORDER_HEADER_ID NUMBER, Required: ISO header ID
2766 --       P_ORDER_LINE_ID NUMBER, Required: ISO line ID
2767 --       P_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The serial numbers list
2768 --       P_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The serial numbers list
2769 --       P_QUANTITY_TBL OAF_VARCHAR2_TABLE_100, Required: Quantity for serial range (default values as 1)
2770 --       P_PICKING_RULE_ID NUMBER, Optional: The picking Rule ID
2771 --       P_SOURCE_LOCATOR_TBL OAF_NUMBER_TABLE, Optional: The source locator list for the picked serials
2772 --       P_SOURCE_SUB_INV_TBL OAF_VARCHAR2_TABLE_100, Optional: The source sub inv list for the picked serials
2773 --       P_PICK_FROM_ORG NUMBER, Optional: The supply org
2774 --  Procedure --  OUT Parameters :
2775 --
2776 --
2777 --  End of Comments  --
2778 PROCEDURE PICK_RELEASE(
2779     P_API_VERSION        IN NUMBER,
2780     P_INIT_MSG_LIST      IN VARCHAR2 DEFAULT FND_API.G_FALSE,
2781     P_COMMIT             IN VARCHAR2 DEFAULT FND_API.G_FALSE,
2782     P_ORDER_HEADER_ID    IN NUMBER, -- the ISO header is
2783     P_ORDER_LINE_ID      IN NUMBER, -- the iso line id
2784     P_FM_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
2785     P_TO_SERIAL_NUM_TBL  IN OAF_VARCHAR2_TABLE_100,
2786     P_QUANTITY_TBL       IN OAF_NUMBER_TABLE,                    -- The total quantity of serials present is serial tables passed
2787     P_PICKING_RULE_ID    IN NUMBER DEFAULT NULL,                 -- If not pass the required details
2788     P_SOURCE_LOCATOR_TBL IN OAF_NUMBER_TABLE DEFAULT NULL,       -- the supply Locator
2789     P_SOURCE_SUB_INV_TBL IN OAF_VARCHAR2_TABLE_100 DEFAULT NULL, -- the Supply Sub inventory
2790     P_PICK_FROM_ORG      IN NUMBER DEFAULT NULL,                 -- the supply org
2791     X_MSG_COUNT OUT NOCOPY     NUMBER,
2792     X_MSG_DATA OUT NOCOPY      VARCHAR2,
2793     X_RETURN_STATUS OUT NOCOPY VARCHAR2 )
2794 
2795 IS
2796 
2797 L_API_NAME CONSTANT VARCHAR2(80)               := 'AHL_MM_MTL_MGT_PVT.PICK_RELEASE';
2798 L_SOURCE_SUB_INV_TBL OAF_VARCHAR2_TABLE_100    := OAF_VARCHAR2_TABLE_100();
2799 L_SOURCE_LOCATOR_TBL OAF_NUMBER_TABLE          := OAF_NUMBER_TABLE();
2800 L_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100     := OAF_VARCHAR2_TABLE_100();
2801 L_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100     := OAF_VARCHAR2_TABLE_100();
2802 L_CUR_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100 := OAF_VARCHAR2_TABLE_100();
2803 L_CUR_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100 := OAF_VARCHAR2_TABLE_100();
2804 L_QUANTITY_TBL OAF_NUMBER_TABLE                := OAF_NUMBER_TABLE();
2805 L_CURRENT_SUPPLY_SUB_INV VARCHAR2(10);
2806 L_CURRENT_SUPPLY_LOCATOR NUMBER;
2807 J                        NUMBER;
2808 
2809 BEGIN
2810 
2811   L_SOURCE_SUB_INV_TBL := P_SOURCE_SUB_INV_TBL;
2812   L_SOURCE_LOCATOR_TBL := P_SOURCE_LOCATOR_TBL;
2813   L_CUR_FM_SERIAL_NUM_TBL := P_FM_SERIAL_NUM_TBL;
2814   L_CUR_TO_SERIAL_NUM_TBL := P_TO_SERIAL_NUM_TBL;
2815 
2816 
2817   LOOP
2818 
2819     J             := 1;
2820     L_CURRENT_SUPPLY_SUB_INV := L_SOURCE_SUB_INV_TBL(L_SOURCE_SUB_INV_TBL.FIRST);
2821     L_CURRENT_SUPPLY_LOCATOR := L_SOURCE_LOCATOR_TBL(L_SOURCE_LOCATOR_TBL.FIRST);
2822     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2823 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
2824 					' L_CURRENT_SUPPLY_SUB_INV - ' || L_CURRENT_SUPPLY_SUB_INV ||
2825           ', L_CURRENT_SUPPLY_LOCATOR - ' || L_CURRENT_SUPPLY_LOCATOR ||
2826 					', L_SOURCE_SUB_INV_TBL size - ' || L_SOURCE_SUB_INV_TBL.COUNT);
2827 		  END IF;
2828 
2829     FOR I IN L_SOURCE_SUB_INV_TBL.FIRST .. L_SOURCE_SUB_INV_TBL.LAST
2830 		LOOP
2831       BEGIN
2832 
2833       IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2834         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME , '------------------------------------------');
2835       END IF;
2836 
2837         IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2838           FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
2839                         ' CURRENT_SUPPLY_SUB_INV - ' || L_SOURCE_SUB_INV_TBL(I) ||
2840                         ' CURRENT_SUPPLY_LOCATOR - ' || L_SOURCE_LOCATOR_TBL(I));
2841         END IF;
2842 
2843         IF(L_CURRENT_SUPPLY_SUB_INV = L_SOURCE_SUB_INV_TBL(I)) THEN
2844             IF(L_CURRENT_SUPPLY_LOCATOR = L_SOURCE_LOCATOR_TBL(I)) THEN
2845 
2846                 L_FM_SERIAL_NUM_TBL.EXTEND;
2847                 L_TO_SERIAL_NUM_TBL.EXTEND;
2848                 L_QUANTITY_TBL.EXTEND;
2849                 L_FM_SERIAL_NUM_TBL(J) := L_CUR_FM_SERIAL_NUM_TBL(I);
2850                 L_TO_SERIAL_NUM_TBL(J) := L_CUR_TO_SERIAL_NUM_TBL(I);
2851                 L_QUANTITY_TBL(J) := 1;
2852                 J := J + 1;
2853 
2854                 L_SOURCE_SUB_INV_TBL.DELETE(I);
2855                 L_SOURCE_LOCATOR_TBL.DELETE(I);
2856                 L_CUR_FM_SERIAL_NUM_TBL.DELETE(I);
2857                 L_CUR_TO_SERIAL_NUM_TBL.DELETE(I);
2858 
2859             END IF;
2860         END IF;
2861 
2862       EXCEPTION
2863               when no_data_found then
2864               IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2865                 FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
2866                   ' Supply Sub Inv data missing from table as already removed');
2867               END IF;
2868 
2869       END; -- End to begin
2870 
2871     END LOOP; -- End to for loop
2872 
2873     FOR K IN 1 .. L_FM_SERIAL_NUM_TBL.COUNT
2874 		LOOP
2875 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2876 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME ,
2877 					' L_FM_SERIAL_NUM_TBL(' || K || ') - ' || L_FM_SERIAL_NUM_TBL(K) ||
2878 					' L_TO_SERIAL_NUM_TBL(' || K || ') - ' || L_TO_SERIAL_NUM_TBL(K) ||
2879 					' L_QUANTITY_TBL(' || K || ') - ' || L_QUANTITY_TBL(K));
2880       END IF;
2881 
2882 		END LOOP;
2883 
2884     PICK_RELEASE_CONFIRM(
2885 					 P_API_VERSION			    => 1.0,
2886 					 P_COMMIT				        => FND_API.G_FALSE,
2887 					 P_INIT_MSG_LIST		    => FND_API.G_TRUE,
2888 					 P_ORDER_HEADER_ID      => P_ORDER_HEADER_ID,
2889 					 P_ORDER_LINE_ID		    => P_ORDER_LINE_ID,
2890 					 P_FM_SERIAL_NUM_TBL    => L_FM_SERIAL_NUM_TBL,
2891 					 P_TO_SERIAL_NUM_TBL	  => L_TO_SERIAL_NUM_TBL,
2892 					 P_QUANTITY_TBL			    => L_QUANTITY_TBL,
2893 					 P_PICKING_RULE_ID      => null, --l_order_rec.picking_rule_id,
2894 					 P_PICK_from_locator	  => L_CURRENT_SUPPLY_LOCATOR,
2895            P_PICK_FROM_SUBINV		  => L_CURRENT_SUPPLY_SUB_INV,
2896 					 P_PICK_FROM_ORG		    => P_PICK_FROM_ORG,
2897 					 X_MSG_COUNT			      => X_MSG_COUNT,
2898 					 X_MSG_DATA				      => X_MSG_DATA,
2899 					 X_RETURN_STATUS		    => X_RETURN_STATUS
2900 					 );
2901 
2902     -- Delete the local table data
2903 		L_FM_SERIAL_NUM_TBL.DELETE;
2904     L_TO_SERIAL_NUM_TBL.DELETE;
2905     L_QUANTITY_TBL.DELETE;
2906 
2907     /*IF 	X_RETURN_STATUS <> G_RET_STS_SUCCESS
2908 		THEN
2909 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
2910 			FND_LOG.STRING( l_log_statement, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'Pick Release/Confirmation failed as: '|| L_MSG_DATA);
2911 			end if;
2912 			RAISE PICK_REL_EXC;
2913     end if;*/
2914 
2915   EXIT
2916 			WHEN L_SOURCE_SUB_INV_TBL.COUNT < 1;
2917 
2918 	END LOOP; -- end to loop
2919 
2920 
2921 END PICK_RELEASE;
2922 
2923 
2924 ---------------------------------------------------------------------------------------------------------
2925 -- SANSATPA:: Adding the following procedure for pick releasing the selected serials
2926 ---------------------------------------------------------------------------------------------------------
2927 -----------------------
2928 -- Define procedures --
2929 -----------------------
2930 --  Start of Comments  --
2931 --
2932 --  Procedure name      : PICK_RELEASE_CONFIRM
2933 --  Type                : Private
2934 --  Description         : This procedure is called for creating Internal Sales Orders.
2935 --  Pre-reqs            :
2936 --
2937 --  Standard IN  Parameters :
2938 --      p_api_version       NUMBER      := 1.0
2939 --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
2940 --      p_commit            VARCHAR2    := FND_API.G_FALSE
2941 --
2942 --  Standard OUT Parameters :
2943 --      x_return_status     VARCHAR2                                        Required
2944 --      x_msg_count         NUMBER                                          Required
2945 --      x_msg_data          VARCHAR2                                        Required
2946 --
2947 --
2948 --  Procedure --  IN Parameters :
2949 --       P_ORDER_HEADER_ID NUMBER, Required: ISO header ID
2950 --       P_ORDER_LINE_ID NUMBER, Required: ISO line ID
2951 --       P_FM_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The serial numbers list
2952 --       P_TO_SERIAL_NUM_TBL OAF_VARCHAR2_TABLE_100, Required: The serial numbers list
2953 --       P_QUANTITY_TBL OAF_VARCHAR2_TABLE_100, Required: Quantity for serial range (default values as 1)
2954 --       P_PICKING_RULE_ID NUMBER, Optional: The picking Rule ID
2955 --       P_SOURCE_LOCATOR NUMBER, Optional: The source locator for the picked serials
2956 --       P_SOURCE_SUB_INV NUMBER, Optional: The source sub inv for the picked serials
2957 --       P_PICK_FROM_ORG NUMBER, Optional: The supply org
2958 --
2959 --  Procedure --  OUT Parameters :
2960 --
2961 --
2962 --  End of Comments  --
2963 PROCEDURE PICK_RELEASE_CONFIRM(
2964     P_API_VERSION       IN NUMBER,
2965     P_INIT_MSG_LIST     IN VARCHAR2 DEFAULT FND_API.G_FALSE,
2966     P_COMMIT            IN VARCHAR2 DEFAULT FND_API.G_FALSE,
2967     P_ORDER_HEADER_ID   IN NUMBER, -- the ISO header is
2968     P_ORDER_LINE_ID     IN NUMBER, -- the iso line id
2969     P_FM_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
2970     P_TO_SERIAL_NUM_TBL IN OAF_VARCHAR2_TABLE_100,
2971     --P_IS_SN_RANGE       IN VARCHAR2 DEFAULT NULL, -- if serial numbers are in range -- not used now
2972     --P_IS_RESERVABLE     IN VARCHAR2 DEFAULT NULL, -- not used now
2973     --P_LOT_NUM           IN VARCHAR2 DEFAULT NULL, -- not used now, used when an itme is both lot and serial controlled item
2974     --P_REV               IN VARCHAR2 DEFAULT NULL, -- item revision -- not used now
2975     P_QUANTITY_TBL      IN OAF_NUMBER_TABLE,      -- The total quantity of serials present is serial tables passed
2976     P_PICKING_RULE_ID   IN NUMBER DEFAULT NULL,   -- If not pass the required details
2977     P_PICK_FROM_LOCATOR IN NUMBER DEFAULT NULL,   -- the supply Locator
2978     P_PICK_FROM_SUBINV    IN VARCHAR2 DEFAULT NULL, -- the Supply Sub inventory
2979     P_PICK_FROM_ORG     IN NUMBER DEFAULT NULL,   -- the supply org
2980     X_MSG_COUNT OUT NOCOPY     NUMBER,
2981     X_MSG_DATA OUT NOCOPY      VARCHAR2,
2982     X_RETURN_STATUS OUT NOCOPY VARCHAR2 )
2983 IS
2984 l_api_version          CONSTANT NUMBER := 1.0;
2985 L_API_NAME				varchar2(80) := 'AHL_MM_MTL_MGT_PVT.PICK_RELEASE_CONFIRM';
2986 L_PICKING_RULE_ID NUMBER DEFAULT NULL;
2987 l_batch_rec   			WSH_PICKING_BATCHES_PUB.batch_info_rec;
2988 l_order_type_id			NUMBER;
2989 l_customer_id			NUMBER;
2990 l_document_set_id		NUMBER;
2991 lc_batch_prefix 		CONSTANT VARCHAR2(5) := 'DR';
2992 l_batch_name      		VARCHAR2(30);
2993 l_move_order_hdr_id     NUMBER;
2994 l_reservable_flag		VARCHAR2(2);
2995 l_reservation_id		NUMBER;
2996 l_item_id 				NUMBER;
2997 l_org_id				NUMBER;
2998 l_mmtt_temp_id			NUMBER;
2999 L_FM_SERIAL_NUMBER		OAF_VARCHAR2_TABLE_100;
3000 L_TO_SERIAL_NUMBER      OAF_VARCHAR2_TABLE_100;
3001 l_move_order_line_id	NUMBER;
3002 l_delivery_status		VARCHAR2(2);
3003 l_delivery_detail_id	NUMBER;
3004 l_delivery_detail_id_new NUMBER;
3005 l_picked_qty			NUMBER;
3006 l_order_line_id 		NUMBER := p_order_line_id;
3007 l_requested_qty			NUMBER;
3008 l_picking_qty			NUMBER := 0;
3009 l_transaction_uom		VARCHAR2(10);
3010 i						NUMBER;
3011 j						NUMBER;
3012 l_dummy					VARCHAR2(1) := 'N';
3013 x_batch_id 				NUMBER;
3014 x_request_id			NUMBER;
3015 x_success				NUMBER;
3016 x_number_of_rows		NUMBER;
3017 x_detailed_qty			NUMBER;
3018 x_detailed_qty2			NUMBER;
3019 x_revision				VARCHAR2(3);
3020 x_locator_id			NUMBER;
3021 x_transfer_to_location 	NUMBER;
3022 x_lot_number			VARCHAR2(30);
3023 x_expiration_date		DATE;
3024 x_record_id				NUMBER;
3025 
3026 l_trolin_tbl            inv_move_order_pub.trolin_tbl_type;
3027 l_mold_tbl			    inv_mo_line_detail_util.g_mmtt_tbl_type;
3028 x_mmtt_tbl      	    inv_mo_line_detail_util.g_mmtt_tbl_type;
3029 x_trolin_tbl            inv_move_order_pub.trolin_tbl_type;
3030 
3031 INVALID_PICK_RULE EXCEPTION;
3032 INVALID_DELIVERY_DETAIL EXCEPTION;
3033 CREATE_BATCH			EXCEPTION;
3034 RELEASE_BATCH			EXCEPTION;
3035 ALLOCATION_ERROR		EXCEPTION;
3036 
3037 cursor GET_INIT_SERIAL_ALLOC(P_MMTT_TEMP_ID number) is
3038 select FM_SERIAL_NUMBER, TO_SERIAL_NUMBER from MTL_SERIAL_NUMBERS_TEMP
3039 where transaction_temp_id = p_mmtt_temp_id;
3040 
3041 BEGIN
3042 	IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3043 	       fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'Begin API');
3044 	END IF;
3045 
3046 	-- standard check for API compatibility.
3047 	IF NOT Fnd_Api.Compatible_API_Call
3048 				(l_api_version,
3049 				 p_api_version,
3050 				 l_api_name,
3051 				 G_PKG_NAME)
3052 	THEN
3053 		RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3054 	END IF;
3055 
3056 	IF fnd_api.to_boolean(p_init_msg_list)
3057 	THEN
3058 		fnd_msg_pub.initialize;
3059 	END IF;
3060 
3061 	x_return_status := G_RET_STS_SUCCESS;
3062 
3063 	SAVEPOINT RELEASE_SALESORDER;
3064 
3065 
3066   L_PICKING_RULE_ID := p_picking_rule_id;
3067   IF p_picking_rule_id IS NULL OR p_picking_rule_id = 0 THEN
3068     -- get the default picking rule id.
3069     FND_PROFILE.GET('AHL_DEF_PICK_RELEASE_RULE', L_PICKING_RULE_ID);
3070   END IF;
3071 
3072   IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3073     FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'L_PICKING_RULE_ID = ' || L_PICKING_RULE_ID);
3074   END IF;
3075 
3076   IF L_PICKING_RULE_ID IS NULL OR L_PICKING_RULE_ID = 0 THEN
3077     RAISE INVALID_PICK_RULE;
3078   END IF;
3079 
3080 
3081 	-- get the delivery line status.
3082   BEGIN
3083 	SELECT released_status,requested_quantity,requested_quantity_uom,delivery_detail_id
3084 	INTO l_delivery_status,l_requested_qty,l_transaction_uom,l_delivery_detail_id
3085 	FROM WSH_DELIVERY_DETAILS
3086 	WHERE SOURCE_HEADER_ID = P_ORDER_HEADER_ID
3087   and released_status not in ('S', 'Y', 'C');
3088   EXCEPTION
3089 		WHEN NO_DATA_FOUND THEN
3090 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3091 				FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' No delivery details found');
3092 			end if;
3093       RAISE INVALID_DELIVERY_DETAIL;
3094 	END;
3095 
3096 	/*-- requested quantity is the quantity available for transaction.*/
3097 
3098 	IF NOT (l_delivery_status = 'S' OR l_delivery_status = 'Y') THEN
3099   if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3100 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' L_DELIVERY_STATUS is = ' || L_DELIVERY_STATUS||
3101                                                                     ', l_delivery_detail_id = ' || L_DELIVERY_DETAIL_ID);
3102   end if;
3103 		-- fetch the customer details.
3104 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3105 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Fetching customer, order type and source document');
3106 		END IF;
3107 		SELECT sold_to_org_id,
3108 			   order_type_id,
3109 			   source_document_type_id
3110 		INTO   l_customer_id,
3111 			   l_order_type_id,
3112 			   l_document_set_id
3113 		FROM oe_order_headers_all
3114 		WHERE header_id = p_order_header_id;
3115 
3116 		-- get the defaults from picking rule.
3117 		-- Auto pick confirm flag will be always set to N in this API
3118 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3119 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Fetching picking defaults');
3120 		END IF;
3121 
3122 		SELECT NVL(document_set_id, l_document_set_id),
3123 			  'I',
3124 			  NVL(existing_rsvs_only_flag, 'N'),
3125 			  shipment_priority_code,
3126 			  p_order_header_id,
3127 			  l_delivery_detail_id,--NULL,
3128 			  l_order_type_id,
3129 			  NULL,
3130 			  l_customer_id,
3131 			  NULL,
3132 			  ship_method_code,
3133 			  NVL(P_PICK_FROM_SUBINV, PICK_FROM_SUBINVENTORY),
3134 			  nvl(P_PICK_FROM_LOCATOR, pick_from_locator_id),
3135 			  default_stage_subinventory,
3136 			  default_stage_locator_id,
3137 			  autodetail_pr_flag,
3138 			  'N',
3139 			  ship_set_number,
3140 			  NULL,
3141 			  NULL,
3142 			  NULL,
3143 			  NULL,
3144 			  NULL,
3145 			  pick_grouping_rule_id,
3146 			  pick_sequence_rule_id,
3147 			  NVL(p_pick_from_org, organization_id),
3148 			  project_id,
3149 			  task_id,
3150 			  include_planned_lines,
3151 			  autocreate_delivery_flag,
3152 			  allocation_method,
3153 			  l_delivery_detail_id
3154 		INTO  l_batch_rec.document_set_id,
3155 			  l_batch_rec.backorders_only_flag,
3156 			  l_batch_rec.existing_rsvs_only_flag,
3157 			  l_batch_rec.shipment_priority_code,
3158 			  l_batch_rec.order_header_id,
3159 			  l_batch_rec.delivery_detail_id,
3160 			  l_batch_rec.order_type_id,
3161 			  l_batch_rec.ship_from_location_id,
3162 			  l_batch_rec.customer_id,
3163 			  l_batch_rec.ship_to_location_id,
3164 			  l_batch_rec.ship_method_code,
3165 			  l_batch_rec.pick_from_subinventory,
3166 			  l_batch_rec.pick_from_locator_id,
3167 			  l_batch_rec.default_stage_subinventory,
3168 			  l_batch_rec.default_stage_locator_id,
3169 			  l_batch_rec.autodetail_pr_flag,
3170 			  l_batch_rec.auto_pick_confirm_flag,
3171 			  l_batch_rec.ship_set_number,
3172 			  l_batch_rec.inventory_item_id,
3173 			  l_batch_rec.from_requested_date,
3174 			  l_batch_rec.to_requested_date,
3175 			  l_batch_rec.from_scheduled_ship_date,
3176 			  l_batch_rec.to_scheduled_ship_date,
3177 			  l_batch_rec.pick_grouping_rule_id,
3178 			  l_batch_rec.pick_sequence_rule_id,
3179 			  l_batch_rec.organization_id,
3180 			  l_batch_rec.project_id,
3181 			  l_batch_rec.task_id,
3182 			  l_batch_rec.include_planned_lines,
3183 			  l_batch_rec.autocreate_delivery_flag,
3184 			  l_batch_rec.allocation_method,
3185 			  l_batch_rec.delivery_detail_id
3186 		from WSH_PICKING_RULES
3187 		WHERE PICKING_RULE_ID = l_picking_rule_id; -- value 628
3188 
3189     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3190       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.backorders_only_flag ' || l_batch_rec.backorders_only_flag);
3191       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.existing_rsvs_only_flag ' || l_batch_rec.existing_rsvs_only_flag);
3192       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.customer_id ' || l_batch_rec.customer_id);
3193       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.order_header_id ' || l_batch_rec.order_header_id);
3194       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.from_scheduled_ship_date ' || l_batch_rec.from_scheduled_ship_date);
3195       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.organization_id ' || l_batch_rec.organization_id);
3196       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.include_planned_lines ' || l_batch_rec.include_planned_lines);
3197       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.autocreate_delivery_flag ' || l_batch_rec.autocreate_delivery_flag);
3198       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.autodetail_pr_flag ' || l_batch_rec.autodetail_pr_flag);
3199       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.allocation_method ' || l_batch_rec.allocation_method);
3200       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.pick_from_locator_id ' || l_batch_rec.pick_from_locator_id);
3201       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.auto_pick_confirm_flag ' || l_batch_rec.auto_pick_confirm_flag);
3202       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.autopack_flag  ' || l_batch_rec.autopack_flag );
3203       FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'l_batch_rec.pick_from_locator_id ' || L_BATCH_REC.PICK_FROM_LOCATOR_ID);
3204     END IF;
3205 		-- create the release batch.
3206 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3207 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Creating the release batch');
3208 		END IF;
3209 
3210 		WSH_PICKING_BATCHES_GRP.Create_Batch(
3211 								p_api_version_number => 1.0,
3212 								p_init_msg_list	     => fnd_api.g_false,
3213 								p_commit		     => fnd_api.g_false,
3214 								x_return_status	     => x_return_status,
3215 								x_msg_count		     => x_msg_count,
3216 								x_msg_data		     => x_msg_data,
3217 								p_rule_id		     => p_picking_rule_id,
3218 								p_rule_name		     => NULL,
3219 								p_batch_rec		     => l_batch_rec,
3220 								p_batch_prefix	     => lc_batch_prefix,
3221 								x_batch_id		     => x_batch_id
3222 								);
3223 
3224       if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3225         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' create batch x_return_status = ' || X_RETURN_STATUS ||
3226                                                         ', create batch x_batch_id = ' || X_BATCH_ID);
3227       end if;
3228 
3229 		IF NOT x_return_status = G_RET_STS_SUCCESS THEN
3230 			IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3231 				   fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'WSH_PICKING_BATCHES_GRP.Create_Batch has failed:'||x_msg_data);
3232 			END IF;
3233 			RAISE CREATE_BATCH;
3234 		END IF;
3235 
3236 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3237 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Created the release batch, calling release batch now');
3238 		END IF;
3239 
3240 		wsh_picking_batches_pub.Release_Batch(
3241 								p_api_version     => 1.0,
3242 								p_init_msg_list   => fnd_api.g_false,
3243 								p_commit          => fnd_api.g_false,
3244 								x_return_status   => x_return_status,
3245 								x_msg_count       => x_msg_count,
3246 								x_msg_data        => x_msg_data,
3247 								p_batch_id        => x_batch_id,
3248 								p_batch_name      => l_batch_name,
3249 								p_log_level       => NULL,
3250 								p_release_mode    => 'ONLINE',
3251 								X_REQUEST_ID      => X_REQUEST_ID
3252 								);
3253 
3254 
3255 		IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3256 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'after wsh_picking_batches_pub.Release_Batch, return status:'||x_return_status);
3257 		end if;
3258 
3259 		IF x_return_status = wsh_util_core.g_ret_sts_warning THEN
3260 			-- treat warning as success.
3261 			x_return_status := G_RET_STS_SUCCESS;
3262 		END IF;
3263 
3264 		IF x_return_status = G_RET_STS_ERROR THEN
3265 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3266 			FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Release batch is failed!');
3267 			END IF;
3268 			RAISE RELEASE_BATCH;
3269 		END IF;
3270 	END IF;
3271 
3272    -- the batch is released. Check if the allocation is automatically created. If not, need to create
3273    -- allocation.
3274    IF NOT l_delivery_status = 'Y' THEN
3275 	   BEGIN
3276 			IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3277         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Getting allocations if any for order header id:'||p_order_header_id || ' and delivery_detail_id:' || l_delivery_detail_id);
3278 			END IF;
3279 
3280 			SELECT mtrh.header_id,mmtt.transaction_temp_id,
3281 				  mtrl.line_id,wdd.delivery_detail_id
3282 			INTO l_move_order_hdr_id,l_mmtt_temp_id,
3283 				l_move_order_line_id,G_DELIVERY_DETAIL_ID
3284 			FROM wsh_delivery_details wdd,
3285 				mtl_txn_request_headers mtrh,
3286 				mtl_txn_request_lines mtrl,
3287 				mtl_material_transactions_temp mmtt
3288 			WHERE wdd.source_header_id = p_order_header_id
3289 			AND  wdd.move_order_line_id = mtrl.line_id
3290 			AND  mtrl.header_id       = mtrh.header_id
3291 			AND  MTRL.LINE_ID		  = MMTT.MOVE_ORDER_LINE_ID(+)
3292       AND  wdd.delivery_detail_id = l_delivery_detail_id;
3293 
3294 	  if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3295         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' Fetched move order header id '||L_MOVE_ORDER_HDR_ID ||
3296                                                                               ' Fetched l_mmtt_temp_id '||l_mmtt_temp_id);
3297     end if;
3298 
3299 		EXCEPTION
3300 			WHEN no_data_found THEN
3301 				if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3302           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'No allocations were found!');
3303 				END IF;
3304 				l_move_order_hdr_id := 0;
3305 		END;
3306 
3307 		IF NVL(l_mmtt_temp_id,0) = 0 THEN
3308 			-- we would need to create the allocation here. We make use of inv_replenish_detail_pub.line_details
3309 			-- to create the allocations.
3310 			SELECT wdd.move_order_line_id
3311 			INTO l_move_order_line_id
3312 			FROM wsh_delivery_details wdd
3313 			WHERE wdd.source_header_id = p_order_header_id;
3314 
3315 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3316         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Creating the allocations for move line id'||l_move_order_line_id);
3317 			END IF;
3318 
3319       IF not NVL(l_move_order_line_id,0) = 0 THEN
3320           inv_replenish_detail_pub.line_details_pub
3321                   (p_line_id			=> l_move_order_line_id,
3322                    x_number_of_rows 	=> x_number_of_rows,
3323                    x_detailed_qty		=> x_detailed_qty,
3324                    x_detailed_qty2	=> x_detailed_qty2,
3325                    x_return_status	=> x_return_status,
3326                    x_msg_count		=> x_msg_count,
3327                    x_msg_data			=> x_msg_data,
3328                    x_revision			=> x_revision,
3329                    x_locator_id		=> x_locator_id,
3330                    x_transfer_to_location => x_transfer_to_location,
3331                    x_lot_number		=> x_lot_number,
3332                    x_expiration_date	=> x_expiration_date,
3333                    x_transaction_temp_id => l_mmtt_temp_id,
3334                    p_transaction_header_id => NULL,
3335                    p_transaction_mode	=> NULL,
3336                    p_move_order_type 	=> inv_globals.g_move_order_pick_wave,
3337                    p_serial_flag		=> 'T',
3338                    p_plan_tasks		=> FALSE,
3339                    p_auto_pick_confirm	=> FALSE,
3340                    p_commit				=> FALSE
3341                    );
3342           if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3343             FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Returned from inv_replenish_detail_pub.line_details. Return status'||x_return_status);
3344           END IF;
3345 
3346           IF x_return_status <> G_RET_STS_SUCCESS THEN
3347             IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3348             FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Error while trying to create allocations..'||x_msg_data);
3349             END IF;
3350             RAISE ALLOCATION_ERROR;
3351           END IF;
3352 
3353           if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3354             FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Successfully created the allocation: Transaction temp id is='||l_mmtt_temp_id);
3355           END IF;
3356       END IF;
3357 		END IF;
3358 
3359 		IF l_mmtt_temp_id <> 0 THEN
3360 
3361 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3362         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Checking if the item is reservable..');
3363 				   fnd_log.string(L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'mover order line id:'||l_move_order_line_id);
3364 			END IF;
3365 
3366 			SELECT msi.reservable_type,msi.inventory_item_id,
3367 				   msi.organization_id
3368 			INTO l_reservable_flag,l_item_id,
3369 				 l_org_id
3370 			FROM mtl_system_items_b msi,
3371 				 mtl_txn_request_lines mtrl
3372 			WHERE mtrl.inventory_item_id = msi.inventory_item_id
3373 			 AND mtrl.organization_id = msi.organization_id
3374 			 AND mtrl.line_id = l_move_order_line_id;
3375 
3376 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3377         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Reservation flag:'||l_reservable_flag);
3378 			END IF;
3379 
3380 			IF l_reservable_flag = 1 THEN
3381 				BEGIN
3382 					SELECT reservation_id
3383 					INTO l_reservation_id
3384 					FROM mtl_reservations mr
3385 					WHERE mr.demand_source_line_id = l_order_line_id
3386 					AND NVL(staged_flag,'N') = 'N';
3387 				EXCEPTION
3388 					WHEN no_data_found THEN
3389 						l_reservation_id := NULL;
3390 				END;
3391 			END IF;
3392 
3393 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3394         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Existing reservation id: '||l_reservation_id);
3395 			END IF;
3396 
3397 
3398         if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3399         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' defualt allocation details');
3400         end if;
3401 
3402 			for serial_number_rec in get_init_serial_alloc(l_mmtt_temp_id)
3403 			LOOP
3404 				if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3405           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' ll_fm_serial_number: ' || serial_number_rec.fm_serial_number);
3406           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' ll_to_serial_number : ' || SERIAL_NUMBER_REC.TO_SERIAL_NUMBER);
3407         end if;
3408 			end loop;
3409 
3410 
3411 			SELECT fm_serial_number, to_serial_number
3412 			BULK COLLECT INTO
3413 			l_fm_serial_number, l_to_serial_number
3414 			FROM mtl_serial_numbers_temp
3415 			WHERE transaction_temp_id = l_mmtt_temp_id;
3416 
3417       if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3418         FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' after allocation details');
3419       end if;
3420 
3421       FOR k IN 1 ..l_fm_serial_number.COUNT
3422       LOOP
3423         if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3424           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' l_fm_serial_number = ' || L_FM_SERIAL_NUMBER(K)||
3425                                                                       ', l_to_serial_number = ' || L_TO_SERIAL_NUMBER(K));
3426         end if;
3427       end loop;
3428 
3429 			-- unmark the serials.
3430 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3431           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Unmarking the existing range');
3432 			END IF;
3433 
3434 			FOR i in 1 ..l_fm_serial_number.COUNT
3435 			LOOP
3436 
3437 				SERIAL_CHECK.inv_unmark_rsv_serial
3438 							(from_serial_number   => l_fm_serial_number(i),
3439 							 to_serial_number	  => l_to_serial_number(i),
3440 							 serial_code     	  => 2,
3441 							 hdr_id				  => l_mmtt_temp_id,
3442 							 temp_id			  => l_mmtt_temp_id,
3443 							 lot_temp_id		  => l_mmtt_temp_id,
3444 							 p_inventory_item_id  => l_item_id,
3445 							 p_update_reservation => 'T'
3446 							);
3447 			END LOOP;
3448 
3449 			-- delete all the existing serials from MSNT.
3450 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3451           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Deleting from MSNT for transaction_temp_id='||l_mmtt_temp_id);
3452 			END IF;
3453 
3454 			DELETE FROM mtl_serial_numbers_temp WHERE transaction_temp_id = l_mmtt_temp_id;
3455 
3456 			-- mark the newly passed serials. And insert them into MSNT.
3457 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3458           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Marking the newly entered serial ranges');
3459 				  FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Range count:'||p_fm_serial_num_tbl.COUNT);
3460 
3461 			END IF;
3462 
3463       l_picking_qty := 0;
3464 			FOR j in 1 ..p_fm_serial_num_tbl.COUNT
3465 			LOOP
3466 
3467 				SERIAL_CHECK.inv_mark_rsv_serial
3468 							(from_serial_number   => p_fm_serial_num_tbl(j),
3469 							 to_serial_number	  =>  p_to_serial_num_tbl(j),
3470 							 item_id			  => l_item_id,
3471 							 org_id				  => l_org_id,
3472 							 hdr_id				  => l_mmtt_temp_id,
3473 							 temp_id			  => l_mmtt_temp_id,
3474 							 lot_temp_id		  => l_mmtt_temp_id,
3475 							 p_reservation_id	  => l_reservation_id,
3476 							 p_update_reservation => fnd_api.g_true,
3477 							 success			  => x_success
3478 							);
3479 
3480 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3481           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Inserting into msnt='||l_mmtt_temp_id);
3482 			END IF;
3483 
3484 				INSERT INTO mtl_serial_numbers_temp
3485 							(transaction_temp_id,
3486 							 last_update_date,
3487 							 last_updated_by,
3488 							 creation_date,
3489 							 created_by,
3490 							 last_update_login,
3491 							 fm_serial_number,
3492 							 to_serial_number,
3493 							 group_header_id,
3494 							 serial_prefix
3495 							)
3496 				VALUES		(l_mmtt_temp_id,
3497 							 sysdate,
3498 							 fnd_global.user_id,
3499 							 sysdate,
3500 							 fnd_global.user_id,
3501 							 fnd_global.login_id,
3502 							 p_fm_serial_num_tbl(j),
3503 							 p_to_serial_num_tbl(j),
3504 							 l_mmtt_temp_id,
3505 							 p_quantity_tbl(j)
3506 							);
3507 				l_picking_qty := l_picking_qty + p_quantity_tbl(j);
3508 			END LOOP;
3509 		END IF;
3510 
3511 
3512 		-- if we are doing partial picking, then need to update the existing allocation details.
3513 		-- the serial number allocation would have been already addressed above.
3514 
3515     if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3516           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' allocation details after unmarking and marking');
3517     end if;
3518 
3519 			for serial_number_rec in get_init_serial_alloc(l_mmtt_temp_id)
3520 			LOOP
3521 				if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3522           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' ll_fm_serial_number: ' || SERIAL_NUMBER_REC.FM_SERIAL_NUMBER ||
3523                                                       ', ll_to_serial_number : ' || SERIAL_NUMBER_REC.TO_SERIAL_NUMBER);
3524         end if;
3525       end loop;
3526 
3527 		IF l_picking_qty < l_requested_qty
3528 		then
3529       if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3530           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, ' l_picking_qty is less than l_requested_qty');
3531 			end if;
3532 
3533 			IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3534 				   fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'Updating the existing allocations for temp id ='||l_mmtt_temp_id);
3535 			END IF;
3536 			inv_missing_qty_actions_engine.update_allocation_qty
3537 								(x_return_status 		=> x_return_status,
3538 								 x_msg_data				=> x_msg_data,
3539 								 x_msg_count			=> x_msg_count,
3540 								 p_transaction_temp_id	=> l_mmtt_temp_id,
3541 								 p_confirmed_quantity   => l_picking_qty,
3542 								 p_transaction_uom		=> l_transaction_uom
3543 								 );
3544 			IF x_return_status <> G_RET_STS_SUCCESS
3545 			THEN
3546 				IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3547 					   fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'Error in inv_missing_qty_actions_engine.update_allocation_qty. Msg is '||x_msg_data);
3548 				END IF;
3549 				RAISE ALLOCATION_ERROR;
3550 			END IF;
3551 
3552 			-- we need to process the allocations such that a back order gets created for
3553 			-- the remaining quantity.
3554 			IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3555 				   fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'Calling process action to back order remaining quantity ');
3556 			END IF;
3557 			inv_missing_qty_actions_engine.process_action
3558 								(x_return_status 		=> x_return_status,
3559 								 x_msg_data				=> x_msg_data,
3560 								 x_msg_count			=> x_msg_count,
3561 								 x_new_record_id		=> x_record_id,
3562 								 p_action				=> 1, -- back order
3563 								 p_transaction_temp_id	=> l_mmtt_temp_id,
3564 								 p_remaining_quantity	=> (l_requested_qty - l_picking_qty)
3565 								);
3566 			IF x_return_status <> G_RET_STS_SUCCESS
3567 			THEN
3568 				IF (G_LEVEL_PROCEDURE >= G_RUNTIME_LEVEL) THEN
3569 					   fnd_log.string(G_LEVEL_PROCEDURE, l_api_name,'Error in process_action API. Msg = '||x_msg_data);
3570 				END IF;
3571 				RAISE ALLOCATION_ERROR;
3572 			END IF;
3573 		END IF;
3574 
3575 		-- need to pick release the line.
3576 		-- we just need to populate l_trolin_tbl table. No need to populate mmtt table type.
3577 		-- even in the l_trolin_tbl we need to pass the correct move order line id.
3578 		-- INV team says that the API queries all the remaining details itself.
3579 		l_trolin_tbl(1).line_id := l_move_order_line_id;
3580 		-- call the pick confirm api
3581 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3582           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Calling INV_Pick_Wave_Pick_Confirm_PUB.Pick_Confirm');
3583 		END IF;
3584 
3585 		INV_Pick_Wave_Pick_Confirm_PUB.Pick_Confirm
3586 							(p_api_version_number => 1.0,
3587 							 p_init_msg_list	  => p_init_msg_list,
3588 							 p_commit			  => p_commit,
3589 							 x_return_status	  => x_return_status,
3590 							 x_msg_count		  => x_msg_count,
3591 							 x_msg_data			  => x_msg_data,
3592 							 p_move_order_type    => inv_globals.g_move_order_pick_wave,
3593 							 p_transaction_mode   => 1,
3594 							 p_trolin_tbl 		  => l_trolin_tbl,
3595 							 p_mold_tbl			  => l_mold_tbl,
3596 							 x_mmtt_tbl			  => l_mold_tbl,
3597 							 x_trolin_tbl		  => l_trolin_tbl
3598 							);
3599 		IF x_return_status <> G_RET_STS_SUCCESS THEN
3600 			if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3601           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'ERROR in INV_Pick_Wave_Pick_Confirm_PUB.Pick_Confirm');
3602 			END IF;
3603 			RAISE RELEASE_BATCH;
3604 		END IF;
3605 	END IF;
3606 
3607 	-- Check if the delivery is successfully pick confirmed.
3608 	IF l_move_order_line_id IS NOT NULL
3609 	THEN
3610 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3611           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'Checking if the delivery is successfully pick released. DDID='||l_delivery_detail_id);
3612 		END IF;
3613 		SELECT released_status,delivery_detail_id,picked_quantity
3614 		INTO l_delivery_status,l_delivery_detail_id_new,l_picked_qty
3615 		FROM wsh_delivery_details
3616 		WHERE move_order_line_id = l_move_order_line_id;
3617 
3618 		IF l_delivery_status <> 'Y'
3619 		THEN
3620 			RAISE RELEASE_BATCH;
3621 		END IF;
3622 	END IF;
3623 
3624 	if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3625           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,' p_commit value - ' || p_commit);
3626 		END IF;
3627 
3628 	IF fnd_api.to_boolean(p_commit)
3629 	THEN
3630 		COMMIT;
3631 	END IF;
3632 
3633 EXCEPTION
3634 	WHEN INVALID_PICK_RULE THEN
3635 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3636           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In INVALID_PICK_RULE exception');
3637 		end if;
3638     FND_MESSAGE.SET_NAME('AHL', 'AHL_PICKING_RULE_ID_INV');
3639     fnd_message.set_token('PICKING_RULE_ID',l_picking_rule_id );
3640     FND_MSG_PUB.ADD;
3641     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3642                                p_data    => x_msg_data,
3643                                p_encoded => fnd_api.g_false);
3644 		X_RETURN_STATUS := G_RET_STS_ERROR;
3645 		rollback to RELEASE_SALESORDER;
3646   WHEN INVALID_DELIVERY_DETAIL THEN
3647 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3648           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In INVALID_DELIVERY_DETAIL exception');
3649 		end if;
3650     FND_MESSAGE.SET_NAME('AHL', 'AHL_INVLD_DELIVERY_DETAILS');
3651     FND_MSG_PUB.ADD;
3652     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3653                                p_data    => x_msg_data,
3654                                p_encoded => fnd_api.g_false);
3655 		X_RETURN_STATUS := G_RET_STS_ERROR;
3656 		ROLLBACK TO RELEASE_SALESORDER;
3657   WHEN CREATE_BATCH THEN
3658 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3659           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In create_batch exception');
3660 		end if;
3661     FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_PICK_REL_CRT_BTCH_FAIL');
3662     FND_MSG_PUB.ADD;
3663     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3664                                p_data    => x_msg_data,
3665                                p_encoded => fnd_api.g_false);
3666 		x_return_status := G_RET_STS_ERROR;
3667 		ROLLBACK TO RELEASE_SALESORDER;
3668 	WHEN RELEASE_BATCH THEN
3669 		if (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) then
3670           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In release_batch exception');
3671 		end if;
3672     FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_PICK_REL_REL_BTCH_FAIL');
3673     fnd_msg_pub.add;
3674     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3675                                P_DATA    => X_MSG_DATA,
3676                                p_encoded => fnd_api.g_false);
3677     x_return_status := G_RET_STS_ERROR;
3678     ROLLBACK TO RELEASE_SALESORDER;
3679 	WHEN ALLOCATION_ERROR THEN
3680     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3681           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In allocation_error exception');
3682 		END IF;
3683     FND_MESSAGE.SET_NAME('AHL', 'AHL_MM_PICK_REL_ALOC_FAIL');
3684     fnd_msg_pub.add;
3685     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3686                                P_DATA    => X_MSG_DATA,
3687                                p_encoded => fnd_api.g_false);
3688 		x_return_status := G_RET_STS_ERROR;
3689 		ROLLBACK TO RELEASE_SALESORDER;
3690   WHEN NO_DATA_FOUND THEN
3691     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3692           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In NO_DATA_FOUND exception');
3693 		END IF;
3694     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3695                                P_DATA    => X_MSG_DATA,
3696                                p_encoded => fnd_api.g_false);
3697 		X_RETURN_STATUS := G_RET_STS_ERROR;
3698 		ROLLBACK TO RELEASE_SALESORDER;
3699   WHEN OTHERS THEN
3700     IF (L_LOG_STATEMENT >= L_LOG_CURRENT_LEVEL) THEN
3701           FND_LOG.STRING( L_LOG_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME,'In OTHERS exception');
3702 		END IF;
3703     FND_MSG_PUB.count_and_get( p_count   => x_msg_count,
3704                                P_DATA    => X_MSG_DATA,
3705                                p_encoded => fnd_api.g_false);
3706 		X_RETURN_STATUS := G_RET_STS_ERROR;
3707 		ROLLBACK TO RELEASE_SALESORDER;
3708 
3709 
3710 END PICK_RELEASE_CONFIRM;
3711 
3712 -- changes by sansatpa ends
3713 
3714 -------------------------------------------------------------------------------------------------------------
3715 -- ARUNJK:: Added the following procedure for for sending workflow notification when AOG flag gets updated
3716 -------------------------------------------------------------------------------------------------------------
3717 --  Procedure name : AOG_Upd_Notification
3718 --  Type           : Public
3719 --  Usage          : This procedure is called from variour places where AOG flag gets updated.
3720 --                    Invokes Invoke_AOG_Upd_Notification to send notification and AhlPrdWorkorderPvt.updateWoAogStatus
3721 --                    to update workorder status to AOG
3722 --  IN Parameters :
3723 --      p_api_version                   IN      NUMBER                Required
3724 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
3725 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
3726 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
3727 --      p_asm_id                        IN      NUMBER                Required.
3728 --
3729 --  OUT Parameters :
3730 --      x_return_status                 OUT     VARCHAR2               Required
3731 --      x_msg_count                     OUT     NUMBER                 Required
3732 --      x_msg_data                      OUT     VARCHAR2               Required
3733 --
3734 
3735 PROCEDURE AOG_UPD_NOTIFICATION(
3736  P_API_VERSION               IN         NUMBER   :=  1.0,
3737  P_INIT_MSG_LIST             IN         VARCHAR2 := FND_API.G_FALSE,
3738  P_COMMIT                    IN         VARCHAR2 := FND_API.G_FALSE,
3739  P_VALIDATION_LEVEL          IN         NUMBER   := FND_API.G_VALID_LEVEL_FULL,
3740  P_SCHEDULE_MATERIAL_ID_TBL  IN         NUMBER_TABLE_TYPE,
3741  X_RETURN_STATUS             OUT NOCOPY VARCHAR2,
3742  X_MSG_COUNT                 OUT NOCOPY NUMBER,
3743  X_MSG_DATA                  OUT NOCOPY VARCHAR2
3744 )
3745 IS
3746 
3747   L_CUR               AHL_OSP_UTIL_PKG.AHL_SEARCH_CSR;
3748   L_SQL_STRING        VARCHAR2(30000) := 'SELECT distinct AWO.WORKORDER_ID,AWO.OBJECT_VERSION_NUMBER FROM AHL_WORKORDERS AWO,
3749                                       AHL_SCHEDULE_MATERIALS ASM WHERE AWO.VISIT_TASK_ID = ASM.VISIT_TASK_ID
3750                                       AND AWO.VISIT_TASK_ID = ASM.VISIT_TASK_ID AND ASM.SCHEDULED_MATERIAL_ID in(';
3751   L_BINDVAR_TBL       AHL_OSP_UTIL_PKG.AHL_CONDITIONS_TBL;
3752   P_WORK_ORDER_ID_TBL AHL_PRD_WORKORDER_PVT.WORKORDER_ID_TBL_TYPE;
3753   L_WORKORDER_ID NUMBER;
3754   L_OBJ_VER_NO NUMBER;
3755   COUNTER NUMBER := 1;
3756 
3757   L_API_VERSION          CONSTANT NUMBER        := 1.0;
3758   L_API_NAME             CONSTANT VARCHAR2(30)  := 'AOG_UPD_NOTIFICATION';
3759   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3760 BEGIN
3761   SAVEPOINT MM_AOG_UPD_NOTIFICATION_SP;
3762   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
3763     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure AOG_UPD_NOTIFICATION');
3764   END IF;
3765 
3766   -- Initialize API return status to success
3767   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
3768 
3769   -- Standard call to check for call compatibility.
3770   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
3771     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3772   END IF;
3773 
3774   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
3775     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG, 'ASM ID Count : ' || TO_CHAR(P_SCHEDULE_MATERIAL_ID_TBL.COUNT) );
3776   END IF;
3777 
3778   FOR I IN 1 .. P_SCHEDULE_MATERIAL_ID_TBL.COUNT
3779   LOOP
3780     IF(I = 1) THEN
3781       L_SQL_STRING := L_SQL_STRING || P_SCHEDULE_MATERIAL_ID_TBL(I);
3782     ELSE
3783       L_SQL_STRING := L_SQL_STRING || ',' || P_SCHEDULE_MATERIAL_ID_TBL(I);
3784     END IF;
3785   END LOOP;
3786 
3787   L_SQL_STRING := L_SQL_STRING || ')';
3788 
3789   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
3790     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'Query Formed ' || L_SQL_STRING);
3791   END IF;
3792 
3793   AHL_OSP_UTIL_PKG.OPEN_SEARCH_CURSOR
3794   (
3795     P_CONDITIONS_TBL => L_BINDVAR_TBL,
3796     P_SQL_STR        => L_SQL_STRING,
3797     P_X_CSR          => L_CUR
3798   );
3799 
3800   LOOP
3801   FETCH L_CUR INTO L_WORKORDER_ID,L_OBJ_VER_NO;
3802     EXIT WHEN L_CUR%NOTFOUND;
3803     P_WORK_ORDER_ID_TBL(COUNTER).WORKORDER_ID := L_WORKORDER_ID;
3804     P_WORK_ORDER_ID_TBL(COUNTER).OBJ_VER_NUM := L_OBJ_VER_NO;
3805     COUNTER := COUNTER +1;
3806   END LOOP;
3807 
3808   INVOKE_AOG_UPD_NOTIFICATION(P_API_VERSION => P_API_VERSION,
3809                                 P_INIT_MSG_LIST => P_INIT_MSG_LIST,
3810                                 P_COMMIT => P_COMMIT,
3811                                 P_VALIDATION_LEVEL => P_VALIDATION_LEVEL,
3812                                 P_ASM_ID_TAB => P_SCHEDULE_MATERIAL_ID_TBL,
3813                                 X_RETURN_STATUS => X_RETURN_STATUS,
3814                                 X_MSG_COUNT => X_MSG_COUNT,
3815                                 X_MSG_DATA => X_MSG_DATA
3816                                 );
3817 
3818   AHL_PRD_WORKORDER_PVT.UPDATE_WO_AOG_STATUS(P_API_VERSION => P_API_VERSION,
3819                                             P_INIT_MSG_LIST => P_INIT_MSG_LIST,
3820                                             P_COMMIT => P_COMMIT,
3821                                             P_WORKORDER_ID_TBL => P_WORK_ORDER_ID_TBL,
3822                                             X_RETURN_STATUS => X_RETURN_STATUS,
3823                                             X_MSG_COUNT => X_MSG_COUNT,
3824                                             X_MSG_DATA => X_MSG_DATA);
3825 
3826 EXCEPTION
3827   WHEN FND_API.G_EXC_ERROR THEN
3828     ROLLBACK TO MM_AOG_UPD_NOTIFICATION_SP;
3829     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
3830     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3831       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
3832 
3833   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3834     ROLLBACK TO MM_AOG_UPD_NOTIFICATION_SP;
3835     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
3836     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3837     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
3838 
3839   WHEN OTHERS THEN
3840     ROLLBACK TO MM_AOG_UPD_NOTIFICATION_SP;
3841     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
3842     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3843       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
3844     END IF;
3845     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3846     P_COUNT => X_MSG_COUNT,
3847     P_DATA  => X_MSG_DATA);
3848 
3849 END AOG_UPD_NOTIFICATION;
3850 
3851 
3852 -------------------------------------------------------------------------------------------------------------
3853 -- ARUNJK:: Added the following procedure for for sending workflow notification when AOG flag gets updated
3854 -------------------------------------------------------------------------------------------------------------
3855 --  Procedure name : UPDATE_AOG
3856 --  Type           : Public
3857 --  Usage          : This procedure is called to update AOG flag
3858 --  IN Parameters :
3859 --      p_api_version                   IN      NUMBER                Required
3860 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
3861 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
3862 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
3863 --      P_AOG_TBL                       IN      AOG_TBL_TYPE                Required.
3864 --
3865 --  OUT Parameters :
3866 --      x_return_status                 OUT     VARCHAR2               Required
3867 --      x_msg_count                     OUT     NUMBER                 Required
3868 --      x_msg_data                      OUT     VARCHAR2               Required
3869 --
3870 
3871 PROCEDURE UPDATE_AOG(
3872  P_API_VERSION               IN         NUMBER   :=  1.0,
3873  P_INIT_MSG_LIST             IN         VARCHAR2 := FND_API.G_FALSE,
3874  P_COMMIT                    IN         VARCHAR2 := FND_API.G_FALSE,
3875  P_VALIDATION_LEVEL          IN         NUMBER   := FND_API.G_VALID_LEVEL_FULL,
3876  P_AOG_TBL                   IN         AOG_TBL_TYPE,
3877  X_RETURN_STATUS             OUT NOCOPY VARCHAR2,
3878  X_MSG_COUNT                 OUT NOCOPY NUMBER,
3879  X_MSG_DATA                  OUT NOCOPY VARCHAR2
3880 )
3881 IS
3882 
3883   CURSOR CURRENT_AOG_CSR(P_SCHEDULE_MATERIAL_ID NUMBER) IS
3884     SELECT AOG_FLAG FROM AHL_SCHEDULE_MATERIALS WHERE SCHEDULED_MATERIAL_ID = P_SCHEDULE_MATERIAL_ID;
3885 
3886   P_SCHEDULE_MATERIAL_ID_TBL NUMBER_TABLE_TYPE;
3887   P_COUNT NUMBER := 1;
3888 
3889   L_API_VERSION          CONSTANT NUMBER        := 1.0;
3890   L_API_NAME             CONSTANT VARCHAR2(30)  := 'UPDATE_AOG';
3891   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3892 BEGIN
3893   SAVEPOINT MM_UPDATE_AOG_SP;
3894   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
3895     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure UPDATE_AOG');
3896   END IF;
3897 
3898   -- Initialize API return status to success
3899   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
3900 
3901   -- Standard call to check for call compatibility.
3902   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
3903     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3904   END IF;
3905 
3906   FOR I IN 1 .. P_AOG_TBL.COUNT
3907   LOOP
3908     FOR CURRENT_AOG IN CURRENT_AOG_CSR(P_AOG_TBL(I).SCHEDULE_MATERIAL_ID)
3909     LOOP
3910       IF(P_AOG_TBL(I).AOG_FLAG <> CURRENT_AOG.AOG_FLAG OR CURRENT_AOG.AOG_FLAG IS NULL )
3911       THEN
3912         IF(P_AOG_TBL(I).AOG_FLAG = 'Y' OR P_AOG_TBL(I).AOG_FLAG = 'y') THEN
3913           IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
3914             FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG, 'Invoking Update Notification for ' || P_AOG_TBL(I).SCHEDULE_MATERIAL_ID);
3915           END IF;
3916           P_SCHEDULE_MATERIAL_ID_TBL(P_COUNT) := P_AOG_TBL(I).SCHEDULE_MATERIAL_ID;
3917           P_COUNT := P_COUNT + 1;
3918         END IF;
3919         IF(NOT((P_AOG_TBL(I).AOG_FLAG = 'N' OR P_AOG_TBL(I).AOG_FLAG = 'n') AND CURRENT_AOG.AOG_FLAG IS NULL ))THEN
3920           UPDATE AHL_SCHEDULE_MATERIALS SET
3921           AOG_FLAG                = P_AOG_TBL(I).AOG_FLAG,
3922           OBJECT_VERSION_NUMBER   = P_AOG_TBL(I).ASM_OBJECT_VERSION_NUMBER + 1,
3923           LAST_UPDATE_DATE        = SYSDATE,
3924           LAST_UPDATED_BY         = FND_GLOBAL.USER_ID,
3925           LAST_UPDATE_LOGIN       = FND_GLOBAL.USER_ID
3926           WHERE SCHEDULED_MATERIAL_ID = P_AOG_TBL(I).SCHEDULE_MATERIAL_ID AND OBJECT_VERSION_NUMBER = P_AOG_TBL(I).ASM_OBJECT_VERSION_NUMBER;
3927           IF SQL%ROWCOUNT=0 THEN
3928             FND_MESSAGE.SET_NAME('AHL','AHL_COM_RECORD_CHANGED');
3929             FND_MSG_PUB.ADD;
3930             RAISE FND_API.G_EXC_ERROR;
3931           END IF;
3932         END IF;
3933       END IF;
3934     END LOOP;
3935   END LOOP;
3936 
3937   IF(P_COUNT > 1) THEN
3938     AOG_UPD_NOTIFICATION(
3939                         P_API_VERSION => P_API_VERSION,
3940                         P_INIT_MSG_LIST => P_INIT_MSG_LIST,
3941                         P_COMMIT => P_COMMIT,
3942                         P_VALIDATION_LEVEL => P_VALIDATION_LEVEL,
3943                         P_SCHEDULE_MATERIAL_ID_TBL => P_SCHEDULE_MATERIAL_ID_TBL,
3944                         X_RETURN_STATUS => X_RETURN_STATUS,
3945                         X_MSG_COUNT => X_MSG_COUNT,
3946                         X_MSG_DATA => X_MSG_DATA
3947                         );
3948   END IF;
3949 
3950   IF FND_API.TO_BOOLEAN(P_COMMIT)
3951 	THEN
3952 		COMMIT;
3953 	END IF;
3954 
3955 EXCEPTION
3956   WHEN FND_API.G_EXC_ERROR THEN
3957     ROLLBACK TO MM_UPDATE_AOG_SP;
3958     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
3959     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3960       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
3961 
3962   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3963     ROLLBACK TO MM_UPDATE_AOG_SP;
3964     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
3965     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3966     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
3967 
3968   WHEN OTHERS THEN
3969     ROLLBACK TO MM_UPDATE_AOG_SP;
3970     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
3971     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3972       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
3973     END IF;
3974     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
3975     P_COUNT => X_MSG_COUNT,
3976     P_DATA  => X_MSG_DATA);
3977 
3978 END UPDATE_AOG;
3979 
3980 -- Start of changes by debadey
3981 ------------------------------------------------------------------------------------
3982   -- Define procedures
3983   ------------------------------------------------------------------------------------
3984   -- Start of Comments
3985   --  Procedure name    : Validate_Record
3986   --  Type              : Private
3987   --  Function          : This procedure will validate Material Transfer Record
3988   --                      When an error is encountered corresponding message is stored
3989   --                      and the validation continued.
3990   --  Pre-reqs          :
3991   --  Parameters        :
3992   --    1. p_x_mtltfr_rec   -        IN   OUT  Material Transfer Record      Required
3993   --    2. x_return_status  -        OUT       Standard out parameter
3994   --    3. x_msg_count      -        OUT       Standard out parameter
3995   --    4. x_msg_data       -        OUT       Standard out parameter
3996   --  Validate_Record Parameters
3997   --       p_x_mtltfr_rec           IN  OUT    Material Transfer Record      Required
3998   --
3999   --  End of Comments
4000   -------------------------------------------------------------------------------------
4001 PROCEDURE Validate_Record
4002   (
4003     p_x_mtltfr_rec  IN OUT NOCOPY  Ahl_Mtltfr_Rec_Type,
4004     x_return_status OUT NOCOPY     VARCHAR2,
4005     x_msg_count     OUT NOCOPY     NUMBER,
4006     x_msg_data      OUT NOCOPY     VARCHAR2 );
4007   --------------------------------------------------------------------------------------------------------------------
4008   -------------------------------------------------------------------------------------
4009   -- Start of Comments
4010   --  Procedure name    : Insert_Material
4011   --  Type              : Private
4012   --  Function          : This procedure will insert Material Transfer Record in the
4013   --                      transaction interface and the serial interface tables
4014   --  Pre-reqs          :
4015   --  Parameters        :
4016   --    1. p_x_mtltfr_rec   -        IN   OUT  Material Transfer Record      Required
4017   --    2. p_x_txn_hdr_id   -        IN   OUT  Transaction Header Id
4018   --    3. p_x_txn_intf_id  -        IN   OUT  Transaction Interface Id
4019   --    4. p_shipping_type  -        IN        Shipping type
4020   --    5. x_return_status  -        OUT       Standard out parameter
4021   -- End of Comments
4022   -------------------------------------------------------------------------------------
4023 PROCEDURE Insert_Material
4024   (
4025     p_x_mtltfr_rec  IN OUT NOCOPY Ahl_Mtltfr_Rec_Type,
4026     p_x_txn_hdr_id  IN OUT NOCOPY NUMBER,
4027     p_x_txn_intf_id IN OUT NOCOPY NUMBER,
4028 	p_shipping_type IN NUMBER,
4029     x_return_status OUT NOCOPY    VARCHAR2 );
4030   -------------------------------------------------------------------------------------
4031 
4032   ----------------------------------------------------------------------------------------------------------------------
4033   -- Define Private APIs --
4034   ---------------------------------------------------------------------------------------------------------
4035   -- Start of Comments  --
4036   --
4037   --  Procedure name      : Perform_Inter_Org_Transfer
4038   --  Type                : Private
4039   --  Description         : This procedure is called from the UI on selecting the option to do inter org
4040   --                        transfer. It will perform reservation of the item instances after transferring
4041   --                        the selected serial numbers and return one reservation id for all the serial
4042   --                        numbers. In case the shipping network is Intransit then no reservation is made
4043   --                        but the shipment number for each serial is returned back.
4044   --
4045   --  Pre-reqs            : The item should be only serial controlled and should not be locator controlled
4046   --                        in the source/destination organization.
4047   --
4048   --  Standard IN  Parameters :
4049   --      p_api_version       NUMBER      := 1.0
4050   --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
4051   --      p_commit            VARCHAR2    := FND_API.G_FALSE
4052   --      p_validation_level  NUMBER      := FND_API.G_VALID_LEVEL_FULL
4053   --      p_default           VARCHAR2    := FND_API.G_FALSE
4054   --      p_module_type       VARCHAR2    := NULL
4055   --
4056   --  Standard OUT Parameters :
4057   --      p_x_return_status     VARCHAR2                                        Required
4058   --      p_x_msg_count         NUMBER                                          Required
4059   --      p_x_msg_data          VARCHAR2                                        Required
4060   --
4061   --
4062   --  Procedure IN, OUT, IN/OUT params :
4063   --      p_x_mtltfr_tbl  Ahl_Mtltfr_Tbl_Type         IN                          Required
4064   --    This record type variable will store all required information regarding the transfer
4065   --      x_reservation_id NUMBER                   OUT
4066   --    This variable will store the id for the reservation made, if any
4067   --      p_sched_material_id   NUMBER              IN
4068   --    This variable value needs to be fetched from the demand section and is used for reservation
4069   --
4070   --  Version :
4071   --      Initial Version     1.0
4072   --
4073   -- End of Comments  --
4074   --------------------------------------------------------------------------------------------------------
4075 PROCEDURE Perform_Inter_Org_Transfer
4076   (
4077     -- Standard IN params
4078     p_api_version      IN NUMBER := 1.0,
4079     p_init_msg_list    IN VARCHAR2 := FND_API.G_FALSE,
4080     p_commit           IN VARCHAR2 := FND_API.G_FALSE,
4081     p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
4082     p_default          IN VARCHAR2 := FND_API.G_FALSE,
4083     p_module_type      IN VARCHAR2 := NULL,
4084     -- Standard OUT params
4085     x_return_status OUT NOCOPY VARCHAR2,
4086     x_msg_count OUT NOCOPY     NUMBER,
4087     x_msg_data OUT NOCOPY      VARCHAR2,
4088     -- Procedure IN, OUT, IN/OUT params
4089     p_x_mtltfr_tbl        IN OUT NOCOPY Ahl_Mtltfr_Tbl_Type,
4090     p_sched_material_id IN NUMBER,-- This is required for reservation API invocation
4091     x_reservation_id OUT NOCOPY NUMBER   -- Only one reservation will be made even for multiple item selection
4092 	-- Assumption is that the user will be allowed to select multiple serials/lots of only ONE item
4093     -- and after inter org transfer all the item instances will reside in the same visit sub-inv and locator
4094   )
4095                                 IS
4096 
4097   -- Logging Variable
4098   l_debug_module VARCHAR2(1000) := 'ahl.plsql.AHL_MM_MTL_MGT_PVT.Perform_Inter_Org_Transfer';
4099   l_msg_index_out NUMBER;
4100 
4101   -- Local Variables
4102   l_shipping_network_code MTL_SHIPPING_NETWORK_VIEW.intransit_type%TYPE;
4103 
4104   -- Record type variables
4105   -- Variables for making reservation
4106   l_rsv_rec AHL_MM_RESERVATIONS_PVT.mtl_reservation_rec_type;
4107   l_serial_number_tbl  AHL_MM_RESERVATIONS_PVT.serial_number_tbl_type;
4108   l_reservation_id_tbl         AHL_MM_RESERVATIONS_PVT.number_table_type;
4109 
4110   -- for commit
4111   l_commit            VARCHAR2(1) := FND_API.G_FALSE;
4112   l_count             NUMBER;
4113 
4114 BEGIN
4115   G_DEBUG_LINE_NUM := 10;
4116   IF (l_log_statement >= l_log_current_level) THEN
4117     FND_LOG.STRING(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Entered Perform_Inter_Org_Transfer Procedure');
4118 	IF (p_x_mtltfr_tbl IS NOT NULL) THEN
4119 		FND_LOG.STRING(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Input record count ='||p_x_mtltfr_tbl.COUNT);
4120 	END IF;
4121   END IF;
4122 
4123   -- Initialize return status to success
4124   x_return_status := FND_API.G_RET_STS_SUCCESS;
4125 
4126   -- Initialize message list if p_init_msg_list is set to TRUE
4127   IF FND_API.To_Boolean(p_init_msg_list) THEN
4128     FND_MSG_PUB.Initialize;
4129   END IF;
4130 
4131   -- Standard start of API savepoint
4132   SAVEPOINT Perform_Inter_Org_Transfer;
4133   G_DEBUG_LINE_NUM := 15;
4134 
4135   -- Check whether the input table type is valid
4136   IF (p_x_mtltfr_tbl IS NULL)
4137   THEN
4138     G_DEBUG_LINE_NUM := 17;
4139 	x_return_status := FND_API.G_RET_STS_ERROR;
4140 	FND_MESSAGE.Set_Name('AHL','AHL_MM_MTRL_REC_NULL');
4141     FND_MSG_PUB.ADD;
4142 	RAISE FND_API.G_EXC_ERROR;
4143   ELSIF (p_x_mtltfr_tbl.COUNT = 0)
4144   THEN
4145     G_DEBUG_LINE_NUM := 19;
4146 	x_return_status := FND_API.G_RET_STS_ERROR;
4147 	FND_MESSAGE.Set_Name('AHL','AHL_MM_MTRL_REC_NULL');
4148     FND_MSG_PUB.ADD;
4149 	RAISE FND_API.G_EXC_ERROR;
4150   END IF;
4151 
4152   G_DEBUG_LINE_NUM := 20;
4153   -- Call API to process transfer
4154   BEGIN
4155     IF (l_log_statement >= l_log_current_level) THEN
4156       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Calling API Perform_Inter_Org_Transfer_Inv');
4157     END IF;
4158     Perform_Inter_Org_Transfer_Inv (p_api_version => p_api_version,
4159                       	            p_init_msg_list => p_init_msg_list,
4160 									p_commit => l_commit,
4161 									p_validation_level => p_validation_level,
4162 									p_default => p_default,
4163 									p_module_type => p_module_type,
4164 									x_return_status => x_return_status,
4165 									x_msg_count => x_msg_count,
4166 									x_msg_data => x_msg_data,
4167 									p_x_mtltfr_tbl => p_x_mtltfr_tbl );
4168 	IF (l_log_statement >= l_log_current_level) THEN
4169       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Back from API Perform_Inter_Org_Transfer_Inv with'||
4170 																		' retrun status '||x_return_status);
4171     END IF;
4172   EXCEPTION
4173   WHEN OTHERS THEN
4174     IF (l_log_exception >= l_log_current_level) THEN
4175       FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':API Perform_Inter_Org_Transfer_Inv returned exception');
4176 	  FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM -'|| SQLERRM);
4177     END IF;
4178     -- Raise Exception
4179     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4180   END;
4181   G_DEBUG_LINE_NUM    := 30;
4182   IF (x_return_status = FND_API.G_RET_STS_ERROR)
4183   THEN
4184     IF (l_log_error  >= l_log_current_level) THEN
4185       FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':API Perform_Inter_Org_Transfer_Inv returned error.');
4186     END IF;
4187     -- Raise exception
4188     RAISE FND_API.G_EXC_ERROR;
4189   ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
4190   THEN
4191     IF (l_log_error  >= l_log_current_level) THEN
4192       FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':API Perform_Inter_Org_Transfer_Inv returned unexpected error.');
4193     END IF;
4194 	-- Raise exception
4195     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4196   ELSIF (x_return_status = FND_API.G_RET_STS_SUCCESS)
4197   THEN
4198 
4199 	-- Loop through all records and reserve if applicable
4200     FOR i IN p_x_mtltfr_tbl.FIRST.. p_x_mtltfr_tbl.LAST
4201 	LOOP
4202     G_DEBUG_LINE_NUM    := 40;
4203     -- Get the shipping org type
4204 	SELECT intransit_type
4205 	INTO l_shipping_network_code
4206 	FROM MTL_SHIPPING_NETWORK_VIEW
4207 	WHERE from_organization_id =p_x_mtltfr_tbl(i).source_org_id
4208 	AND to_organization_id = p_x_mtltfr_tbl(i).dest_org_id ;
4209 
4210 	IF (l_shipping_network_code = C_DIRECT_NETWORK)
4211 	THEN
4212 	--  Direct transfer. Create Reservation
4213 	G_DEBUG_LINE_NUM    := 50;
4214 	IF (l_log_statement  >= l_log_current_level) THEN
4215           FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Shipping network type is direct for serial '||p_x_mtltfr_tbl(i).serial_number);
4216         END IF;
4217 	IF (l_serial_number_tbl IS NOT NULL)
4218 	THEN
4219 	  l_count := l_serial_number_tbl.COUNT;
4220 	ELSE
4221 	  l_count := 0;
4222 	END IF;
4223 	l_serial_number_tbl(l_count+1).inventory_item_id := p_x_mtltfr_tbl(i).inventory_item_id;
4224 	l_serial_number_tbl(l_count+1).serial_number     := p_x_mtltfr_tbl(i).serial_number;
4225 
4226 	ELSE
4227 	-- Do not create Reservation
4228 	G_DEBUG_LINE_NUM := 55;
4229 		IF (l_log_statement  >= l_log_current_level) THEN
4230 		  FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Shipping network type is InTransit between source org '||p_x_mtltfr_tbl(i).source_org_id||
4231 		                                                                 ' And dest org '||p_x_mtltfr_tbl(i).dest_org_id);
4232 		  FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':No reservation created. For the serial '||p_x_mtltfr_tbl(i).serial_number||
4233 											'Shipment number is '||p_x_mtltfr_tbl(i).shipment_number);
4234 
4235 		END IF;
4236 	END IF;
4237 	END LOOP;
4238 	IF (l_serial_number_tbl IS NOT NULL AND l_serial_number_tbl.COUNT >0)
4239     THEN
4240 	     G_DEBUG_LINE_NUM    := 65;
4241 		IF (l_log_statement  >= l_log_current_level) THEN
4242 			FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Reservation to be made for '||l_serial_number_tbl.COUNT||' serials');
4243 			FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Populate variable for resevation');
4244         END IF;
4245 		l_rsv_rec.demand_source_line_detail    := p_sched_material_id;
4246         l_rsv_rec.supply_source_type_id        := inv_reservation_global.g_source_type_inv;
4247         l_rsv_rec.supply_source_header_id      := null;
4248         l_rsv_rec.supply_source_line_id        := null;
4249         l_rsv_rec.supply_source_line_detail    := null;
4250 	l_rsv_rec.reservation_id               := null;
4251         l_rsv_rec.primary_reservation_quantity := null;
4252 
4253 		-- Call Process reservation API
4254 		IF (l_log_statement  >= l_log_current_level)
4255 		THEN
4256 		G_DEBUG_LINE_NUM    := 67;
4257         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Calling PROCESS_RESERVATION API with following paramters');
4258 		FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':l_rsv_rec.demand_source_line_detail ='||l_rsv_rec.demand_source_line_detail||
4259 					' ,l_rsv_rec.supply_source_type_id ='||l_rsv_rec.supply_source_type_id||
4260 					' ,l_rsv_rec.subinventory_code ='||l_rsv_rec.subinventory_code||
4261 					' ,l_rsv_rec.supply_source_header_id ='||l_rsv_rec.supply_source_header_id ||
4262 					' ,l_rsv_rec.supply_source_line_id ='||l_rsv_rec.supply_source_line_id||
4263 					' ,l_rsv_rec.supply_source_line_detail ='||l_rsv_rec.supply_source_line_detail||
4264 					/*' ,l_rsv_rec.locator_id ='||l_rsv_rec.locator_id||
4265 					' ,l_rsv_rec.revision ='||l_rsv_rec.revision||*/
4266 					' ,l_rsv_rec.reservation_id = '||l_rsv_rec.reservation_id||
4267                                         ' ,l_rsv_rec.primary_reservation_quantity = '||l_rsv_rec.primary_reservation_quantity||
4268 					' ,l_serial_number_tbl.COUNT ='||l_serial_number_tbl.COUNT||
4269 					' ,l_serial_number_tbl(1).inventory_item_id ='||l_serial_number_tbl(1).inventory_item_id||
4270 					' ,l_serial_number_tbl(i).serial_number ='||l_serial_number_tbl(1).serial_number||
4271 					/*' ,l_rsv_rec.lot_number ='||l_rsv_rec.lot_number||*/
4272 					' ,p_module_type ='||p_module_type||
4273 					' ,x_return_status ='||x_return_status||
4274 					' ,x_msg_count ='||x_msg_count)	;
4275         END IF;
4276 		 -- Call Create Reservation API
4277 		 BEGIN
4278 		 G_DEBUG_LINE_NUM    := 70;
4279 
4280 		 x_msg_count := NULL;
4281                  x_msg_data  := NULL;
4282 		 AHL_MM_RESERVATIONS_PVT.PROCESS_RESERVATION(
4283                                           p_api_version              =>     1.0,
4284                                           p_init_msg_list            =>    FND_API.G_TRUE,
4285                                           p_commit                   =>    FND_API.G_FALSE,
4286                                           p_validation_level         =>    FND_API.G_VALID_LEVEL_FULL,
4287                                           p_module_type              =>    p_module_type,
4288                                           x_return_status            =>    x_return_status,
4289                                           x_msg_count                =>    x_msg_count,
4290                                           x_msg_data                 =>    x_msg_data,
4291                                           p_rsv_rec		             =>	   l_rsv_rec,
4292                                           p_serial_number_tbl        =>    l_serial_number_tbl,
4293                                           x_reservation_id_tbl	     =>    l_reservation_id_tbl);
4294 		EXCEPTION
4295 		WHEN OTHERS THEN
4296 			IF (l_log_exception >= l_log_current_level) THEN
4297 			  FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':API AHL_MM_RESERVATIONS_PVT.PROCESS_RESERVATION returned exception');
4298 			  FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM ='||SQLERRM);
4299 			END IF;
4300 			-- Raise Exception
4301 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4302 		END;
4303 		IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
4304 			IF (l_log_error  >= l_log_current_level) THEN
4305 			  FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':API AHL_MM_RESERVATIONS_PVT.PROCESS_RESERVATION returned error. x_msg_count ='||x_msg_count);
4306 			END IF;
4307 			-- Raise exception
4308 			RAISE FND_API.G_EXC_ERROR;
4309 		ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4310 			IF (l_log_error  >= l_log_current_level) THEN
4311 			  FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':API AHL_MM_RESERVATIONS_PVT.PROCESS_RESERVATION returned unexpected error.');
4312 			END IF;
4313 			-- Raise exception
4314 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4315 		ELSIF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
4316 			  IF (l_log_statement  >= l_log_current_level) THEN
4317 				  FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':API AHL_MM_RESERVATIONS_PVT.PROCESS_RESERVATION completed successfully.');
4318 			  END IF;
4319 			  --FND_MESSAGE.Set_Name('AHL','AHL_MM_RES_MSG');
4320 		          --FND_MESSAGE.Set_Token('MSG','Material transfer is completed and reservation made');
4321                           --FND_MSG_PUB.ADD;
4322 			  --FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Number of reservations = ' || l_reservation_id_tbl.COUNT);
4323 				IF(l_reservation_id_tbl.COUNT > 0) THEN
4324 					FOR i IN l_reservation_id_tbl.FIRST..l_reservation_id_tbl.LAST LOOP
4325 						IF (l_log_statement  >= l_log_current_level) THEN
4326 						 FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Reservation_ID ' || i || ':= ' || l_reservation_id_tbl(i));
4327 						END IF;
4328 						x_reservation_id := l_reservation_id_tbl(i);
4329 					END LOOP;
4330 			        END IF;
4331 			--END IF;
4332 		END IF;
4333 	END IF;
4334   END IF;
4335   G_DEBUG_LINE_NUM := 90;
4336   -- Perform Commit
4337   -- Standard check of p_commit
4338   IF FND_API.To_Boolean(p_commit) THEN
4339     COMMIT ;
4340   END IF;
4341   IF (l_log_statement  >= l_log_current_level) THEN
4342       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':API Perform_Inter_Org_Transfer completed sucessfully');
4343   END IF;
4344 EXCEPTION
4345 WHEN FND_API.G_EXC_ERROR THEN
4346   x_return_status := FND_API.G_RET_STS_ERROR;
4347     IF (l_log_error  >= l_log_current_level) THEN
4348       FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Error in processing. x_return_status ='||x_return_status);
4349 
4350     END IF;
4351     ROLLBACK TO Perform_Inter_Org_Transfer;
4352   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4353 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4354   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4355   IF (l_log_error  >= l_log_current_level) THEN
4356       FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Error in processing. x_return_status ='||x_return_status);
4357 	  FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM ='||SQLERRM);
4358     END IF;
4359     ROLLBACK TO Perform_Inter_Org_Transfer;
4360   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4361 WHEN OTHERS THEN
4362   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4363   IF (l_log_exception  >= l_log_current_level) THEN
4364       FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':Error in processing. x_return_status ='||x_return_status);
4365 	  FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM ='||SQLERRM);
4366     END IF;
4367     ROLLBACK TO Perform_Inter_Org_Transfer;
4368   fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME, p_procedure_name => 'Perform_Inter_Org_Transfer', p_error_text => SQLERRM);
4369   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4370 END;
4371 ------------------------------------------------------------------------------------------------------
4372 --------------------------------------------------------------------------------------------------------------------------------------
4373 -- Define Private APIs --
4374 --------------------------------------------------------------------------------------------------------------------------------------
4375 -- Start of Comments  --
4376 --
4377 --  Procedure name      : Perform_Inter_Org_Transfer_Inv
4378 --  Type                : Private
4379 --  Description         : This procedure is called for the actual transfer in inventory. This does
4380 --                        perform any reservation
4381 --  Pre-reqs            :
4382 --
4383 --  Standard IN  Parameters :
4384 --      p_api_version       NUMBER      := 1.0
4385 --      p_init_msg_list     VARCHAR2    := FND_API.G_FALSE
4386 --      p_commit            VARCHAR2    := FND_API.G_FALSE
4387 --      p_validation_level  NUMBER      := FND_API.G_VALID_LEVEL_FULL
4388 --      p_default           VARCHAR2    := FND_API.G_FALSE
4389 --      p_module_type       VARCHAR2    := NULL
4390 --
4391 --  Standard OUT Parameters :
4392 --      x_return_status     VARCHAR2                                        Required
4393 --      x_msg_count         NUMBER                                          Required
4394 --      x_msg_data          VARCHAR2                                        Required
4395 --
4396 --
4397 --  Procedure IN, OUT, IN/OUT params :
4398 --      p_x_mtltfr_tbl        Ahl_Mtltfr_Tbl_Type     IN    OUT               Required
4399 --    This record type variable will store all required information regarding the transfer
4400 --    Also in case of intransit shipment the shipement id is stored in record type variable
4401 --  Version :
4402 --      Initial Version     1.0
4403 --
4404 -- End of Comments  --
4405 ------------------------------------------------------------------------------------------------------
4406 PROCEDURE Perform_Inter_Org_Transfer_Inv
4407   (
4408     -- Standard IN params
4409     p_api_version      IN NUMBER := 1.0,
4410     p_init_msg_list    IN VARCHAR2 := FND_API.G_FALSE,
4411     p_commit           IN VARCHAR2 := FND_API.G_FALSE,
4412     p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
4413     p_default          IN VARCHAR2 := FND_API.G_FALSE,
4414     p_module_type      IN VARCHAR2 := NULL,
4415     -- Standard OUT params
4416     x_return_status OUT NOCOPY VARCHAR2,
4417     x_msg_count OUT NOCOPY     NUMBER,
4418     x_msg_data OUT NOCOPY      VARCHAR2,
4419     -- Procedure IN, OUT, IN/OUT params
4420     p_x_mtltfr_tbl IN OUT NOCOPY Ahl_Mtltfr_Tbl_Type )
4421                  IS
4422   -- Standard variables
4423   ----------------------
4424 
4425   -- Constants
4426   l_api_version CONSTANT NUMBER       := 1.0;
4427   l_api_name    CONSTANT VARCHAR2(30) := 'Perform_Inter_Org_Transfer_Inv';
4428 
4429   --Logging
4430   l_debug_module VARCHAR2(1000) := 'ahl.plsql.AHL_MM_MTL_MGT_PVT.Perform_Inter_Org_Transfer_Inv';
4431 
4432   --local variables
4433   l_error                 BOOLEAN;
4434   l_transaction_header_id NUMBER;
4435   l_transaction_id        NUMBER;
4436   l_return_status         VARCHAR2(1);
4437   l_result                NUMBER; -- stores result for transaction manager
4438   l_trans_count           NUMBER;
4439   l_error_msg             VARCHAR2(240);
4440   l_error_code            VARCHAR2(240);
4441 
4442   l_item mtl_system_items_kfv.concatenated_segments%TYPE;
4443   l_serial MTL_SERIAL_NUMBERS_INTERFACE.FM_SERIAL_NUMBER%TYPE;
4444   l_shipping_network_code MTL_SHIPPING_NETWORK_VIEW.intransit_type%TYPE;
4445 
4446   -- Record Type variables
4447   l_x_mtltfr_rec Ahl_Mtltfr_Rec_Type;        -- record type variable for storing each item record
4448   l_transaction_id_tbl transaction_intf_tbl; -- stores the transaction ids for each record
4449 
4450   -- Cursor to get the error messages
4451   CURSOR Transaction_Error_Cur(p_txn_Id NUMBER)
4452   IS
4453     SELECT intf.ERROR_EXPLANATION ,
4454       intf.ERROR_CODE,
4455       kfv.concatenated_segments,
4456       sni.FM_SERIAL_NUMBER
4457     FROM MTL_TRANSACTIONS_INTERFACE INTF,
4458       mtl_system_items_kfv kfv,
4459       MTL_SERIAL_NUMBERS_INTERFACE sni
4460     WHERE intf.TRANSACTION_INTERFACE_ID = p_txn_Id
4461     AND intf.inventory_item_id          = kfv.inventory_item_id
4462     AND intf.organization_id            = kfv.organization_id
4463     AND intf.TRANSACTION_INTERFACE_ID   = sni.transaction_interface_id;
4464 
4465 BEGIN
4466   G_DEBUG_LINE_NUM := 100;
4467   -- Log
4468   IF (l_log_statement >= l_log_current_level) THEN
4469     FND_LOG.STRING(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Entered Inter Org Transfer Inventory Procedure');
4470     IF (p_x_mtltfr_tbl IS NOT NULL) THEN
4471       FND_LOG.STRING(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Input record count ='||p_x_mtltfr_tbl.COUNT);
4472     END IF;
4473   END IF;
4474   -- Standard start of API savepoint
4475   SAVEPOINT Perform_Inter_Org_Transfer_Inv;
4476   -- Standard call to check for call compatibility
4477   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4478     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4479   END IF;
4480   -- Initialize message list if p_init_msg_list is set to TRUE
4481   IF FND_API.To_Boolean(p_init_msg_list) THEN
4482     FND_MSG_PUB.Initialize;
4483   END IF;
4484   -- Initialize API return status to success
4485   x_return_status       := FND_API.G_RET_STS_SUCCESS;
4486   -- Initialize shipping id table to null
4487   ship_id_tbl := NULL;
4488   -- Check whether the input table type is valid
4489   IF (p_x_mtltfr_tbl IS NULL)
4490   THEN
4491     G_DEBUG_LINE_NUM := 107;
4492 	x_return_status := FND_API.G_RET_STS_ERROR;
4493 	FND_MESSAGE.Set_Name('AHL','AHL_MM_MTRL_REC_NULL');
4494     FND_MSG_PUB.ADD;
4495 	RAISE FND_API.G_EXC_ERROR;
4496   ELSIF (p_x_mtltfr_tbl.COUNT = 0)
4497   THEN
4498     G_DEBUG_LINE_NUM := 109;
4499 	x_return_status := FND_API.G_RET_STS_ERROR;
4500 	FND_MESSAGE.Set_Name('AHL','AHL_MM_MTRL_REC_NULL');
4501     FND_MSG_PUB.ADD;
4502 	RAISE FND_API.G_EXC_ERROR;
4503   END IF;
4504 
4505   IF (p_x_mtltfr_tbl.COUNT > 0) THEN
4506     -- Validate each record
4507     G_DEBUG_LINE_NUM := 110;
4508     FOR i IN p_x_mtltfr_tbl.FIRST..p_x_mtltfr_tbl.LAST
4509     LOOP
4510       IF (l_log_statement >= l_log_current_level) THEN
4511         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Calling Validate_Record for record i=['||i||']');
4512       END IF;
4513       G_DEBUG_LINE_NUM := 120;
4514       --Call  Validate_record to validate the material transfer record.
4515       l_x_mtltfr_rec := p_x_mtltfr_tbl(i);
4516       Validate_Record ( p_x_mtltfr_rec => l_x_mtltfr_rec,
4517 	                    x_return_status => x_return_status,
4518 						x_msg_count => x_msg_count,
4519 						x_msg_data => x_msg_data );
4520 
4521       IF (l_log_statement >= l_log_current_level) THEN
4522         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':After calling Validate_Record for i=['||i||']');
4523       END IF;
4524 
4525       IF (x_return_status = FND_API.G_RET_STS_ERROR)
4526 	  THEN
4527         l_error          := true;
4528         IF (l_log_statement >= l_log_current_level)
4529 		THEN
4530           FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Error in Validation for record no'||i);
4531         END IF;
4532       ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
4533 	  THEN
4534         IF (l_log_statement    >= l_log_current_level) THEN
4535           FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Unexpected error in Validation. No further processing');
4536         END IF;
4537         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4538       END IF;
4539 
4540     END LOOP;
4541     G_DEBUG_LINE_NUM := 130;
4542     -- End of validation
4543     --log
4544     IF (l_log_statement >= l_log_current_level) THEN
4545       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validation completed for all records');
4546     END IF;
4547     IF (l_error) THEN
4548       -- No further processing till validation errors are there
4549       G_DEBUG_LINE_NUM := 140;
4550 	  --log
4551       IF (l_log_statement >= l_log_current_level) THEN
4552         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validation Errors are there. Raise Error');
4553       END IF;
4554       RAISE FND_API.G_EXC_ERROR;
4555     END IF;
4556     -- No errors. Insert in interface table.
4557 	l_error          := false;
4558 	--log
4559       IF (l_log_statement >= l_log_current_level) THEN
4560         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':No Validation Errors are there. Continue...');
4561       END IF;
4562 
4563 	G_DEBUG_LINE_NUM    := 150;
4564     l_transaction_header_id := NULL; -- this will identify the records to be picked up by transaction Manager
4565 
4566     SELECT Mtl_Material_Transactions_S.nextval
4567     INTO l_transaction_header_id
4568     FROM DUAL;
4569 
4570 	--log
4571     G_DEBUG_LINE_NUM := 155;
4572     IF (l_log_statement >= l_log_current_level) THEN
4573       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Transaction Header id is '||l_transaction_header_id);
4574     END IF;
4575 
4576     l_transaction_id := NULL; -- one transaction id per record
4577     -- loop through the material record
4578     FOR i IN p_x_mtltfr_tbl.FIRST..p_x_mtltfr_tbl.LAST
4579     LOOP
4580 
4581 	  -- Get the shipping org type
4582 	SELECT intransit_type
4583 	INTO l_shipping_network_code
4584 	FROM MTL_SHIPPING_NETWORK_VIEW
4585 	WHERE from_organization_id =p_x_mtltfr_tbl(i).source_org_id
4586 	AND to_organization_id = p_x_mtltfr_tbl(i).dest_org_id ;
4587 
4588 	--log
4589     G_DEBUG_LINE_NUM    := 157;
4590       IF (l_log_statement >= l_log_current_level) THEN
4591         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Shipping network type is '||l_shipping_network_code);
4592       END IF;
4593 
4594       G_DEBUG_LINE_NUM := 160;
4595       --log
4596       IF (l_log_statement >= l_log_current_level) THEN
4597         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Calling Insert_Material for record '||i);
4598       END IF;
4599       --reset record type variable
4600       l_x_mtltfr_rec := NULL;
4601       l_x_mtltfr_rec := p_x_mtltfr_tbl(i);
4602 
4603       Insert_Material ( p_x_mtltfr_rec => l_x_mtltfr_rec,
4604                    	    p_x_txn_hdr_id => l_transaction_header_id,
4605 						p_x_txn_intf_id => l_transaction_id,
4606 						p_shipping_type => l_shipping_network_code,
4607 						x_return_status => x_return_status );
4608 
4609       --log
4610 	  G_DEBUG_LINE_NUM        := 165;
4611       IF (l_log_statement >= l_log_current_level) THEN
4612         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Return status from Insert_Material '||x_return_status);
4613 		FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Shipment Number for the record '||l_x_mtltfr_rec.shipment_number);
4614       END IF;
4615       -- Store the shipment id
4616 	  p_x_mtltfr_tbl(i).shipment_number := l_x_mtltfr_rec.shipment_number;
4617 
4618 	  -- Store the transaction ids generated during each insertion
4619       l_transaction_id_tbl(i) := l_transaction_id;
4620       G_DEBUG_LINE_NUM        := 170;
4621 
4622       IF (x_return_status    = FND_API.G_RET_STS_ERROR) THEN
4623         l_error             := true;
4624 		IF (l_log_error >= l_log_current_level) THEN
4625 			FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Error in Insert_Material Procedure for record '||i);
4626 			FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Continuing...');
4627 		END IF;
4628       ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4629         l_error             := true;
4630 		IF (l_log_error >= l_log_current_level) THEN
4631 			FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Unexpected Error in Insert_Material Procedure for record '||i);
4632 			FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Raising Error');
4633 		END IF;
4634         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4635       END IF;
4636     END LOOP;
4637     IF(l_error ) THEN
4638       G_DEBUG_LINE_NUM := 180;
4639 	  IF (l_log_error >= l_log_current_level) THEN
4640         FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Error in Insert_Material Procedure');
4641 		FND_LOG.string(l_log_error, l_debug_module, G_DEBUG_LINE_NUM||':Raising Error');
4642       END IF;
4643       -- Processing stops
4644       RAISE FND_API.G_EXC_ERROR;
4645     END IF;
4646     -- Now process the interface records
4647     --log
4648     IF (l_log_statement >= l_log_current_level) THEN
4649       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Calling INV_TXN_MANAGER_PUB.process_Transactions');
4650     END IF;
4651     BEGIN
4652 	G_DEBUG_LINE_NUM := 185;
4653 	l_result := INV_TXN_MANAGER_PUB.process_Transactions( p_api_version => NULL ,
4654 	                                                      p_init_msg_list => fnd_api.g_false,
4655 														  p_commit => fnd_api.g_false ,
4656 														  p_validation_level => fnd_api.g_valid_level_full ,
4657 														  x_return_status => x_return_status,
4658 														  x_msg_count => x_msg_count,
4659 														  x_msg_data => x_msg_data,
4660 														  x_trans_count => l_trans_count,
4661 														  p_table => 1 ,
4662 														  p_header_id => l_transaction_header_id );
4663 	EXCEPTION
4664     WHEN OTHERS
4665     THEN
4666 	    IF (l_log_exception >= l_log_current_level) THEN
4667            FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':API INV_TXN_MANAGER_PUB.process_Transactions returned exception');
4668 	       FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM -'|| SQLERRM);
4669         END IF;
4670 		-- Raise Exception
4671 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4672 	END;
4673     mo_global.init('AHL');
4674     IF( l_result        = -1 OR x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4675 	  G_DEBUG_LINE_NUM := 188;
4676 	  IF (l_log_statement >= l_log_current_level) THEN
4677         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':INV_TXN_MANAGER_PUB.process_Transactions returned error.x_msg_data = '||x_msg_data);
4678       END IF;
4679     END IF;
4680   END IF;
4681 
4682   IF (l_log_statement >= l_log_current_level) THEN
4683         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':INV_TXN_MANAGER_PUB.process_Transactions return status is '||x_return_status);
4684   END IF;
4685   -- Now  Loop thru the transaction Id table, Check Errors
4686   IF (l_transaction_id_tbl.COUNT > 0)
4687   THEN
4688     -- This loop checks for errors. No interface record implies
4689     -- tha there is no error.
4690 	G_DEBUG_LINE_NUM := 190;
4691     l_error := false;
4692     FOR i   IN l_transaction_id_tbl.FIRST..l_transaction_id_tbl.LAST
4693     LOOP
4694       OPEN Transaction_Error_Cur(l_transaction_id_tbl(i));
4695       FETCH Transaction_Error_Cur INTO l_error_msg,l_error_code, l_item, l_serial;
4696       IF(Transaction_Error_Cur%FOUND AND (l_error_code IS NOT NULL OR trim(l_error_code) = '')) THEN
4697        	IF (l_log_statement >= l_log_current_level) THEN
4698           FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Error in transaction['||l_error_code||':'||l_error_msg||']');
4699         END IF;
4700         FND_MESSAGE.Set_Name('AHL','AHL_MM_MTLTFR_ERROR');
4701         FND_MESSAGE.Set_Token('MSG',l_error_msg);
4702 		FND_MESSAGE.Set_Token('CODE',l_error_code);
4703         FND_MESSAGE.Set_Token('ITEM',l_item);
4704         FND_MESSAGE.Set_Token('SER',l_serial);
4705         FND_MSG_PUB.ADD;
4706         l_error := true;
4707       END IF;
4708       CLOSE Transaction_Error_Cur;
4709     END LOOP;
4710     IF(l_error ) THEN
4711       RAISE FND_API.G_EXC_ERROR;
4712     END IF;
4713   END IF;
4714   -- END of if which checks the count of transactions created
4715   -- Standard check of p_commit
4716   IF FND_API.To_Boolean(p_commit) THEN
4717     COMMIT ;
4718   END IF;
4719 EXCEPTION
4720 WHEN FND_API.G_EXC_ERROR THEN
4721   x_return_status := FND_API.G_RET_STS_ERROR;
4722     ROLLBACK TO Perform_Inter_Org_Transfer_Inv;
4723   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4724 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4725   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4726     ROLLBACK TO Perform_Inter_Org_Transfer_Inv;
4727   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4728 WHEN OTHERS THEN
4729   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4730     ROLLBACK TO Perform_Inter_Org_Transfer_Inv;
4731   fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME, p_procedure_name => 'Perform_Inter_Org_Transfer_Inv', p_error_text => SQLERRM);
4732   FND_MSG_PUB.count_and_get( p_count => x_msg_count, p_data => x_msg_data, p_encoded => fnd_api.g_false);
4733 END Perform_Inter_Org_Transfer_Inv;
4734 ------------------------------------------------------------------------------------------------------------
4735 PROCEDURE Insert_Material
4736   (
4737     p_x_mtltfr_rec  IN OUT NOCOPY Ahl_Mtltfr_Rec_Type,
4738     p_x_txn_hdr_id  IN OUT NOCOPY NUMBER,
4739     p_x_txn_intf_id IN OUT NOCOPY NUMBER,
4740 	p_shipping_type IN NUMBER,
4741     x_return_status OUT NOCOPY    VARCHAR2
4742 	)
4743 IS
4744   -- Serial Number dff
4745   CURSOR get_serial_dff_attrib(p_inv_item_id IN NUMBER, p_serial_number IN VARCHAR2)
4746                                              IS
4747     SELECT ATTRIBUTE_CATEGORY,
4748       ATTRIBUTE1,
4749       ATTRIBUTE2,
4750       ATTRIBUTE3,
4751       ATTRIBUTE4,
4752       ATTRIBUTE5,
4753       ATTRIBUTE6,
4754       ATTRIBUTE7,
4755       ATTRIBUTE8,
4756       ATTRIBUTE9,
4757       ATTRIBUTE10,
4758       ATTRIBUTE11,
4759       ATTRIBUTE12,
4760       ATTRIBUTE13,
4761       ATTRIBUTE14,
4762       ATTRIBUTE15,
4763       C_ATTRIBUTE1,
4764       C_ATTRIBUTE2,
4765       C_ATTRIBUTE3,
4766       C_ATTRIBUTE4,
4767       C_ATTRIBUTE5,
4768       C_ATTRIBUTE6,
4769       C_ATTRIBUTE7,
4770       C_ATTRIBUTE8,
4771       C_ATTRIBUTE9,
4772       C_ATTRIBUTE10,
4773       C_ATTRIBUTE11,
4774       C_ATTRIBUTE12,
4775       C_ATTRIBUTE13,
4776       C_ATTRIBUTE14,
4777       C_ATTRIBUTE15,
4778       C_ATTRIBUTE16,
4779       C_ATTRIBUTE17,
4780       C_ATTRIBUTE18,
4781       C_ATTRIBUTE19,
4782       C_ATTRIBUTE20,
4783       D_ATTRIBUTE1,
4784       D_ATTRIBUTE2,
4785       D_ATTRIBUTE3,
4786       D_ATTRIBUTE4,
4787       D_ATTRIBUTE5,
4788       D_ATTRIBUTE6,
4789       D_ATTRIBUTE7,
4790       D_ATTRIBUTE8,
4791       D_ATTRIBUTE9,
4792       D_ATTRIBUTE10,
4793       N_ATTRIBUTE1,
4794       N_ATTRIBUTE2,
4795       N_ATTRIBUTE3,
4796       N_ATTRIBUTE4,
4797       N_ATTRIBUTE5,
4798       N_ATTRIBUTE6,
4799       N_ATTRIBUTE7,
4800       N_ATTRIBUTE8,
4801       N_ATTRIBUTE9,
4802       N_ATTRIBUTE10
4803     FROM mtl_serial_numbers
4804     WHERE inventory_item_id = p_inv_item_id
4805     AND serial_number       = p_serial_number;
4806 
4807   l_serial_dff_rec get_serial_dff_attrib%ROWTYPE;
4808   --local variables
4809   l_qty                 NUMBER;
4810   l_process_flag        VARCHAR2(1);
4811   l_txn_tmp_id          NUMBER;
4812   l_transaction_Type_Id NUMBER ;
4813   l_shipment_num NUMBER;
4814   l_shipment_number VARCHAR2(30);
4815 
4816   --Constants for insert
4817   l_validation_required VARCHAR2(1) := 1;
4818   l_transaction_mode    NUMBER := 2;
4819   l_source_header_id    NUMBER := 1;
4820   l_source_line_id      NUMBER := 1;
4821   l_source_code         VARCHAR2(240):= 'AHL';
4822   l_ship_id_present     VARCHAR2(1);
4823 
4824   --Log
4825   l_debug_module VARCHAR2(1000) := 'ahl.plsql.AHL_MM_MTL_MGT_PVT.Insert_Material';
4826 BEGIN
4827   l_process_flag        := '1';
4828   x_return_status := FND_API.G_RET_STS_SUCCESS;
4829   --log
4830   G_DEBUG_LINE_NUM := 200;
4831     IF (l_log_statement >= l_log_current_level) THEN
4832       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':In Insert_Material Procedure with shipping network type '||p_shipping_type||
4833 	  ',transaction header id '||p_x_txn_hdr_id);
4834     END IF;
4835 
4836   IF(p_x_txn_hdr_id     IS NULL) THEN
4837     SELECT Mtl_Material_Transactions_S.nextval INTO p_x_txn_hdr_id FROM DUAL;
4838   END IF;
4839   G_DEBUG_LINE_NUM := 210;
4840   SELECT Mtl_Material_Transactions_S.nextval INTO p_x_txn_intf_id FROM DUAL;
4841   IF (l_log_statement >= l_log_current_level) THEN
4842       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Interface Id created - '||p_x_txn_intf_id);
4843 
4844   END IF;
4845 
4846   IF (p_shipping_type = C_INTRANSIT_NETWORK)
4847   THEN
4848     G_DEBUG_LINE_NUM := 220;
4849 	l_qty    := -1;
4850 	l_transaction_type_id := C_INTRANSIT_SHIPMENT;
4851 	--SELECT AHL_SHIPMENT_NUMBER_S.nextval INTO l_shipment_num FROM dual;
4852 
4853   -- Check if shipment number already exists for this combination of organizations
4854 	IF (ship_id_tbl IS NULL)
4855 	THEN
4856 	  SELECT AHL_SHIPMENT_NUMBER_S.nextval INTO l_shipment_num FROM dual;
4857 	  ship_id_tbl := Shipping_Id_Tbl_type();
4858 	  ship_id_tbl.EXTEND;
4859 	  ship_id_tbl(1).source_org_id := p_x_mtltfr_rec.source_org_id;
4860 	  ship_id_tbl(1).dest_org_id := p_x_mtltfr_rec.dest_org_id;
4861 	  ship_id_tbl(1).shipment_num := l_shipment_num;
4862 	ELSE
4863 	  IF (ship_id_tbl.COUNT > 0)
4864 	  THEN
4865     l_ship_id_present := 'N';
4866 	  FOR i IN ship_id_tbl.FIRST..ship_id_tbl.LAST
4867 	  LOOP
4868 	    IF (ship_id_tbl(i).source_org_id = p_x_mtltfr_rec.source_org_id
4869      		AND ship_id_tbl(i).dest_org_id = p_x_mtltfr_rec.dest_org_id) THEN
4870 			l_ship_id_present := 'Y';
4871 			l_shipment_num := ship_id_tbl(i).shipment_num;
4872 			EXIT;
4873 		ELSE
4874 		    SELECT AHL_SHIPMENT_NUMBER_S.nextval INTO l_shipment_num FROM dual;
4875 			ship_id_tbl.EXTEND;
4876 			ship_id_tbl(i).source_org_id := p_x_mtltfr_rec.source_org_id;
4877 	        ship_id_tbl(i).dest_org_id := p_x_mtltfr_rec.dest_org_id;
4878 	        ship_id_tbl(i).shipment_num := l_shipment_num;
4879 		END IF;
4880 	  END LOOP;
4881 	  END IF;
4882 	END IF;
4883 	l_shipment_number := 'CMRO'||l_shipment_num;
4884 
4885 	IF (l_log_statement >= l_log_current_level) THEN
4886       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Shipment Number created - '||l_shipment_number);
4887 	END IF;
4888   ELSIF (p_shipping_type = C_DIRECT_NETWORK)
4889   THEN
4890     G_DEBUG_LINE_NUM := 230;
4891 	l_qty    := 1;
4892 	l_transaction_type_id := C_DIRECT_INTERORG_TXFR;
4893 	l_shipment_number := NULL;
4894   END IF;
4895 
4896   --If the serial controlled rec is not null then insert records
4897   -- into the serial numbers interface table
4898   IF (p_x_mtltfr_rec.serial_number IS NOT NULL)
4899   THEN
4900   G_DEBUG_LINE_NUM := 240;
4901     OPEN get_serial_dff_attrib(p_x_mtltfr_rec.inventory_item_id, p_x_mtltfr_rec.serial_number);
4902     FETCH get_serial_dff_attrib INTO l_serial_dff_rec;
4903     CLOSE get_serial_dff_attrib;
4904 
4905 	G_DEBUG_LINE_NUM := 250;
4906     INSERT
4907     INTO MTL_SERIAL_NUMBERS_INTERFACE
4908       (
4909         TRANSACTION_INTERFACE_ID,
4910         SOURCE_CODE,
4911         SOURCE_LINE_ID,
4912         LAST_UPDATE_DATE,
4913         LAST_UPDATED_BY,
4914         CREATION_DATE,
4915         CREATED_BY,
4916         LAST_UPDATE_LOGIN,
4917         FM_SERIAL_NUMBER,
4918         TO_SERIAL_NUMBER,
4919         PROCESS_FLAG,
4920         ATTRIBUTE_CATEGORY,
4921         ATTRIBUTE1,
4922         ATTRIBUTE2,
4923         ATTRIBUTE3,
4924         ATTRIBUTE4,
4925         ATTRIBUTE5,
4926         ATTRIBUTE6,
4927         ATTRIBUTE7,
4928         ATTRIBUTE8,
4929         ATTRIBUTE9,
4930         ATTRIBUTE10,
4931         ATTRIBUTE11,
4932         ATTRIBUTE12,
4933         ATTRIBUTE13,
4934         ATTRIBUTE14,
4935         ATTRIBUTE15,
4936         C_ATTRIBUTE1,
4937         C_ATTRIBUTE2,
4938         C_ATTRIBUTE3,
4939         C_ATTRIBUTE4,
4940         C_ATTRIBUTE5,
4941         C_ATTRIBUTE6,
4942         C_ATTRIBUTE7,
4943         C_ATTRIBUTE8,
4944         C_ATTRIBUTE9,
4945         C_ATTRIBUTE10,
4946         C_ATTRIBUTE11,
4947         C_ATTRIBUTE12,
4948         C_ATTRIBUTE13,
4949         C_ATTRIBUTE14,
4950         C_ATTRIBUTE15,
4951         C_ATTRIBUTE16,
4952         C_ATTRIBUTE17,
4953         C_ATTRIBUTE18,
4954         C_ATTRIBUTE19,
4955         C_ATTRIBUTE20,
4956         D_ATTRIBUTE1,
4957         D_ATTRIBUTE2,
4958         D_ATTRIBUTE3,
4959         D_ATTRIBUTE4,
4960         D_ATTRIBUTE5,
4961         D_ATTRIBUTE6,
4962         D_ATTRIBUTE7,
4963         D_ATTRIBUTE8,
4964         D_ATTRIBUTE9,
4965         D_ATTRIBUTE10,
4966         N_ATTRIBUTE1,
4967         N_ATTRIBUTE2,
4968         N_ATTRIBUTE3,
4969         N_ATTRIBUTE4,
4970         N_ATTRIBUTE5,
4971         N_ATTRIBUTE6,
4972         N_ATTRIBUTE7,
4973         N_ATTRIBUTE8,
4974         N_ATTRIBUTE9,
4975         N_ATTRIBUTE10
4976       )
4977       VALUES
4978       (
4979         p_x_txn_intf_id,
4980         l_source_code,
4981         l_source_line_id,
4982         SYSDATE,
4983         FND_GLOBAL.USER_ID,
4984         SYSDATE,
4985         FND_GLOBAL.USER_ID,
4986         FND_GLOBAL.LOGIN_ID,
4987         p_x_mtltfr_rec.serial_number,
4988         p_x_mtltfr_rec.serial_number,
4989         l_process_flag,
4990         l_serial_dff_rec.ATTRIBUTE_CATEGORY,
4991         l_serial_dff_rec.ATTRIBUTE1,
4992         l_serial_dff_rec.ATTRIBUTE2,
4993         l_serial_dff_rec.ATTRIBUTE3,
4994         l_serial_dff_rec.ATTRIBUTE4,
4995         l_serial_dff_rec.ATTRIBUTE5,
4996         l_serial_dff_rec.ATTRIBUTE6,
4997         l_serial_dff_rec.ATTRIBUTE7,
4998         l_serial_dff_rec.ATTRIBUTE8,
4999         l_serial_dff_rec.ATTRIBUTE9,
5000         l_serial_dff_rec.ATTRIBUTE10,
5001         l_serial_dff_rec.ATTRIBUTE11,
5002         l_serial_dff_rec.ATTRIBUTE12,
5003         l_serial_dff_rec.ATTRIBUTE13,
5004         l_serial_dff_rec.ATTRIBUTE14,
5005         l_serial_dff_rec.ATTRIBUTE15,
5006         l_serial_dff_rec.C_ATTRIBUTE1,
5007         l_serial_dff_rec.C_ATTRIBUTE2,
5008         l_serial_dff_rec.C_ATTRIBUTE3,
5009         l_serial_dff_rec.C_ATTRIBUTE4,
5010         l_serial_dff_rec.C_ATTRIBUTE5,
5011         l_serial_dff_rec.C_ATTRIBUTE6,
5012         l_serial_dff_rec.C_ATTRIBUTE7,
5013         l_serial_dff_rec.C_ATTRIBUTE8,
5014         l_serial_dff_rec.C_ATTRIBUTE9,
5015         l_serial_dff_rec.C_ATTRIBUTE10,
5016         l_serial_dff_rec.C_ATTRIBUTE11,
5017         l_serial_dff_rec.C_ATTRIBUTE12,
5018         l_serial_dff_rec.C_ATTRIBUTE13,
5019         l_serial_dff_rec.C_ATTRIBUTE14,
5020         l_serial_dff_rec.C_ATTRIBUTE15,
5021         l_serial_dff_rec.C_ATTRIBUTE16,
5022         l_serial_dff_rec.C_ATTRIBUTE17,
5023         l_serial_dff_rec.C_ATTRIBUTE18,
5024         l_serial_dff_rec.C_ATTRIBUTE19,
5025         l_serial_dff_rec.C_ATTRIBUTE20,
5026         l_serial_dff_rec.D_ATTRIBUTE1,
5027         l_serial_dff_rec.D_ATTRIBUTE2,
5028         l_serial_dff_rec.D_ATTRIBUTE3,
5029         l_serial_dff_rec.D_ATTRIBUTE4,
5030         l_serial_dff_rec.D_ATTRIBUTE5,
5031         l_serial_dff_rec.D_ATTRIBUTE6,
5032         l_serial_dff_rec.D_ATTRIBUTE7,
5033         l_serial_dff_rec.D_ATTRIBUTE8,
5034         l_serial_dff_rec.D_ATTRIBUTE9,
5035         l_serial_dff_rec.D_ATTRIBUTE10,
5036         l_serial_dff_rec.N_ATTRIBUTE1,
5037         l_serial_dff_rec.N_ATTRIBUTE2,
5038         l_serial_dff_rec.N_ATTRIBUTE3,
5039         l_serial_dff_rec.N_ATTRIBUTE4,
5040         l_serial_dff_rec.N_ATTRIBUTE5,
5041         l_serial_dff_rec.N_ATTRIBUTE6,
5042         l_serial_dff_rec.N_ATTRIBUTE7,
5043         l_serial_dff_rec.N_ATTRIBUTE8,
5044         l_serial_dff_rec.N_ATTRIBUTE9,
5045         l_serial_dff_rec.N_ATTRIBUTE10
5046       );
5047   END IF;
5048  G_DEBUG_LINE_NUM := 260;
5049   IF (l_log_statement >= l_log_current_level) THEN
5050       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Inserted in serial interface table');
5051 	END IF;
5052   INSERT
5053   INTO MTL_TRANSACTIONS_INTERFACE
5054     (
5055       TRANSACTION_INTERFACE_ID ,
5056       TRANSACTION_HEADER_ID ,
5057       SOURCE_CODE ,
5058       SOURCE_LINE_ID ,
5059       SOURCE_HEADER_ID,
5060       PROCESS_FLAG ,
5061       VALIDATION_REQUIRED ,
5062       TRANSACTION_MODE ,
5063       LAST_UPDATE_DATE ,
5064       LAST_UPDATED_BY ,
5065       CREATION_DATE ,
5066       CREATED_BY ,
5067       LAST_UPDATE_LOGIN ,
5068       INVENTORY_ITEM_ID ,
5069       ORGANIZATION_ID ,
5070       TRANSACTION_QUANTITY ,
5071       PRIMARY_QUANTITY ,
5072       TRANSACTION_UOM ,
5073       TRANSACTION_DATE ,
5074       SUBINVENTORY_CODE ,
5075       LOCATOR_ID ,
5076       TRANSACTION_TYPE_ID ,
5077       REVISION ,
5078       TRANSACTION_REFERENCE ,
5079       TRANSFER_SUBINVENTORY,
5080       TRANSFER_LOCATOR,
5081       TRANSFER_ORGANIZATION,
5082 	  SHIPMENT_NUMBER
5083     )
5084     VALUES
5085     (
5086       p_x_txn_intf_id,
5087       p_x_txn_hdr_id,
5088       l_source_code,
5089       l_source_line_id,
5090       l_source_header_id,
5091       l_process_flag,
5092       l_validation_required ,
5093       l_transaction_mode,
5094       sysdate,
5095       FND_GLOBAL.USER_ID,
5096       sysdate,
5097       FND_GLOBAL.USER_ID,
5098       FND_GLOBAL.LOGIN_ID,
5099       p_x_mtltfr_rec.inventory_item_id,
5100       p_x_mtltfr_rec.source_org_id,
5101       l_qty,
5102       l_qty,
5103       p_x_mtltfr_rec.uom,
5104       sysdate,
5105       p_x_mtltfr_rec.source_subinv_name,
5106       p_x_mtltfr_rec.source_locator_id,
5107       l_transaction_type_id,
5108       p_x_mtltfr_rec.revision,
5109       'AHL',
5110       p_x_mtltfr_rec.dest_subinv_name,
5111       p_x_mtltfr_rec.dest_locator_id,
5112       p_x_mtltfr_rec.dest_org_id,
5113 	  l_shipment_number
5114     );
5115 	G_DEBUG_LINE_NUM := 270;
5116 	IF (l_log_statement >= l_log_current_level) THEN
5117       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Inserted in transaction interface table');
5118 	  FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Returning from Insert_Material Procedure');
5119 	END IF;
5120 	p_x_mtltfr_rec.shipment_number := l_shipment_number;
5121 EXCEPTION
5122 WHEN OTHERS
5123 THEN
5124 	x_return_status := FND_API.G_RET_STS_ERROR;
5125 	IF (l_log_exception >= l_log_current_level) THEN
5126       FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':Exception in Insert_Material');
5127 	  FND_LOG.string(l_log_exception, l_debug_module, G_DEBUG_LINE_NUM||':SQLERRM -'||SQLERRM);
5128 	END IF;
5129 	 FND_MESSAGE.Set_Name('AHL','AHL_MM_MTLTFR_ERROR');
5130            FND_MESSAGE.Set_Token('MSG',SQLERRM);
5131            FND_MESSAGE.Set_Token('ITEM',p_x_mtltfr_rec.inventory_item_id);
5132 		   FND_MESSAGE.Set_Token('SER',p_x_mtltfr_rec.Serial_Number);
5133            FND_MSG_PUB.ADD;
5134      RAISE FND_API.G_EXC_ERROR;
5135 END Insert_Material;
5136 ------------------------------------------------------------------------------------------------------------
5137 PROCEDURE Validate_Record
5138   (
5139     p_x_mtltfr_rec IN OUT NOCOPY Ahl_Mtltfr_Rec_Type,
5140     x_return_status OUT NOCOPY VARCHAR2,
5141     x_msg_count OUT NOCOPY     NUMBER,
5142     x_msg_data OUT NOCOPY      VARCHAR2 )
5143                                 IS
5144   l_debug_module VARCHAR2(1000) := 'ahl.plsql.AHL_MM_MTL_MGT_PVT.Validate_Record';
5145   -- Cursor Declaration
5146   -- Item id validation and selecting item attributes in destination
5147   CURSOR ITEM_VALID_CUR_DEST (p_org_id NUMBER, p_item NUMBER)
5148   IS
5149     SELECT SERIAL_NUMBER_CONTROL_CODE,
5150       LOT_CONTROL_CODE,
5151       REVISION_QTY_CONTROL_CODE,
5152       LOCATION_CONTROL_CODE,
5153       primary_uom_code,
5154       concatenated_segments
5155     FROM MTL_SYSTEM_ITEMS_KFV
5156     WHERE ORGANIZATION_ID    = p_org_id
5157     AND INVENTORY_ITEM_ID    = p_item
5158     AND ENABLED_FLAG         = 'Y'
5159     AND ((START_DATE_ACTIVE IS NULL)
5160     OR (START_DATE_ACTIVE   <= SYSDATE))
5161     AND ((END_DATE_ACTIVE   IS NULL)
5162     OR (END_DATE_ACTIVE     >= SYSDATE));
5163   -- Item id validation and selecting item attributes in source org
5164   CURSOR ITEM_VALID_CUR_SRC (p_org_id NUMBER, p_item NUMBER)
5165   IS
5166     SELECT SERIAL_NUMBER_CONTROL_CODE,
5167       LOT_CONTROL_CODE,
5168       REVISION_QTY_CONTROL_CODE,
5169       LOCATION_CONTROL_CODE,
5170       primary_uom_code,
5171       concatenated_segments
5172     FROM MTL_SYSTEM_ITEMS_KFV
5173     WHERE ORGANIZATION_ID    = p_org_id
5174     AND INVENTORY_ITEM_ID    = p_item
5175     AND ENABLED_FLAG         = 'Y'
5176     AND ((START_DATE_ACTIVE IS NULL)
5177     OR (START_DATE_ACTIVE   <= SYSDATE))
5178     AND ((END_DATE_ACTIVE   IS NULL)
5179     OR (END_DATE_ACTIVE     >= SYSDATE));
5180   -- Locator validation
5181   CURSOR LOCATOR_VALID_CUR (p_org_id NUMBER, p_loc_id NUMBER)
5182   IS
5183     SELECT 1
5184     FROM MTL_ITEM_LOCATIONS
5185     WHERE INVENTORY_LOCATION_ID = p_loc_id
5186     AND ORGANIZATION_ID         = p_org_id;
5187   -- Reservation validation
5188   CURSOR RESERVATION_VALID_CUR (p_org_id NUMBER, p_item NUMBER, p_serial_num VARCHAR2)
5189   IS
5190     SELECT 1
5191     FROM MTL_SERIAL_NUMBERS
5192     WHERE INVENTORY_ITEM_ID     = p_item
5193     AND CURRENT_ORGANIZATION_ID = p_org_id
5194     AND SERIAL_NUMBER           = p_serial_num
5195     AND RESERVATION_ID         IS NOT NULL;
5196   -- Shipping Network validation
5197   CURSOR SHIPPING_NETWORK_CUR(p_source_org_id NUMBER, p_dest_org_id NUMBER)
5198   IS
5199     SELECT 1
5200     FROM MTL_SHIPPING_NETWORK_VIEW
5201     WHERE from_organization_id =p_source_org_id
5202     AND to_organization_id     = p_dest_org_id ;
5203 
5204   -- Shiipinmg allowed validation
5205   CURSOR SHIPPING_ATTRIB_CUR(p_source_org_id NUMBER, p_dest_org_id NUMBER)
5206   IS
5207     SELECT 1
5208     FROM MTL_SHIPPING_NETWORK_VIEW
5209     WHERE from_organization_id =p_source_org_id
5210     AND to_organization_id     = p_dest_org_id
5211     AND internal_order_required_flag = 1;
5212 
5213   -- local variable declaration
5214   l_serial_control_src    NUMBER;
5215   l_serial_control_dest   NUMBER;
5216   l_revision_control_src  NUMBER;
5217   l_revision_control_dest NUMBER;
5218   l_lot_control_src       NUMBER;
5219   l_lot_control_dest      NUMBER;
5220   l_location_control_src  NUMBER;
5221   l_location_control_dest NUMBER;
5222   l_temp_number           NUMBER;
5223   l_primary_uom_code mtl_system_items.primary_uom_code%TYPE;
5224   l_concatenated_segments mtl_system_items_kfv.concatenated_segments%TYPE;
5225   l_src_organization_name        Org_Organization_definitions.organization_name%TYPE;
5226   l_dest_organization_name       Org_Organization_definitions.organization_name%TYPE;
5227 BEGIN
5228   x_return_status := FND_API.G_RET_STS_SUCCESS;
5229   --log
5230   G_DEBUG_LINE_NUM    := 300;
5231   IF (l_log_statement >= l_log_current_level) THEN
5232     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':In Validate_Record procedure');
5233   END IF;
5234   -- get the item name instead of id for error message purpose
5235       BEGIN
5236       SELECT concatenated_segments
5237       INTO l_concatenated_segments
5238       FROM mtl_system_items_kfv
5239       WHERE inventory_item_id = p_x_mtltfr_rec.Inventory_Item_Id
5240       AND organization_id = p_x_mtltfr_rec.dest_org_id;
5241       EXCEPTION
5242       WHEN OTHERS
5243       THEN
5244       l_concatenated_segments:= NULL;
5245       END;
5246       -- get the source org name instead of the org id for error message purpose
5247       BEGIN
5248       SELECT organization_name
5249       INTO l_src_organization_name
5250       FROM Org_Organization_definitions
5251       WHERE organization_id = p_x_mtltfr_rec.source_org_id;
5252       EXCEPTION
5253       WHEN OTHERS
5254       THEN
5255          l_src_organization_name := NULL;
5256       END;
5257 
5258       -- get the dest org name instead of the org id for error message purpose
5259       BEGIN
5260       SELECT organization_name
5261       INTO l_dest_organization_name
5262       FROM Org_Organization_definitions
5263       WHERE organization_id = p_x_mtltfr_rec.dest_org_id;
5264       EXCEPTION
5265       WHEN OTHERS
5266       THEN
5267          l_dest_organization_name := NULL;
5268       END;
5269   -- Validate transaction quantity
5270   -- transaction quantity should be +ve always.
5271   G_DEBUG_LINE_NUM    := 310;
5272   IF (l_log_statement >= l_log_current_level) THEN
5273     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating quantity '||p_x_mtltfr_rec.quantity);
5274   END IF;
5275   -- Quantity validation
5276   IF(NVL(p_x_mtltfr_rec.quantity,0) <= 0) THEN
5277     FND_MESSAGE.Set_Name('AHL','AHL_PRD_INVALID_QTY');
5278     FND_MESSAGE.Set_Token('QUANTITY',p_x_mtltfr_rec.quantity);
5279     FND_MSG_PUB.ADD;
5280     x_return_status := FND_API.G_RET_STS_ERROR;
5281   END IF;
5282   G_DEBUG_LINE_NUM    := 320;
5283   IF (l_log_statement >= l_log_current_level) THEN
5284     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating item '||p_x_mtltfr_rec.inventory_item_id||' and org id '||p_x_mtltfr_rec.source_org_id);
5285   END IF;
5286   -- Item validation
5287   IF (p_x_mtltfr_rec.source_org_id IS NOT NULL AND p_x_mtltfr_rec.inventory_item_id IS NOT NULL) THEN
5288     OPEN ITEM_VALID_CUR_DEST(p_x_mtltfr_rec.dest_org_id, p_x_mtltfr_rec.inventory_item_id);
5289     FETCH ITEM_VALID_CUR_DEST
5290     INTO l_serial_Control_dest,
5291       l_lot_control_dest,
5292       l_revision_control_dest,
5293       l_location_control_dest,
5294       l_primary_uom_code,
5295       l_concatenated_segments;
5296 
5297     G_DEBUG_LINE_NUM := 330;
5298     IF(ITEM_VALID_CUR_DEST%NOTFOUND) THEN
5299       IF (l_log_statement >= l_log_current_level) THEN
5300         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Item/Destination Org combination is invalid');
5301       END IF;
5302       FND_MESSAGE.Set_Name('AHL','AHL_COM_INVALID_ITEM');
5303       FND_MESSAGE.Set_Token('FIELD',NVL(l_concatenated_segments, p_x_mtltfr_rec.Inventory_Item_Id));
5304       FND_MSG_PUB.ADD;
5305       x_return_status := FND_API.G_RET_STS_ERROR;
5306     END IF;
5307     CLOSE ITEM_VALID_CUR_DEST;
5308   ELSE
5309     G_DEBUG_LINE_NUM    := 340;
5310     IF (l_log_statement >= l_log_current_level) THEN
5311       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating Source and Destination Orgs for null');
5312     END IF;
5313     IF p_x_mtltfr_rec.source_org_id IS NULL THEN
5314       IF (l_log_statement           >= l_log_current_level) THEN
5315         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Source Org is null');
5316       END IF;
5317       FND_MESSAGE.Set_Name('AHL','AHL_MM_SOURCE_ORG_NULL');
5318       FND_MESSAGE.Set_Token('SER', p_x_mtltfr_rec.serial_number);
5319       FND_MSG_PUB.ADD;
5320       x_return_status := FND_API.G_RET_STS_ERROR;
5321     END IF;
5322     IF p_x_mtltfr_rec.dest_org_id IS NULL THEN
5323       G_DEBUG_LINE_NUM            := 350;
5324       IF (l_log_statement         >= l_log_current_level) THEN
5325         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Destination Org is null');
5326       END IF;
5327       FND_MESSAGE.Set_Name('AHL','AHL_MM_DEST_ORG_NULL');
5328       FND_MESSAGE.Set_Token('SER', p_x_mtltfr_rec.serial_number);
5329       FND_MSG_PUB.ADD;
5330       x_return_status := FND_API.G_RET_STS_ERROR;
5331     END IF;
5332   END IF;
5333    G_DEBUG_LINE_NUM := 352;
5334       IF (l_log_statement >= l_log_current_level) THEN
5335       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating Item for null');
5336       END IF;
5337     IF p_x_mtltfr_rec.Inventory_Item_Id IS NULL THEN
5338       G_DEBUG_LINE_NUM                  := 360;
5339       IF (l_log_statement               >= l_log_current_level) THEN
5340         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Item is null');
5341       END IF;
5342       FND_MESSAGE.Set_Name('AHL','AHL_CMP_ITEM_NULL');
5343       FND_MSG_PUB.ADD;
5344       x_return_status := FND_API.G_RET_STS_ERROR;
5345     END IF;
5346 
5347   IF (l_log_statement >= l_log_current_level) THEN
5348     G_DEBUG_LINE_NUM  := 370;
5349     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating Serial '||p_x_mtltfr_rec.Serial_Number);
5350   END IF;
5351   IF(p_x_mtltfr_rec.Serial_Number IS NULL OR p_x_mtltfr_rec.Serial_Number = FND_API.G_MISS_CHAR)
5352   THEN
5353     G_DEBUG_LINE_NUM              := 380;
5354     IF (l_log_statement           >= l_log_current_level) THEN
5355       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Item serial is NULL. Can not be transfered');
5356     END IF;
5357     FND_MESSAGE.Set_Name('AHL','AHL_MM_SERIAL_NULL');
5358     FND_MSG_PUB.ADD;
5359     x_return_status := FND_API.G_RET_STS_ERROR;
5360   ELSE
5361     IF (p_x_mtltfr_rec.Serial_Number IS NOT NULL AND l_serial_Control_dest = 1) THEN
5362       G_DEBUG_LINE_NUM               := 390;
5363       IF (l_log_statement            >= l_log_current_level) THEN
5364         FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Item is not serialized in destination org. Can not be transfered');
5365       END IF;
5366       FND_MESSAGE.Set_Name('AHL','AHL_PRD_SRLNUM_NOTMAND');
5367       FND_MESSAGE.Set_Token('SER',p_x_mtltfr_rec.Serial_Number);
5368       FND_MESSAGE.Set_Token('ITEM',l_concatenated_segments);
5369       FND_MSG_PUB.ADD;
5370       x_return_status := FND_API.G_RET_STS_ERROR;
5371     END IF;
5372   END IF;
5373   IF (l_log_statement >= l_log_current_level) THEN
5374     G_DEBUG_LINE_NUM  := 392;
5375     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating Serial Control/Lot Control');
5376   END IF;
5377   IF (l_lot_control_src <> 1 AND l_lot_control_src IS NOT NULL) THEN
5378     G_DEBUG_LINE_NUM    := 400;
5379     IF (l_log_statement >= l_log_current_level) THEN
5380       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Item is lot controlled in destination org. Can not be transfered');
5381     END IF;
5382     FND_MESSAGE.Set_Name('AHL','AHL_MM_LOT_BASED_ITEM');
5383     FND_MSG_PUB.ADD;
5384     x_return_status := FND_API.G_RET_STS_ERROR;
5385   END IF;
5386   -- Visit Locator validation
5387   IF (l_log_statement >= l_log_current_level) THEN
5388     G_DEBUG_LINE_NUM  := 402;
5389     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating Locator');
5390   END IF;
5391   IF (p_x_mtltfr_rec.dest_locator_id IS NULL) THEN
5392     IF (l_log_statement              >= l_log_current_level) THEN
5393       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Visit locator is null');
5394     END IF;
5395     FND_MESSAGE.Set_Name('AHL','AHL_MM_NULL_VISIT_LOCATOR');
5396     FND_MSG_PUB.ADD;
5397     x_return_status := FND_API.G_RET_STS_ERROR;
5398   ELSE
5399   --Locator Validation for destination
5400   OPEN LOCATOR_VALID_CUR(p_x_mtltfr_rec.dest_org_id, p_x_mtltfr_rec.dest_locator_id);
5401   FETCH LOCATOR_VALID_CUR INTO l_temp_number;
5402   IF (LOCATOR_VALID_CUR%NOTFOUND) THEN
5403     IF (l_log_statement >= l_log_current_level) THEN
5404       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Invalid destination locator');
5405     END IF;
5406     FND_MESSAGE.Set_Name('AHL','AHL_MM_INVALID_LOCATOR');
5407     FND_MESSAGE.Set_Token('ORG',NVL(l_dest_organization_name, p_x_mtltfr_rec.dest_org_id));
5408     FND_MESSAGE.Set_Token('LOC',p_x_mtltfr_rec.dest_locator_id);
5409     FND_MSG_PUB.ADD;
5410     x_return_status := FND_API.G_RET_STS_ERROR;
5411   END IF;
5412   CLOSE LOCATOR_VALID_CUR;
5413  END IF;
5414   --Locator Validation for source
5415   OPEN LOCATOR_VALID_CUR(p_x_mtltfr_rec.source_org_id, p_x_mtltfr_rec.source_locator_id);
5416   FETCH LOCATOR_VALID_CUR INTO l_temp_number;
5417   IF (LOCATOR_VALID_CUR%NOTFOUND) THEN
5418     IF (l_log_statement >= l_log_current_level) THEN
5419       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Invalid source locator');
5420     END IF;
5421     FND_MESSAGE.Set_Name('AHL','AHL_MM_INVALID_LOCATOR');
5422     FND_MESSAGE.Set_Token('ORG',NVL(l_src_organization_name,p_x_mtltfr_rec.source_org_id));
5423     FND_MESSAGE.Set_Token('LOC',p_x_mtltfr_rec.dest_locator_id);
5424     FND_MSG_PUB.ADD;
5425     x_return_status := FND_API.G_RET_STS_ERROR;
5426   END IF;
5427   CLOSE LOCATOR_VALID_CUR;
5428   -- Check if already reserved
5429   IF (l_log_statement >= l_log_current_level) THEN
5430     G_DEBUG_LINE_NUM  := 405;
5431     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating for Existing reservation');
5432   END IF;
5433   OPEN RESERVATION_VALID_CUR(p_x_mtltfr_rec.source_org_id, p_x_mtltfr_rec.inventory_item_id, p_x_mtltfr_rec.serial_number);
5434   FETCH RESERVATION_VALID_CUR INTO l_temp_number;
5435   IF (RESERVATION_VALID_CUR%FOUND) THEN
5436     IF (l_log_statement >= l_log_current_level) THEN
5437       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Reservation already exists on the serial');
5438     END IF;
5439     FND_MESSAGE.Set_Name('AHL','AHL_MM_EXIST_RES');
5440     FND_MESSAGE.Set_Token('SER',p_x_mtltfr_rec.serial_number);
5441     FND_MSG_PUB.ADD;
5442     x_return_status := FND_API.G_RET_STS_ERROR;
5443   END IF;
5444   CLOSE RESERVATION_VALID_CUR;
5445   -- Shipping network validation
5446   IF (l_log_statement >= l_log_current_level) THEN
5447     G_DEBUG_LINE_NUM  := 408;
5448     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Validating for Shipping Network');
5449   END IF;
5450   OPEN SHIPPING_NETWORK_CUR(p_x_mtltfr_rec.source_org_id, p_x_mtltfr_rec.dest_org_id);
5451   FETCH SHIPPING_NETWORK_CUR INTO l_temp_number;
5452   IF (SHIPPING_NETWORK_CUR%NOTFOUND) THEN
5453     IF (l_log_statement >= l_log_current_level) THEN
5454       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'No shipping network between the organizations');
5455     END IF;
5456     FND_MESSAGE.Set_Name('AHL','AHL_MM_NO_SHIP_NETWORK');
5457     FND_MSG_PUB.ADD;
5458     x_return_status := FND_API.G_RET_STS_ERROR;
5459   END IF;
5460   CLOSE SHIPPING_NETWORK_CUR;
5461 
5462   -- Validate if internal order is reqd fro transfer
5463   OPEN SHIPPING_ATTRIB_CUR(p_x_mtltfr_rec.source_org_id, p_x_mtltfr_rec.dest_org_id);
5464   FETCH SHIPPING_ATTRIB_CUR INTO l_temp_number;
5465   IF (SHIPPING_ATTRIB_CUR%FOUND) THEN
5466     IF (l_log_statement >= l_log_current_level) THEN
5467       FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||'Internal Order required to transfer between the organizations');
5468     END IF;
5469     FND_MESSAGE.Set_Name('AHL','AHL_MM_INTERNAL_ORD_REQD');
5470     FND_MSG_PUB.ADD;
5471     x_return_status := FND_API.G_RET_STS_ERROR;
5472   END IF;
5473   CLOSE SHIPPING_ATTRIB_CUR;
5474   --This should be the last print
5475   G_DEBUG_LINE_NUM    := 410;
5476   IF (l_log_statement >= l_log_current_level) THEN
5477     FND_LOG.string(l_log_statement, l_debug_module, G_DEBUG_LINE_NUM||':Leaving Validate_Record with x_return_status ='||x_return_status);
5478   END IF;
5479 END Validate_Record;
5480 -- End of changes by debadey
5481 
5482 ---------------------------------------------------------------------------------------------------------
5483 -- AJPRASAN:: Adding the following function for filtering instances which satisfy build goal requirements
5484 ---------------------------------------------------------------------------------------------------------
5485 --  Procedure name : FILTER_INSTANCES_MATCHING_BG
5486 --  Type           : Public
5487 --  Usage          : This function does two things
5488 --                   1. Call an API to populate a temporary table with the instances which are suitable
5489 --                      to be installed in the given position.
5490 --                   2. Delete those instances from the table, which do not satisfy the
5491 --                      build goal requirements.
5492 --
5493 --  IN Parameters :
5494 --       P_MODULE_TYPE     IN VARCHAR2 -- Can be 'INVENTORY', 'ER', 'WO2WO', 'CNB'
5495 --       p_demand_Record   IN AHL_MM_MTL_MGT_PVT.BG_Demand_Rec
5496 --
5497 PROCEDURE FILTER_INSTANCES_MATCHING_BG(
5498    p_api_version          IN         NUMBER,
5499    p_init_msg_list        IN         VARCHAR2  := FND_API.G_FALSE,
5500    p_commit               IN         VARCHAR2  := FND_API.G_FALSE,
5501    p_module_type          IN         VARCHAR2,
5502    p_demand_Record        IN         AHL_MM_MTL_MGT_PVT.BG_Demand_Rec,
5503    x_return_status        OUT NOCOPY VARCHAR2,
5504    x_msg_count            OUT NOCOPY NUMBER,
5505    x_msg_data             OUT NOCOPY VARCHAR2
5506 )
5507 IS
5508 
5509     --Local Cursors
5510     --Get Net Reading for all UOM for all instances in AHL_APPLICABLE_INSTANCES table
5511     CURSOR Get_Inst_Net_Reading
5512     IS
5513       SELECT CCA.SOURCE_OBJECT_ID ITEM_INSTANCE_ID,
5514              CC.COUNTER_ID,
5515              CC.COUNTER_TEMPLATE_NAME,
5516              CC.NAME COUNTER_NAME,
5517              CC.UOM_CODE,
5518              NVL((SELECT CCR.NET_READING
5519                    FROM CSI_COUNTER_READINGS CCR
5520                   WHERE CCR.COUNTER_VALUE_ID = CC.CTR_VAL_MAX_SEQ_NO
5521                     AND NVL(CCR.DISABLED_FLAG,'N') = 'N'), 0) NET_READING
5522         FROM CSI_COUNTER_ASSOCIATIONS CCA,
5523              CSI_COUNTERS_VL CC,
5524              AHL_APPLICABLE_INSTANCES APPL_INST
5525        WHERE CCA.COUNTER_ID = CC.COUNTER_ID
5526          AND CCA.SOURCE_OBJECT_CODE = 'CP'
5527          AND CCA.SOURCE_OBJECT_ID = APPL_INST.CSI_ITEM_INSTANCE_ID;
5528 
5529     --Get the MRs effective on this position, based on Hard & Soft Limit options
5530     CURSOR Get_Effective_MRs(C_ASM_ID IN NUMBER, CONSIDER_HARD_LIMIT IN VARCHAR2, CONSIDER_SOFT_LIMIT IN VARCHAR2)
5531     IS
5532       SELECT ASM.SCHEDULED_MATERIAL_ID,
5533         CNTR.COUNTER_ID,
5534         CNTR.NAME COUNTER_NAME,
5535         UOM.UOM_CODE,
5536         BG.COUNTER_VALUE BG_VALUE,
5537         CASE MR.IMPLEMENT_STATUS_CODE
5538           WHEN 'SOFT_LIMIT'
5539           THEN (BG.COUNTER_VALUE    - INTV.INTERVAL_VALUE)
5540           ELSE (INTV.INTERVAL_VALUE - BG.COUNTER_VALUE) -- Mandatory or Optional Implement
5541         END MAX_COUNTER_VALUE,
5542         MR.TITLE MR_TITLE,
5543         MR.MR_HEADER_ID MR_HEADER_ID
5544       FROM AHL_SCHEDULE_MATERIALS ASM,
5545         AHL_MR_INTERVALS INTV,
5546         CS_COUNTERS CNTR,
5547         MTL_UNITS_OF_MEASURE_VL UOM,
5548         AHL_BUILD_GOALS BG,
5549         AHL_VISITS_B AVB,
5550         AHL_MR_HEADERS_B MR,
5551         AHL_MR_EFFECTIVITIES EFF,
5552         AHL_MC_PATH_POSITION_NODES NODE,
5553         AHL_MC_HEADERS_B MC,
5554         AHL_UNIT_CONFIG_HEADERS UCH
5555       WHERE INTV.COUNTER_ID         = CNTR.COUNTER_ID
5556       AND UOM.UOM_CODE              = CNTR.UOM_CODE
5557       AND BG.VISIT_ID               = AVB.VISIT_ID
5558       AND BG.UOM_CODE               = CNTR.UOM_CODE
5559       AND AVB.item_instance_id      = UCH.csi_item_instance_id
5560       AND INTV.MR_EFFECTIVITY_ID    = EFF.MR_EFFECTIVITY_ID
5561       AND EFF.MR_HEADER_ID          = MR.MR_HEADER_ID
5562       AND ( MR.IMPLEMENT_STATUS_CODE = DECODE(CONSIDER_HARD_LIMIT, 'Y', 'MANDATORY', 'X')
5563             OR MR.IMPLEMENT_STATUS_CODE = DECODE(CONSIDER_HARD_LIMIT, 'Y', 'OPTIONAL_IMPLEMENT', 'X')
5564             OR MR.IMPLEMENT_STATUS_CODE = DECODE(CONSIDER_SOFT_LIMIT, 'Y', 'SOFT_LIMIT', 'X') )
5565       AND MR.SERVICE_TYPE_CODE      = 'ASR'
5566       AND MR.MR_STATUS_CODE         = 'COMPLETE'
5567       AND NVL(MR.EFFECTIVE_TO,sysdate+1) > (sysdate)
5568       AND EFF.RELATIONSHIP_ID       = NODE.PATH_POSITION_ID
5569       -- Filter for MC Position + MC Item combination
5570       AND NVL(EFF.INVENTORY_ITEM_ID, 1) = NVL2(EFF.INVENTORY_ITEM_ID, ASM.INVENTORY_ITEM_ID, 1)
5571       AND ASM.MC_HEADER_ID          = MC.MC_HEADER_ID
5572       AND ASM.POSITION_KEY          = NODE.POSITION_KEY
5573       AND MC.MC_ID                  = NODE.MC_ID
5574       AND NVL(NODE.VERSION_NUMBER,MC.VERSION_NUMBER) = MC.VERSION_NUMBER
5575       AND AVB.VISIT_ID              = ASM.VISIT_ID
5576       AND NODE.sequence             = (SELECT MAX(PPN.sequence)
5577                                          FROM AHL_MC_PATH_POSITION_NODES PPN
5578                                         WHERE PPN.PATH_POSITION_ID = NODE.PATH_POSITION_ID)
5579       AND INTV.INTERVAL_VALUE      IN (SELECT MIN(THR.INTERVAL_VALUE)
5580                                          FROM AHL_MR_INTERVALS THR, CS_COUNTERS CS
5581                                         WHERE THR.MR_EFFECTIVITY_ID = INTV.MR_EFFECTIVITY_ID
5582                                           AND CS.COUNTER_ID = THR.COUNTER_ID
5583                                         GROUP BY CS.UOM_CODE)
5584       --PC Node effectivities
5585       AND (    --Unit type PC assoc
5586                NVL2(EFF.pc_node_id,
5587                    (SELECT COUNT('X')
5588                       FROM ahl_pc_nodes_b B
5589                      WHERE B.pc_node_id = EFF.pc_node_id
5590                      START WITH B.pc_node_id
5591                         IN (select pc_node_id
5592                               from ahl_pc_associations unit
5593                              where unit.association_type_flag = 'U'
5594                                and unit.unit_item_id = UCH.unit_config_header_id)
5595                      CONNECT BY B.pc_node_id = PRIOR B.parent_node_id),
5596                    1) > 0
5597             OR
5598                --Item type PC assoc
5599                NVL2(EFF.pc_node_id,
5600                    (SELECT COUNT('X')
5601                       FROM ahl_pc_nodes_b B
5602                      WHERE B.pc_node_id = EFF.pc_node_id
5603                      START WITH B.pc_node_id
5604                         IN (select pc_node_id
5605                               from ahl_pc_associations itm, csi_item_instances csi
5606                              where itm.association_type_flag = 'I'
5607                                and itm.unit_item_id = csi.inventory_item_id
5608                                and csi.instance_id = UCH.csi_item_instance_id)
5609                    CONNECT BY B.pc_node_id = PRIOR B.parent_node_id),
5610                    1) > 0)
5611       -- Fleet based effecctivities
5612       AND NVL2(EFF.fleet_header_id,
5613                  Ahl_Ump_ProcessUnit_Pvt.get_Fleet_From_Unit_Asso(UCH.unit_config_header_id,sysdate,null),
5614                  1) = NVL(EFF.fleet_header_id, 1)
5615       AND ASM.SCHEDULED_MATERIAL_ID = C_ASM_ID;
5616 
5617 
5618       --Table types
5619       TYPE mr_tbl_type IS TABLE OF Get_Effective_MRs%ROWTYPE INDEX BY BINARY_INTEGER;
5620       TYPE appl_inst_tbl_type IS TABLE OF Get_Inst_Net_Reading%ROWTYPE INDEX BY BINARY_INTEGER;
5621 
5622       --Local Variables
5623       l_eff_mr_tbl           Mr_tbl_type;
5624       l_mc_header_id         NUMBER;
5625       l_appl_inst_tbl        Appl_inst_tbl_type;
5626       l_inventory_item_id    NUMBER;
5627       l_org_id               NUMBER;
5628       l_pos_key              NUMBER;
5629       l_uc_header_id         NUMBER;
5630       l_relationship_id      NUMBER;
5631       l_inv_item_id_for_api  NUMBER := NULL;
5632       last_acc_value         NUMBER;
5633       net_reading            NUMBER;
5634       max_ctr_value          NUMBER;
5635       build_goal_value       NUMBER;
5636       l_accomplishment_date  DATE;
5637       l_unit_effectivity_id  NUMBER;
5638       l_deferral_flag        BOOLEAN;
5639       l_status_code          VARCHAR2(30);
5640       l_return_val           BOOLEAN;
5641       l_alt_items_tbl        AHL_LTP_MTL_REQ_PVT.Alt_Items_Tbl_Type;
5642       l_msg_count            NUMBER;
5643       l_err_msg              VARCHAR2(2000);
5644       l_msg_index_out        NUMBER;
5645       l_api_name             CONSTANT VARCHAR2(30) := 'FILTER_INSTANCES_MATCHING_BG' ;
5646       l_debug                CONSTANT VARCHAR2(90) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5647 
5648       --for dynamic formation of query
5649       l_base_query           VARCHAR2(8000) :=
5650             ' INSERT INTO AHL_APPLICABLE_INSTANCES(CSI_ITEM_INSTANCE_ID, POSITION_ID)' ||
5651             ' SELECT UNIQUE INST.instance_id, -1' ||
5652             ' FROM mtl_system_items_b ITEMS,' ||
5653             '   csi_item_instances INST,' ||
5654             '   mtl_serial_numbers SERIALS' ||
5655             ' WHERE ITEMS.inventory_item_id = INST.inventory_item_id' ||
5656             ' AND ITEMS.organization_id = INST.inv_master_organization_id' ||
5657             ' AND INST.serial_number = SERIALS.serial_number' ||
5658             ' AND INST.inventory_item_id = SERIALS.inventory_item_id' ||
5659             ' AND EXISTS (SELECT 1' ||
5660             '             FROM mtl_parameters mp, inv_organization_info_v io' ||
5661             '             WHERE mp.master_organization_id = ITEMS.organization_id' ||
5662             '             AND mp.organization_Id = io.organization_id' ||
5663             '             AND NVL(io.operating_unit, mo_global.get_current_org_id()) = mo_global.get_current_org_id())';
5664 
5665 BEGIN
5666 
5667     -- Standard start of API savepoint
5668     SAVEPOINT FILTER_INSTANCES_SP;
5669 
5670     IF (l_log_procedure >= l_log_current_level) THEN
5671         FND_LOG.string(l_log_procedure, l_debug || '.begin','At the start of PLSQL procedure');
5672     END IF;
5673 
5674     -- Initialize message list if p_init_msg_list is set to TRUE.
5675     IF FND_API.to_boolean( p_init_msg_list ) THEN
5676         FND_MSG_PUB.initialize;
5677     END IF;
5678 
5679     -- Initialize API return status to success
5680     x_return_status := FND_API.G_RET_STS_SUCCESS;
5681 
5682     IF (l_log_statement >= l_log_current_level) THEN
5683        FND_LOG.string(l_log_statement, l_debug, 'Scheduled_Material_ID :' || p_demand_Record.Scheduled_Material_ID);
5684        FND_LOG.string(l_log_statement, l_debug, 'Include_HardLimit_MRs :' || p_demand_Record.Include_HardLimit_MRs);
5685        FND_LOG.string(l_log_statement, l_debug, 'Include_SoftLimit_MRs :' || p_demand_Record.Include_SoftLimit_MRs);
5686        FND_LOG.string(l_log_statement, l_debug, 'Include_Alt_Items :' || p_demand_Record.Include_Alt_Items);
5687        FND_LOG.string(l_log_statement, l_debug, 'Organization_Name :' || p_demand_Record.Organization_Name);
5688        FND_LOG.string(l_log_statement, l_debug, 'Serial_Number :' || p_demand_Record.Serial_Number);
5689        FND_LOG.string(l_log_statement, l_debug, 'Item_Owner :' || p_demand_Record.Item_Owner);
5690        FND_LOG.string(l_log_statement, l_debug, 'Reservation_Type :' || p_demand_Record.Reservation_Type);
5691        FND_LOG.string(l_log_statement, l_debug, 'WO_Number :' || p_demand_Record.WO_Number);
5692        FND_LOG.string(l_log_statement, l_debug, 'WO_Org :' || p_demand_Record.WO_Org);
5693        FND_LOG.string(l_log_statement, l_debug, 'Filter_Reservations :' || p_demand_Record.Filter_Reservations);
5694        FND_LOG.string(l_log_statement, l_debug, 'Visit_Org :' || p_demand_Record.Visit_Org);
5695        FND_LOG.string(l_log_statement, l_debug, 'Visit_Number :' || p_demand_Record.Visit_Number);
5696        FND_LOG.string(l_log_statement, l_debug, 'Visit_Start_Date :' || p_demand_Record.Visit_Start_Date);
5697        FND_LOG.string(l_log_statement, l_debug, 'Visit_Unit :' || p_demand_Record.Visit_Unit);
5698     END IF;
5699 
5700     --Clear the temp table before inserting new rows
5701     DELETE FROM ahl_applicable_instances;
5702 
5703     SELECT ASM.inventory_item_id,
5704            ASM.organization_id,
5705            ASM.mc_header_id,
5706            ASM.position_key,
5707            AHL_UTIL_UC_PKG.GET_UC_HEADER_ID(NVL(TSK.INSTANCE_ID,VST.ITEM_INSTANCE_ID)) UC_HEADER_ID
5708       INTO l_inventory_item_id,
5709            l_org_id,
5710            l_mc_header_id,
5711            l_pos_key,
5712            l_uc_header_id
5713       FROM ahl_schedule_materials ASM,
5714            ahl_visits_b VST,
5715            ahl_visit_tasks_b TSK
5716      WHERE ASM.visit_id = VST.visit_id
5717        AND ASM.visit_task_id = TSK.visit_task_id
5718        AND ASM.scheduled_material_id = p_demand_Record.Scheduled_Material_ID;
5719 
5720    IF (l_mc_header_id is NULL OR l_mc_header_id = '') THEN
5721 
5722         IF (l_log_statement >= l_log_current_level) THEN
5723             FND_LOG.string(l_log_statement, l_debug, 'Requirement is not position based, returning back');
5724         END IF;
5725 
5726         --Standard check for commit
5727         IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5728             COMMIT;
5729         END IF;
5730 
5731         RETURN;
5732 
5733     END IF;
5734 
5735     --Inventory
5736     IF (p_module_type = 'INVENTORY') THEN
5737 
5738         IF (l_log_statement >= l_log_current_level) THEN
5739             FND_LOG.string(l_log_statement, l_debug, 'Called by Inventory');
5740         END IF;
5741 
5742         IF(NVL(p_demand_Record.Include_Alt_Items, 'N') <> 'Y') THEN
5743             l_inv_item_id_for_api := l_inventory_item_id;
5744         END IF;
5745 
5746         --Call API to populate AHL_APPLICABLE_INSTANCES
5747         --SB rules are applied by this API itself
5748         AHL_UC_INSTANCE_PVT.get_instances_for_req
5749                          (p_api_version          => 1.0,
5750                           p_init_msg_list        => FND_API.G_FALSE,
5751                           x_return_status        => x_return_status,
5752                           x_msg_count            => x_msg_count,
5753                           x_msg_data             => x_msg_data,
5754                           p_schedule_material_id => p_demand_Record.Scheduled_Material_ID,
5755                           p_inventory_item_id    => l_inv_item_id_for_api,
5756                           p_supply_location_type => p_module_type,
5757                           p_organization_name    => p_demand_Record.Organization_Name,
5758                           p_serial_number        => p_demand_Record.Serial_Number);
5759 
5760         --Write in Log and exit when return status is not success
5761         IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)
5762         THEN
5763             IF (l_log_statement >= l_log_current_level) THEN
5764                FND_LOG.string(l_log_statement, l_debug,
5765                               'After calling get_instances_for_req, Return Status is :' || x_return_status);
5766             END IF;
5767             RAISE FND_API.G_EXC_ERROR;
5768         END IF;
5769 
5770     --Other 3 supplies
5771     ELSIF (p_module_type = 'ER' OR p_module_type = 'WO' OR p_module_type = 'CNB') THEN
5772 
5773         IF (p_demand_Record.Include_Alt_Items = 'Y')
5774         THEN
5775             --Primary and alterante items filter
5776             AHL_LTP_MTL_REQ_PVT.Get_Alternate_Items
5777                          (p_api_version      => 1.0,
5778                           p_init_msg_list    => FND_API.G_FALSE,
5779                           p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5780                           p_schedule_material_id => p_demand_Record.Scheduled_Material_ID,
5781                           p_curr_item_flag   => FND_API.G_TRUE,
5782                           x_alt_items        => l_alt_items_tbl,
5783                           x_return_status    => x_return_status,
5784                           x_msg_count        => x_msg_count,
5785                           x_msg_data         => x_msg_data);
5786 
5787             IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)
5788             THEN
5789                 IF (l_log_statement >= l_log_current_level) THEN
5790                    FND_LOG.string(l_log_statement, l_debug,
5791                                   'After calling Get_Alternate_Items, Return Status is :' || x_return_status
5792                                   || ', l_alt_items_tbl.COUNT :' || l_alt_items_tbl.COUNT);
5793                 END IF;
5794                 RAISE FND_API.G_EXC_ERROR;
5795             END IF;
5796 
5797             IF(l_alt_items_tbl.COUNT > 0) THEN
5798                 l_base_query := l_base_query || ' AND ITEMS.inventory_item_id IN (NULL ';
5799 
5800                 FOR i in l_alt_items_tbl.FIRST..l_alt_items_tbl.LAST
5801                 LOOP
5802                         l_base_query := l_base_query || ',' || l_alt_items_tbl(i);
5803                 END LOOP;
5804 
5805                 l_base_query := l_base_query || ')';
5806             ELSE
5807                 --No items are matching SB rules, and temp table is already empty
5808                 --Simply return without further processing
5809                 IF (l_log_statement >= l_log_current_level) THEN
5810                    FND_LOG.string(l_log_statement, l_debug,
5811                                   'No items match SB rules, returning without populating temp table');
5812                 END IF;
5813 
5814                 --Standard check for commit
5815                 IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5816                     COMMIT;
5817                 END IF;
5818 
5819                 RETURN;
5820             END IF;
5821         ELSE
5822             --Only Primary item filter, validate through AHL_SB_RULES_PVT.Evaluate_Rules_For_Pos
5823             --This API populates FND message stack in case of errors
5824             AHL_SB_RULES_PVT.Evaluate_Rules_For_Pos(
5825                             p_mc_header_id    => l_mc_header_id,
5826                             p_mc_pos_key      => l_pos_key,
5827                             p_inv_item_id     => l_inventory_item_id,
5828                             p_inv_org_id      => l_org_id,
5829                             p_uc_header_id    => l_uc_header_id);
5830 
5831             l_msg_count := Fnd_Msg_Pub.count_msg;
5832 
5833             IF (l_msg_count > 0) THEN
5834                 FOR i IN 1..l_msg_count
5835                 LOOP
5836                     fnd_msg_pub.get( p_msg_index => i,
5837                              p_encoded => FND_API.G_FALSE,
5838                              p_data => l_err_msg,
5839                              p_msg_index_out => l_msg_index_out);
5840 
5841                     IF (l_log_statement >= l_log_current_level) THEN
5842                         FND_LOG.string(l_log_statement, l_debug,
5843                                         'Error message-'||l_msg_index_out||':' || l_err_msg);
5844                     END IF;
5845                 END LOOP;
5846 
5847                 IF (l_log_statement >= l_log_current_level) THEN
5848                     FND_LOG.string(l_log_statement, l_debug,
5849                                         'Alt items is not required and primary item is invalid.'
5850                                         || ' Returning back without temp table population.');
5851                 END IF;
5852 
5853                 --Standard check for commit
5854                 IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5855                     COMMIT;
5856                 END IF;
5857 
5858                 RETURN;
5859 
5860             --Else append the primary item ID
5861             ELSE
5862                 l_base_query := l_base_query || ' AND ITEMS.inventory_item_id = ' || l_inventory_item_id || ' ' ;
5863             END IF;
5864 
5865         END IF; --IF p_demand_Record.Include_Alt_Items = 'Y'
5866 
5867         --Instance Validation
5868         SELECT relationship_id
5869           INTO l_relationship_id
5870           FROM AHL_SCHEDULE_MATERIALS
5871          WHERE scheduled_material_id = p_demand_Record.Scheduled_Material_ID;
5872 
5873         --Check if instance is valid for the position with a function
5874         l_base_query := l_base_query
5875                           || ' AND AHL_UC_INSTANCE_PVT.is_instance_valid_for_pos(INST.instance_id'
5876                           || ' , ' || l_relationship_id
5877                           || ' , ' || p_demand_Record.Scheduled_Material_ID
5878                           || ' ) = ''T'' ';
5879 
5880         --Serial Filter
5881         IF(p_demand_Record.Serial_Number IS NOT NULL) THEN
5882             IF(INSTR(p_demand_Record.Serial_Number, '%', 1, 1) <> 0) THEN
5883                 l_base_query := l_base_query || ' AND SERIALS.serial_number LIKE '''
5884                                      || p_demand_Record.Serial_Number || '''';
5885             ELSE
5886                 l_base_query := l_base_query || ' AND SERIALS.serial_number = '''
5887                                      || p_demand_Record.Serial_Number || '''';
5888             END IF;
5889         END IF;
5890 
5891         --Item Owner filter
5892         IF(p_demand_Record.Item_Owner IS NOT NULL) THEN
5893             IF(INSTR(p_demand_Record.Item_Owner, '%', 1, 1) <> 0) THEN
5894                 l_base_query := l_base_query || ' AND INST.owner_party_id IN '
5895                                      || ' (SELECT party_id FROM hz_parties'
5896                                      || ' WHERE party_name LIKE '''
5897                                      || p_demand_Record.Item_Owner || ''')';
5898             ELSE
5899                 l_base_query := l_base_query || ' AND INST.owner_party_id IN '
5900                                      || ' (SELECT party_id FROM hz_parties'
5901                                      || ' WHERE party_name = '''
5902                                      || p_demand_Record.Item_Owner || ''')';
5903             END IF;
5904         END IF;
5905 
5906 
5907         --Existing reservations supply specific filters
5908         IF (p_module_type = 'ER') THEN
5909 
5910             IF (l_log_statement >= l_log_current_level) THEN
5911                 FND_LOG.string(l_log_statement, l_debug, 'Called by Existing reservations');
5912             END IF;
5913 
5914             --Base criteria for existing reservations
5915             l_base_query := l_base_query || ' AND SERIALS.serial_number IN'
5916                                  || ' (SELECT UNIQUE NVL(MSN.SERIAL_NUMBER, NVL(WO_RESERV.SERIAL_NUMBER, ISO_RESERV.SERIAL_NUMBER))'
5917                                  || '  FROM MTL_RESERVATIONS MR,'
5918                                  || '    MTL_SERIAL_NUMBERS MSN,'
5919                                  || '    (SELECT CSIII.serial_number,'
5920                                  || '        WO.WIP_ENTITY_ID'
5921                                  || '     FROM AHL_WORKORDERS WO,'
5922                                  || '       AHL_VISIT_TASKS_B ATSK,'
5923                                  || '       AHL_VISITS_B AVST,'
5924                                  || '       CSI_ITEM_INSTANCES CSIII'
5925                                  || '     WHERE WO.visit_task_id = ATSK.visit_task_id'
5926                                  || '     AND WO.STATUS_CODE NOT IN (7, 22, 17, 12, 18, 21, 4, 5)'
5927                                  || '     AND ATSK.return_to_supply_flag = ''Y'''
5928                                  || '     AND ATSK.visit_id = AVST.visit_id'
5929                                  || '     AND CSIII.instance_id = NVL(ATSK.instance_id, AVST.item_instance_id)) WO_RESERV,'
5930                                  || '     (SELECT CSIII.SERIAL_NUMBER, CSIII.INVENTORY_ITEM_ID, PRHA.REQUISITION_HEADER_ID, AMTI.RESERVATION_ID'
5931                                  || '      FROM PO_REQUISITION_HEADERS_ALL PRHA,'
5932                                  || '        OE_ORDER_HEADERS_ALL OOHA,'
5933                                  || '        MTL_SERIAL_NUMBERS MSN,'
5934                                  || '        CSI_ITEM_INSTANCES CSIII,'
5935                                  || '        MTL_SERIAL_NUMBERS_TEMP MSNT,'
5936                                  || '        WSH_DELIVERY_DETAILS WDD,'
5937                                  || '        WSH_SERIAL_NUMBERS WSN,'
5938                                  || '        AHL_MM_TXN_INTERFACE AMTI'
5939                                  || '       WHERE PRHA.REQUISITION_HEADER_ID = OOHA.SOURCE_DOCUMENT_ID'
5940                                  || '       AND OOHA.HEADER_ID = WDD.SOURCE_HEADER_ID'
5941                                  || '       AND WDD.RELEASED_STATUS <> ''B'' '
5942                                  || '       AND WDD.TRANSACTION_TEMP_ID = MSNT.TRANSACTION_TEMP_ID (+)'
5943                                  || '       AND WDD.DELIVERY_DETAIL_ID = WSN.DELIVERY_DETAIL_ID (+)'
5944                                  || '       AND CSIII.SERIAL_NUMBER = NVL(WDD.SERIAL_NUMBER, '
5945                                                   || ' NVL(MSNT.FM_SERIAL_NUMBER, NVL(WSN.FM_SERIAL_NUMBER, AMTI.SERIAL_NUMBER)))'
5946                                  || '       AND CSIII.SERIAL_NUMBER = MSN.SERIAL_NUMBER'
5947                                  || '       AND AMTI.TXN_SOURCE_TYPE = ''ISO'') ISO_RESERV'
5948                                  || '  WHERE MR.DEMAND_SOURCE_TYPE_ID   = 5'
5949                                  || '  AND MR.EXTERNAL_SOURCE_CODE    = ''AHL'' '
5950                                  || '  AND MR.inventory_item_id = ITEMS.inventory_item_id'
5951                                  || '  AND MR.RESERVATION_ID = MSN.RESERVATION_ID(+)'
5952                                  || '  AND NVL2(MSN.RESERVATION_ID, MR.SUPPLY_SOURCE_TYPE_ID, 1) = NVL2(MSN.RESERVATION_ID, 13, 1)'
5953                                  || '  AND MR.SUPPLY_SOURCE_HEADER_ID = WO_RESERV.WIP_ENTITY_ID(+)'
5954                                  || '  AND NVL2(WO_RESERV.WIP_ENTITY_ID, MR.SUPPLY_SOURCE_TYPE_ID, 1) = NVL2(WO_RESERV.WIP_ENTITY_ID, 5, 1)'
5955                                  || '  AND MR.RESERVATION_ID = ISO_RESERV.RESERVATION_ID(+)'
5956                                  || '  AND MR.INVENTORY_ITEM_ID = ISO_RESERV.INVENTORY_ITEM_ID(+)'
5957                                  || '  AND MR.SUPPLY_SOURCE_HEADER_ID = ISO_RESERV.REQUISITION_HEADER_ID(+)'
5958                                  || '  AND NVL2(ISO_RESERV.REQUISITION_HEADER_ID, MR.SUPPLY_SOURCE_TYPE_ID, 1) = NVL2(ISO_RESERV.REQUISITION_HEADER_ID, 7, 1)';
5959 
5960 
5961             --Reservaton Type filter
5962             IF(p_demand_Record.Reservation_Type IS NOT NULL) THEN
5963                 IF(p_demand_Record.Reservation_Type = 'INVENTORY') THEN
5964                     l_base_query := l_base_query || ' AND MR.SUPPLY_SOURCE_HEADER_ID = 13';
5965                 ELSIF (p_demand_Record.Reservation_Type = 'INTERNAL_ORDER') THEN
5966                     l_base_query := l_base_query || ' AND MR.SUPPLY_SOURCE_HEADER_ID = 7';
5967                 ELSE
5968                     l_base_query := l_base_query || ' AND MR.SUPPLY_SOURCE_HEADER_ID = 5';
5969                 END IF;
5970             END IF;
5971 
5972             --End Existing reservations query part
5973             l_base_query := l_base_query || ')';
5974 
5975         --Work Order supply specific filters
5976         ELSIF (p_module_type = 'WO') THEN
5977 
5978             IF (l_log_statement >= l_log_current_level) THEN
5979                 FND_LOG.string(l_log_statement, l_debug, 'Called by Work Order Supply');
5980             END IF;
5981 
5982             --Base criteria for Work Order Supply
5983             l_base_query := l_base_query || ' AND EXISTS (SELECT 1'
5984                                  || ' FROM AHL_WORKORDERS WO, AHL_VISIT_TASKS_B TSK, AHL_VISITS_B VST'
5985                                  || ' WHERE WO.visit_task_id = TSK.visit_task_id'
5986                                  || ' AND WO.STATUS_CODE NOT IN (7, 22, 17, 12, 18, 21, 4, 5)'
5987                                  || ' AND TSK.return_to_supply_flag = ''Y'' '
5988                                  || ' AND TSK.visit_id = VST.visit_id'
5989                                  || ' AND NVL(TSK.instance_id, VST.item_instance_id) = INST.instance_id';
5990 
5991             --Work Order Number filter
5992             IF(p_demand_Record.WO_Number IS NOT NULL) THEN
5993                 IF(INSTR(p_demand_Record.WO_Number, '%', 1, 1) <> 0) THEN
5994                     l_base_query := l_base_query || ' AND WO.WORKORDER_NAME LIKE '''
5995                                          || p_demand_Record.WO_Number || '''';
5996                 ELSE
5997                     l_base_query := l_base_query || ' AND WO.WORKORDER_NAME = '''
5998                                          || p_demand_Record.WO_Number || '''';
5999                 END IF;
6000             END IF;
6001 
6002             --Work Order Org filter
6003             IF(p_demand_Record.WO_Org IS NOT NULL) THEN
6004                 l_base_query := l_base_query || ' AND VST.ORGANIZATION_ID IN '
6005                                      || ' (SELECT ORGANIZATION_ID FROM HR_ORGANIZATION_UNITS'
6006                                      || ' WHERE NAME LIKE '''
6007                                      || p_demand_Record.WO_Org || ''')';
6008             END IF;
6009 
6010             --Reservations filter
6011             IF(p_demand_Record.Filter_Reservations = 'Y') THEN
6012                 l_base_query := l_base_query || ' AND EXISTS '
6013                                      || ' (SELECT 1'
6014                                      || ' FROM MTL_RESERVATIONS RESERV, CSI_ITEM_INSTANCES CSIII'
6015                                      || ' WHERE CSIII.instance_id  = NVL(TSK.instance_id, VST.item_instance_id)'
6016                                      || ' AND RESERV.SUPPLY_SOURCE_HEADER_ID = WO.WIP_ENTITY_ID'
6017                                      || ' AND RESERV.SUPPLY_SOURCE_TYPE_ID = 5)';
6018             END IF;
6019 
6020             --End WO query part
6021             l_base_query := l_base_query || ')';
6022 
6023         --Cannibalization supply specific filters
6024         ELSIF (p_module_type = 'CNB') THEN
6025 
6026             IF (l_log_statement >= l_log_current_level) THEN
6027                 FND_LOG.string(l_log_statement, l_debug, 'Called by Cannibalization Supply');
6028             END IF;
6029 
6030             --Beginning of base criteria for Cannibalization Supply
6031             l_base_query := l_base_query || ' AND INST.instance_id IN'
6032                                  || ' (WITH base_inst AS'
6033                                  || ' (SELECT item_instance_id'
6034                                  || ' FROM ahl_visits_b'
6035                                  || ' WHERE item_instance_id IS NOT NULL'
6036                                  || ' AND status_code IN (''RELEASED'',''PARTIALLY RELEASED'')';
6037 
6038             --Visit Number filter
6039             IF(p_demand_Record.Visit_Number IS NOT NULL) THEN
6040                 IF(INSTR(TO_CHAR(p_demand_Record.Visit_Number), '%', 1, 1) <> 0) THEN
6041                     l_base_query := l_base_query || ' AND visit_number LIKE '''
6042                                          || p_demand_Record.Visit_Number || '''';
6043                 ELSE
6044                     l_base_query := l_base_query || ' AND visit_number = ' || p_demand_Record.Visit_Number;
6045                 END IF;
6046             END IF;
6047 
6048             --Visit Org filter
6049             IF(p_demand_Record.Visit_Org IS NOT NULL) THEN
6050                 l_base_query := l_base_query || ' AND ORGANIZATION_ID IN '
6051                                      || ' (SELECT ORGANIZATION_ID FROM HR_ORGANIZATION_UNITS'
6052                                      || ' WHERE NAME LIKE '''
6053                                      || p_demand_Record.Visit_Org || ''')';
6054             END IF;
6055 
6056             --Visit Start date filter
6057             IF(p_demand_Record.Visit_Start_Date IS NOT NULL) THEN
6058                 l_base_query := l_base_query || ' AND START_DATE_TIME <= '
6059                                      || ' TO_DATE(''' || to_char(p_demand_Record.Visit_Start_Date) || ''')';
6060             END IF;
6061 
6062             --Visit Unit filter
6063             IF(p_demand_Record.Visit_Unit IS NOT NULL) THEN
6064                 IF(INSTR(p_demand_Record.Visit_Unit, '%', 1, 1) <> 0) THEN
6065                     l_base_query := l_base_query || ' AND ITEM_INSTANCE_ID IN '
6066                                          || ' (SELECT CSI_ITEM_INSTANCE_ID FROM AHL_UNIT_CONFIG_HEADERS'
6067                                          || ' WHERE NAME LIKE ''' || p_demand_Record.Visit_Unit || ''')';
6068                 ELSE
6069                     l_base_query := l_base_query || ' AND ITEM_INSTANCE_ID IN '
6070                                          || ' (SELECT CSI_ITEM_INSTANCE_ID FROM AHL_UNIT_CONFIG_HEADERS'
6071                                          || ' WHERE NAME = ''' || p_demand_Record.Visit_Unit || ''')';
6072                 END IF;
6073             END IF;
6074 
6075             --End of base criteria for Cannibalization Supply
6076             l_base_query := l_base_query || ' )'
6077                                  || ' SELECT cis.instance_id'
6078                                  || ' FROM csi_item_instances cis, csi_ii_relationships cir, base_inst'
6079                                  || ' WHERE cis.instance_id = cir.subject_id'
6080                                  || ' AND cir.relationship_type_code = ''COMPONENT-OF'''
6081                                  || ' AND NVL(cir.active_start_date,sysdate) <= sysdate'
6082                                  || ' AND NVL(cir.active_end_date,sysdate) >= sysdate'
6083                                  || ' START WITH cir.object_id  = base_inst.item_instance_id'
6084                                  || ' CONNECT BY cir.object_id = prior cir.subject_id'
6085                                  || ' UNION'
6086                                  || ' SELECT cis.instance_id'
6087                                  || ' FROM csi_item_instances cis, base_inst'
6088                                  || ' WHERE cis.instance_id = base_inst.item_instance_id)';
6089 
6090         END IF;
6091 
6092         IF (l_log_statement >= l_log_current_level) THEN
6093             FND_LOG.string(l_log_statement, l_debug, 'Final Query: ' || l_base_query);
6094         END IF;
6095 
6096         --Finally run the DDL statement to populate AHL_APPLICABLE_INSTANCES
6097         EXECUTE IMMEDIATE l_base_query;
6098 
6099     END IF;
6100 
6101     --Return with out applying any build goal logic, if neither of Hard Limit or Soft Limit MR checks are required
6102     IF (p_demand_Record.Include_HardLimit_MRs <> 'Y'
6103            AND p_demand_Record.Include_SoftLimit_MRs <> 'Y') THEN
6104 
6105         --Standard check for commit
6106         IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6107             COMMIT;
6108         END IF;
6109 
6110         RETURN;
6111     END IF;
6112 
6113     --Populate the instance table type from AHL_APPLICABLE_INSTANCES
6114     OPEN Get_Inst_Net_Reading();
6115     LOOP
6116         FETCH Get_Inst_Net_Reading
6117         BULK COLLECT INTO l_appl_inst_tbl;
6118         EXIT WHEN Get_Inst_Net_Reading%NOTFOUND;
6119     END LOOP;
6120     CLOSE Get_Inst_Net_Reading;
6121 
6122     IF (l_log_statement >= l_log_current_level) THEN
6123         FND_LOG.string(l_log_statement, l_debug,'After creating a record of applicable instances'
6124                          || ', no of instance+MR combination records: ' || l_appl_inst_tbl.COUNT );
6125     END IF;
6126 
6127     --Populate Effective MRs in MR Table Type
6128     OPEN Get_Effective_MRs(p_demand_Record.Scheduled_Material_ID, p_demand_Record.Include_HardLimit_MRs, p_demand_Record.Include_SoftLimit_MRs);
6129     LOOP
6130         FETCH Get_Effective_MRs
6131         BULK COLLECT INTO l_eff_mr_tbl;
6132         EXIT WHEN Get_Effective_MRs%NOTFOUND;
6133     END LOOP;
6134     CLOSE Get_Effective_MRs;
6135 
6136     IF (l_log_statement >= l_log_current_level) THEN
6137         FND_LOG.string(l_log_statement, l_debug,'After creating a record of effective MRs'
6138                          || ', no of MRs record: ' || l_eff_mr_tbl.COUNT );
6139     END IF;
6140 
6141     IF(l_appl_inst_tbl.COUNT > 0 AND l_eff_mr_tbl.COUNT > 0)
6142     THEN
6143         --Loop through instances table
6144         FOR j IN l_appl_inst_tbl.FIRST..l_appl_inst_tbl.LAST
6145         LOOP
6146 
6147             --Loop through effectivities table
6148             FOR i IN l_eff_mr_tbl.FIRST..l_eff_mr_tbl.LAST
6149             LOOP
6150 
6151                 --Go to the next iteration when the UOM do not macth between instance and BG
6152                 CONTINUE WHEN l_appl_inst_tbl(j).UOM_CODE <> l_eff_mr_tbl(i).UOM_CODE ;
6153 
6154                 --Get net reading of the instance with build goal
6155                 net_reading := l_appl_inst_tbl(j).NET_READING;
6156 
6157                 --Get last accomplished value for instance and MR
6158                 --Call Get_Last_Accomplishment() API to get the last accomplished UE ID
6159                 AHL_UMP_UTIL_PKG.Get_Last_Accomplishment
6160                                  (p_csi_item_instance_id  => l_appl_inst_tbl(j).ITEM_INSTANCE_ID
6161                                   , p_mr_header_id        => l_eff_mr_tbl(i).MR_HEADER_ID
6162                                   , x_accomplishment_date => l_accomplishment_date
6163                                   , x_unit_effectivity_id => l_unit_effectivity_id
6164                                   , x_deferral_flag       => l_deferral_flag
6165                                   , x_status_code         => l_status_code
6166                                   , x_return_val          => l_return_val);
6167 
6168                 IF (l_unit_effectivity_id IS NULL) THEN
6169                     last_acc_value := 0;
6170                 ELSE
6171                     SELECT NVL(MAX(UA.COUNTER_VALUE), 0) COUNTER_VALUE
6172                       INTO last_acc_value
6173                       FROM AHL_UNIT_ACCOMPLISHMNTS UA,
6174                            CSI_COUNTERS_VL CS
6175                      WHERE UA.COUNTER_ID = CS.COUNTER_ID
6176                        AND UA.UNIT_EFFECTIVITY_ID = l_unit_effectivity_id
6177                        AND CS.UOM_CODE = l_eff_mr_tbl(i).UOM_CODE;
6178                 END IF;
6179 
6180                 --Max counter value
6181                 max_ctr_value := l_eff_mr_tbl(i).MAX_COUNTER_VALUE;
6182 
6183                 --Build goal value
6184                 build_goal_value := l_eff_mr_tbl(i).BG_VALUE;
6185 
6186                 --Discard the instance if it is not satisfying build goal
6187                 IF((last_acc_value + max_ctr_value - net_reading) < build_goal_value)
6188                 THEN
6189                     IF (l_log_statement >= l_log_current_level) THEN
6190                         FND_LOG.string(l_log_statement, l_debug,
6191                                           ' To remove Instance ID: ' || l_appl_inst_tbl(j).ITEM_INSTANCE_ID
6192                                           || 'last_acc_value: ' || last_acc_value
6193                                           || ', max_ctr_value: ' || max_ctr_value
6194                                           || ', net_reading:' || net_reading
6195                                           || ', build_goal_value:' || build_goal_value);
6196                     END IF;
6197 
6198                     DELETE AHL_APPLICABLE_INSTANCES
6199                      WHERE CSI_ITEM_INSTANCE_ID = l_appl_inst_tbl(j).ITEM_INSTANCE_ID;
6200 
6201                     IF (l_log_statement >= l_log_current_level) THEN
6202                         FND_LOG.string(l_log_statement, l_debug,'After removing instance '
6203                                           || l_appl_inst_tbl(j).ITEM_INSTANCE_ID || ' from the list of applicable instances');
6204                     END IF;
6205 
6206                END IF;
6207 
6208             END LOOP; -- END l_eff_mr_tbl LOOP
6209 
6210         END LOOP; -- END l_appl_inst_tbl LOOP
6211     END IF;
6212 
6213     --Standard check for commit
6214     IF (FND_API.TO_BOOLEAN(p_commit) AND x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6215         COMMIT;
6216     END IF;
6217 
6218     -- Count and Get messages
6219     FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
6220                                   p_count => x_msg_count,
6221                                   p_data  => x_msg_data);
6222 
6223     IF (l_log_procedure >= l_log_current_level) THEN
6224         FND_LOG.string(l_log_procedure, l_debug || '.end','At the end of PLSQL procedure');
6225     END IF;
6226 
6227 EXCEPTION
6228     WHEN FND_API.G_EXC_ERROR THEN
6229        ROLLBACK TO FILTER_INSTANCES_SP;
6230        x_return_status := FND_API.G_RET_STS_ERROR;
6231        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
6232                                      p_count => x_msg_count,
6233                                      p_data  => x_msg_data);
6234     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6235        ROLLBACK TO FILTER_INSTANCES_SP;
6236        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6237        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
6238                                      p_count => x_msg_count,
6239                                      p_data  => x_msg_data);
6240     WHEN OTHERS THEN
6241        ROLLBACK TO FILTER_INSTANCES_SP;
6242        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6243        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6244            FND_MSG_PUB.add_exc_msg (G_PKG_NAME, L_API_NAME);
6245        END IF;
6246        FND_MSG_PUB.count_and_get (p_encoded => FND_API.G_FALSE,
6247                                      p_count => x_msg_count,
6248                                      p_data  => x_msg_data);
6249 
6250 END FILTER_INSTANCES_MATCHING_BG;
6251 
6252 ---------------------------------------------------------------------------------------------------------
6253 -- ARUNJK:: Adding the following Procedure for Available Quantity based on Inventory Item Id and Organization Id
6254 ---------------------------------------------------------------------------------------------------------
6255 --  Function name : Get_Available_Quantity
6256 --  Type           : Public
6257 --  Usage          : This function accepts the Inventory Item Id and work order id and
6258 --                      returns the Availabile quantity of the given Item
6259 --
6260 --  Parameters :
6261 --         P_INVENTORY_ITEM_ID  IN  NUMBER
6262 --         P_ORG_ID      IN NUMBER
6263 --
6264 --  Return:
6265 --         X_Inv_Mtl_Avl_Tbl             AHL_MM_MTL_MGT_PVT.Inv_Mtl_Avl_Tbl
6266 --
6267 PROCEDURE GET_AVAILABLE_QUANTITY(
6268     P_API_VERSION      IN NUMBER,
6269     P_INIT_MSG_LIST    IN VARCHAR2 := FND_API.G_FALSE,
6270     P_COMMIT           IN VARCHAR2 := FND_API.G_FALSE,
6271     P_MODULE_TYPE      IN VARCHAR2 := NULL,
6272     P_VALIDATION_LEVEL IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6273     P_ORG_ID      NUMBER,
6274     P_INV_ITEM_ID NUMBER,
6275     X_Inv_Mtl_Avl_Tbl OUT NOCOPY AHL_MM_MTL_MGT_PVT.Inv_Mtl_Avl_Tbl,
6276     x_return_status OUT NOCOPY VARCHAR2,
6277     X_MSG_COUNT OUT NOCOPY     NUMBER,
6278     x_msg_data OUT NOCOPY      VARCHAR2)
6279 IS
6280   L_SESSION_ID NUMBER;
6281   L_ATP_TABLE MRP_ATP_PUB.ATP_REC_TYP;
6282   X_ATP_TABLE MRP_ATP_PUB.ATP_REC_TYP;
6283   X_ATP_SUPPLY_DEMAND MRP_ATP_PUB.ATP_SUPPLY_DEMAND_TYP;
6284   X_ATP_PERIOD MRP_ATP_PUB.ATP_PERIOD_TYP;
6285   x_atp_details mrp_atp_pub.atp_details_typ;
6286   l_instance_id INTEGER;
6287   CURSOR Instance_Id_Cur
6288   IS
6289     SELECT instance_id FROM mrp_ap_apps_instances;
6290   CURSOR item_details_cur(c_inv_item_id NUMBER, c_org_id NUMBER)
6291   IS
6292     SELECT primary_uom_code,
6293       concatenated_segments
6294     FROM mtl_system_items_kfv
6295     WHERE inventory_item_id = c_inv_item_id
6296     AND organization_id     = c_org_id;
6297   CURSOR mfg_err_msg_cur(C_LOOKUP_CODE NUMBER)
6298   IS
6299     SELECT Meaning
6300     FROM MFG_LOOKUPS
6301     WHERE LOOKUP_TYPE = 'MTL_DEMAND_INTERFACE_ERRORS'
6302     AND LOOKUP_CODE   = C_LOOKUP_CODE;
6303   l_error_msg VARCHAR2(1000);
6304   item_details item_details_cur%rowtype;
6305   L_API_VERSION CONSTANT NUMBER        := 1.0;
6306   L_API_NAME    CONSTANT VARCHAR2(30)  := 'GET_AVAILABLE_QUANTITY';
6307   L_DEBUG       CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6308 BEGIN
6309   -- Standard start of API savepoint
6310   SAVEPOINT GET_AVAILABLE_QUANTITY;
6311   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
6312     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure GET_AVAILABLE_QUANTITY');
6313   END IF;
6314   -- Initialize API return status to success
6315   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
6316   -- Standard call to check for call compatibility.
6317   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
6318     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6319   END IF;
6320   -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
6321   IF FND_API.TO_BOOLEAN(p_init_msg_list) THEN
6322     FND_MSG_PUB.INITIALIZE;
6323   END IF;
6324   SELECT mrp_atp_schedule_temp_s.nextval INTO l_session_id FROM dual;
6325   -- Get Session ID
6326   SELECT MRP_ATP_SCHEDULE_TEMP_S.NEXTVAL
6327   INTO l_session_id
6328   FROM dual;
6329   OPEN Instance_Id_Cur;
6330   FETCH Instance_Id_Cur INTO l_instance_id;
6331   IF instance_id_cur%notfound THEN
6332       FND_MESSAGE.Set_Name( 'AHL','AHL_LTP_ATP_INS_ENABLE' );
6333       FND_MSG_PUB.add;
6334       CLOSE Instance_Id_Cur;
6335       RAISE  FND_API.G_EXC_ERROR;
6336   END IF;
6337   CLOSE instance_id_cur;
6338   OPEN item_details_cur(P_INV_ITEM_ID,P_ORG_ID);
6339   FETCH item_details_cur INTO item_details;
6340   CLOSE item_details_cur;
6341 
6342   msc_atp_global.extend_atp(l_atp_table, x_return_status);
6343   l_atp_table.inventory_item_id(1)          := P_INV_ITEM_ID;
6344   l_atp_table.inventory_item_name(1)        := item_details.concatenated_segments;
6345   l_atp_table.instance_id(1)                := l_instance_id;
6346   l_atp_table.source_organization_id(1)     := P_ORG_ID;
6347   l_atp_table.demand_source_type(1)         := 100;
6348   l_atp_table.quantity_ordered(1)           := 1;
6349   l_atp_table.quantity_uom(1)               := item_details.primary_uom_code;
6350   l_atp_table.requested_ship_date(1)        := sysdate;
6351   l_atp_table.action(1)                     := 100;
6352   l_atp_table.old_source_organization_id(1) := P_ORG_ID;
6353   l_atp_table.calling_module(1)             := 867;
6354   MRP_ATP_PUB.CALL_ATP (L_SESSION_ID, L_ATP_TABLE, X_ATP_TABLE, X_ATP_SUPPLY_DEMAND, X_ATP_PERIOD, X_ATP_DETAILS, X_RETURN_STATUS, x_msg_data, X_MSG_COUNT);
6355   X_Inv_Mtl_Avl_Tbl(1).AVAILABLE_QUANTITY := X_ATP_TABLE.AVAILABLE_QUANTITY(1);
6356   X_Inv_Mtl_Avl_Tbl(1).ERROR_CODE         := X_ATP_TABLE.ERROR_CODE(1);
6357   IF(X_ATP_TABLE.ERROR_CODE(1)            <> 0) THEN
6358     FND_MESSAGE.SET_NAME('AHL','AHL_MM_CHK_SCH_INFO');
6359     FND_MESSAGE.SET_TOKEN('ITEM_NAME', item_details.concatenated_segments);
6360     FOR mfg_err_msg IN mfg_err_msg_cur(X_ATP_TABLE.ERROR_CODE(1))
6361     LOOP
6362       l_error_msg := mfg_err_msg.Meaning;
6363     END LOOP;
6364     FND_MESSAGE.SET_TOKEN('ATP_MSG', l_error_msg);
6365     X_Inv_Mtl_Avl_Tbl(1).ERROR_MESSAGE := FND_MESSAGE.GET();
6366   END IF;
6367   -- Standard call to get message count and if count is 1, get message info
6368   FND_MSG_PUB.count_and_get ( p_count => x_msg_count, p_data => x_msg_data, p_encoded => FND_API.G_FALSE );
6369   -- Log API exit point
6370   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
6371     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.end', 'At the end of PLSQL procedure');
6372   END IF;
6373 EXCEPTION
6374 WHEN FND_API.G_EXC_ERROR THEN
6375   ROLLBACK TO GET_AVAILABLE_QUANTITY;
6376   x_return_status := FND_API.G_RET_STS_ERROR;
6377   FND_MSG_PUB.count_and_get ( p_count => x_msg_count, p_data => x_msg_data, p_encoded => FND_API.G_FALSE );
6378 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6379   ROLLBACK TO GET_AVAILABLE_QUANTITY;
6380   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6381   FND_MSG_PUB.count_and_get ( p_count => x_msg_count, p_data => x_msg_data, p_encoded => FND_API.G_FALSE );
6382 WHEN OTHERS THEN
6383   ROLLBACK TO GET_AVAILABLE_QUANTITY;
6384   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6385   IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6386     FND_MSG_PUB.add_exc_msg ( p_pkg_name => G_PKG_NAME, p_procedure_name => 'create_reservation', p_error_text => SUBSTR(SQLERRM,1,240) );
6387   END IF;
6388   FND_MSG_PUB.count_and_get ( p_count => x_msg_count, p_data => x_msg_data, p_encoded => FND_API.G_FALSE );
6389 END GET_AVAILABLE_QUANTITY;
6390 
6391 -- Kasridha: Changes for Marshalling Phase II Begins
6392 
6393 ---------------------------------------------------------------------------------------------------------
6394 -- Declare Procedures --
6395 ---------------------------------------------------------------------------------------------------------
6396 -- Start of Comments --
6397 --  Procedure name    : SCHED_ALL_VST_MTLS
6398 --  Type        : Public
6399 --  Function    : This procedure calls ATP to schedule all material requirements in a visit.
6400 --
6401 --  Pre-reqs    :
6402 --  Parameters  :
6403 --
6404 --  Standard IN  Parameters :
6405 --      p_api_version                   IN      NUMBER                Required
6406 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
6407 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
6408 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
6409 --         Based on this flag, the API will set the default attributes.
6410 --      p_module_type                   In      VARCHAR2     Default  NULL
6411 --         This will be null.
6412 --  Standard OUT Parameters :
6413 --      x_return_status                 OUT     VARCHAR2               Required
6414 --      x_msg_count                     OUT     NUMBER                 Required
6415 --      x_msg_data                      OUT     VARCHAR2               Required
6416 --
6417 --  SCHED_ALL_VST_MTLS Parameters :
6418 --         p_visit_ids                    IN      : visit_ids_Tbl,Required : Visit ID
6419 --         x_mtl_avl_schld_tbl           OUT     : Table containing output against schedule material req id
6420 --
6421 PROCEDURE SCHED_ALL_VST_MTLS(
6422   P_API_VERSION      IN NUMBER,
6423   P_INIT_MSG_LIST    IN VARCHAR2 := FND_API.G_FALSE,
6424   P_COMMIT           IN VARCHAR2 := FND_API.G_FALSE,
6425   P_MODULE_TYPE      IN VARCHAR2 := NULL,
6426   P_VALIDATION_LEVEL IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6427   P_VISIT_IDS         AHL_MM_MTL_MGT_PVT.visit_ids_Tbl,
6428   X_MTL_AVL_SCHLD_TBL OUT NOCOPY AHL_MM_MTL_MGT_PVT.MTL_AVL_SCHLD_TBL,
6429   X_RETURN_STATUS OUT NOCOPY VARCHAR2,
6430   X_MSG_COUNT OUT NOCOPY     NUMBER,
6431   X_MSG_DATA OUT NOCOPY      VARCHAR2 )
6432 IS
6433   L_API_VERSION          CONSTANT NUMBER        := 1.0;
6434   L_API_NAME             CONSTANT VARCHAR2(30)  := 'SCHED_ALL_VST_MTLS';
6435   L_DEBUG                CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6436 
6437   CURSOR SCHEDULE_MATERIAL_ID_CSR(L_VISIT_ID NUMBER)
6438   IS
6439     SELECT SCHEDULED_MATERIAL_ID
6440     FROM AHL_SCHEDULE_MATERIALS
6441     WHERE VISIT_ID = L_VISIT_ID;
6442 
6443   P_SCHEDULE_MATERIAL_ID_TBL  NUMBER_TABLE_TYPE;
6444   L_LOOP_COUNTER NUMBER;
6445 
6446 BEGIN
6447   SAVEPOINT MM_SCH_ALL_VISIT_MTLS;
6448   IF (L_LOG_PROCEDURE >= L_LOG_CURRENT_LEVEL) THEN
6449     FND_LOG.STRING(L_LOG_PROCEDURE, L_DEBUG || '.begin', 'At the start of the PLSQL procedure SCHEDULE_MATERIALS');
6450   END IF;
6451 
6452   -- Initialize API return status to success
6453   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
6454 
6455   -- Standard call to check for call compatibility.
6456   IF NOT FND_API.COMPATIBLE_API_CALL(L_API_VERSION, P_API_VERSION, L_API_NAME, G_PKG_NAME) THEN
6457     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6458   END IF;
6459 
6460   L_LOOP_COUNTER := 1;
6461   FOR l_visit_id IN P_VISIT_IDS.FIRST..P_VISIT_IDS.LAST
6462   LOOP
6463       FOR SCHEDULE_MATERIAL_ID IN SCHEDULE_MATERIAL_ID_CSR(P_VISIT_IDS(l_visit_id))
6464       LOOP
6465           P_SCHEDULE_MATERIAL_ID_TBL(L_LOOP_COUNTER) := SCHEDULE_MATERIAL_ID.SCHEDULED_MATERIAL_ID;
6466           L_LOOP_COUNTER := L_LOOP_COUNTER + 1;
6467       END LOOP;
6468   END LOOP;
6469 
6470   SCHEDULE_MATERIALS(
6471   P_API_VERSION               => P_API_VERSION,
6472   P_INIT_MSG_LIST             =>  P_INIT_MSG_LIST,
6473   P_COMMIT                    => P_COMMIT,
6474   P_MODULE_TYPE               => P_MODULE_TYPE,
6475   P_VALIDATION_LEVEL          => P_VALIDATION_LEVEL,
6476   P_SCHEDULE_MATERIAL_ID_TBL  => P_SCHEDULE_MATERIAL_ID_TBL,
6477   X_MTL_AVL_SCHLD_TBL         => X_MTL_AVL_SCHLD_TBL,
6478   X_RETURN_STATUS             => X_RETURN_STATUS,
6479   X_MSG_COUNT                 => X_MSG_COUNT,
6480   X_MSG_DATA                  => X_MSG_DATA);
6481 
6482 EXCEPTION
6483   WHEN FND_API.G_EXC_ERROR THEN
6484     ROLLBACK TO MM_SCH_ALL_VISIT_MTLS;
6485     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
6486     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
6487       P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
6488 
6489   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6490     ROLLBACK TO MM_SCH_ALL_VISIT_MTLS;
6491     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
6492     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
6493     P_COUNT => X_MSG_COUNT, P_DATA  => X_MSG_DATA);
6494 
6495   WHEN OTHERS THEN
6496     ROLLBACK TO MM_SCH_ALL_VISIT_MTLS;
6497     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
6498     IF FND_MSG_PUB.CHECK_MSG_LEVEL (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6499       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME, L_API_NAME);
6500     END IF;
6501     FND_MSG_PUB.COUNT_AND_GET (P_ENCODED => FND_API.G_FALSE,
6502     P_COUNT => X_MSG_COUNT,
6503     P_DATA  => X_MSG_DATA);
6504 END SCHED_ALL_VST_MTLS;
6505 -- Kasridha: Changes for Marshalling Phase II Ends
6506 
6507 
6508 END AHL_MM_MTL_MGT_PVT;