[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;