1 PACKAGE BODY AHL_OSP_PO_REQ_PVT AS
2 /* $Header: AHLVPRQB.pls 120.3 2008/04/08 23:13:25 jaramana noship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AHL_OSP_PO_REQ_PVT';
5 G_LOG_PREFIX CONSTANT VARCHAR2(100) := 'ahl.plsql.AHL_OSP_PO_REQ_PVT';
6
7 G_NO_FLAG CONSTANT VARCHAR2(1) := 'N';
8 G_YES_FLAG CONSTANT VARCHAR2(1) := 'Y';
9
10 G_PO_APP_CODE CONSTANT VARCHAR2(2) := 'PO';
11 G_REQIMPORT_PROG_CODE CONSTANT VARCHAR2(30) := 'REQIMPORT';
12
13 -- OSP Order Statuses
14 G_OSP_ENTERED_STATUS CONSTANT VARCHAR2(30) := 'ENTERED';
15 G_OSP_SUBMITTED_STATUS CONSTANT VARCHAR2(30) := 'SUBMITTED';
16 G_OSP_SUB_FAILED_STATUS CONSTANT VARCHAR2(30) := 'SUBMISSION_FAILED';
17 G_OSP_REQ_SUB_FAILED_STATUS CONSTANT VARCHAR2(30) := 'REQ_SUBMISSION_FAILED';
18 G_OSP_PO_CREATED_STATUS CONSTANT VARCHAR2(30) := 'PO_CREATED';
19 G_OSP_REQ_CREATED_STATUS CONSTANT VARCHAR2(30) := 'REQ_CREATED';
20 G_OSP_REQ_SUBMITTED_STATUS CONSTANT VARCHAR2(30) := 'REQ_SUBMITTED';
21 G_OSP_CLOSED_STATUS CONSTANT VARCHAR2(30) := 'CLOSED';
22
23 -- OSP Order Line Statuses
24 G_OL_REQ_CANCELLED_STATUS CONSTANT VARCHAR2(30) := 'REQ_CANCELLED';
25 G_OL_REQ_DELETED_STATUS CONSTANT VARCHAR2(30) := 'REQ_DELETED';
26
27 -- Log Constants: Transaction Types
28 G_TXN_TYPE_PO_REQ_CREATION CONSTANT VARCHAR2(30) := 'Requisition Creation';
29 G_TXN_TYPE_PO_SYNCH CONSTANT VARCHAR2(30) := 'PO Synchronization';
30
31 -- Log Constants: Document Types
32 G_DOC_TYPE_OSP CONSTANT VARCHAR2(30) := 'OSP';
33 G_DOC_TYPE_PO CONSTANT VARCHAR2(30) := 'PO';
34 G_DOC_TYPE_PO_REQ CONSTANT VARCHAR2(30) := 'REQ';
35
36 -- Default Values for One-time Items
37 G_DEFAULT_PRICE CONSTANT NUMBER := 0;
38 G_DEFAULT_CATEGORY_SEG1 CONSTANT VARCHAR2(40) := 'MISC';
39 G_DEFAULT_CATEGORY_SEG2 CONSTANT VARCHAR2(40) := 'MISC';
40
41 -- PO Line Types
42 G_PO_LINE_TYPE_QUANTITY CONSTANT VARCHAR2(30) := 'QUANTITY';
43
44 -------------------------------------------------
45 -- Declare Locally used Record and Table Types --
46 -------------------------------------------------
47
48 TYPE PO_Req_Header_Rec_Type IS RECORD (
49 OSP_ORDER_ID NUMBER,
50 OPERATING_UNIT_ID NUMBER,
51 VENDOR_ID NUMBER,
52 VENDOR_SITE_ID NUMBER,
53 BUYER_ID NUMBER,
54 DESCRIPTION VARCHAR2(240),
55 VENDOR_CONTACT_ID NUMBER
56 );
57
58 TYPE PO_Req_Line_Rec_Type IS RECORD (
59 OSP_LINE_ID NUMBER,
60 OBJECT_VERSION_NUMBER NUMBER,
61 LINE_NUMBER NUMBER,
62 PO_LINE_TYPE_ID NUMBER,
63 ITEM_ID NUMBER,
64 ITEM_DESCRIPTION VARCHAR2(240),
65 QUANTITY NUMBER,
66 UOM_CODE VARCHAR2(3),
67 NEED_BY_DATE DATE,
68 SHIP_TO_ORG_ID NUMBER,
69 SHIP_TO_LOC_ID NUMBER,
70 WIP_ENTITY_ID NUMBER,
71 PROJECT_ID NUMBER,
72 TASK_ID NUMBER
73 );
74
75 TYPE PO_Req_Line_Tbl_Type IS TABLE OF PO_Req_Line_Rec_Type INDEX BY BINARY_INTEGER;
76
77 ------------------------------
78 -- Declare Local Procedures --
79 ------------------------------
80
81 -- Validate OSP Order for Req Header Creation
82 PROCEDURE Validate_PO_Req_Header(
83 p_po_Req_header_rec IN PO_Req_Header_Rec_Type);
84
85 -- Validate Requisition Lines
86 PROCEDURE Validate_PO_Req_Lines(
87 p_po_req_line_tbl IN PO_Req_Line_Tbl_Type,
88 p_osp_order_id IN NUMBER);
89
90 -- Insert a record into the PO_REQUISITIONS_INTERFACE_ALL table
91 PROCEDURE Insert_Into_Req_Interface(
92 p_po_req_hdr_rec IN PO_Req_Header_Rec_Type,
93 p_po_req_line_tbl IN PO_Req_Line_Tbl_Type,
94 x_batch_id OUT NOCOPY NUMBER);
95
96 -- Calls the Concurrent Program to Create Requisition
97 PROCEDURE Call_Req_Import_Program(
98 p_batch_id IN NUMBER,
99 p_osp_order_id IN NUMBER,
100 x_request_id OUT NOCOPY NUMBER);
101
102 -- This Procedure updates a record of AHL_OSP_ORDERS_B using the table handler.
103 -- All updates to this table from this Package should go through this procedure only
104 PROCEDURE Update_OSP_Order(
105 p_osp_order_id IN NUMBER,
106 p_po_req_header_id IN NUMBER := NULL,
107 p_batch_id IN NUMBER := NULL,
108 p_request_id IN NUMBER := NULL,
109 p_status_code IN VARCHAR2 := NULL
110 );
111
112 -- This Local Procedure updates OSP Tables with Requisition Information for one OSP Order
113 PROCEDURE Associate_New_Req(
114 p_osp_order_id IN NUMBER,
115 x_po_req_header_id OUT NOCOPY NUMBER);
116
117 -- This Procedure updates AHL_OSP_ORDERS_B's PO_REQ_HEADER_ID and sets STATUS_CODE to REQUISITION_CREATED
118 PROCEDURE Set_PO_Req_Header_ID(
119 p_osp_order_id IN NUMBER,
120 p_po_req_header_id IN NUMBER);
121
122 -- This Procedure updates AHL_OSP_ORDER_LINES.P_PO_REQ_LINE_ID
123 PROCEDURE Update_Osp_Order_Lines(
124 p_osp_order_line_id IN NUMBER,
125 p_po_req_line_id IN NUMBER := NULL);
126
127 -- This Procedure updates AHL_OSP_ORDERS_B.STATUS_CODE to SUBMISSION_FAILED
128 PROCEDURE Set_Req_Submission_Failed(
129 p_osp_order_id IN NUMBER);
130
131 -- This Procedure handles deleted Requisition Headers from Purchasing and is Part of PO Synchronization.
132 -- This procedure commits its work if p_commit is set to true and
133 -- if there were no errors during the execution of this procedure.
134 -- It does not check the message list for performing the commit action
135 PROCEDURE Handle_Deleted_Req_Headers(
136 p_commit IN VARCHAR2,
137 x_return_status OUT NOCOPY VARCHAR2);
138
139 -- This Procedure handles cancelled Req Lines and is Part of PO Synchronization.
140 -- This procedure commits its work if p_commit is set to true and
141 -- if there were no errors during the execution of this procedure.
142 -- It does not check the message list for performing the commit action
143 PROCEDURE Handle_Cancelled_Req_Lines(
144 p_commit IN VARCHAR2,
145 x_return_status OUT NOCOPY VARCHAR2);
146
147 -- This Procedure handles deleted Req Lines and is Part of PO Synchronization.
148 -- This procedure commits its work if p_commit is set to true and
149 -- if there were no errors during the execution of this procedure.
150 -- It does not check the message list for performing the commit action
151 PROCEDURE Handle_Deleted_Req_Lines(
152 p_commit IN VARCHAR2,
153 x_return_status OUT NOCOPY VARCHAR2);
154
155 -- Helper function to get the Charge Account Id to fill
156 -- po_requisitions_interface.CHARGE_ACCOUNT_ID, given the Item and Org.
157 FUNCTION get_charge_account_id
158 (
159 p_inv_org_id IN NUMBER,
160 p_item_id IN NUMBER
161 ) RETURN NUMBER;
162
163 -----------------------------------------
164 -- Public Procedure Definitions follow --
165 -----------------------------------------
166 -- Start of Comments --
167 -- Procedure name : Create_PO_Requisition
168 -- Type : Private
169 -- Function : Validates OSP Information and inserts records into PO Requisition Interface tables
170 -- Launches Concurrent Program to initiate PO Requisition creation
171 -- Updates OSP table with request id, batch id and interface header id
172 -- Pre-reqs :
173 -- Parameters :
174 --
175 -- Standard IN Parameters :
176 -- p_api_version IN NUMBER Required
177 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
178 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
179 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
180 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
181 -- p_module_type IN VARCHAR2 Default NULL.
182 --
183 -- Standard OUT Parameters :
184 -- x_return_status OUT VARCHAR2 Required
185 -- x_msg_count OUT NUMBER Required
186 -- x_msg_data OUT VARCHAR2 Required
187 --
188 -- Create_PO_Requisition Parameters:
189 -- p_osp_order_id IN NUMBER Required
190 -- The Id of the OSP Order for which to create the Purchase Requisition
191 -- p_osp_order_number IN NUMBER Required
192 -- The Number of the OSP Order for which to create the Purchase Requisition
193 -- x_batch_id OUT NUMBER Required
194 -- Contains the batch id if the concurrent program was launched successfuly.
195 -- x_request_id OUT NUMBER Required
196 -- Contains the concurrent request id if the concurrent program was launched successfuly.
197 --
198 --
199 -- Version :
200 -- Initial Version 1.0
201 --
202 -- End of Comments.
203
204 PROCEDURE Create_PO_Requisition
205 (
206 p_api_version IN NUMBER,
207 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
208 p_commit IN VARCHAR2 := FND_API.G_FALSE,
209 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
210 p_module_type IN VARCHAR2 := NULL,
211 p_osp_order_id IN NUMBER := NULL, -- Required if Number is not given
212 p_osp_order_number IN NUMBER := NULL, -- Required if Id is not given
213 x_batch_id OUT NOCOPY NUMBER,
214 x_request_id OUT NOCOPY NUMBER,
215 x_return_status OUT NOCOPY VARCHAR2,
216 x_msg_count OUT NOCOPY NUMBER,
217 x_msg_data OUT NOCOPY VARCHAR2) IS
218
219 l_api_version CONSTANT NUMBER := 1.0;
220 l_api_name CONSTANT VARCHAR2(30) := 'Create_PO_Requisition';
221 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Create_PO_Requisition';
222
223 CURSOR l_osp_id_csr(p_osp_order_number IN NUMBER) IS
224 SELECT OSP_ORDER_ID
225 FROM AHL_OSP_ORDERS_B
226 WHERE OSP_ORDER_NUMBER = p_osp_order_number;
227
228 CURSOR l_osp_dtls_csr(p_osp_order_id IN NUMBER) IS
229 SELECT B.VENDOR_ID,
230 B.VENDOR_SITE_ID,
231 B.OPERATING_UNIT_ID,
232 B.PO_AGENT_ID,
233 B.PO_BATCH_ID,
234 TL.DESCRIPTION,
235 B.PO_INTERFACE_HEADER_ID,
236 B.VENDOR_CONTACT_ID,
237 B.STATUS_CODE
238 FROM AHL_OSP_ORDERS_B B, AHL_OSP_ORDERS_TL TL
239 WHERE B.OSP_ORDER_ID = p_osp_order_id
240 AND TL.OSP_ORDER_ID = B.OSP_ORDER_ID
241 AND TL.LANGUAGE = userenv('LANG');
242
243 CURSOR l_osp_line_dtls_csr(p_osp_order_id IN NUMBER) IS
244 SELECT OL.OSP_ORDER_LINE_ID,
245 OL.OBJECT_VERSION_NUMBER,
246 OL.OSP_LINE_NUMBER,
247 OL.SERVICE_ITEM_ID,
248 OL.SERVICE_ITEM_DESCRIPTION,
249 OL.QUANTITY,
250 OL.NEED_BY_DATE,
251 OL.SERVICE_ITEM_UOM_CODE,
252 OL.PO_LINE_TYPE_ID,
253 OL.INVENTORY_ORG_ID,
254 DECODE(OL.WORKORDER_ID, NULL, HAOU.LOCATION_ID, BOM.LOCATION_ID),
255 WO.WIP_ENTITY_ID,
256 WDJ.PROJECT_ID,
257 WDJ.TASK_ID
258 FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS WO, BOM_DEPARTMENTS BOM, HR_ALL_ORGANIZATION_UNITS HAOU, WIP_DISCRETE_JOBS WDJ
259 WHERE OL.OSP_ORDER_ID = p_osp_order_id AND
260 WO.WORKORDER_ID (+) = OL.WORKORDER_ID AND
261 WDJ.WIP_ENTITY_ID (+) = WO.WIP_ENTITY_ID AND
262 BOM.DEPARTMENT_ID (+) = WDJ.OWNING_DEPARTMENT AND
263 HAOU.ORGANIZATION_ID = OL.INVENTORY_ORG_ID
264 ORDER BY OL.OSP_LINE_NUMBER;
265
266 CURSOR get_return_to_org_csr(p_osp_line_id IN NUMBER) IS
267 SELECT oola.ship_from_org_id, HAOU.LOCATION_ID
268 FROM oe_order_lines_all oola, ahl_osp_order_lines aool, HR_ALL_ORGANIZATION_UNITS HAOU
269 WHERE oola.line_id = aool.oe_return_line_id and
270 HAOU.ORGANIZATION_ID = oola.ship_from_org_id and
271 aool.osp_order_line_id = p_osp_line_id;
272
273 l_po_req_header PO_Req_Header_Rec_Type;
274 l_po_req_line_tbl PO_Req_Line_Tbl_Type;
275 l_intf_hdr_id NUMBER;
276 l_batch_id NUMBER;
277 l_old_batch_id NUMBER := null;
278 l_old_intf_header_id NUMBER := null;
279 l_request_id NUMBER := 0;
280 l_temp_num NUMBER := 0;
281 l_temp_ret_org_id NUMBER;
282 l_temp_ret_org_loc_id NUMBER;
283 l_status VARCHAR2(30);
284
285 BEGIN
286
287 -- Standard start of API savepoint
288 SAVEPOINT Create_PO_Requisition_pvt;
289
290 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
291 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
292 END IF;
293
294 -- Standard call to check for call compatibility
295 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
296 G_PKG_NAME) THEN
297 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
298 END IF;
299
300 -- Initialize message list if p_init_msg_list is set to TRUE
301 IF FND_API.To_Boolean(p_init_msg_list) THEN
302 FND_MSG_PUB.Initialize;
303 END IF;
304
305 -- Initialize API return status to success
306 x_return_status := FND_API.G_RET_STS_SUCCESS;
307
308 -- Start processing
309
310 -- Create the Header Rec
311 IF (p_osp_order_id IS NOT NULL) THEN
312 l_po_req_header.OSP_ORDER_ID := p_osp_order_id;
313 ELSE
314 -- Convert the Order number to Id
315 OPEN l_osp_id_csr(p_osp_order_number);
316 FETCH l_osp_id_csr INTO l_po_req_header.OSP_ORDER_ID;
317 CLOSE l_osp_id_csr;
318 END IF;
319
320 OPEN l_osp_dtls_csr(l_po_req_header.OSP_ORDER_ID);
321 FETCH l_osp_dtls_csr INTO l_po_req_header.VENDOR_ID,
322 l_po_req_header.VENDOR_SITE_ID,
323 l_po_req_header.OPERATING_UNIT_ID,
324 l_po_req_header.BUYER_ID,
325 l_old_batch_id, -- For Purging Interface table records
326 l_po_req_header.DESCRIPTION,
327 l_old_intf_header_id, -- For Purging Interface table records
328 l_po_req_header.VENDOR_CONTACT_ID,
329 l_status;
330 CLOSE l_osp_dtls_csr;
331
332 -- Validate Header
333 Validate_PO_Req_Header(l_po_req_header);
334 -- Create the Lines Table
335 OPEN l_osp_line_dtls_csr(p_osp_order_id);
336 LOOP
337 FETCH l_osp_line_dtls_csr INTO l_po_req_line_tbl(l_temp_num).OSP_LINE_ID,
338 l_po_req_line_tbl(l_temp_num).OBJECT_VERSION_NUMBER,
339 l_po_req_line_tbl(l_temp_num).LINE_NUMBER,
340 l_po_req_line_tbl(l_temp_num).ITEM_ID,
341 l_po_req_line_tbl(l_temp_num).ITEM_DESCRIPTION,
342 l_po_req_line_tbl(l_temp_num).QUANTITY,
343 l_po_req_line_tbl(l_temp_num).NEED_BY_DATE,
344 l_po_req_line_tbl(l_temp_num).UOM_CODE,
345 l_po_req_line_tbl(l_temp_num).PO_LINE_TYPE_ID,
346 l_po_req_line_tbl(l_temp_num).SHIP_TO_ORG_ID,
347 l_po_req_line_tbl(l_temp_num).SHIP_TO_LOC_ID,
348 l_po_req_line_tbl(l_temp_num).WIP_ENTITY_ID,
349 l_po_req_line_tbl(l_temp_num).PROJECT_ID,
350 l_po_req_line_tbl(l_temp_num).TASK_ID;
351
352 EXIT WHEN l_osp_line_dtls_csr%NOTFOUND;
353
354 OPEN get_return_to_org_csr(l_po_req_line_tbl(l_temp_num).OSP_LINE_ID);
355 FETCH get_return_to_org_csr INTO l_temp_ret_org_id, l_temp_ret_org_loc_id;
356 IF (get_return_to_org_csr%FOUND AND l_temp_ret_org_id IS NOT NULL) THEN
357 IF (l_temp_ret_org_id <> l_po_req_line_tbl(l_temp_num).SHIP_TO_ORG_ID) THEN
358 l_po_req_line_tbl(l_temp_num).SHIP_TO_ORG_ID := l_temp_ret_org_id;
359 -- Update the Ship To Location also from the Line's Inventory Org
360 -- if the Return To Org is different
361 l_po_req_line_tbl(l_temp_num).SHIP_TO_LOC_ID := l_temp_ret_org_loc_id;
362 END IF;
363 END IF;
364 CLOSE get_return_to_org_csr;
365
366 l_temp_num := l_temp_num + 1;
367 END LOOP;
368 CLOSE l_osp_line_dtls_csr;
369 l_po_req_line_tbl.DELETE(l_temp_num); -- Delete the last (null) record
370 -- Validate Lines
371 Validate_PO_Req_Lines(l_po_req_line_tbl, l_po_req_header.OSP_ORDER_ID);
372 -- Check Error Message stack.
373 x_msg_count := FND_MSG_PUB.count_msg;
374 IF x_msg_count > 0 THEN
375 RAISE FND_API.G_EXC_ERROR;
376 END IF;
377
378 -- Insert Rows into PO_REQUISITIONS_INTERFACE_ALL
379
380 -- Purge Error records from prior submission (if any)
381 IF (l_status = G_OSP_REQ_SUB_FAILED_STATUS) THEN
382 DELETE FROM po_interface_errors
383 WHERE INTERFACE_TRANSACTION_ID in
384 (SELECT transaction_id
385 FROM po_requisitions_interface_all
386 WHERE INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME
387 AND INTERFACE_SOURCE_LINE_ID = l_po_req_header.OSP_ORDER_ID);
388 DELETE FROM po_requisitions_interface_all
389 WHERE INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME
390 AND INTERFACE_SOURCE_LINE_ID = l_po_req_header.OSP_ORDER_ID;
391
392 ELSIF(l_status = G_OSP_SUB_FAILED_STATUS and l_old_intf_header_id IS NOT NULL) THEN
393 -- Earlier, User tried to create a PO (not a requisition) and that failed.
394 DELETE FROM PO_INTERFACE_ERRORS WHERE
395 INTERFACE_HEADER_ID = l_old_intf_header_id;
396 DELETE FROM PO_HEADERS_INTERFACE WHERE
397 INTERFACE_HEADER_ID = l_old_intf_header_id;
398 DELETE FROM PO_LINES_INTERFACE WHERE
399 INTERFACE_HEADER_ID = l_old_intf_header_id;
400 END IF;
401
402 Insert_Into_Req_Interface(p_po_req_hdr_rec => l_po_req_header,
403 p_po_req_line_tbl => l_po_req_line_tbl,
404 x_batch_id => l_batch_id);
405
406 -- Launch Concurrent Program to create PO Requisition
407 Call_Req_Import_Program(p_batch_id => l_batch_id,
408 p_osp_order_id => l_po_req_header.OSP_ORDER_ID,
409 x_request_id => l_request_id);
410 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
411 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'PO Req Concurrent Program Request Submitted. Request Id = ' || l_request_id);
412 END IF;
413 -- Check if request was submitted without error
414 IF (l_request_id = 0) THEN
415 -- Add Error Message generated by Concurrent Manager to Message List
416 FND_MSG_PUB.ADD;
417 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
418 FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, FALSE);
419 END IF;
420 RAISE FND_API.G_EXC_ERROR;
421 END IF;
422
423 -- Update OSP Table with batch id, request id
424 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
425 p_batch_id => l_batch_id,
426 p_request_id => l_request_id);
427
428 -- Set Return parameters
429 x_batch_id := l_batch_id;
430 x_request_id := l_request_id;
431
432 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
433 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors');
434 END IF;
435 -- Check Error Message stack.
436 x_msg_count := FND_MSG_PUB.count_msg;
437 IF x_msg_count > 0 THEN
438 RAISE FND_API.G_EXC_ERROR;
439 END IF;
440
441 -- Log this transaction in the Log Table
442 AHL_OSP_UTIL_PKG.Log_Transaction(p_trans_type_code => G_TXN_TYPE_PO_REQ_CREATION,
443 p_src_doc_id => p_osp_order_id,
444 p_src_doc_type_code => G_DOC_TYPE_OSP,
445 p_dest_doc_id => l_batch_id,
446 p_dest_doc_type_code => G_DOC_TYPE_PO_REQ);
447
448 -- Standard check of p_commit
449 IF FND_API.TO_BOOLEAN(p_commit) THEN
450 COMMIT WORK;
451 END IF;
452
453 -- Standard call to get message count and if count is 1, get message info
454 FND_MSG_PUB.Count_And_Get
455 ( p_count => x_msg_count,
456 p_data => x_msg_data,
457 p_encoded => fnd_api.g_false
458 );
459
460 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
461 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
462 END IF;
463
464 EXCEPTION
465 WHEN FND_API.G_EXC_ERROR THEN
466 ROLLBACK TO Create_PO_Requisition_pvt;
467 x_return_status := FND_API.G_RET_STS_ERROR;
468 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
469 p_data => x_msg_data,
470 p_encoded => fnd_api.g_false);
471
472 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
473 ROLLBACK TO Create_PO_Requisition_pvt;
474 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
475 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
476 p_data => x_msg_data,
477 p_encoded => fnd_api.g_false);
478
479 WHEN OTHERS THEN
480 ROLLBACK TO Create_PO_Requisition_pvt;
481 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
482 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
483 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
484 p_procedure_name => 'Create_PO_Requisition',
485 p_error_text => SUBSTR(SQLERRM,1,240));
486 END IF;
487 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
488 p_data => x_msg_data,
489 p_encoded => fnd_api.g_false);
490
491
492 END Create_PO_Requisition;
493
494 -- Start of Comments --
495 -- Procedure name : PO_Synch_All_Requisitions
496 -- Type : Private
497 -- Function : Synchronizes all OSPs based on the Requisition Status
498 -- 1. Handles successfully completed Requisition Submissions (Updates OSP tables)
499 -- 2. Handles failed Requisition Submissions (Updates OSP Status)
500 -- 3. Handles Cancelled Requisition Lines (Updates OSP Line status, deletes shipment lines)
501 -- 4. Handles Deleted Requisition Lines (Updates OSP Line status, deletes shipment lines)
502 -- Pre-reqs :
503 -- Parameters :
504 --
505 -- Standard IN Parameters :
506 -- p_api_version IN NUMBER Required
507 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
508 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
509 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
510 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
511 -- p_module_type IN VARCHAR2 Default NULL.
512 --
513 -- Standard OUT Parameters :
514 -- x_return_status OUT VARCHAR2 Required
515 -- x_msg_count OUT NUMBER Required
516 -- x_msg_data OUT VARCHAR2 Required
517 --
518 -- PO_Synch_All_Requisitions parameters:
519 -- p_concurrent_flag IN VARCHAR2 Default N.
520 -- Writes debug Information to Concurrent Program's Log File if set to 'Y'
521 --
522 -- Version :
523 -- Initial Version 1.0
524 --
525 -- End of Comments.
526
527 PROCEDURE PO_Synch_All_Requisitions
528 (
529 p_api_version IN NUMBER,
530 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
531 p_commit IN VARCHAR2 := FND_API.G_FALSE,
532 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
533 p_default IN VARCHAR2 := FND_API.G_TRUE,
534 p_module_type IN VARCHAR2 := NULL,
535 p_concurrent_flag IN VARCHAR2 := 'N',
536 x_return_status OUT NOCOPY VARCHAR2,
537 x_msg_count OUT NOCOPY NUMBER,
538 x_msg_data OUT NOCOPY VARCHAR2) IS
539
540 l_api_version CONSTANT NUMBER := 1.0;
541 l_api_name CONSTANT VARCHAR2(30) := 'PO_Synch_All_Requisitions';
542 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.PO_Synch_All_Requisitions';
543
544 BEGIN
545 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
546 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
547 END IF;
548
549 -- No need of a Savepoint: Individual procedures commit or rollback
550 -- within themselves.
551
552 -- Standard call to check for call compatibility
553 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
554 G_PKG_NAME) THEN
555 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
556 END IF;
557
558 -- Initialize message list if p_init_msg_list is set to TRUE
559 IF FND_API.To_Boolean(p_init_msg_list) THEN
560 FND_MSG_PUB.Initialize;
561 END IF;
562
563 -- Initialize API return status to success
564 x_return_status := FND_API.G_RET_STS_SUCCESS;
565
566 IF FND_API.to_boolean( p_default ) THEN
567 -- No special default settings required in this API
568 NULL;
569 END IF;
570
571 -- Start processing
572 IF (p_concurrent_flag = 'Y') THEN
573 fnd_file.put_line(fnd_file.log, 'Starting Requisition Synch process...');
574 END IF;
575
576 -- First make all associations (PO Req Header Id, PO Req Line Id, Status updates)
577 Associate_All_New_Reqs(p_api_version => 1.0,
578 p_commit => p_commit, --Commit this independent of other operations
579 x_return_status => x_return_status,
580 x_msg_count => x_msg_count,
581 x_msg_data => x_msg_data);
582 IF (p_concurrent_flag = 'Y') THEN
583 fnd_file.put_line(fnd_file.log, 'Completed Associating OSPs with POs');
584 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
585 END IF;
586 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
587 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Associating OSPs with Requisitions, Return Status = ' || x_return_status);
588 END IF;
589
590 Handle_Deleted_Req_Headers(p_commit => p_commit, --Commit this independent of other operations
591 x_return_status => x_return_status);
592 IF (p_concurrent_flag = 'Y') THEN
593 fnd_file.put_line(fnd_file.log, 'Completed Handling Deleted PO Requisition Headers.');
594 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
595 END IF;
596 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
597 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Deleted PO Requisition Headers, Return Status = ' || x_return_status);
598 END IF;
599
600
601 -- Handle Canceled PO Requisitions
602 Handle_Cancelled_Req_Lines(p_commit => p_commit, --Commit this independent of other operations
603 x_return_status => x_return_status);
604 IF (p_concurrent_flag = 'Y') THEN
605 fnd_file.put_line(fnd_file.log, 'Completed Handling Cancelled PO Requisition Lines.');
606 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
607 END IF;
608 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
609 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Cancelled PO Requisition Lines, Return Status = ' || x_return_status);
610 END IF;
611
612 -- Handle Deleted PO Requisition Lines
613 Handle_Deleted_Req_Lines(p_commit => p_commit, --Commit this independent of other operations
614 x_return_status => x_return_status);
615 IF (p_concurrent_flag = 'Y') THEN
616 fnd_file.put_line(fnd_file.log, 'Completed Handling Deleted PO Requisition Lines.');
617 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
618 END IF;
619 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
620 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Deleted PO Requisition Lines, Return Status = ' || x_return_status);
621 END IF;
622
623 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
624 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors.');
625 END IF;
626
627 IF (p_concurrent_flag = 'Y') THEN
628 fnd_file.put_line(fnd_file.log, 'Completed Requisition Synch Process. Checking for errors.');
629 END IF;
630 -- Check Error Message stack.
631 x_msg_count := FND_MSG_PUB.count_msg;
632 IF x_msg_count > 0 THEN
633 RAISE FND_API.G_EXC_ERROR; --Note that commit might already have taken place
634 END IF;
635
636 -- Standard check of p_commit
637 -- No need to commit: Individual procedures commit or rollback
638 -- within themselves.
639 -- IF FND_API.TO_BOOLEAN(p_commit) THEN
640 -- COMMIT WORK; --Note that commit might already have taken place
641 -- END IF;
642
643 -- Standard call to get message count and if count is 1, get message info
644 FND_MSG_PUB.Count_And_Get
645 ( p_count => x_msg_count,
646 p_data => x_msg_data,
647 p_encoded => fnd_api.g_false
648 );
649
650 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
651 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
652 END IF;
653
654 EXCEPTION
655 WHEN FND_API.G_EXC_ERROR THEN
656 -- No need to rollback: Individual procedures commit or rollback
657 -- within themselves.
658 -- ROLLBACK TO PO_Synch_All_OSPs_pvt; --Note that commit might already have taken place
659 x_return_status := FND_API.G_RET_STS_ERROR;
660 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
661 p_data => x_msg_data,
662 p_encoded => fnd_api.g_false);
663 IF (p_concurrent_flag = 'Y') THEN
664 fnd_file.put_line(fnd_file.log, 'Caught Execution Exception: ' || x_msg_data);
665 END IF;
666 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
667 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Execution Exception: ' || x_msg_data);
668 END IF;
669
670 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
671 -- No need to rollback: Individual procedures commit or rollback
672 -- within themselves.
673
674 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
675 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
676 p_data => x_msg_data,
677 p_encoded => fnd_api.g_false);
678 IF (p_concurrent_flag = 'Y') THEN
679 fnd_file.put_line(fnd_file.log, 'Caught Unexpected Exception: ' || x_msg_data);
680 END IF;
681 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
682 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Unexpected Exception: ' || x_msg_data);
683 END IF;
684
685 WHEN OTHERS THEN
686 -- No need to rollback: Individual procedures commit or rollback
687 -- within themselves.
688 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
689 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
690 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
691 p_procedure_name => 'PO_Synch_All_Requisitions',
692 p_error_text => SUBSTR(SQLERRM,1,240));
693 END IF;
694 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
695 p_data => x_msg_data,
696 p_encoded => fnd_api.g_false);
697 IF (p_concurrent_flag = 'Y') THEN
698 fnd_file.put_line(fnd_file.log, 'Caught Unknown Exception: ' || x_msg_data);
699 END IF;
700 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
701 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Unknown Exception: ' || x_msg_data);
702 END IF;
703
704 END PO_Synch_All_Requisitions;
705
706 ----------------------------------------
707
708 -- Start of Comments --
709 -- Procedure name : Associate_All_New_Reqs
710 -- Type : Private
711 -- Function : Updates AHL_OSP_ORDERS_B.PO_REQ_HEADER_ID and
712 -- AHL_OSP_ORDER_LINES.PO_REQ_LINE_ID with REQUISITION_HEADER_ID and
713 -- REQUISITION_LINE_ID respectively for all submitted OSP Orders (for Requisitions).
714 -- Pre-reqs :
715 -- Parameters :
716 --
717 -- Standard IN Parameters :
718 -- p_api_version IN NUMBER Required
719 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
720 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
721 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
722 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
723 -- p_module_type IN VARCHAR2 Default NULL.
724 --
725 -- Standard OUT Parameters :
726 -- x_return_status OUT VARCHAR2 Required
727 -- x_msg_count OUT NUMBER Required
728 -- x_msg_data OUT VARCHAR2 Required
729 --
730 -- Version :
731 -- Initial Version 1.0
732 --
733 -- End of Comments.
734
735 PROCEDURE Associate_All_New_Reqs
736 (
737 p_api_version IN NUMBER,
738 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
739 p_commit IN VARCHAR2 := FND_API.G_FALSE,
740 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
741 p_default IN VARCHAR2 := FND_API.G_TRUE,
742 p_module_type IN VARCHAR2 := NULL,
743 x_return_status OUT NOCOPY VARCHAR2,
744 x_msg_count OUT NOCOPY NUMBER,
745 x_msg_data OUT NOCOPY VARCHAR2) IS
746
747 CURSOR l_get_osps_for_reqs_csr IS
748 SELECT OSP_ORDER_ID FROM AHL_OSP_ORDERS_B
749 WHERE STATUS_CODE = G_OSP_REQ_SUBMITTED_STATUS
750 AND PO_REQ_HEADER_ID IS NULL
751 AND PO_BATCH_ID IS NOT NULL
752 -- Added by jaramana on April 7, 2008 for bug 6609988
753 AND OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id();
754
755 l_api_version CONSTANT NUMBER := 1.0;
756 l_api_name CONSTANT VARCHAR2(30) := 'Associate_All_New_Reqs';
757 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Associate_All_New_Reqs';
758 l_dummy VARCHAR2(1);
759 l_osp_order_id NUMBER;
760 l_po_req_header_id NUMBER;
761 l_temp_count NUMBER := 0;
762
763 BEGIN
764 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
765 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
766 END IF;
767
768 -- Standard start of API savepoint
769 SAVEPOINT Associate_All_New_Reqs_pvt;
770
771 -- Standard call to check for call compatibility
772 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
773 G_PKG_NAME) THEN
774 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
775 END IF;
776
777 -- Initialize message list if p_init_msg_list is set to TRUE
778 IF FND_API.To_Boolean(p_init_msg_list) THEN
779 FND_MSG_PUB.Initialize;
780 END IF;
781
782 -- Initialize API return status to success
783 x_return_status := FND_API.G_RET_STS_SUCCESS;
784
785 IF FND_API.to_boolean( p_default ) THEN
786 -- No special default settings required in this API
787 NULL;
788 END IF;
789
790 -- Start processing
791 OPEN l_get_osps_for_reqs_csr;
792 LOOP
793 FETCH l_get_osps_for_reqs_csr INTO l_osp_order_id;
794 EXIT WHEN l_get_osps_for_reqs_csr%NOTFOUND;
795 Associate_New_Req(p_osp_order_id => l_osp_order_id,
796 x_po_req_header_id => l_po_req_header_id);
797 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
798 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Associated OSP Order with Id ' || l_osp_order_id || ' to Requisition with Id ' || l_po_req_header_id);
799 END IF;
800 l_temp_count := l_temp_count + 1;
801 END LOOP;
802 CLOSE l_get_osps_for_reqs_csr;
803
804 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
805 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Associated ' || l_temp_count || ' OSP Orders with Requisitions');
806 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors.');
807 END IF;
808 -- Check Error Message stack.
809 x_msg_count := FND_MSG_PUB.count_msg;
810 IF x_msg_count > 0 THEN
811 RAISE FND_API.G_EXC_ERROR;
812 END IF;
813
814 -- Standard check of p_commit
815 IF FND_API.TO_BOOLEAN(p_commit) THEN
816 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
817 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
818 END IF;
819 COMMIT WORK;
820 END IF;
821
822 -- Standard call to get message count and if count is 1, get message info
823 FND_MSG_PUB.Count_And_Get
824 ( p_count => x_msg_count,
825 p_data => x_msg_data,
826 p_encoded => fnd_api.g_false
827 );
828
829 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
830 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
831 END IF;
832
833 EXCEPTION
834 WHEN FND_API.G_EXC_ERROR THEN
835 ROLLBACK TO Associate_All_New_Reqs_pvt;
836 x_return_status := FND_API.G_RET_STS_ERROR;
837 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
838 p_data => x_msg_data,
839 p_encoded => fnd_api.g_false);
840
841 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
842 ROLLBACK TO Associate_All_New_Reqs_pvt;
843 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
844 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
845 p_data => x_msg_data,
846 p_encoded => fnd_api.g_false);
847
848 WHEN OTHERS THEN
849 ROLLBACK TO Associate_All_New_Reqs_pvt;
850 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
851 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
852 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
853 p_procedure_name => 'Associate_All_New_Reqs',
854 p_error_text => SUBSTR(SQLERRM,1,240));
855 END IF;
856 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
857 p_data => x_msg_data,
858 p_encoded => fnd_api.g_false);
859
860 END Associate_All_New_Reqs;
861
862 -------------------------------------------------------------------------
863 -- This Procedure inserts a record into the PO_REQUISITIONS_INTERFACE_ALL table
864 -------------------------------------------------------------------------
865 PROCEDURE Insert_Into_Req_Interface
866 (
867 p_po_req_hdr_rec IN PO_Req_Header_Rec_Type,
868 p_po_req_line_tbl IN PO_Req_Line_Tbl_Type,
869 x_batch_id OUT NOCOPY NUMBER
870 ) IS
871
872 l_org_id NUMBER := NULL;
873 l_price NUMBER := NULL;
874 l_category VARCHAR2(30) := NULL;
875 l_category_seg1 VARCHAR2(40) := NULL;
876 l_category_seg2 VARCHAR2(40) := NULL;
877 l_charge_acct_id NUMBER := NULL;
878
879 CURSOR get_prj_task_comp_date_csr (c_task_id IN NUMBER) IS
880 SELECT COMPLETION_DATE from pa_tasks
881 where task_id = c_task_id;
882
883 l_task_completion_date DATE;
884 l_expenditure_item_type pa_expenditure_types.expenditure_type%type;
885
886 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Insert_Into_Req_Interface';
887
888 BEGIN
889
890 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
891 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
892 END IF;
893
894 -- Get the current Org to get Item Price
895 l_org_id := MO_GLOBAL.get_current_org_id();
896
897 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
898 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_po_req_line_tbl.count: '|| p_po_req_line_tbl.count);
899 END IF;
900
901 FOR i IN p_po_req_line_tbl.FIRST..p_po_req_line_tbl.LAST LOOP
902 IF (p_po_req_line_tbl(i).ITEM_ID IS NULL) THEN
903 -- One time items defaulting
904 l_price := G_DEFAULT_PRICE;
905 l_category_seg1 := G_DEFAULT_CATEGORY_SEG1;
906 l_category_seg2 := G_DEFAULT_CATEGORY_SEG2;
907 ELSE
908 -- Purchasing defaults the category from the item
909 l_category_seg1 := null;
910 l_category_seg2 := null;
911
912 /*
913 Item pricing information is also derived in the UNIT_PRICE and CURRENCY_UNIT_PRICE columns.
914 If no sourcing rules are found for the item, supplier sourcing fails and the UNIT_PRICE is
915 defaulted from the item master for supplier requisition lines
916 */
917 l_price := null;
918 END IF;
919
920 -- Insert row into PO_REQUISITIONS_INTERFACE_ALL
921 l_charge_acct_id := get_charge_account_id(p_po_req_line_tbl(i).SHIP_TO_ORG_ID, p_po_req_line_tbl(i).ITEM_ID);
922
923 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
924 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id before inserting: '|| l_charge_acct_id);
925 END IF;
926
927 -- Project related fields to link the distributions to Projects
928 IF p_po_req_line_tbl(i).TASK_ID IS NOT NULL THEN
929 OPEN get_prj_task_comp_date_csr(p_po_req_line_tbl(i).TASK_ID);
930 FETCH get_prj_task_comp_date_csr INTO l_task_completion_date;
931 CLOSE get_prj_task_comp_date_csr;
932 ELSE
933 l_task_completion_date := NULL;
934 END IF;
935
936 l_expenditure_item_type := FND_PROFILE.VALUE('AHL_OSP_EXPENDITURE_TYPE');
937 IF(l_expenditure_item_type IS NULL) THEN
938 l_expenditure_item_type := 'Outside Processing';
939 END IF;
940
941 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
942 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_task_completion_date : '|| to_char(l_task_completion_date, 'DD-MON-YYYY HH24:MI:SS'));
943 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_expenditure_item_type : '|| l_expenditure_item_type);
944 END IF;
945
946 INSERT INTO po_requisitions_interface_all
947 (
948 INTERFACE_SOURCE_CODE,
949 INTERFACE_SOURCE_LINE_ID,
950 REFERENCE_NUM,
951 LINE_TYPE_ID,
952 SOURCE_TYPE_CODE,
953 DESTINATION_TYPE_CODE,
954 AUTHORIZATION_STATUS,
955 PREPARER_ID,
956 ITEM_ID,
957 ITEM_DESCRIPTION,
958 QUANTITY,
959 CATEGORY_SEGMENT1,
960 CATEGORY_SEGMENT2,
961 UOM_CODE,
962 UNIT_PRICE,
963 NEED_BY_DATE,
964 DESTINATION_ORGANIZATION_ID,
965 DELIVER_TO_LOCATION_ID,
966 DELIVER_TO_REQUESTOR_ID,
967 SUGGESTED_BUYER_ID,
968 SUGGESTED_VENDOR_ID,
969 SUGGESTED_VENDOR_SITE_ID,
970 SUGGESTED_VENDOR_CONTACT_ID,
971 HEADER_DESCRIPTION,
972 --Project related fields to link the distributions to Projects
973 WIP_ENTITY_ID,
974 PROJECT_ID,
975 TASK_ID,
976 --Project related fields End
977 GROUP_CODE,
978 BATCH_ID,
979 ORG_ID,
980 PROGRAM_ID,
981 PROGRAM_APPLICATION_ID,
982 CHARGE_ACCOUNT_ID,
983 --Project related fields to link the distributions to Projects
984 PROJECT_ACCOUNTING_CONTEXT,
985 EXPENDITURE_TYPE,
986 EXPENDITURE_ORGANIZATION_ID,
987 EXPENDITURE_ITEM_DATE
988 --Project related fields End
989 )
990 VALUES
991 (
992 AHL_GLOBAL.AHL_APP_SHORT_NAME, --INTERFACE_SOURCE_CODE
993 p_po_req_hdr_rec.OSP_ORDER_ID, --INTERFACE_SOURCE_LINE_ID
994 p_po_req_line_tbl(i).OSP_LINE_ID, --REFERENCE_NUM
995 p_po_req_line_tbl(i).PO_LINE_TYPE_ID, --LINE_TYPE_ID
996 'VENDOR', --SOURCE_TYPE_CODE
997 'EXPENSE', --DESTINATION_TYPE_CODE
998 'INCOMPLETE', --AUTHORIZATION_STATUS
999 FND_GLOBAL.EMPLOYEE_ID, --PREPARER_ID (Should be logged in user)
1000 p_po_req_line_tbl(i).ITEM_ID, --ITEM_ID
1001 p_po_req_line_tbl(i).ITEM_DESCRIPTION, --ITEM_DESCRIPTION
1002 p_po_req_line_tbl(i).QUANTITY, --QUANTITY
1003 l_category_seg1, --CATEGORY_SEGMENT1
1004 l_category_seg2, --CATEGORY_SEGMENT2
1005 p_po_req_line_tbl(i).UOM_CODE, --UOM_CODE
1006 l_price, --UNIT_PRICE
1007 p_po_req_line_tbl(i).NEED_BY_DATE, --NEED_BY_DATE
1008 p_po_req_line_tbl(i).SHIP_TO_ORG_ID, --DESTINATION_ORGANIZATION_ID
1009 p_po_req_line_tbl(i).SHIP_TO_LOC_ID, --DELIVER_TO_LOCATION_ID
1010 FND_GLOBAL.EMPLOYEE_ID, --DELIVER_TO_REQUESTOR_ID
1011 p_po_req_hdr_rec.BUYER_ID, --SUGGESTED_BUYER_ID
1012 p_po_req_hdr_rec.VENDOR_ID, --SUGGESTED_VENDOR_ID
1013 p_po_req_hdr_rec.VENDOR_SITE_ID, --SUGGESTED_VENDOR_SITE_ID
1014 p_po_req_hdr_rec.VENDOR_CONTACT_ID, --SUGGESTED_VENDOR_CONTACT_ID
1015 SUBSTR(p_po_req_hdr_rec.DESCRIPTION, 1, 240), --HEADER_DESCRIPTION
1016
1017 p_po_req_line_tbl(i).WIP_ENTITY_ID, --WIP_ENTITY_ID
1018 p_po_req_line_tbl(i).PROJECT_ID, --PROJECT_ID
1019 p_po_req_line_tbl(i).TASK_ID, --TASK_ID
1020
1021 p_po_req_hdr_rec.OSP_ORDER_ID, --GROUP_CODE
1022 p_po_req_hdr_rec.OSP_ORDER_ID, --BATCH_ID
1023 p_po_req_hdr_rec.OPERATING_UNIT_ID, --ORG_ID
1024 AHL_GLOBAL.AHL_OSP_PROGRAM_ID, --PROGRAM_ID
1025 AHL_GLOBAL.AHL_APPLICATION_ID, --PROGRAM_APPLICATION_ID
1026 l_charge_acct_id, --CHARGE_ACCOUNT_ID
1027
1028 decode(p_po_req_line_tbl(i).PROJECT_ID, null, null, 'Y'), --PROJECT_ACCOUNTING_CONTEXT
1029 decode(p_po_req_line_tbl(i).PROJECT_ID, null, null, l_expenditure_item_type), --EXPENDITURE_TYPE
1030 decode(p_po_req_line_tbl(i).PROJECT_ID, null, null, p_po_req_line_tbl(i).SHIP_TO_ORG_ID), --EXPENDITURE_ORGANIZATION_ID
1031 l_task_completion_date --EXPENDITURE_ITEM_DATE
1032 );
1033
1034 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1035 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
1036 ' Inserting into po_requisitions_interface_all: '||
1037 ' WIP_ENTITY_ID = ' || p_po_req_line_tbl(i).WIP_ENTITY_ID ||
1038 ', PROJECT_ID = ' || p_po_req_line_tbl(i).PROJECT_ID ||
1039 ', TASK_ID = ' || p_po_req_line_tbl(i).TASK_ID ||
1040 ', EXPENDITURE_TYPE = ' || l_expenditure_item_type ||
1041 ', EXPENDITURE_ORGANIZATION_ID = ' || p_po_req_line_tbl(i).SHIP_TO_ORG_ID ||
1042 ', EXPENDITURE_ITEM_DATE = ' || to_char(l_task_completion_date, 'DD-MON-YYYY HH24:MI:SS'));
1043 END IF;
1044
1045 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1046 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Inserted One Record.');
1047 END IF;
1048
1049 END LOOP;
1050 x_batch_id := p_po_req_hdr_rec.OSP_ORDER_ID;
1051
1052 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1053 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1054 END IF;
1055 END Insert_Into_Req_Interface;
1056
1057 ----------------------------------------
1058 -- This Procedure calls the Concurrent Program to
1059 -- Create a Purchasing Requisition
1060 ----------------------------------------
1061 PROCEDURE Call_Req_Import_Program(
1062 p_batch_id IN NUMBER,
1063 p_osp_order_id IN NUMBER,
1064 x_request_id OUT NOCOPY NUMBER) IS
1065
1066 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Call_Req_Import_Program';
1067 l_curr_org_id NUMBER;
1068
1069 BEGIN
1070 -- Added by jaramana on Feb 7, 2008
1071 l_curr_org_id := MO_GLOBAL.get_current_org_id();
1072 FND_REQUEST.SET_ORG_ID(l_curr_org_id);
1073
1074 x_request_id := FND_REQUEST.SUBMIT_REQUEST(
1075 application => G_PO_APP_CODE,
1076 program => G_REQIMPORT_PROG_CODE,
1077 argument1 => AHL_GLOBAL.AHL_APP_SHORT_NAME, -- Origin of requisition (INTERFACE_SOURCE_CODE)
1078 argument2 => p_osp_order_id, -- ID of batch to be imported (BATCH_ID)
1079 argument3 => p_osp_order_id, -- Parameter to group reqs by (GROUP_BY)
1080 argument4 => NULL, -- Last Requisition Number
1081 argument5 => 'N', -- Speicfies if Multiple Distributions are to be created
1082 argument6 => 'N' -- Specifies if requisition approval has to be initiated
1083 );
1084
1085 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1086 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Request Submitted. Request Id = ' || x_request_id);
1087 END IF;
1088 END Call_Req_Import_Program;
1089
1090 -----------------------------------------------------------------------
1091 -- This Procedure validates the OSP Order for PO Requisition Creation
1092 -----------------------------------------------------------------------
1093 PROCEDURE Validate_PO_Req_Header(
1094 p_po_req_header_rec IN PO_Req_Header_Rec_Type) IS
1095
1096 CURSOR l_validate_osp_csr(p_osp_order_id IN NUMBER) IS
1097 SELECT 'x' FROM AHL_OSP_ORDERS_B
1098 WHERE OSP_ORDER_ID = p_osp_order_id
1099 FOR UPDATE OF PO_BATCH_ID, PO_REQUEST_ID; -- Lock Row
1100
1101 CURSOR l_validate_supplier_csr(p_supplier_id IN NUMBER) IS
1102 SELECT 'x' FROM PO_VENDORS_VIEW
1103 WHERE VENDOR_ID = p_supplier_id
1104 AND ENABLED_FLAG = G_YES_FLAG
1105 AND NVL(VENDOR_START_DATE_ACTIVE, SYSDATE - 1) <= SYSDATE
1106 AND NVL(VENDOR_END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE;
1107
1108 CURSOR l_validate_supp_site_csr(p_supp_site_id IN NUMBER,
1109 p_supp_id IN NUMBER) IS
1110 SELECT 'x' FROM PO_VENDOR_SITES
1111 WHERE VENDOR_SITE_ID = p_supp_site_id
1112 AND VENDOR_ID = p_supp_id
1113 AND NVL(INACTIVE_DATE, SYSDATE + 1) > SYSDATE
1114 AND NVL(RFQ_ONLY_SITE_FLAG, G_NO_FLAG) = G_NO_FLAG
1115 AND PURCHASING_SITE_FLAG = G_YES_FLAG;
1116 -- NOTE: Organization filtering is done by the PO_VENDOR_SITES view itself
1117
1118 CURSOR l_validate_vendor_contact_csr(p_vendor_contact_id IN NUMBER,
1119 p_supp_site_id IN NUMBER) IS
1120 SELECT 'x' FROM PO_VENDOR_CONTACTS
1121 WHERE VENDOR_CONTACT_ID = p_vendor_contact_id
1122 AND VENDOR_SITE_ID = p_supp_site_id;
1123 -- May have to check INACTIVE_DATE > SYSDATE also?
1124
1125 CURSOR l_validate_buyer_csr(p_buyer_id IN NUMBER) IS
1126 SELECT 'x' FROM PO_AGENTS_NAME_V
1127 WHERE BUYER_ID = p_buyer_id;
1128 -- NOTE: Effective Date filtering is done by the PO_AGENTS_NAME_V view itself
1129
1130 l_dummy VARCHAR2(1);
1131 l_temp_count NUMBER;
1132 l_org_id NUMBER := NULL;
1133 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Validate_PO_Req_Header';
1134
1135 BEGIN
1136
1137 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1138 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1139 END IF;
1140
1141 -- OSP Order Id
1142 IF (p_po_req_header_rec.OSP_ORDER_ID IS NULL OR p_po_req_header_rec.OSP_ORDER_ID = FND_API.G_MISS_NUM) THEN
1143 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_NULL');
1144 FND_MSG_PUB.ADD;
1145 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1146 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1147 END IF;
1148 ELSE
1149 OPEN l_validate_osp_csr(p_po_req_header_rec.OSP_ORDER_ID);
1150 FETCH l_validate_osp_csr INTO l_dummy;
1151 IF (l_validate_osp_csr%NOTFOUND) THEN
1152 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_INVALID');
1153 FND_MESSAGE.Set_Token('OSP_ID', p_po_req_header_rec.OSP_ORDER_ID);
1154 FND_MSG_PUB.ADD;
1155 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1156 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1157 END IF;
1158 END IF;
1159 CLOSE l_validate_osp_csr;
1160 END IF;
1161
1162 -- Supplier
1163 IF (p_po_req_header_rec.VENDOR_ID IS NULL OR p_po_req_header_rec.VENDOR_ID = FND_API.G_MISS_NUM) THEN
1164 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SUPPLIER_ID_NULL');
1165 FND_MSG_PUB.ADD;
1166 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1167 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1168 END IF;
1169 ELSE
1170 OPEN l_validate_supplier_csr(p_po_req_header_rec.VENDOR_ID);
1171 FETCH l_validate_supplier_csr INTO l_dummy;
1172 IF (l_validate_supplier_csr%NOTFOUND) THEN
1173 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SUPP_INVALID');
1174 FND_MESSAGE.Set_Token('SUPP_ID', p_po_req_header_rec.VENDOR_ID);
1175 FND_MSG_PUB.ADD;
1176 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1177 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1178 END IF;
1179 END IF;
1180 CLOSE l_validate_supplier_csr;
1181 END IF;
1182
1183 -- Supplier Site
1184 IF (p_po_req_header_rec.VENDOR_SITE_ID IS NULL OR p_po_req_header_rec.VENDOR_SITE_ID = FND_API.G_MISS_NUM) THEN
1185 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SSITE_ID_NULL');
1186 FND_MSG_PUB.ADD;
1187 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1188 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1189 END IF;
1190 ELSE
1191 OPEN l_validate_supp_site_csr(p_po_req_header_rec.VENDOR_SITE_ID, p_po_req_header_rec.VENDOR_ID);
1192 FETCH l_validate_supp_site_csr INTO l_dummy;
1193 IF (l_validate_supp_site_csr%NOTFOUND) THEN
1194 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SSITE_INVALID');
1195 FND_MESSAGE.Set_Token('SS_ID', p_po_req_header_rec.VENDOR_SITE_ID);
1196 FND_MSG_PUB.ADD;
1197 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1198 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1199 END IF;
1200 END IF;
1201 CLOSE l_validate_supp_site_csr;
1202 END IF;
1203
1204 -- Vendor Contact (Optional)
1205 IF (p_po_req_header_rec.VENDOR_CONTACT_ID IS NOT NULL AND p_po_req_header_rec.VENDOR_CONTACT_ID <> FND_API.G_MISS_NUM) THEN
1206 OPEN l_validate_vendor_contact_csr(p_po_req_header_rec.VENDOR_CONTACT_ID, p_po_req_header_rec.VENDOR_SITE_ID);
1207 FETCH l_validate_vendor_contact_csr INTO l_dummy;
1208 IF (l_validate_vendor_contact_csr%NOTFOUND) THEN
1209 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_VCONTACT_INVALID');
1210 FND_MESSAGE.Set_Token('V_CONTACT_ID', p_po_req_header_rec.VENDOR_CONTACT_ID);
1211 FND_MSG_PUB.ADD;
1212 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1213 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1214 END IF;
1215 END IF;
1216 CLOSE l_validate_vendor_contact_csr;
1217 END IF;
1218
1219 -- Buyer
1220 IF (p_po_req_header_rec.BUYER_ID IS NULL OR p_po_req_header_rec.BUYER_ID = FND_API.G_MISS_NUM) THEN
1221 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_BUYER_ID_NULL');
1222 FND_MSG_PUB.ADD;
1223 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1224 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1225 END IF;
1226 ELSE
1227 OPEN l_validate_buyer_csr(p_po_req_header_rec.BUYER_ID);
1228 FETCH l_validate_buyer_csr INTO l_dummy;
1229 IF (l_validate_buyer_csr%NOTFOUND) THEN
1230 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_BUYER_INVALID');
1231 FND_MESSAGE.Set_Token('BUYER_ID', p_po_req_header_rec.BUYER_ID);
1232 FND_MSG_PUB.ADD;
1233 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1234 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1235 END IF;
1236 END IF;
1237 CLOSE l_validate_buyer_csr;
1238 END IF;
1239
1240 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1241 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1242 END IF;
1243
1244 END Validate_PO_Req_Header;
1245
1246 ----------------------------------------------------
1247 -- This Procedure validates the PO Requisition Lines
1248 ----------------------------------------------------
1249 PROCEDURE Validate_PO_Req_Lines(
1250 p_po_req_line_tbl IN PO_Req_Line_Tbl_Type,
1251 p_osp_order_id IN NUMBER) IS
1252
1253 CURSOR l_validate_item_csr(p_item_id IN NUMBER,
1254 p_org_id IN NUMBER) IS
1255 SELECT 'x' FROM MTL_SYSTEM_ITEMS_KFV
1256 WHERE INVENTORY_ITEM_ID = p_item_id
1257 AND ENABLED_FLAG = G_YES_FLAG
1258 AND PURCHASING_ENABLED_FLAG = G_YES_FLAG
1259 AND INVENTORY_ITEM_FLAG = G_NO_FLAG -- No Physical Items
1260 AND NVL(START_DATE_ACTIVE, SYSDATE - 1) <= SYSDATE
1261 AND NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE
1262 AND ORGANIZATION_ID = p_org_id
1263 AND NVL(OUTSIDE_OPERATION_FLAG, G_NO_FLAG) = G_NO_FLAG;
1264
1265 CURSOR l_validate_line_type_csr(p_line_type_id IN NUMBER) IS
1266 SELECT 'x' FROM PO_LINE_TYPES
1267 WHERE ORDER_TYPE_LOOKUP_CODE = G_PO_LINE_TYPE_QUANTITY
1268 AND NVL(OUTSIDE_OPERATION_FLAG, G_NO_FLAG) = G_NO_FLAG
1269 AND LINE_TYPE_ID = p_line_type_id;
1270
1271 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Validate_PO_Lines';
1272 l_org_id NUMBER := NULL;
1273 l_dummy VARCHAR2(1);
1274
1275 BEGIN
1276 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1277 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1278 END IF;
1279
1280 -- Get the current Org
1281 l_org_id := MO_GLOBAL.get_current_org_id();
1282 IF (l_org_id IS NULL) THEN
1283 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_ORG_NOT_SET');
1284 FND_MSG_PUB.ADD;
1285 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1286 FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, FALSE);
1287 END IF;
1288 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1289 END IF;
1290
1291 -- Non zero count
1292 IF (p_po_req_line_tbl.COUNT = 0) THEN
1293 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NO_PO_LINES');
1294 FND_MSG_PUB.ADD;
1295 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1296 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1297 END IF;
1298 RETURN; -- Cannot do any further validation
1299 END IF;
1300
1301 FOR i IN p_po_req_line_tbl.FIRST..p_po_req_line_tbl.LAST LOOP
1302 -- Item
1303 IF (p_po_req_line_tbl(i).ITEM_ID IS NOT NULL AND p_po_req_line_tbl(i).ITEM_ID <> FND_API.G_MISS_NUM) THEN
1304 -- Non One-time Item
1305 OPEN l_validate_item_csr(p_po_req_line_tbl(i).ITEM_ID, p_po_req_line_tbl(i).SHIP_TO_ORG_ID);
1306 FETCH l_validate_item_csr INTO l_dummy;
1307 IF (l_validate_item_csr%NOTFOUND) THEN
1308 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_ITEM_INVALID');
1309 FND_MESSAGE.Set_Token('ITEM', p_po_req_line_tbl(i).ITEM_ID);
1310 FND_MSG_PUB.ADD;
1311 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1312 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1313 END IF;
1314 END IF;
1315 CLOSE l_validate_item_csr;
1316 ELSE
1317 -- One-time Item: Description is mandatory
1318 IF (TRIM(p_po_req_line_tbl(i).ITEM_DESCRIPTION) IS NULL OR p_po_req_line_tbl(i).ITEM_DESCRIPTION = FND_API.G_MISS_CHAR) THEN
1319 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_IDESC_NULL');
1320 FND_MSG_PUB.ADD;
1321 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1322 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1323 END IF;
1324 END IF;
1325 -- One-time Item: UOM is mandatory
1326 IF (TRIM(p_po_req_line_tbl(i).UOM_CODE) IS NULL OR p_po_req_line_tbl(i).UOM_CODE = FND_API.G_MISS_CHAR) THEN
1327 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_UOM_CODE_NULL');
1328 FND_MSG_PUB.ADD;
1329 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1330 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1331 END IF;
1332 END IF;
1333 END IF;
1334
1335 -- Quantity
1336 IF (p_po_req_line_tbl(i).QUANTITY IS NULL OR p_po_req_line_tbl(i).QUANTITY = FND_API.G_MISS_NUM) THEN
1337 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_QUANTITY_NULL');
1338 FND_MSG_PUB.ADD;
1339 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1340 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1341 END IF;
1342 ELSE
1343 IF (p_po_req_line_tbl(i).QUANTITY <= 0) THEN
1344 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_QUANTITY_INVALID');
1345 FND_MESSAGE.Set_Token('QUANTITY', p_po_req_line_tbl(i).QUANTITY);
1346 FND_MSG_PUB.ADD;
1347 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1348 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1349 END IF;
1350 END IF;
1351 END IF;
1352
1353 -- Need By Date
1354 IF (p_po_req_line_tbl(i).NEED_BY_DATE IS NULL OR p_po_req_line_tbl(i).NEED_BY_DATE = FND_API.G_MISS_DATE) THEN
1355 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NEED_BY_DATE_NULL');
1356 FND_MSG_PUB.ADD;
1357 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1358 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1359 END IF;
1360 ELSE
1361 IF (TRUNC(p_po_req_line_tbl(i).NEED_BY_DATE) < TRUNC(SYSDATE)) THEN
1362 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NBDATE_INVALID');
1363 FND_MESSAGE.Set_Token('NBDATE', p_po_req_line_tbl(i).NEED_BY_DATE);
1364 FND_MSG_PUB.ADD;
1365 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1366 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1367 END IF;
1368 END IF;
1369 END IF;
1370
1371 -- Ship To Organization
1372 IF (p_po_req_line_tbl(i).SHIP_TO_ORG_ID IS NULL OR p_po_req_line_tbl(i).SHIP_TO_ORG_ID = FND_API.G_MISS_NUM) THEN
1373 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SHIP_TO_ORG_NULL');
1374 FND_MSG_PUB.ADD;
1375 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1376 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1377 END IF;
1378 END IF;
1379
1380 -- Line Type
1381 IF (p_po_req_line_tbl(i).PO_LINE_TYPE_ID IS NULL OR p_po_req_line_tbl(i).PO_LINE_TYPE_ID = FND_API.G_MISS_NUM) THEN
1382 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_LN_TYPE_ID_NULL');
1383 FND_MSG_PUB.ADD;
1384 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1385 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1386 END IF;
1387 ELSE
1388 OPEN l_validate_line_type_csr(p_po_req_line_tbl(i).PO_LINE_TYPE_ID);
1389 FETCH l_validate_line_type_csr INTO l_dummy;
1390 IF (l_validate_line_type_csr%NOTFOUND) THEN
1391 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_LN_TYPE_ID_INVALID');
1392 FND_MESSAGE.Set_Token('LINE_TYPE_ID', p_po_req_line_tbl(i).PO_LINE_TYPE_ID);
1393 FND_MSG_PUB.ADD;
1394 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1395 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1396 END IF;
1397 END IF;
1398 CLOSE l_validate_line_type_csr;
1399 END IF;
1400
1401 END LOOP;
1402 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1403 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1404 END IF;
1405 END Validate_PO_Req_Lines;
1406
1407 ----------------------------------------
1408 -- This Procedure updates a record of AHL_OSP_ORDERS_B using the table handler
1409 -- All updates to this table from this Package should go through this procedure only
1410 ----------------------------------------
1411 PROCEDURE Update_OSP_Order(
1412 p_osp_order_id IN NUMBER,
1413 p_po_req_header_id IN NUMBER := NULL,
1414 p_batch_id IN NUMBER := NULL,
1415 p_request_id IN NUMBER := NULL,
1416 p_status_code IN VARCHAR2 := NULL
1417 ) IS
1418
1419 CURSOR l_osp_dtls_csr(p_osp_order_id IN NUMBER) IS
1420 SELECT
1421 OBJECT_VERSION_NUMBER,
1422 OSP_ORDER_NUMBER,
1423 ORDER_TYPE_CODE,
1424 SINGLE_INSTANCE_FLAG,
1425 PO_HEADER_ID,
1426 OE_HEADER_ID,
1427 VENDOR_ID,
1428 VENDOR_SITE_ID,
1429 VENDOR_CONTACT_ID,
1430 CUSTOMER_ID,
1431 ORDER_DATE,
1432 CONTRACT_ID,
1433 CONTRACT_TERMS,
1434 OPERATING_UNIT_ID,
1435 PO_SYNCH_FLAG,
1436 STATUS_CODE,
1437 PO_BATCH_ID,
1438 PO_INTERFACE_HEADER_ID,
1439 PO_REQUEST_ID,
1440 PO_AGENT_ID,
1441 PO_REQ_HEADER_ID,
1442 ATTRIBUTE_CATEGORY,
1443 ATTRIBUTE1,
1444 ATTRIBUTE2,
1445 ATTRIBUTE3,
1446 ATTRIBUTE4,
1447 ATTRIBUTE5,
1448 ATTRIBUTE6,
1449 ATTRIBUTE7,
1450 ATTRIBUTE8,
1451 ATTRIBUTE9,
1452 ATTRIBUTE10,
1453 ATTRIBUTE11,
1454 ATTRIBUTE12,
1455 ATTRIBUTE13,
1456 ATTRIBUTE14,
1457 ATTRIBUTE15,
1458 DESCRIPTION
1459 FROM AHL_OSP_ORDERS_VL
1460 WHERE OSP_ORDER_ID = p_osp_order_id;
1461
1462 l_osp_dtls_rec l_osp_dtls_csr%ROWTYPE;
1463 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Update_OSP_Order';
1464
1465 BEGIN
1466 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1467 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1468 END IF;
1469 -- Retrieve the current record
1470 OPEN l_osp_dtls_csr(p_osp_order_id);
1471 FETCH l_osp_dtls_csr INTO l_osp_dtls_rec;
1472 IF (l_osp_dtls_csr%NOTFOUND) THEN
1473 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_INVALID');
1474 FND_MESSAGE.Set_Token('OSP_ID', p_osp_order_id);
1475 FND_MSG_PUB.ADD;
1476 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1477 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1478 END IF;
1479 CLOSE l_osp_dtls_csr;
1480 RAISE FND_API.G_EXC_ERROR;
1481 END IF;
1482 CLOSE l_osp_dtls_csr;
1483
1484 -- Update non-null local variables into cursor variable
1485 IF (p_po_req_header_id IS NOT NULL) THEN
1486 l_osp_dtls_rec.PO_REQ_HEADER_ID := p_po_req_header_id;
1487 END IF;
1488 IF (p_batch_id IS NOT NULL) THEN
1489 l_osp_dtls_rec.PO_BATCH_ID := p_batch_id;
1490 END IF;
1491 IF (p_request_id IS NOT NULL) THEN
1492 l_osp_dtls_rec.PO_REQUEST_ID := p_request_id;
1493 END IF;
1494 IF (p_status_code IS NOT NULL) THEN
1495 l_osp_dtls_rec.STATUS_CODE := p_status_code;
1496 END IF;
1497
1498 -- Call Table Handler
1499 AHL_OSP_ORDERS_PKG.UPDATE_ROW(
1500 X_OSP_ORDER_ID => p_osp_order_id,
1501 X_OBJECT_VERSION_NUMBER => l_osp_dtls_rec.OBJECT_VERSION_NUMBER + 1, -- Updated
1502 X_OSP_ORDER_NUMBER => l_osp_dtls_rec.OSP_ORDER_NUMBER,
1503 X_ORDER_TYPE_CODE => l_osp_dtls_rec.ORDER_TYPE_CODE,
1504 X_SINGLE_INSTANCE_FLAG => l_osp_dtls_rec.SINGLE_INSTANCE_FLAG,
1505 X_PO_HEADER_ID => l_osp_dtls_rec.PO_HEADER_ID,
1506 X_OE_HEADER_ID => l_osp_dtls_rec.OE_HEADER_ID,
1507 X_VENDOR_ID => l_osp_dtls_rec.VENDOR_ID,
1508 X_VENDOR_SITE_ID => l_osp_dtls_rec.VENDOR_SITE_ID,
1509 X_VENDOR_CONTACT_ID => l_osp_dtls_rec.VENDOR_CONTACT_ID,
1510 X_CUSTOMER_ID => l_osp_dtls_rec.CUSTOMER_ID,
1511 X_ORDER_DATE => l_osp_dtls_rec.ORDER_DATE,
1512 X_CONTRACT_ID => l_osp_dtls_rec.CONTRACT_ID,
1513 X_CONTRACT_TERMS => l_osp_dtls_rec.CONTRACT_TERMS,
1514 X_OPERATING_UNIT_ID => l_osp_dtls_rec.OPERATING_UNIT_ID,
1515 X_PO_SYNCH_FLAG => l_osp_dtls_rec.PO_SYNCH_FLAG,
1516 X_STATUS_CODE => l_osp_dtls_rec.STATUS_CODE, -- Updated
1517 X_PO_BATCH_ID => l_osp_dtls_rec.PO_BATCH_ID, -- Updated
1518 X_PO_REQUEST_ID => l_osp_dtls_rec.PO_REQUEST_ID, -- Updated
1519 X_PO_INTERFACE_HEADER_ID => l_osp_dtls_rec.PO_INTERFACE_HEADER_ID,
1520 X_PO_REQ_HEADER_ID => l_osp_dtls_rec.PO_REQ_HEADER_ID, -- Updated
1521 X_PO_AGENT_ID => l_osp_dtls_rec.PO_AGENT_ID,
1522 X_ATTRIBUTE_CATEGORY => l_osp_dtls_rec.ATTRIBUTE_CATEGORY,
1523 X_ATTRIBUTE1 => l_osp_dtls_rec.ATTRIBUTE1,
1524 X_ATTRIBUTE2 => l_osp_dtls_rec.ATTRIBUTE2,
1525 X_ATTRIBUTE3 => l_osp_dtls_rec.ATTRIBUTE3,
1526 X_ATTRIBUTE4 => l_osp_dtls_rec.ATTRIBUTE4,
1527 X_ATTRIBUTE5 => l_osp_dtls_rec.ATTRIBUTE5,
1528 X_ATTRIBUTE6 => l_osp_dtls_rec.ATTRIBUTE6,
1529 X_ATTRIBUTE7 => l_osp_dtls_rec.ATTRIBUTE7,
1530 X_ATTRIBUTE8 => l_osp_dtls_rec.ATTRIBUTE8,
1531 X_ATTRIBUTE9 => l_osp_dtls_rec.ATTRIBUTE9,
1532 X_ATTRIBUTE10 => l_osp_dtls_rec.ATTRIBUTE10,
1533 X_ATTRIBUTE11 => l_osp_dtls_rec.ATTRIBUTE11,
1534 X_ATTRIBUTE12 => l_osp_dtls_rec.ATTRIBUTE12,
1535 X_ATTRIBUTE13 => l_osp_dtls_rec.ATTRIBUTE13,
1536 X_ATTRIBUTE14 => l_osp_dtls_rec.ATTRIBUTE14,
1537 X_ATTRIBUTE15 => l_osp_dtls_rec.ATTRIBUTE15,
1538 X_DESCRIPTION => l_osp_dtls_rec.DESCRIPTION,
1539 X_LAST_UPDATE_DATE => TRUNC(sysdate), -- Updated
1540 X_LAST_UPDATED_BY => fnd_global.user_id, -- Updated
1541 X_LAST_UPDATE_LOGIN => fnd_global.login_id); -- Updated
1542 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1543 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1544 END IF;
1545 END Update_OSP_Order;
1546
1547 ----------------------------------------
1548 -- This Local Procedure updates OSP Tables with
1549 -- PO Information for one OSP Order
1550 ----------------------------------------
1551 PROCEDURE Associate_New_Req(
1552 p_osp_order_id IN NUMBER,
1553 x_po_req_header_id OUT NOCOPY NUMBER) IS
1554
1555 CURSOR l_get_po_req_hdr_csr(p_osp_order_id IN NUMBER) IS
1556 SELECT POREQ.REQUISITION_HEADER_ID
1557 FROM PO_REQUISITION_HEADERS_ALL POREQ, AHL_OSP_ORDERS_B OSP
1558 WHERE POREQ.INTERFACE_SOURCE_LINE_ID = p_osp_order_id AND
1559 OSP.OSP_ORDER_ID = p_osp_order_id AND
1560 OSP.OPERATING_UNIT_ID = POREQ.ORG_ID AND
1561 POREQ.INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME;
1562
1563 CURSOR l_get_osp_lines_csr(p_osp_order_id IN NUMBER) IS
1564 SELECT OSP_ORDER_LINE_ID FROM AHL_OSP_ORDER_LINES
1565 WHERE PO_REQ_LINE_ID IS NULL
1566 AND OSP_ORDER_ID = p_osp_order_id;
1567
1568 CURSOR l_get_po_req_line_csr(p_osp_order_line_id IN NUMBER, p_po_req_header_id IN NUMBER) IS
1569 SELECT REQUISITION_LINE_ID FROM PO_REQUISITION_LINES_ALL
1570 WHERE REFERENCE_NUM = p_osp_order_line_id AND
1571 REQUISITION_HEADER_ID = p_po_req_header_id;
1572
1573 CURSOR l_get_request_id_csr(p_osp_order_id IN NUMBER) IS
1574 SELECT PO_REQUEST_ID FROM AHL_OSP_ORDERS_B
1575 WHERE OSP_ORDER_ID = p_osp_order_id;
1576
1577 CURSOR check_req_completeness_csr(c_po_req_header_id IN NUMBER) IS
1578 select 1 from dual where
1579 (select count(*) from AHL_OSP_ORDER_LINES where OSP_ORDER_ID = p_osp_order_id) =
1580 (select count(*) from
1581 PO_REQUISITION_LINES_ALL REQL, AHL_OSP_ORDER_LINES OSPL
1582 where OSPL.OSP_ORDER_ID = p_osp_order_id
1583 AND REQL.REFERENCE_NUM = OSPL.osp_order_line_id
1584 AND REQL.REQUISITION_HEADER_ID = c_po_req_header_id);
1585
1586 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Associate_New_Req';
1587 l_po_req_header_id NUMBER;
1588 l_osp_order_line_id NUMBER;
1589 l_po_req_line_id NUMBER;
1590 l_request_id NUMBER;
1591 l_phase VARCHAR2(100);
1592 l_status VARCHAR2(100);
1593 l_dev_phase VARCHAR2(100);
1594 l_dev_status VARCHAR2(100);
1595 l_message VARCHAR2(1000);
1596 l_retval BOOLEAN;
1597 l_temp_num NUMBER;
1598
1599 BEGIN
1600 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1601 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1602 END IF;
1603
1604 OPEN l_get_po_req_hdr_csr(p_osp_order_id);
1605 FETCH l_get_po_req_hdr_csr INTO x_po_req_header_id;
1606 IF (l_get_po_req_hdr_csr%FOUND) THEN
1607 -- Ensure that the Requisition is created in its entirety
1608 OPEN check_req_completeness_csr(x_po_req_header_id);
1609 FETCH check_req_completeness_csr INTO l_temp_num;
1610 IF (check_req_completeness_csr%NOTFOUND) THEN
1611 -- The Requisition has been created only PARTIALLY: Flag as Failed
1612 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1613 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Requisition Creation succeeded only PARTIALLY for OSP Order Id ' || p_osp_order_id ||
1614 ', Requisition Header Id: ' || x_po_req_header_id);
1615 END IF;
1616 Set_Req_Submission_Failed(p_osp_order_id);
1617 ELSE
1618 -- Update AHL_OSP_ORDERS_B's PO_REQ_HEADER_ID
1619 --dbms_output.put_line('About to Update AHL_OSP_ORDERS_B.PO_REQ_HEADER_ID with ' || x_po_req_header_id);
1620 Set_PO_Req_Header_Id(p_osp_order_id => p_osp_order_id,
1621 p_po_req_header_id => x_po_req_header_id);
1622
1623 --dbms_output.put_line('Updated po_req_header_id. Logging Transaction...');
1624 AHL_OSP_UTIL_PKG.Log_Transaction(p_trans_type_code => G_TXN_TYPE_PO_SYNCH,
1625 p_src_doc_id => p_osp_order_id,
1626 p_src_doc_type_code => G_DOC_TYPE_PO_REQ,
1627 p_dest_doc_id => x_po_req_header_id,
1628 p_dest_doc_type_code => G_DOC_TYPE_OSP);
1629
1630 -- Get PO Lines for all OSP Lines
1631 OPEN l_get_osp_lines_csr(p_osp_order_id);
1632 LOOP
1633 FETCH l_get_osp_lines_csr INTO l_osp_order_line_id;
1634 EXIT WHEN l_get_osp_lines_csr%NOTFOUND;
1635 OPEN l_get_po_req_line_csr(l_osp_order_line_id, x_po_req_header_id);
1636 FETCH l_get_po_req_line_csr INTO l_po_req_line_id;
1637 IF (l_get_po_req_line_csr%FOUND) THEN
1638 Update_Osp_Order_Lines(p_osp_order_line_id => l_osp_order_line_id,
1639 p_po_req_line_id => l_po_req_line_id);
1640 ELSE
1641 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1642 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'OSP Line Id ' || l_osp_order_line_id || ' is not yet associated with a PO Req Line');
1643 END IF;
1644 END IF;
1645 CLOSE l_get_po_req_line_csr;
1646 END LOOP;
1647 CLOSE l_get_osp_lines_csr;
1648 END IF; -- check_req_completeness_csr FOUND or not
1649 CLOSE check_req_completeness_csr;
1650 ELSE
1651 -- Set Return PO Header Value to null
1652 x_po_req_header_id := null;
1653 -- Check if the Concurrent Program has completed
1654 OPEN l_get_request_id_csr(p_osp_order_id);
1655 FETCH l_get_request_id_csr INTO l_request_id;
1656 CLOSE l_get_request_id_csr;
1657 IF (l_request_id IS NOT NULL AND l_request_id <> 0) THEN
1658 --dbms_output.put_line('Getting Concurrent Program Status ');
1659 l_retval := FND_CONCURRENT.GET_REQUEST_STATUS(request_id => l_request_id,
1660 phase => l_phase,
1661 status => l_status,
1662 dev_phase => l_dev_phase,
1663 dev_status => l_dev_status,
1664 message => l_message);
1665 -- IF ((l_retval = TRUE) AND (l_dev_phase = 'COMPLETE') AND (l_dev_status <> 'NORMAL')) THEN
1666 -- Status can be NORMAL even if the Requisition Creation had failed.
1667 -- So setting status to REQ_SUBMISSION_FAILED if the Concurrent Program has completed
1668 -- but the Requisition Header is not set
1669 IF ((l_retval = TRUE) AND (l_dev_phase = 'COMPLETE')) THEN
1670 -- Abnormal Termination
1671 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1672 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Concurrent Program with Request Id ' || l_request_id || ' has terminated. dev_status = ' || l_dev_status || ', message = ' || l_message);
1673 END IF;
1674 -- Set the Status of OSP Order to Submission Failed
1675 Set_Req_Submission_Failed(p_osp_order_id);
1676 END IF;
1677 END IF;
1678 END IF;
1679 CLOSE l_get_po_req_hdr_csr;
1680 --dbms_output.put_line('About to exit Associate_New_Req ');
1681 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1682 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1683 END IF;
1684 END Associate_New_Req;
1685
1686
1687 ----------------------------------------
1688 -- This Procedure updates AHL_OSP_ORDERS_B's PO_REQ_HEADER_ID and sets STATUS_CODE to REQUISITION_CREATED
1689 ----------------------------------------
1690 PROCEDURE Set_PO_Req_Header_ID(
1691 p_osp_order_id IN NUMBER,
1692 p_po_req_header_id IN NUMBER) IS
1693 BEGIN
1694 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
1695 p_po_req_header_id => p_po_req_header_id,
1696 p_status_code => G_OSP_REQ_CREATED_STATUS);
1697 END Set_PO_Req_Header_ID;
1698
1699 ----------------------------------------
1700 -- This Procedure updates the Osp Order Lines with the PO_REQ_LINE_ID
1701 ----------------------------------------
1702 PROCEDURE Update_Osp_Order_Lines(
1703 p_osp_order_line_id IN NUMBER,
1704 p_po_req_line_id IN NUMBER := NULL) IS
1705
1706 CURSOR l_osp_line_dtls_csr(p_osp_line_id IN NUMBER) IS
1707 SELECT
1708 OBJECT_VERSION_NUMBER,
1709 OSP_ORDER_ID,
1710 OSP_LINE_NUMBER,
1711 STATUS_CODE,
1712 PO_LINE_TYPE_ID,
1713 SERVICE_ITEM_ID,
1714 SERVICE_ITEM_DESCRIPTION,
1715 SERVICE_ITEM_UOM_CODE,
1716 NEED_BY_DATE,
1717 SHIP_BY_DATE,
1718 PO_LINE_ID,
1719 PO_REQ_LINE_ID,
1720 OE_SHIP_LINE_ID,
1721 OE_RETURN_LINE_ID,
1722 WORKORDER_ID,
1723 OPERATION_ID,
1724 QUANTITY,
1725 EXCHANGE_INSTANCE_ID,
1726 INVENTORY_ITEM_ID,
1727 INVENTORY_ORG_ID,
1728 INVENTORY_ITEM_UOM,
1729 INVENTORY_ITEM_QUANTITY,
1730 SUB_INVENTORY,
1731 LOT_NUMBER,
1732 SERIAL_NUMBER,
1733 ATTRIBUTE_CATEGORY,
1734 ATTRIBUTE1,
1735 ATTRIBUTE2,
1736 ATTRIBUTE3,
1737 ATTRIBUTE4,
1738 ATTRIBUTE5,
1739 ATTRIBUTE6,
1740 ATTRIBUTE7,
1741 ATTRIBUTE8,
1742 ATTRIBUTE9,
1743 ATTRIBUTE10,
1744 ATTRIBUTE11,
1745 ATTRIBUTE12,
1746 ATTRIBUTE13,
1747 ATTRIBUTE14,
1748 ATTRIBUTE15
1749 FROM AHL_OSP_ORDER_LINES
1750 WHERE OSP_ORDER_LINE_ID = p_osp_order_line_id;
1751
1752 l_osp_line_dtls_rec l_osp_line_dtls_csr%ROWTYPE;
1753 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Update_Osp_Order_Lines';
1754
1755 BEGIN
1756 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1757 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1758 END IF;
1759 -- Retrieve the current record
1760 OPEN l_osp_line_dtls_csr(p_osp_order_line_id);
1761 FETCH l_osp_line_dtls_csr INTO l_osp_line_dtls_rec;
1762 IF (l_osp_line_dtls_csr%NOTFOUND) THEN
1763 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_LINE_ID_INVALID');
1764 FND_MESSAGE.Set_Token('OSP_LINE_ID', p_osp_order_line_id);
1765 FND_MSG_PUB.ADD;
1766 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1767 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1768 END IF;
1769 CLOSE l_osp_line_dtls_csr;
1770 RAISE FND_API.G_EXC_ERROR;
1771 END IF;
1772 CLOSE l_osp_line_dtls_csr;
1773
1774 -- Update cursor variable's PO Req Line ID and PO intf transaction id
1775
1776 IF (p_po_req_line_id IS NOT NULL) THEN
1777 l_osp_line_dtls_rec.PO_REQ_LINE_ID := p_po_req_line_id;
1778 END IF;
1779
1780 -- Call Table Handler
1781 AHL_OSP_ORDER_LINES_PKG.UPDATE_ROW(
1782 P_OSP_ORDER_LINE_ID => p_osp_order_line_id,
1783 P_OBJECT_VERSION_NUMBER => l_osp_line_dtls_rec.OBJECT_VERSION_NUMBER + 1, -- Updated
1784 P_OSP_ORDER_ID => l_osp_line_dtls_rec.OSP_ORDER_ID,
1785 P_OSP_LINE_NUMBER => l_osp_line_dtls_rec.OSP_LINE_NUMBER,
1786 P_STATUS_CODE => l_osp_line_dtls_rec.STATUS_CODE,
1787 P_PO_LINE_TYPE_ID => l_osp_line_dtls_rec.PO_LINE_TYPE_ID,
1788 P_SERVICE_ITEM_ID => l_osp_line_dtls_rec.SERVICE_ITEM_ID,
1789 P_SERVICE_ITEM_DESCRIPTION => l_osp_line_dtls_rec.SERVICE_ITEM_DESCRIPTION,
1790 P_SERVICE_ITEM_UOM_CODE => l_osp_line_dtls_rec.SERVICE_ITEM_UOM_CODE,
1791 P_NEED_BY_DATE => l_osp_line_dtls_rec.NEED_BY_DATE,
1792 P_SHIP_BY_DATE => l_osp_line_dtls_rec.SHIP_BY_DATE,
1793 P_PO_LINE_ID => l_osp_line_dtls_rec.PO_LINE_ID,
1794 P_PO_REQ_LINE_ID => l_osp_line_dtls_rec.PO_REQ_LINE_ID, -- Updated
1795 P_OE_SHIP_LINE_ID => l_osp_line_dtls_rec.OE_SHIP_LINE_ID,
1796 P_OE_RETURN_LINE_ID => l_osp_line_dtls_rec.OE_RETURN_LINE_ID,
1797 P_WORKORDER_ID => l_osp_line_dtls_rec.WORKORDER_ID,
1798 P_OPERATION_ID => l_osp_line_dtls_rec.OPERATION_ID,
1799 P_QUANTITY => l_osp_line_dtls_rec.QUANTITY,
1800 P_EXCHANGE_INSTANCE_ID => l_osp_line_dtls_rec.EXCHANGE_INSTANCE_ID,
1801 P_INVENTORY_ITEM_ID => l_osp_line_dtls_rec.INVENTORY_ITEM_ID,
1802 P_INVENTORY_ORG_ID => l_osp_line_dtls_rec.INVENTORY_ORG_ID,
1803 P_INVENTORY_ITEM_UOM => l_osp_line_dtls_rec.INVENTORY_ITEM_UOM,
1804 P_INVENTORY_ITEM_QUANTITY => l_osp_line_dtls_rec.INVENTORY_ITEM_QUANTITY,
1805 P_SUB_INVENTORY => l_osp_line_dtls_rec.SUB_INVENTORY,
1806 P_LOT_NUMBER => l_osp_line_dtls_rec.LOT_NUMBER,
1807 P_SERIAL_NUMBER => l_osp_line_dtls_rec.SERIAL_NUMBER,
1808 P_ATTRIBUTE_CATEGORY => l_osp_line_dtls_rec.ATTRIBUTE_CATEGORY,
1809 P_ATTRIBUTE1 => l_osp_line_dtls_rec.ATTRIBUTE1,
1810 P_ATTRIBUTE2 => l_osp_line_dtls_rec.ATTRIBUTE2,
1811 P_ATTRIBUTE3 => l_osp_line_dtls_rec.ATTRIBUTE3,
1812 P_ATTRIBUTE4 => l_osp_line_dtls_rec.ATTRIBUTE4,
1813 P_ATTRIBUTE5 => l_osp_line_dtls_rec.ATTRIBUTE5,
1814 P_ATTRIBUTE6 => l_osp_line_dtls_rec.ATTRIBUTE6,
1815 P_ATTRIBUTE7 => l_osp_line_dtls_rec.ATTRIBUTE7,
1816 P_ATTRIBUTE8 => l_osp_line_dtls_rec.ATTRIBUTE8,
1817 P_ATTRIBUTE9 => l_osp_line_dtls_rec.ATTRIBUTE9,
1818 P_ATTRIBUTE10 => l_osp_line_dtls_rec.ATTRIBUTE10,
1819 P_ATTRIBUTE11 => l_osp_line_dtls_rec.ATTRIBUTE11,
1820 P_ATTRIBUTE12 => l_osp_line_dtls_rec.ATTRIBUTE12,
1821 P_ATTRIBUTE13 => l_osp_line_dtls_rec.ATTRIBUTE13,
1822 P_ATTRIBUTE14 => l_osp_line_dtls_rec.ATTRIBUTE14,
1823 P_ATTRIBUTE15 => l_osp_line_dtls_rec.ATTRIBUTE15,
1824 P_LAST_UPDATE_DATE => TRUNC(sysdate), -- Updated
1825 P_LAST_UPDATED_BY => fnd_global.user_id, -- Updated
1826 P_LAST_UPDATE_LOGIN => fnd_global.login_id); -- Updated
1827
1828 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1829 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1830 END IF;
1831 END Update_Osp_Order_Lines;
1832
1833
1834 -- This Procedure updates AHL_OSP_ORDERS_B.STATUS_CODE to REQ_SUBMISSION_FAILED
1835 PROCEDURE Set_Req_Submission_Failed(
1836 p_osp_order_id IN NUMBER) IS
1837 BEGIN
1838 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
1839 p_status_code => G_OSP_REQ_SUB_FAILED_STATUS);
1840 END Set_Req_Submission_Failed;
1841
1842 ----------------------------------------
1843 -- This Procedure handles Deleted PO Req Headers and is Part of PO Synchronization.
1844 -- This procedure commits its work if p_commit is set to true and
1845 -- if there were no errors during the execution of this procedure.
1846 -- It does not check the message list for performing the commit action.
1847 -- Functionality:
1848 -- After a PO Requisition has been created for an OSP Order, it is possible for the Requisition
1849 -- to be manually deleted (using Purchasing responsibility) before the Requisition is approved.
1850 -- Since this deletion will result in an OSP Order referring to a non-existent Requisition,
1851 -- we need to change the OSP order to bring it to a consistent state.
1852 -- This procedure basically looks for OSP Orders for which the Requisition has been deleted
1853 -- and resets some values and corrects the status of the order as well as the lines
1854 -- so that the OSP Order can be resubmitted and a different Requisition can be created.
1855 -- This procedure does a direct update of the AHL_OSP_ORDERS_B and the AHL_OSP_ORDER_LINES
1856 -- tables and does not call the process_osp_order API to avoid unwanted validations
1857 ----------------------------------------
1858 PROCEDURE Handle_Deleted_Req_Headers(
1859 p_commit IN VARCHAR2,
1860 x_return_status OUT NOCOPY VARCHAR2) IS
1861
1862 CURSOR get_req_deleted_osps_csr IS
1863 SELECT osp.osp_order_id,
1864 osp.object_version_number,
1865 osp.po_req_header_id,
1866 osp.status_code,
1867 osp.order_type_code
1868 FROM ahl_osp_orders_b osp
1869 WHERE osp.status_code = G_OSP_REQ_CREATED_STATUS AND
1870 osp.order_type_code in ('SERVICE', 'EXCHANGE') AND
1871 -- Added by jaramana on April 7, 2008 for bug 6609988
1872 osp.operating_unit_id = MO_GLOBAL.get_current_org_id() AND
1873 NOT EXISTS (SELECT 1 FROM po_requisition_headers_all where requisition_header_id = osp.po_req_header_id);
1874
1875 CURSOR get_osp_line_dtls_csr(c_osp_order_id IN NUMBER) IS
1876 SELECT ospl.osp_order_id,
1877 ospl.osp_order_line_id,
1878 ospl.object_version_number,
1879 ospl.status_code,
1880 ospl.po_req_line_id
1881 FROM ahl_osp_order_lines ospl
1882 WHERE ospl.osp_order_id = c_osp_order_id;
1883
1884 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Deleted_Req_Headers';
1885 l_temp_num NUMBER := 0;
1886 l_osp_details_rec get_req_deleted_osps_csr%ROWTYPE;
1887 l_osp_line_details_rec get_osp_line_dtls_csr%ROWTYPE;
1888
1889 BEGIN
1890 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1891 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1892 END IF;
1893 -- Standard start of API savepoint
1894 SAVEPOINT Handle_Deleted_Req_Headers_pvt;
1895
1896 -- Initialize API return status to success
1897 x_return_status := FND_API.G_RET_STS_SUCCESS;
1898 -- Get all OSP Orders for which the PO Header has been deleted
1899 OPEN get_req_deleted_osps_csr;
1900 LOOP
1901 FETCH get_req_deleted_osps_csr into l_osp_details_rec;
1902 EXIT WHEN get_req_deleted_osps_csr%NOTFOUND;
1903 l_temp_num := l_temp_num + 1;
1904 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1905 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processing PO Req Deletion for OSP Order ' || l_osp_details_rec.osp_order_id);
1906 END IF;
1907 -- Get the Line Details
1908 OPEN get_osp_line_dtls_csr(c_osp_order_id => l_osp_details_rec.osp_order_id);
1909 LOOP
1910 FETCH get_osp_line_dtls_csr into l_osp_line_details_rec;
1911 EXIT WHEN get_osp_line_dtls_csr%NOTFOUND;
1912 IF (l_osp_line_details_rec.status_code IS NULL) THEN
1913 IF (l_osp_line_details_rec.po_req_line_id IS NOT NULL) THEN
1914 -- Reset the value of PO_REQ_LINE_ID and increment OVN (status_code is already null)
1915 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1916 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Updating OSP Line with Id ' || l_osp_line_details_rec.osp_order_line_id);
1917 END IF;
1918 update ahl_osp_order_lines
1919 set po_req_line_id = null,
1920 object_version_number = l_osp_line_details_rec.object_version_number + 1,
1921 last_update_date = TRUNC(sysdate),
1922 last_updated_by = fnd_global.user_id,
1923 last_update_login = fnd_global.login_id
1924 where osp_order_line_id = l_osp_line_details_rec.osp_order_line_id;
1925 END IF;
1926 ELSE
1927 -- Physically delete this line (REQ_DELETED, REQ_CANCELLED)
1928 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1929 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line with Id ' || l_osp_line_details_rec.osp_order_line_id);
1930 END IF;
1931 DELETE FROM ahl_osp_order_lines
1932 WHERE osp_order_line_id = l_osp_line_details_rec.osp_order_line_id;
1933 END IF;
1934 END LOOP;
1935 CLOSE get_osp_line_dtls_csr;
1936 -- Now for the OSP Order Header, reset PO_REQ_HEADER_ID, PO_BATCH_ID, PO_REQUEST_ID
1937 -- set STATUS_CODE to "ENTERED" and increment OVN
1938 update ahl_osp_orders_b
1939 set po_req_header_id = null,
1940 po_batch_id = null,
1941 po_request_id = null,
1942 status_code = G_OSP_ENTERED_STATUS,
1943 object_version_number = l_osp_details_rec.object_version_number + 1,
1944 last_update_date = TRUNC(sysdate),
1945 last_updated_by = fnd_global.user_id,
1946 last_update_login = fnd_global.login_id
1947 where osp_order_id = l_osp_details_rec.osp_order_id;
1948 END LOOP;
1949 CLOSE get_req_deleted_osps_csr;
1950
1951 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1952 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processed PO Req Deletion for ' || l_temp_num || ' OSP Orders');
1953 END IF;
1954
1955 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
1956 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1957 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
1958 END IF;
1959 COMMIT WORK;
1960 END IF;
1961 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1962 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1963 END IF;
1964
1965 EXCEPTION
1966 WHEN FND_API.G_EXC_ERROR THEN
1967 ROLLBACK TO Handle_Deleted_Req_Headers_pvt;
1968 x_return_status := FND_API.G_RET_STS_ERROR;
1969
1970 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1971 ROLLBACK TO Handle_Deleted_Req_Headers_pvt;
1972 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1973
1974 WHEN OTHERS THEN
1975 ROLLBACK TO Handle_Deleted_Req_Headers_pvt;
1976 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1977 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1978 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
1979 p_procedure_name => 'Handle_Deleted_Req_Headers',
1980 p_error_text => SUBSTR(SQLERRM,1,240));
1981 END IF;
1982 END Handle_Deleted_Req_Headers;
1983
1984 ----------------------------------------
1985 -- This Procedure handles cancelled Req Lines and is Part of PO Synchronization.
1986 -- This procedure commits its work if p_commit is set to true and
1987 -- if there were no errors during the execution of this procedure.
1988 -- It does not check the message list for performing the commit action
1989 ----------------------------------------
1990 PROCEDURE Handle_Cancelled_Req_Lines(
1991 p_commit IN VARCHAR2,
1992 x_return_status OUT NOCOPY VARCHAR2) IS
1993
1994 CURSOR l_get_cancelled_req_lines_csr IS
1995 SELECT REQL.REQUISITION_LINE_ID,
1996 OL.OSP_ORDER_LINE_ID,
1997 REQH.INTERFACE_SOURCE_LINE_ID,
1998 OL.OBJECT_VERSION_NUMBER,
1999 OSP.OBJECT_VERSION_NUMBER
2000 FROM PO_REQUISITION_LINES_ALL REQL,
2001 PO_REQUISITION_HEADERS_ALL REQH,
2002 AHL_OSP_ORDER_LINES OL,
2003 AHL_OSP_ORDERS_B OSP
2004 WHERE nvl(REQL.CANCEL_FLAG,'N') = 'Y' AND -- Canceled Req Line
2005 REQL.REQUISITION_HEADER_ID = REQH.REQUISITION_HEADER_ID AND
2006 REQH.INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME AND -- AHL Created Req
2007 REQH.INTERFACE_SOURCE_LINE_ID = OSP.OSP_ORDER_ID AND -- Related to the OSP Order
2008 OSP.OSP_ORDER_ID = OL.OSP_ORDER_ID AND
2009 -- Added by jaramana on April 7, 2008 for bug 6609988
2010 OSP.OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id() AND
2011 OL.PO_REQ_LINE_ID = REQL.REQUISITION_LINE_ID AND
2012 NVL(OL.STATUS_CODE, ' ') <> G_OL_REQ_CANCELLED_STATUS -- Not yet updated
2013 ORDER BY REQH.INTERFACE_SOURCE_LINE_ID; -- One OSP Order at a time
2014
2015 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Cancelled_Req_Lines';
2016 l_osp_order_id NUMBER := -1;
2017 l_osp_order_line_id NUMBER;
2018 l_po_req_line_id NUMBER;
2019 l_prev_osp_order_id NUMBER := -1;
2020 l_table_index NUMBER := 0;
2021 l_return_status VARCHAR2(1);
2022 l_msg_count NUMBER;
2023 l_msg_data VARCHAR2(1000);
2024 l_osp_order_rec AHL_OSP_ORDERS_PVT.osp_order_rec_type;
2025 l_osp_order_lines_tbl AHL_OSP_ORDERS_PVT.osp_order_lines_tbl_type;
2026 l_commit_flag BOOLEAN := true;
2027 l_osp_obj_ver_num NUMBER;
2028 l_ol_obj_ver_num NUMBER;
2029
2030 BEGIN
2031 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2032 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2033 END IF;
2034 -- Standard start of API savepoint
2035 SAVEPOINT Handle_Cancelled_Req_Lines_pvt;
2036
2037 -- Initialize API return status to success
2038 x_return_status := FND_API.G_RET_STS_SUCCESS;
2039
2040 OPEN l_get_cancelled_req_lines_csr;
2041 LOOP
2042 FETCH l_get_cancelled_req_lines_csr INTO l_po_req_line_id,
2043 l_osp_order_line_id,
2044 l_osp_order_id,
2045 l_ol_obj_ver_num,
2046 l_osp_obj_ver_num;
2047 EXIT WHEN l_get_cancelled_req_lines_csr%NOTFOUND;
2048 IF (l_osp_order_id <> l_prev_osp_order_id) THEN
2049 IF (l_prev_osp_order_id <> -1) THEN
2050 -- Cancel all OSP Lines pertaining to the previous OSP Order
2051 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2052 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Cancelling OSP Line for Order ' || l_prev_osp_order_id);
2053 END IF;
2054 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2055 p_init_msg_list => FND_API.G_FALSE,
2056 p_commit => FND_API.G_FALSE,
2057 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2058 p_x_osp_order_rec => l_osp_order_rec,
2059 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2060 x_return_status => l_return_status,
2061 x_msg_count => l_msg_count,
2062 x_msg_data => l_msg_data);
2063 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2064 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2065 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Cancelling OSP Line for OSP Order ' || l_prev_osp_order_id);
2066 END IF;
2067 l_commit_flag := false;
2068 END IF;
2069 -- Delete table used by prior call
2070 l_osp_order_lines_tbl.DELETE;
2071 END IF;
2072 -- Update API Record with new OSP Order Id
2073 l_osp_order_rec.OSP_ORDER_ID := l_osp_order_id;
2074 l_osp_order_rec.OBJECT_VERSION_NUMBER := l_osp_obj_ver_num;
2075 l_prev_osp_order_id := l_osp_order_id;
2076 l_table_index := 0;
2077 END IF;
2078 -- Copy OSP Line Id into API's Line Table at l_table_index
2079 l_osp_order_lines_tbl(l_table_index).OSP_ORDER_LINE_ID := l_osp_order_line_id;
2080 -- Copy Line's Object Version Nnumber into API's Line Table at l_table_index
2081 l_osp_order_lines_tbl(l_table_index).OBJECT_VERSION_NUMBER := l_ol_obj_ver_num;
2082 -- Set OSP Line Status to G_OL_REQ_CANCELLED_STATUS in API's Line Table
2083 l_osp_order_lines_tbl(l_table_index).STATUS_CODE := G_OL_REQ_CANCELLED_STATUS;
2084 -- Set Operation to Update in the line rec
2085 l_osp_order_lines_tbl(l_table_index).OPERATION_FLAG := AHL_OSP_ORDERS_PVT.G_OP_UPDATE;
2086
2087 l_table_index := l_table_index + 1;
2088 END LOOP;
2089 CLOSE l_get_cancelled_req_lines_csr;
2090 IF (l_prev_osp_order_id <> -1) THEN
2091 -- Save the Last Cancellation
2092 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2093 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Cancelling OSP Line for Order ' || l_prev_osp_order_id);
2094 END IF;
2095 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2096 p_init_msg_list => FND_API.G_FALSE,
2097 p_commit => FND_API.G_FALSE,
2098 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2099 p_x_osp_order_rec => l_osp_order_rec,
2100 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2101 x_return_status => l_return_status,
2102 x_msg_count => l_msg_count,
2103 x_msg_data => l_msg_data);
2104 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2105 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2106 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Cancelling OSP Line for OSP Order ' || l_prev_osp_order_id);
2107 END IF;
2108 l_commit_flag := false;
2109 END IF;
2110 END IF;
2111 IF (l_commit_flag = false) THEN
2112 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
2113 END IF;
2114 -- No errors in current procedure: Check only passed in flag
2115 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2116 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2117 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2118 END IF;
2119 COMMIT WORK;
2120 END IF;
2121 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2122 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2123 END IF;
2124 EXCEPTION
2125 WHEN FND_API.G_EXC_ERROR THEN
2126 ROLLBACK TO Handle_Cancelled_Req_Lines_pvt;
2127 x_return_status := FND_API.G_RET_STS_ERROR;
2128
2129 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2130 ROLLBACK TO Handle_Cancelled_Req_Lines_pvt;
2131 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2132
2133 WHEN OTHERS THEN
2134 ROLLBACK TO Handle_Cancelled_Req_Lines_pvt;
2135 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2136 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2137 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2138 p_procedure_name => 'Handle_Cancelled_Req_Lines',
2139 p_error_text => SUBSTR(SQLERRM,1,240));
2140 END IF;
2141
2142 END Handle_Cancelled_Req_Lines;
2143
2144 ----------------------------------------
2145 -- This Procedure handles deleted Req Lines and is Part of PO Synchronization.
2146 -- This procedure commits its work if p_commit is set to true and
2147 -- if there were no errors during the execution of this procedure.
2148 -- It does not check the message list for performing the commit action.
2149 ----------------------------------------
2150 PROCEDURE Handle_Deleted_Req_Lines(
2151 p_commit IN VARCHAR2,
2152 x_return_status OUT NOCOPY VARCHAR2) IS
2153
2154 CURSOR l_get_deleted_req_lines_csr IS
2155 SELECT OL.OSP_ORDER_ID, OL.OSP_ORDER_LINE_ID,
2156 OL.OBJECT_VERSION_NUMBER, OSP.OBJECT_VERSION_NUMBER
2157 FROM AHL_OSP_ORDER_LINES OL, AHL_OSP_ORDERS_B OSP
2158 WHERE OL.PO_REQ_LINE_ID IS NOT NULL AND -- PO Created
2159 NVL(OL.STATUS_CODE, ' ') <> G_OL_REQ_DELETED_STATUS AND -- Not yet updated
2160 OSP.OSP_ORDER_ID = OL.OSP_ORDER_ID AND
2161 -- Added by jaramana on April 7, 2008 for bug 6609988
2162 OSP.OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id() AND
2163 NOT EXISTS (SELECT REQUISITION_LINE_ID FROM PO_REQUISITION_LINES_ALL WHERE REQUISITION_LINE_ID = OL.PO_REQ_LINE_ID) -- Req Line Deleted
2164 ORDER BY OL.OSP_ORDER_ID; -- One OSP Order at a time
2165
2166 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Deleted_Req_Lines';
2167 l_osp_order_id NUMBER := -1;
2168 l_osp_order_line_id NUMBER;
2169 l_prev_osp_order_id NUMBER := -1;
2170 l_table_index NUMBER := 0;
2171 l_return_status VARCHAR2(1);
2172 l_msg_count NUMBER;
2173 l_msg_data VARCHAR2(1000);
2174 l_osp_order_rec AHL_OSP_ORDERS_PVT.osp_order_rec_type;
2175 l_osp_order_lines_tbl AHL_OSP_ORDERS_PVT.osp_order_lines_tbl_type;
2176 l_commit_flag BOOLEAN := true;
2177 l_osp_obj_ver_num NUMBER;
2178 l_ol_obj_ver_num NUMBER;
2179
2180 BEGIN
2181 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2182 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2183 END IF;
2184 -- Standard start of API savepoint
2185 SAVEPOINT Handle_Deleted_Req_Lines_pvt;
2186
2187 -- Initialize API return status to success
2188 x_return_status := FND_API.G_RET_STS_SUCCESS;
2189
2190 OPEN l_get_deleted_req_lines_csr;
2191 LOOP
2192 FETCH l_get_deleted_req_lines_csr INTO l_osp_order_id,
2193 l_osp_order_line_id,
2194 l_ol_obj_ver_num,
2195 l_osp_obj_ver_num;
2196 EXIT WHEN l_get_deleted_req_lines_csr%NOTFOUND;
2197 IF (l_osp_order_id <> l_prev_osp_order_id) THEN
2198 IF (l_prev_osp_order_id <> -1) THEN
2199 -- Req Delete all OSP Lines pertaining to the previous OSP Order
2200 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2201 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line for Order ' || l_prev_osp_order_id);
2202 END IF;
2203 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2204 p_init_msg_list => FND_API.G_FALSE,
2205 p_commit => FND_API.G_FALSE,
2206 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2207 p_x_osp_order_rec => l_osp_order_rec,
2208 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2209 x_return_status => l_return_status,
2210 x_msg_count => l_msg_count,
2211 x_msg_data => l_msg_data);
2212 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2213 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2214 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Deleting OSP Line for OSP Order ' || l_prev_osp_order_id);
2215 END IF;
2216 l_commit_flag := false;
2217 END IF;
2218 -- Delete table used by prior call
2219 l_osp_order_lines_tbl.DELETE;
2220 END IF;
2221 -- Update API Record with new OSP Order Id
2222 l_osp_order_rec.OSP_ORDER_ID := l_osp_order_id;
2223 l_osp_order_rec.OBJECT_VERSION_NUMBER := l_osp_obj_ver_num;
2224 l_prev_osp_order_id := l_osp_order_id;
2225 l_table_index := 0;
2226 END IF;
2227 -- Copy OSP Line Id into API's Line Table at l_table_index
2228 l_osp_order_lines_tbl(l_table_index).OSP_ORDER_LINE_ID := l_osp_order_line_id;
2229 -- Copy Line's Object Version Nnumber into API's Line Table at l_table_index
2230 l_osp_order_lines_tbl(l_table_index).OBJECT_VERSION_NUMBER := l_ol_obj_ver_num;
2231 -- Set OSP Line Status to G_OL_REQ_DELETED_STATUS in API's Line Table
2232 l_osp_order_lines_tbl(l_table_index).STATUS_CODE := G_OL_REQ_DELETED_STATUS;
2233 -- Set Operation to Update in the line rec
2234 l_osp_order_lines_tbl(l_table_index).OPERATION_FLAG := AHL_OSP_ORDERS_PVT.G_OP_UPDATE;
2235 l_table_index := l_table_index + 1;
2236 END LOOP;
2237 CLOSE l_get_deleted_req_lines_csr;
2238 IF (l_prev_osp_order_id <> -1) THEN
2239 -- Save the Last Deletion
2240 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2241 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line for Order ' || l_prev_osp_order_id);
2242 END IF;
2243 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2244 p_init_msg_list => FND_API.G_FALSE,
2245 p_commit => FND_API.G_FALSE,
2246 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2247 p_x_osp_order_rec => l_osp_order_rec,
2248 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2249 x_return_status => l_return_status,
2250 x_msg_count => l_msg_count,
2251 x_msg_data => l_msg_data);
2252 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2253 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2254 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Deleting OSP Line for OSP Order ' || l_prev_osp_order_id);
2255 END IF;
2256 l_commit_flag := false;
2257 END IF;
2258 END IF;
2259
2260 IF (l_commit_flag = false) THEN
2261 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
2262 END IF;
2263 -- No errors in current procedure: Check only passed in flag
2264 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2265 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2266 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2267 END IF;
2268 COMMIT WORK;
2269 END IF;
2270 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2271 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2272 END IF;
2273 EXCEPTION
2274 WHEN FND_API.G_EXC_ERROR THEN
2275 ROLLBACK TO Handle_Deleted_Req_Lines_pvt;
2276 x_return_status := FND_API.G_RET_STS_ERROR;
2277
2278 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2279 ROLLBACK TO Handle_Deleted_Req_Lines_pvt;
2280 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2281
2282 WHEN OTHERS THEN
2283 ROLLBACK TO Handle_Deleted_Req_Lines_pvt;
2284 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2285 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2286 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2287 p_procedure_name => 'Handle_Deleted_Req_Lines',
2288 p_error_text => SUBSTR(SQLERRM,1,240));
2289 END IF;
2290
2291 END Handle_Deleted_Req_Lines;
2292
2293 ----------------------------------------
2294 -- This function determines if the Requsition is closed/cancelled.
2295 ----------------------------------------
2296 FUNCTION Is_PO_Req_Closed(p_po_req_header_id IN NUMBER) RETURN VARCHAR2 IS
2297
2298 CURSOR l_is_req_closed_csr(p_po_req_header_id IN NUMBER) IS
2299 SELECT 1
2300 FROM po_requisition_headers_all poh
2301 WHERE poh.requisition_header_id = p_po_req_header_id
2302 AND (nvl(poh.closed_code, 'OPEN') IN ('CANCELLED', 'CLOSED','FINALLY CLOSED', 'REJECTED', 'RETURNED')
2303 OR
2304 nvl(poh.authorization_status, 'INCOMPLETE') = 'CANCELLED'
2305 );
2306
2307 --Verify that the passed PO_REQ_HEADER_ID is valid
2308 CURSOR l_val_req_hdr_id_csr(p_po_req_header_id IN NUMBER) IS
2309 SELECT poh.requisition_header_id
2310 FROM po_requisition_headers_all poh
2311 WHERE poh.requisition_header_id = p_po_req_header_id;
2312
2313
2314 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Is_PO_Req_Closed';
2315 l_closed_status VARCHAR2(30);
2316 l_cancel_flag VARCHAR2(1);
2317 l_dummy NUMBER;
2318
2319
2320 BEGIN
2321 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2322 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'PO_REQ_HEADER_ID: '|| p_po_req_header_id);
2323 END IF;
2324
2325 IF (p_po_req_header_id IS NULL OR p_po_req_header_id = FND_API.G_MISS_NUM) THEN
2326 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_REQ_ID_NULL');
2327 FND_MSG_PUB.ADD;
2328 RETURN 'N';
2329 ELSE
2330 --validate the requisition_header_id. If it is not present, it may mean that user need to perform a PO Synch
2331 OPEN l_val_req_hdr_id_csr(p_po_req_header_id);
2332 FETCH l_val_req_hdr_id_csr INTO l_dummy;
2333 IF (l_val_req_hdr_id_csr%NOTFOUND) THEN
2334 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_REQ_HDR_ID_INV');
2335 FND_MESSAGE.Set_Token('REQ_HDR_ID', p_po_req_header_id);
2336 FND_MSG_PUB.ADD;
2337 CLOSE l_val_req_hdr_id_csr;
2338 RETURN 'N';
2339 END IF;
2340 CLOSE l_val_req_hdr_id_csr;
2341
2342 END IF;
2343
2344 OPEN l_is_req_closed_csr(p_po_req_header_id);
2345 FETCH l_is_req_closed_csr INTO l_dummy;
2346 IF (l_is_req_closed_csr%FOUND) THEN
2347 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2348 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Requisition is closed');
2349 END IF;
2350 CLOSE l_is_req_closed_csr;
2351 RETURN 'Y';
2352 END IF;
2353 CLOSE l_is_req_closed_csr;
2354
2355 RETURN 'N';
2356
2357 END Is_PO_Req_Closed;
2358
2359 ----------------------------------------------
2360 -- This function derives the charge_account_id
2361 ----------------------------------------------
2362 FUNCTION get_charge_account_id(
2363 p_inv_org_id IN NUMBER,
2364 p_item_id IN NUMBER
2365 ) RETURN NUMBER IS
2366
2367 CURSOR get_exp_acct_item_csr(c_inv_org_id IN NUMBER, c_item_id IN NUMBER) IS
2368 SELECT expense_account
2369 FROM mtl_system_items_b
2370 WHERE organization_id = c_inv_org_id
2371 AND inventory_item_id = c_item_id;
2372
2373 CURSOR get_mtl_acct_org_csr(c_inv_org_id IN NUMBER) IS
2374 SELECT material_account
2375 FROM mtl_parameters
2376 WHERE organization_id = c_inv_org_id;
2377
2378 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.get_charge_account_id';
2379 l_charge_acct_id NUMBER := null;
2380 l_item_account_set BOOLEAN := FALSE;
2381
2382 BEGIN
2383 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2384 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_inv_org_id: '|| p_inv_org_id);
2385 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_item_id: '|| p_item_id);
2386 END IF;
2387 IF(p_item_id is NULL) THEN
2388 --It is a one-time item
2389 l_item_account_set := FALSE;
2390 ELSE
2391 --Item is present, retrieve the item's expense account.
2392 OPEN get_exp_acct_item_csr(p_inv_org_id, p_item_id);
2393 FETCH get_exp_acct_item_csr INTO l_charge_acct_id;
2394 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2395 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id from item: '|| l_charge_acct_id);
2396 END IF;
2397 CLOSE get_exp_acct_item_csr;
2398 IF(l_charge_acct_id is not NULL) THEN
2399 l_item_account_set := TRUE;
2400 ELSE
2401 --Expense account not set at the Item Level.
2402 l_item_account_set := FALSE;
2403 END IF;
2404 END IF;
2405
2406 IF (l_item_account_set = FALSE) THEN
2407 --Retrieve the Org's Material Account Id
2408 OPEN get_mtl_acct_org_csr(p_inv_org_id);
2409 FETCH get_mtl_acct_org_csr INTO l_charge_acct_id;
2410 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2411 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id from Org: '|| l_charge_acct_id);
2412 END IF;
2413 CLOSE get_mtl_acct_org_csr;
2414 END IF;
2415
2416 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2417 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id: '|| l_charge_acct_id);
2418 END IF;
2419 RETURN l_charge_acct_id;
2420
2421 END get_charge_account_id;
2422
2423 END AHL_OSP_PO_REQ_PVT;