1 PACKAGE BODY AHL_OSP_PO_PVT AS
2 /* $Header: AHLVOPPB.pls 120.14 2008/04/08 23:12:00 jaramana ship $ */
3
4 -----------------------
5 -- Declare Constants --
6 -----------------------
7 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AHL_OSP_PO_PVT';
8
9 G_LOG_PREFIX CONSTANT VARCHAR2(100) := 'ahl.plsql.AHL_OSP_PO_PVT';
10
11 G_JSP_MODULE CONSTANT VARCHAR2(30) := 'JSP';
12
13 G_PO_APP_CODE CONSTANT VARCHAR2(2) := 'PO';
14 G_PDOI_CODE CONSTANT VARCHAR2(30) := 'POXPOPDOI';
15 G_AHL_OSP_PREFIX CONSTANT VARCHAR2(30) := 'AHL OSP Order ';
16 G_PROCESS_CODE CONSTANT VARCHAR2(30) := 'PENDING';
17 G_ACTION_CODE CONSTANT VARCHAR2(30) := 'ORIGINAL';
18 G_DOC_TYPE_CODE CONSTANT VARCHAR2(30) := 'STANDARD';
19 G_INCOMPLETE_STATUS CONSTANT VARCHAR2(30) := 'INCOMPLETE';
20
21 G_NO_FLAG CONSTANT VARCHAR2(1) := 'N';
22 G_YES_FLAG CONSTANT VARCHAR2(1) := 'Y';
23
24 -- PO Closed codes
25 G_PO_CLOSED CONSTANT VARCHAR2(30) := 'CLOSED';
26 G_PO_FINALLY_CLOSED CONSTANT VARCHAR2(30) := 'FINALLY CLOSED';
27 G_PO_OPEN CONSTANT VARCHAR2(30) := 'OPEN';
28
29 -- Default Values for One-time Items
30 -- Changed default price to zero: jaramana on June 22, 2005
31 --G_DEFAULT_PRICE CONSTANT NUMBER := 0.01;
32 G_DEFAULT_PRICE CONSTANT NUMBER := 0;
33 G_DEFAULT_CATEGORY CONSTANT VARCHAR2(30) := 'MISC.MISC';
34
35 -- OSP Order Statuses
36 G_OSP_ENTERED_STATUS CONSTANT VARCHAR2(30) := 'ENTERED';
37 G_OSP_SUBMITTED_STATUS CONSTANT VARCHAR2(30) := 'SUBMITTED';
38 G_OSP_SUB_FAILED_STATUS CONSTANT VARCHAR2(30) := 'SUBMISSION_FAILED';
39 G_OSP_PO_CREATED_STATUS CONSTANT VARCHAR2(30) := 'PO_CREATED';
40 -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
41 G_OSP_REQ_SUB_FAILED_STATUS CONSTANT VARCHAR2(30) := 'REQ_SUBMISSION_FAILED';
42
43 -- OSP Order Line Statuses
44 G_OL_PO_CANCELLED_STATUS CONSTANT VARCHAR2(30) := 'PO_CANCELLED';
45 G_OL_PO_DELETED_STATUS CONSTANT VARCHAR2(30) := 'PO_DELETED';
46
47 -- Log Constants: Transaction Types
48 G_TXN_TYPE_PO_CREATION CONSTANT VARCHAR2(30) := 'PO Creation';
49 G_TXN_TYPE_PO_SYNCH CONSTANT VARCHAR2(30) := 'PO Synchronization';
50 G_TXN_TYPE_PO_UPDATE CONSTANT VARCHAR2(30) := 'PO Update';
51
52 -- Log Constants: Document Types
53 G_DOC_TYPE_OSP CONSTANT VARCHAR2(30) := 'OSP';
54 G_DOC_TYPE_PO CONSTANT VARCHAR2(30) := 'PO';
55
56 -- PO Line Types
57 G_PO_LINE_TYPE_QUANTITY CONSTANT VARCHAR2(30) := 'QUANTITY';
58 -------------------------------------------------
59 -- Declare Locally used Record and Table Types --
60 -------------------------------------------------
61
62 TYPE PO_Header_Rec_Type IS RECORD (
63 OSP_ORDER_ID NUMBER,
64 VENDOR_ID NUMBER,
65 VENDOR_SITE_ID NUMBER,
66 BUYER_ID NUMBER,
67 VENDOR_CONTACT_ID NUMBER -- Added by jaramana on May 27, 2005 to support Inventory Service Order
68 );
69
70 TYPE PO_Line_Rec_Type IS RECORD (
71 OSP_LINE_ID NUMBER,
72 LINE_NUMBER NUMBER,
73 PO_LINE_TYPE_ID NUMBER,
74 ITEM_ID NUMBER,
75 ITEM_DESCRIPTION VARCHAR2(240),
76 QUANTITY NUMBER,
77 UOM_CODE VARCHAR2(3),
78 NEED_BY_DATE DATE,
79 SHIP_TO_ORG_ID NUMBER,
80 SHIP_TO_LOC_ID NUMBER
81 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
82 , WIP_ENTITY_ID NUMBER
83 , PROJECT_ID NUMBER
84 , TASK_ID NUMBER
85 );
86
87 TYPE PO_Line_Tbl_Type IS TABLE OF PO_Line_Rec_Type INDEX BY BINARY_INTEGER;
88
89 ------------------------------
90 -- Declare Local Procedures --
91 ------------------------------
92
93 -- Validate OSP Order for PO Header Creation
94 PROCEDURE Validate_PO_Header(
95 p_po_header_rec IN PO_Header_Rec_Type);
96
97 -- Validate PO Lines
98 PROCEDURE Validate_PO_Lines(
99 p_po_line_tbl IN PO_Line_Tbl_Type,
100 p_osp_order_id IN NUMBER);
101
102 -- Insert a record into the PO_HEADERS_INTERFACE table
103 PROCEDURE Insert_PO_Header(
104 p_po_header_rec IN PO_Header_Rec_Type,
105 x_intf_header_id OUT NOCOPY NUMBER,
106 x_batch_id OUT NOCOPY NUMBER);
107
108 -- Inserts records into the PO_LINES_INTERFACE table
109 PROCEDURE Insert_PO_Lines(
110 p_po_line_tbl IN PO_Line_Tbl_Type,
111 p_intf_header_id IN NUMBER);
112
113 -- Calls the Concurrent Program to Create Purchase Order
114 PROCEDURE Call_PDOI_Program(
115 p_batch_id IN NUMBER,
116 x_request_id OUT NOCOPY NUMBER);
117
118 -- Calls the PDOI API directly to Create Purchase Order
119 -- TO BE USED FOR DEBUGGING PURPOSE ONLY
120 PROCEDURE Call_PDOI_API(
121 p_batch_id IN NUMBER);
122
123 -- This Procedure updates AHL_OSP_ORDERS_B with the Batch Id and Request Id
124 PROCEDURE Record_OSP_Submission(
125 p_osp_order_id IN NUMBER,
126 p_batch_id IN NUMBER,
127 p_request_id IN NUMBER,
128 p_intf_hdr_id IN NUMBER);
129
130 -- This Local Procedure updates OSP Tables with PO Information for one OSP Order
131 PROCEDURE Associate_OSP_PO(
132 p_osp_order_id IN NUMBER,
133 x_po_header_id OUT NOCOPY NUMBER);
134
135 -- This Procedure updates AHL_OSP_ORDERS_B's PO_HEADER_ID and sets STATUS_CODE to PO_CREATED
136 PROCEDURE Set_PO_Header_ID(
137 p_osp_order_id IN NUMBER,
138 p_po_header_id IN NUMBER);
139
140 -- This Procedure updates AHL_OSP_ORDER_LINES.PO_LINE_ID
141 PROCEDURE Set_PO_Line_ID(
142 p_osp_order_line_id IN NUMBER,
143 p_po_line_id IN NUMBER);
144
145 -- This Procedure updates AHL_OSP_ORDERS_B.STATUS_CODE to SUBMISSION_FAILED
146 PROCEDURE Set_Submission_Failed(
147 p_osp_order_id IN NUMBER);
148
149 -- This Procedure handles cancelled PO Lines and is Part of PO Synchronization.
150 -- This procedure commits its work if p_commit is set to true and
151 -- if there were no errors during the execution of this procedure.
152 -- It does not check the message list for performing the commit action
153 PROCEDURE Handle_Cancelled_PO_Lines(
154 p_commit IN VARCHAR2,
155 x_return_status OUT NOCOPY VARCHAR2);
156
157 -- This Procedure handles deleted PO Lines and is Part of PO Synchronization.
158 -- This procedure commits its work if p_commit is set to true and
159 -- if there were no errors during the execution of this procedure.
160 -- It does not check the message list for performing the commit action
161 PROCEDURE Handle_Deleted_PO_Lines(
162 p_commit IN VARCHAR2,
163 x_return_status OUT NOCOPY VARCHAR2);
164
165 -- This Procedure handles Approved POs and is Part of PO Synchronization.
166 -- This procedure commits its work if p_commit is set to true and
167 -- if there were no errors during the execution of this procedure.
168 -- It does not check the message list for performing the commit action
169 PROCEDURE Handle_Approved_POs(
170 p_commit IN VARCHAR2,
171 x_return_status OUT NOCOPY VARCHAR2);
172
173 -- This Procedure updates a record of AHL_OSP_ORDERS_B using the table handler.
174 -- All updates to this table from this Package should go through this procedure only
175 PROCEDURE Update_OSP_Order(
176 p_osp_order_id IN NUMBER,
177 p_batch_id IN NUMBER := NULL,
178 p_request_id IN NUMBER := NULL,
179 p_status_code IN VARCHAR2 := NULL,
180 p_po_header_id IN NUMBER := NULL,
181 p_intf_hdr_id IN NUMBER := NULL);
182
183 FUNCTION Get_Item_Price(
184 p_osp_line_id IN NUMBER) RETURN NUMBER;
185
186 /** The following two procedures Handle_Deleted_PO_Headers and Handle_Deleted_Sales_Orders
187 * were added by jaramana on March 31, 2006 to implement the ER 5074660
188 ***/
189 -- This Procedure handles deleted PO Headers and is Part of PO Synchronization.
190 -- This procedure commits its work if p_commit is set to true and
191 -- if there were no errors during the execution of this procedure.
192 -- It does not check the message list for performing the commit action
193 PROCEDURE Handle_Deleted_PO_Headers(
194 p_commit IN VARCHAR2,
195 x_return_status OUT NOCOPY VARCHAR2);
196
197 -- This Procedure handles deleted Sales Orders and is Part of PO Synchronization.
198 -- This procedure commits its work if p_commit is set to true and
199 -- if there were no errors during the execution of this procedure.
200 -- It does not check the message list for performing the commit action
201 PROCEDURE Handle_Deleted_Sales_Orders(
202 p_commit IN VARCHAR2,
203 x_return_status OUT NOCOPY VARCHAR2);
204
205 --Added by mpothuku on 10-Oct-2007 for fixing the Bug 6436184
206 FUNCTION get_charge_account_id
207 (
208 p_inv_org_id IN NUMBER,
209 p_item_id IN NUMBER
210 ) RETURN NUMBER;
211 --mpothuku End
212
213 -------------------------------------
214 -- End Local Procedures Declaration--
215 -------------------------------------
216
217 -----------------------------------------
218 -- Public Procedure Definitions follow --
219 -----------------------------------------
220 -- Start of Comments --
221 -- Procedure name : Create_Purchase_Order
222 -- Type : Private
223 -- Function : Validates OSP Information and inserts records into PO Interface tables
224 -- Launches Concurrent Program to initiate PO creation
225 -- Updates OSP table with request id batch id and interface header id
226 -- Pre-reqs :
227 -- Parameters :
228 --
229 -- Standard IN Parameters :
230 -- p_api_version IN NUMBER Required
231 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
232 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
233 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
234 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
235 -- p_module_type IN VARCHAR2 Default NULL.
236 --
237 -- Standard OUT Parameters :
238 -- x_return_status OUT VARCHAR2 Required
239 -- x_msg_count OUT NUMBER Required
240 -- x_msg_data OUT VARCHAR2 Required
241 --
242 -- Create_Purchase_Order Parameters:
243 -- p_osp_order_id IN NUMBER Required
244 -- The Id of the OSP Order for which to create the Purchase Order
245 -- x_batch_id OUT NUMBER Required
246 -- Contains the batch id if the concurrent program was launched successfuly.
247 -- x_request_id OUT NUMBER Required
248 -- Contains the concurrent request id if the concurrent program was launched successfuly.
249 -- x_interface_header_id OUT NUMBER Required
250 -- Contains the interface header id generated for the po_headers_interface table.
251 --
252 --
253 -- Version :
254 -- Initial Version 1.0
255 --
256 -- End of Comments.
257
258 PROCEDURE Create_Purchase_Order
259 (
260 p_api_version IN NUMBER,
261 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
262 p_commit IN VARCHAR2 := FND_API.G_FALSE,
263 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
264 p_default IN VARCHAR2 := FND_API.G_TRUE,
265 p_module_type IN VARCHAR2 := NULL,
266 p_osp_order_id IN NUMBER := NULL, -- Required if Number is not given
267 p_osp_order_number IN NUMBER := NULL, -- Required if Id is not given
268 x_batch_id OUT NOCOPY NUMBER,
269 x_request_id OUT NOCOPY NUMBER,
270 x_interface_header_id OUT NOCOPY NUMBER,
271 x_return_status OUT NOCOPY VARCHAR2,
272 x_msg_count OUT NOCOPY NUMBER,
273 x_msg_data OUT NOCOPY VARCHAR2) IS
274
275 l_api_version CONSTANT NUMBER := 1.0;
276 l_api_name CONSTANT VARCHAR2(30) := 'Create_Purchase_Order';
277 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Create_Purchase_Order';
278
279 CURSOR l_osp_id_csr(p_osp_order_number IN NUMBER) IS
280 SELECT OSP_ORDER_ID
281 FROM AHL_OSP_ORDERS_B
282 WHERE OSP_ORDER_NUMBER = p_osp_order_number;
283
284 CURSOR l_osp_dtls_csr(p_osp_order_id IN NUMBER) IS
285 -- VENDOR_CONTACT_ID added by jaramana on May 27, 2005
286 SELECT VENDOR_ID, VENDOR_SITE_ID, PO_AGENT_ID, PO_BATCH_ID, PO_INTERFACE_HEADER_ID, VENDOR_CONTACT_ID
287 , STATUS_CODE -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
288 FROM AHL_OSP_ORDERS_B
289 WHERE OSP_ORDER_ID = p_osp_order_id;
290
291 -- Begin ER 266135 Fix
292 /*
293 CURSOR l_osp_line_dtls_csr(p_osp_order_id IN NUMBER) IS
294 SELECT OL.OSP_ORDER_LINE_ID, OL.OSP_LINE_NUMBER, OL.SERVICE_ITEM_ID,
295 OL.SERVICE_ITEM_DESCRIPTION, WO.QUANTITY, OL.NEED_BY_DATE,
296 OL.SERVICE_ITEM_UOM_CODE, OL.PO_LINE_TYPE_ID,
297 BOM.ORGANIZATION_ID, BOM.LOCATION_ID
298 FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS_V WO, BOM_DEPARTMENTS BOM
299 WHERE OL.OSP_ORDER_ID = p_osp_order_id AND
300 WO.WORKORDER_ID = OL.WORKORDER_ID AND
301 BOM.DEPARTMENT_ID (+) = WO.DEPARTMENT_ID;
302 */
303 -- Changed by jaramana on May 27, 2005 to support Inventory Service Orders
304 -- CURSOR l_osp_line_dtls_csr(p_osp_order_id IN NUMBER) IS
305 -- SELECT OL.OSP_ORDER_LINE_ID, OL.OSP_LINE_NUMBER, OL.SERVICE_ITEM_ID,
306 -- OL.SERVICE_ITEM_DESCRIPTION, OL.QUANTITY, OL.NEED_BY_DATE,
307 -- OL.SERVICE_ITEM_UOM_CODE, OL.PO_LINE_TYPE_ID,
308 ---- Changed by jaramana on May 26, 2005 to Fix bug 4393374
309 ---- BOM.ORGANIZATION_ID, BOM.LOCATION_ID
310 -- WO.ORGANIZATION_ID, BOM.LOCATION_ID
311 -- FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS_OSP_V WO, BOM_DEPARTMENTS BOM
312 -- WHERE OL.OSP_ORDER_ID = p_osp_order_id AND
313 -- WO.WORKORDER_ID = OL.WORKORDER_ID AND
314 -- BOM.DEPARTMENT_ID (+) = WO.DEPARTMENT_ID;
315 -- End ER 266135 Fix
316
317 -- Changed by jaramana on October 26, 2005 for ER 4544642
318 CURSOR l_osp_line_dtls_csr(p_osp_order_id IN NUMBER) IS
319 SELECT OL.OSP_ORDER_LINE_ID, OL.OSP_LINE_NUMBER, OL.SERVICE_ITEM_ID,
320 OL.SERVICE_ITEM_DESCRIPTION, OL.QUANTITY, OL.NEED_BY_DATE,
321 OL.SERVICE_ITEM_UOM_CODE, OL.PO_LINE_TYPE_ID,
322 /**
323 OL.INVENTORY_ORG_ID, BOM.LOCATION_ID
324 FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS_OSP_V WO, BOM_DEPARTMENTS BOM
325 **/
326 OL.INVENTORY_ORG_ID, DECODE(OL.WORKORDER_ID, NULL, HAOU.LOCATION_ID, BOM.LOCATION_ID)
327 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
328 , WO.WIP_ENTITY_ID
329 , WDJ.PROJECT_ID
330 , WDJ.TASK_ID
331 /*
332 FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS_OSP_V WO, BOM_DEPARTMENTS BOM, HR_ALL_ORGANIZATION_UNITS HAOU
333 */
334 -- Changes made by jaramana on December 19, 2005
335 -- to improve the performace of this SQL.
336 -- Removed reference to AHL_WORKORDERS_OSP_V and instead joined directly with
337 -- WIP_DISCRETE_JOBS to get the work order department
338 FROM AHL_OSP_ORDER_LINES OL, AHL_WORKORDERS WO, BOM_DEPARTMENTS BOM, HR_ALL_ORGANIZATION_UNITS HAOU, WIP_DISCRETE_JOBS WDJ
339 WHERE OL.OSP_ORDER_ID = p_osp_order_id AND
340 WO.WORKORDER_ID (+) = OL.WORKORDER_ID AND
341 /**
342 BOM.DEPARTMENT_ID (+) = WO.DEPARTMENT_ID;
343 **/
344 /*
345 BOM.DEPARTMENT_ID (+) = WO.DEPARTMENT_ID AND
346 */
347 WDJ.WIP_ENTITY_ID (+) = WO.WIP_ENTITY_ID AND
348 BOM.DEPARTMENT_ID (+) = WDJ.OWNING_DEPARTMENT AND
349 HAOU.ORGANIZATION_ID = OL.INVENTORY_ORG_ID;
350
351 -- Added by jaramana on June 24, 2005 to get the updated Return to Org
352 -- Updated by jaramana on March 20, 2006 to get the Org Location for fixing Bug 5104282
353 CURSOR get_return_to_org_csr(p_osp_line_id IN NUMBER) IS
354 SELECT oola.ship_from_org_id, HAOU.LOCATION_ID
355 FROM oe_order_lines_all oola, ahl_osp_order_lines aool, HR_ALL_ORGANIZATION_UNITS HAOU
356 WHERE oola.line_id = aool.oe_return_line_id and
357 HAOU.ORGANIZATION_ID = oola.ship_from_org_id and
358 aool.osp_order_line_id = p_osp_line_id;
359
360 l_po_header PO_Header_Rec_Type;
361 l_po_line_tbl PO_Line_Tbl_Type;
362 l_intf_hdr_id NUMBER;
363 l_batch_id NUMBER;
364 l_old_batch_id NUMBER := null;
365 l_old_intf_header_id NUMBER := null;
366 l_request_id NUMBER := 0;
367 l_temp_num NUMBER := 0;
368 l_temp_ret_org_id NUMBER;
369 l_temp_ret_org_loc_id NUMBER;
370
371 -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
372 l_curr_status AHL_OSP_ORDERS_B.STATUS_CODE%TYPE;
373
374 BEGIN
375
376 -- Standard start of API savepoint
377 SAVEPOINT Create_Purchase_Order_pvt;
378
379 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
380 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
381 END IF;
382
383 -- Standard call to check for call compatibility
384 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
385 G_PKG_NAME) THEN
386 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
387 END IF;
388
389 -- Initialize message list if p_init_msg_list is set to TRUE
390 IF FND_API.To_Boolean(p_init_msg_list) THEN
391 FND_MSG_PUB.Initialize;
392 END IF;
393
394 -- Initialize API return status to success
395 x_return_status := FND_API.G_RET_STS_SUCCESS;
396
397 -- Begin Processing
398
399 IF FND_API.to_boolean( p_default ) THEN
400 -- No special default settings required in this API
401 NULL;
402 END IF;
403
404 -- Start processing
405
406 -- Create the Header Rec
407 IF (p_osp_order_id IS NOT NULL) THEN
408 l_po_header.OSP_ORDER_ID := p_osp_order_id;
409 ELSE
410 -- Convert the Order number to Id
411 --dbms_output.put_line('Perfoming OSP Order Number to Id conversion');
412 OPEN l_osp_id_csr(p_osp_order_number);
413 FETCH l_osp_id_csr INTO l_po_header.OSP_ORDER_ID;
414 CLOSE l_osp_id_csr;
415 END IF;
416
417 OPEN l_osp_dtls_csr(l_po_header.OSP_ORDER_ID);
418 FETCH l_osp_dtls_csr INTO l_po_header.VENDOR_ID,
419 l_po_header.VENDOR_SITE_ID,
420 l_po_header.BUYER_ID,
421 l_old_batch_id, -- For Purging Interface table records
422 l_old_intf_header_id, -- -do-
423 l_po_header.VENDOR_CONTACT_ID,
424 l_curr_status; -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
425 CLOSE l_osp_dtls_csr;
426 --dbms_output.put_line('Got Header Rec ');
427 -- Validate Header
428 Validate_PO_Header(l_po_header);
429 --dbms_output.put_line('Validated Header Rec ');
430 -- Create the Lines Table
431 OPEN l_osp_line_dtls_csr(p_osp_order_id);
432 LOOP
433 FETCH l_osp_line_dtls_csr INTO l_po_line_tbl(l_temp_num).OSP_LINE_ID,
434 l_po_line_tbl(l_temp_num).LINE_NUMBER,
435 l_po_line_tbl(l_temp_num).ITEM_ID,
436 l_po_line_tbl(l_temp_num).ITEM_DESCRIPTION,
437 l_po_line_tbl(l_temp_num).QUANTITY,
438 l_po_line_tbl(l_temp_num).NEED_BY_DATE,
439 l_po_line_tbl(l_temp_num).UOM_CODE,
440 l_po_line_tbl(l_temp_num).PO_LINE_TYPE_ID,
441 l_po_line_tbl(l_temp_num).SHIP_TO_ORG_ID,
442 l_po_line_tbl(l_temp_num).SHIP_TO_LOC_ID,
443 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
444 l_po_line_tbl(l_temp_num).WIP_ENTITY_ID,
445 l_po_line_tbl(l_temp_num).PROJECT_ID,
446 l_po_line_tbl(l_temp_num).TASK_ID;
447 EXIT WHEN l_osp_line_dtls_csr%NOTFOUND;
448
449 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
450 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
451 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
452 ' Fetching from l_osp_line_dtls_csr. l_temp_num = ' || l_temp_num ||
453 ', OSP_LINE_ID = ' || l_po_line_tbl(l_temp_num).OSP_LINE_ID ||
454 ', WIP_ENTITY_ID = ' || l_po_line_tbl(l_temp_num).WIP_ENTITY_ID ||
455 ', PROJECT_ID = ' || l_po_line_tbl(l_temp_num).PROJECT_ID ||
456 ', TASK_ID = ' || l_po_line_tbl(l_temp_num).TASK_ID);
457 END IF;
458
459 -- Added by jaramana on June 24, 2005 to get the updated Return to Org.
460 -- It will now be possible to change the Warehouse in the return lines of a Shipment.
461 -- This change will ensure that the PO Shipment gets this changed Org.
462 -- Updated by jaramana on March 20, 2006 for fixing Bug 5104282
463 OPEN get_return_to_org_csr(l_po_line_tbl(l_temp_num).OSP_LINE_ID);
464 FETCH get_return_to_org_csr INTO l_temp_ret_org_id, l_temp_ret_org_loc_id;
465 IF (get_return_to_org_csr%FOUND AND l_temp_ret_org_id IS NOT NULL) THEN
466 IF (l_temp_ret_org_id <> l_po_line_tbl(l_temp_num).SHIP_TO_ORG_ID) THEN
467 l_po_line_tbl(l_temp_num).SHIP_TO_ORG_ID := l_temp_ret_org_id;
468 -- Update the Ship To Location only if the Return To Org is different
469 -- from the Line's Inventory Org
470 l_po_line_tbl(l_temp_num).SHIP_TO_LOC_ID := l_temp_ret_org_loc_id;
471 END IF;
472 END IF;
473 CLOSE get_return_to_org_csr;
474
475 l_temp_num := l_temp_num + 1;
476 END LOOP;
477 CLOSE l_osp_line_dtls_csr;
478 l_po_line_tbl.DELETE(l_temp_num); -- Delete the last (null) record
479 --dbms_output.put_line('Created Lines Table ');
480 -- Validate Lines
481 Validate_PO_Lines(l_po_line_tbl, l_po_header.OSP_ORDER_ID);
482 --dbms_output.put_line('Validated Lines Table ');
483 -- Check Error Message stack.
484 x_msg_count := FND_MSG_PUB.count_msg;
485 IF x_msg_count > 0 THEN
486 RAISE FND_API.G_EXC_ERROR;
487 END IF;
488 --dbms_output.put_line('no errors : going onto insert into po_headers_interface ');
489 -- Insert Row into PO_HEADERS_INTERFACE
490 Insert_PO_Header(p_po_header_rec => l_po_header,
491 x_intf_header_id => l_intf_hdr_id,
492 x_batch_id => l_batch_id);
493 --dbms_output.put_line('Inserted row into po_headers_interface. x_intf_header_id = ' || l_intf_hdr_id);
494 --dbms_output.put_line('x_batch_id = ' || l_batch_id);
495 -- Insert rows into PO_LINES_INTERFACE
496 Insert_PO_Lines(p_po_line_tbl => l_po_line_tbl,
497 p_intf_header_id => l_intf_hdr_id);
498 --dbms_output.put_line('inserted rows into po_lines_interface ');
499 -- Purge Error records from prior submission (if any)
500 -- Begin Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
501 IF (l_old_intf_header_id IS NOT NULL AND l_curr_status = G_OSP_SUB_FAILED_STATUS) THEN
502 -- PO Submission had failed earlier
503 DELETE FROM PO_INTERFACE_ERRORS WHERE
504 INTERFACE_HEADER_ID = l_old_intf_header_id;
505 DELETE FROM PO_HEADERS_INTERFACE WHERE
506 INTERFACE_HEADER_ID = l_old_intf_header_id;
507 DELETE FROM PO_LINES_INTERFACE WHERE
508 INTERFACE_HEADER_ID = l_old_intf_header_id;
509 DELETE FROM PO_DISTRIBUTIONS_INTERFACE WHERE
510 INTERFACE_HEADER_ID = l_old_intf_header_id;
511 ELSIF (l_curr_status = G_OSP_REQ_SUB_FAILED_STATUS) THEN
512 -- Requisition Submission had failed earlier
513 -- Delete from the Errors table first so that the subquery can use po_requisitions_interface_all
514 DELETE FROM po_interface_errors
515 WHERE INTERFACE_TRANSACTION_ID in
516 (SELECT transaction_id
517 FROM po_requisitions_interface_all
518 WHERE INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME
519 AND INTERFACE_SOURCE_LINE_ID = l_po_header.OSP_ORDER_ID);
520 DELETE FROM po_requisitions_interface_all
521 WHERE INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME
522 AND INTERFACE_SOURCE_LINE_ID = l_po_header.OSP_ORDER_ID;
523 END IF;
524 -- End Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
525 --dbms_output.put_line('Purged error records ');
526 -- Launch Concurrent Program to create PO
527 --dbms_output.put_line('About to call Concurrent program ');
528 Call_PDOI_Program(p_batch_id => l_batch_id,
529 x_request_id => l_request_id);
530 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
531 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Concurrent Program Request Submitted. Request Id = ' || l_request_id);
532 END IF;
533 --dbms_output.put_line('Concurrent Program called. Request Id = ' || l_request_id);
534 -- Check if request was submitted without error
535 IF (l_request_id = 0) THEN
536 -- Add Error Message generated by Concurrent Manager to Message List
537 FND_MSG_PUB.ADD;
538 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
539 FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, FALSE);
540 END IF;
541 RAISE FND_API.G_EXC_ERROR;
542 END IF;
543
544 --dbms_output.put_line('Recording OSP Submission... ');
545 -- Update OSP Table with batch id, request id and interface header id
546 Record_OSP_Submission(p_osp_order_id => p_osp_order_id,
547 p_batch_id => l_batch_id,
548 p_request_id => l_request_id,
549 p_intf_hdr_id => l_intf_hdr_id);
550
551 --dbms_output.put_line('Recorded OSP Submission ');
552 -- Set Return parameters
553 x_batch_id := l_batch_id;
554 x_request_id := l_request_id;
555 x_interface_header_id := l_intf_hdr_id;
556
557 --dbms_output.put_line('Completed Processing ');
558 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
559 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors');
560 END IF;
561 -- Check Error Message stack.
562 x_msg_count := FND_MSG_PUB.count_msg;
563 IF x_msg_count > 0 THEN
564 RAISE FND_API.G_EXC_ERROR;
565 END IF;
566
567 -- Log this transaction in the Log Table
568 AHL_OSP_UTIL_PKG.Log_Transaction(p_trans_type_code => G_TXN_TYPE_PO_CREATION,
569 p_src_doc_id => p_osp_order_id,
570 p_src_doc_type_code => G_DOC_TYPE_OSP,
571 p_dest_doc_id => l_batch_id,
572 p_dest_doc_type_code => G_DOC_TYPE_PO);
573
574 -- Standard check of p_commit
575 IF FND_API.TO_BOOLEAN(p_commit) THEN
576 --dbms_output.put_line('About to commit work ');
577 COMMIT WORK;
578 END IF;
579
580 -- Standard call to get message count and if count is 1, get message info
581 FND_MSG_PUB.Count_And_Get
582 ( p_count => x_msg_count,
583 p_data => x_msg_data,
584 p_encoded => fnd_api.g_false
585 );
586
587 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
588 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
589 END IF;
590
591 --dbms_output.put_line('About to return from procedure ');
592 EXCEPTION
593 WHEN FND_API.G_EXC_ERROR THEN
594 ROLLBACK TO Create_Purchase_Order_pvt;
595 x_return_status := FND_API.G_RET_STS_ERROR;
596 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
597 p_data => x_msg_data,
598 p_encoded => fnd_api.g_false);
599 --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
600
601 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
602 ROLLBACK TO Create_Purchase_Order_pvt;
603 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
604 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
605 p_data => x_msg_data,
606 p_encoded => fnd_api.g_false);
607 --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
608
609 WHEN OTHERS THEN
610 ROLLBACK TO Create_Purchase_Order_pvt;
611 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
612 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
613 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
614 p_procedure_name => 'Create_Purchase_Order',
615 p_error_text => SUBSTR(SQLERRM,1,240));
616 END IF;
617 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
618 p_data => x_msg_data,
619 p_encoded => fnd_api.g_false);
620 --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
621
622 END Create_Purchase_Order;
623
624 ----------------------------------------
625
626 -- Start of Comments --
627 -- Procedure name : Associate_OSP_With_PO
628 -- Type : Private
629 -- Function : Updates AHL_OSP_ORDERS_B.PO_HEADER_ID and
630 -- AHL_OSP_ORDER_LINES.PO_LINE_ID with PO_HEADER_ID and
631 -- PO_LINE_ID respectively for a single submitted OSP Order.
632 -- Does not give error if the OSP Order is already associated
633 -- or if there is no corresponding PO yet.
634 -- Pre-reqs :
635 -- Parameters :
636 --
637 -- Standard IN Parameters :
638 -- p_api_version IN NUMBER Required
639 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
640 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
641 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
642 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
643 -- p_module_type IN VARCHAR2 Default NULL.
644 --
645 -- Standard OUT Parameters :
646 -- x_return_status OUT VARCHAR2 Required
647 -- x_msg_count OUT NUMBER Required
648 -- x_msg_data OUT VARCHAR2 Required
649 --
650 -- Associate_New_PO_Lines Parameters:
651 -- p_osp_order_id IN NUMBER Required
652 -- Id of the OSP Order containing the PO Lines
653 -- x_po_header_id OUT NUMBER Required
654 -- Id of the associated PO Header if the association succeeded.
655 --
656 --
657 -- Version :
658 -- Initial Version 1.0
659 --
660 -- End of Comments.
661 PROCEDURE Associate_OSP_With_PO
662 (
663 p_api_version IN NUMBER,
664 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
665 p_commit IN VARCHAR2 := FND_API.G_FALSE,
666 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
667 p_default IN VARCHAR2 := FND_API.G_TRUE,
668 p_module_type IN VARCHAR2 := NULL,
669 p_osp_order_id IN NUMBER,
670 x_po_header_id OUT NOCOPY NUMBER,
671 x_return_status OUT NOCOPY VARCHAR2,
672 x_msg_count OUT NOCOPY NUMBER,
673 x_msg_data OUT NOCOPY VARCHAR2) IS
674
675 CURSOR l_validate_osp_csr(p_osp_order_id IN NUMBER) IS
676 SELECT PO_HEADER_ID FROM AHL_OSP_ORDERS_B
677 WHERE OSP_ORDER_ID = p_osp_order_id;
678 -- Don't throw error based on status
679 -- AND STATUS_CODE = G_OSP_SUBMITTED_STATUS;
680
681 l_api_version CONSTANT NUMBER := 1.0;
682 l_api_name CONSTANT VARCHAR2(30) := 'Associate_OSP_With_PO';
683 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Associate_OSP_With_PO';
684 l_dummy VARCHAR2(1);
685 l_po_header_id NUMBER;
686
687 BEGIN
688
689 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
690 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
691 END IF;
692
693 -- Standard start of API savepoint
694 SAVEPOINT Associate_OSP_With_PO_pvt;
695
696 -- Standard call to check for call compatibility
697 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
698 G_PKG_NAME) THEN
699 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
700 END IF;
701
702 -- Initialize message list if p_init_msg_list is set to TRUE
703 IF FND_API.To_Boolean(p_init_msg_list) THEN
704 FND_MSG_PUB.Initialize;
705 END IF;
706
707 -- Initialize API return status to success
708 x_return_status := FND_API.G_RET_STS_SUCCESS;
709
710 IF FND_API.to_boolean( p_default ) THEN
711 -- No special default settings required in this API
712 NULL;
713 END IF;
714
715 --dbms_output.put_line('Beginning Processing... ');
716 -- Validate OSP Order Id
717 IF (p_osp_order_id IS NULL OR p_osp_order_id = FND_API.G_MISS_NUM) THEN
718 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_NULL');
719 FND_MSG_PUB.ADD;
720 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
721 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
722 END IF;
723 --dbms_output.put_line('OSP Order Id is null');
724 RAISE FND_API.G_EXC_ERROR;
725 ELSE
726 OPEN l_validate_osp_csr(p_osp_order_id);
727 FETCH l_validate_osp_csr INTO l_po_header_id;
728 IF (l_validate_osp_csr%NOTFOUND) THEN
729 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_INVALID');
730 FND_MESSAGE.Set_Token('OSP_ID', p_osp_order_id);
731 FND_MSG_PUB.ADD;
732 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
733 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
734 END IF;
735 CLOSE l_validate_osp_csr;
736 --dbms_output.put_line('OSP Order Id ' || p_osp_order_id || ' is invalid');
737 RAISE FND_API.G_EXC_ERROR;
738 ELSIF (l_po_header_id IS NOT NULL) THEN
739 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
740 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'OSP Order Id ' || p_osp_order_id || ' is already associated with PO ' || l_po_header_id);
741 END IF;
742 --dbms_output.put_line('OSP Order Id ' || p_osp_order_id || ' is already associated with PO ' || l_po_header_id);
743 -- No need to throw an exception
744 /*
745 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_PO_HDR_ASSCTD');
746 FND_MESSAGE.Set_Token('OSP_ID', p_osp_order_id);
747 FND_MSG_PUB.ADD;
748 CLOSE l_validate_osp_csr;
749 RAISE FND_API.G_EXC_ERROR;
750 */
751 ELSE
752 -- Make the association
753 --dbms_output.put_line('About to Make Association ');
754 Associate_OSP_PO(p_osp_order_id => p_osp_order_id,
755 x_po_header_id => x_po_header_id);
756 --dbms_output.put_line('Completed Making Association ');
757 END IF;
758 CLOSE l_validate_osp_csr;
759 END IF;
760
761 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
762 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors');
763 END IF;
764 --dbms_output.put_line('Completed Processing. Checking for errors ');
765 -- Check Error Message stack.
766 x_msg_count := FND_MSG_PUB.count_msg;
767 IF x_msg_count > 0 THEN
768 RAISE FND_API.G_EXC_ERROR;
769 END IF;
770
771 -- Standard check of p_commit
772 IF FND_API.TO_BOOLEAN(p_commit) THEN
773 --dbms_output.put_line('About to commit');
774 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
775 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to commit');
776 END IF;
777 COMMIT WORK;
778 END IF;
779
780 -- Standard call to get message count and if count is 1, get message info
781 FND_MSG_PUB.Count_And_Get
782 ( p_count => x_msg_count,
783 p_data => x_msg_data,
784 p_encoded => fnd_api.g_false
785 );
786
787 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
788 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
789 END IF;
790 --dbms_output.put_line('About to return ');
791 EXCEPTION
792 WHEN FND_API.G_EXC_ERROR THEN
793 ROLLBACK TO Associate_OSP_With_PO_pvt;
794 x_return_status := FND_API.G_RET_STS_ERROR;
795 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
796 p_data => x_msg_data,
797 p_encoded => fnd_api.g_false);
798
799 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
800 ROLLBACK TO Associate_OSP_With_PO_pvt;
801 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
802 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
803 p_data => x_msg_data,
804 p_encoded => fnd_api.g_false);
805
806 WHEN OTHERS THEN
807 ROLLBACK TO Associate_OSP_With_PO_pvt;
808 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
809 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
810 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
811 p_procedure_name => 'Associate_OSP_With_PO',
812 p_error_text => SUBSTR(SQLERRM,1,240));
813 END IF;
814 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
815 p_data => x_msg_data,
816 p_encoded => fnd_api.g_false);
817
818 END Associate_OSP_With_PO;
819
820 ----------------------------------------
821
822 -- Start of Comments --
823 -- Procedure name : Associate_All_OSP_POs
824 -- Type : Private
825 -- Function : Updates AHL_OSP_ORDERS_B.PO_HEADER_ID and
826 -- AHL_OSP_ORDER_LINES.PO_LINE_ID with PO_HEADER_ID and
827 -- PO_LINE_ID respectively for all submitted OSP Orders.
828 -- Pre-reqs :
829 -- Parameters :
830 --
831 -- Standard IN Parameters :
832 -- p_api_version IN NUMBER Required
833 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
834 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
835 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
836 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
837 -- p_module_type IN VARCHAR2 Default NULL.
838 --
839 -- Standard OUT Parameters :
840 -- x_return_status OUT VARCHAR2 Required
841 -- x_msg_count OUT NUMBER Required
842 -- x_msg_data OUT VARCHAR2 Required
843 --
844 -- Version :
845 -- Initial Version 1.0
846 --
847 -- End of Comments.
848 PROCEDURE Associate_All_OSP_POs
849 (
850 p_api_version IN NUMBER,
851 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
852 p_commit IN VARCHAR2 := FND_API.G_FALSE,
853 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
854 p_default IN VARCHAR2 := FND_API.G_TRUE,
855 p_module_type IN VARCHAR2 := NULL,
856 x_return_status OUT NOCOPY VARCHAR2,
857 x_msg_count OUT NOCOPY NUMBER,
858 x_msg_data OUT NOCOPY VARCHAR2) IS
859
860 CURSOR l_get_osps_csr IS
861 SELECT OSP_ORDER_ID FROM AHL_OSP_ORDERS_B
862 WHERE STATUS_CODE = G_OSP_SUBMITTED_STATUS
863 AND PO_HEADER_ID IS NULL
864 AND PO_BATCH_ID IS NOT NULL
865 -- Added by jaramana on April 7, 2008 for bug 6609988
866 AND OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id();
867
868 l_api_version CONSTANT NUMBER := 1.0;
869 l_api_name CONSTANT VARCHAR2(30) := 'Associate_All_OSP_POs';
870 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Associate_All_OSP_POs';
871 l_dummy VARCHAR2(1);
872 l_osp_order_id NUMBER;
873 l_po_header_id NUMBER;
874 l_temp_count NUMBER := 0;
875
876 BEGIN
877 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
878 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
879 END IF;
880
881 -- Standard start of API savepoint
882 SAVEPOINT Associate_All_OSP_POs_pvt;
883
884 -- Standard call to check for call compatibility
885 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
886 G_PKG_NAME) THEN
887 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
888 END IF;
889
890 -- Initialize message list if p_init_msg_list is set to TRUE
891 IF FND_API.To_Boolean(p_init_msg_list) THEN
892 FND_MSG_PUB.Initialize;
893 END IF;
894
895 -- Initialize API return status to success
896 x_return_status := FND_API.G_RET_STS_SUCCESS;
897
898 IF FND_API.to_boolean( p_default ) THEN
899 -- No special default settings required in this API
900 NULL;
901 END IF;
902
903 -- Start processing
904 OPEN l_get_osps_csr;
905 LOOP
906 FETCH l_get_osps_csr INTO l_osp_order_id;
907 EXIT WHEN l_get_osps_csr%NOTFOUND;
908 Associate_OSP_PO(p_osp_order_id => l_osp_order_id,
909 x_po_header_id => l_po_header_id);
910 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
911 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Associated OSP Order with Id ' || l_osp_order_id || ' to PO with Id ' || l_po_header_id);
912 END IF;
913 l_temp_count := l_temp_count + 1;
914 END LOOP;
915 --Added by jaramana on 7-JAN-2008
916 CLOSE l_get_osps_csr;
917 --jaramana End
918 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
919 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Associated ' || l_temp_count || ' OSP Orders with POs');
920 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing. Checking for errors');
921 END IF;
922 -- Check Error Message stack.
923 x_msg_count := FND_MSG_PUB.count_msg;
924 IF x_msg_count > 0 THEN
925 RAISE FND_API.G_EXC_ERROR;
926 END IF;
927
928 -- Standard check of p_commit
929 IF FND_API.TO_BOOLEAN(p_commit) THEN
930 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
931 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
932 END IF;
933 COMMIT WORK;
934 END IF;
935
936 -- Standard call to get message count and if count is 1, get message info
937 FND_MSG_PUB.Count_And_Get
938 ( p_count => x_msg_count,
939 p_data => x_msg_data,
940 p_encoded => fnd_api.g_false
941 );
942
943 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
944 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
945 END IF;
946
947 EXCEPTION
948 WHEN FND_API.G_EXC_ERROR THEN
949 ROLLBACK TO Associate_All_OSP_POs_pvt;
950 x_return_status := FND_API.G_RET_STS_ERROR;
951 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
952 p_data => x_msg_data,
953 p_encoded => fnd_api.g_false);
954
955 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
956 ROLLBACK TO Associate_All_OSP_POs_pvt;
957 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
958 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
959 p_data => x_msg_data,
960 p_encoded => fnd_api.g_false);
961
962 WHEN OTHERS THEN
963 ROLLBACK TO Associate_All_OSP_POs_pvt;
964 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
965 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
966 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
967 p_procedure_name => 'Associate_All_OSP_POs',
968 p_error_text => SUBSTR(SQLERRM,1,240));
969 END IF;
970 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
971 p_data => x_msg_data,
972 p_encoded => fnd_api.g_false);
973
974 END Associate_All_OSP_POs;
975
976 -- Start of Comments --
977 -- Procedure name : PO_Synch_All_OSPs
978 -- Type : Private
979 -- Function : Synchronizes all OSPs based on the PO Status
980 -- 1. Handles successfully completed PO Submissions (Updates OSP tables)
981 -- 2. Handles failed PO Submissions (Updates OSP Status)
982 -- 3. Handles cancelled PO Lines (Updates OSP Line status, delete shipments)
983 -- 4. Handles deleted PO Lines (Updates OSP Line status, delete shipments)
984 -- 5. Handles Approved POs (Books Shipment, notifies shipper?)
985 -- Pre-reqs :
986 -- Parameters :
987 --
988 -- Standard IN Parameters :
989 -- p_api_version IN NUMBER Required
990 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
991 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
992 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
993 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
994 -- p_module_type IN VARCHAR2 Default NULL.
995 --
996 -- Standard OUT Parameters :
997 -- x_return_status OUT VARCHAR2 Required
998 -- x_msg_count OUT NUMBER Required
999 -- x_msg_data OUT VARCHAR2 Required
1000 --
1001 -- PO_Synch_All_OSPs Parameters:
1002 -- p_concurrent_flag IN VARCHAR2 Default N.
1003 -- Writes debug Information to Concurrent Program's Log File if set to 'Y'
1004 --
1005 -- Version :
1006 -- Initial Version 1.0
1007 --
1008 -- End of Comments.
1009
1010 PROCEDURE PO_Synch_All_OSPs
1011 (
1012 p_api_version IN NUMBER,
1013 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
1014 p_commit IN VARCHAR2 := FND_API.G_FALSE,
1015 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
1016 p_default IN VARCHAR2 := FND_API.G_TRUE,
1017 p_module_type IN VARCHAR2 := NULL,
1018 p_concurrent_flag IN VARCHAR2 := 'N',
1019 x_return_status OUT NOCOPY VARCHAR2,
1020 x_msg_count OUT NOCOPY NUMBER,
1021 x_msg_data OUT NOCOPY VARCHAR2) IS
1022
1023 l_api_version CONSTANT NUMBER := 1.0;
1024 l_api_name CONSTANT VARCHAR2(30) := 'PO_Synch_All_OSPs';
1025 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.PO_Synch_All_OSPs';
1026
1027 BEGIN
1028 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1029 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure. Operating Unit = ' || MO_GLOBAL.get_current_org_id());
1030 END IF;
1031
1032 -- No need of a Savepoint: Individual procedures commit or rollback
1033 -- within themselves.
1034 -- Standard start of API savepoint
1035 --SAVEPOINT PO_Synch_All_OSPs_pvt;
1036
1037 -- Standard call to check for call compatibility
1038 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
1039 G_PKG_NAME) THEN
1040 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1041 END IF;
1042
1043 -- Initialize message list if p_init_msg_list is set to TRUE
1044 IF FND_API.To_Boolean(p_init_msg_list) THEN
1045 FND_MSG_PUB.Initialize;
1046 END IF;
1047
1048 -- Initialize API return status to success
1049 x_return_status := FND_API.G_RET_STS_SUCCESS;
1050
1051 IF FND_API.to_boolean( p_default ) THEN
1052 -- No special default settings required in this API
1053 NULL;
1054 END IF;
1055
1056 -- Start processing
1057 IF (p_concurrent_flag = 'Y') THEN
1058 fnd_file.put_line(fnd_file.log, 'Starting PO Synch process...');
1059 END IF;
1060
1061 -- First make all associations (PO Header Id, PO Line Id, Status updates)
1062 ASSOCIATE_ALL_OSP_POs(p_api_version => 1.0,
1063 p_commit => p_commit, --Commit this independent of other operations
1064 x_return_status => x_return_status,
1065 x_msg_count => x_msg_count,
1066 x_msg_data => x_msg_data);
1067 IF (p_concurrent_flag = 'Y') THEN
1068 fnd_file.put_line(fnd_file.log, 'Completed Associating OSPs with POs');
1069 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1070 END IF;
1071 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1072 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Associating OSPs with POs, Return Status = ' || x_return_status);
1073 END IF;
1074
1075 /** The following calls to the Handle_Deleted_PO_Headers and Handle_Deleted_Sales_Orders
1076 * procedures were added by jaramana on March 31, 2006 to implement the ER 5074660
1077 ***/
1078 -- Handle Deleted PO Headers
1079 HANDLE_DELETED_PO_HEADERS(p_commit => p_commit, --Commit this independent of other operations
1080 x_return_status => x_return_status);
1081 IF (p_concurrent_flag = 'Y') THEN
1082 fnd_file.put_line(fnd_file.log, 'Completed Handling Deleted PO Headers');
1083 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1084 END IF;
1085 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1086 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Deleted PO Headers, Return Status = ' || x_return_status);
1087 END IF;
1088
1089 -- Handle Deleted Sales Orders
1090 HANDLE_DELETED_SALES_ORDERS(p_commit => p_commit, --Commit this independent of other operations
1091 x_return_status => x_return_status);
1092 IF (p_concurrent_flag = 'Y') THEN
1093 fnd_file.put_line(fnd_file.log, 'Completed Handling Deleted Sales Orders');
1094 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1095 END IF;
1096 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1097 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Deleted Sales Orders, Return Status = ' || x_return_status);
1098 END IF;
1099
1100 -- Handle Canceled POs
1101 HANDLE_CANCELLED_PO_LINES(p_commit => p_commit, --Commit this independent of other operations
1102 x_return_status => x_return_status);
1103 IF (p_concurrent_flag = 'Y') THEN
1104 fnd_file.put_line(fnd_file.log, 'Completed Handling Cancelled PO Lines');
1105 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1106 END IF;
1107 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1108 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Cancelled PO Lines, Return Status = ' || x_return_status);
1109 END IF;
1110
1111 -- Handle Deleted PO Lines
1112 HANDLE_DELETED_PO_LINES(p_commit => p_commit, --Commit this independent of other operations
1113 x_return_status => x_return_status);
1114 IF (p_concurrent_flag = 'Y') THEN
1115 fnd_file.put_line(fnd_file.log, 'Completed Handling Deleted PO Lines');
1116 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1117 END IF;
1118 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1119 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Deleted PO Lines, Return Status = ' || x_return_status);
1120 END IF;
1121
1122 -- Handle Approved POs
1123 HANDLE_APPROVED_POs(p_commit => p_commit, --Commit this independent of other operations
1124 x_return_status => x_return_status);
1125 IF (p_concurrent_flag = 'Y') THEN
1126 fnd_file.put_line(fnd_file.log, 'Completed Handling Approved POs');
1127 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1128 END IF;
1129 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1130 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Handling Approved POs, Return Status = ' || x_return_status);
1131 END IF;
1132
1133 -- Begin Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
1134 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1135 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing Purchase Orders. About to start processing Requisitions.');
1136 END IF;
1137 IF (p_concurrent_flag = 'Y') THEN
1138 fnd_file.put_line(fnd_file.log, 'Completed PO Synch Process. About to start processing Requisitions by calling AHL_OSP_PO_REQ_PVT.PO_Synch_All_Requisitions.');
1139 END IF;
1140 AHL_OSP_PO_REQ_PVT.PO_Synch_All_Requisitions(p_api_version => 1.0,
1141 p_init_msg_list => FND_API.G_FALSE,
1142 p_commit => p_commit, --Commit this independent of other operations
1143 p_validation_level => p_validation_level,
1144 p_default => p_default,
1145 p_module_type => p_module_type,
1146 p_concurrent_flag => p_concurrent_flag,
1147 x_return_status => x_return_status,
1148 x_msg_count => x_msg_count,
1149 x_msg_data => x_msg_data);
1150
1151 IF (p_concurrent_flag = 'Y') THEN
1152 fnd_file.put_line(fnd_file.log, 'Completed processing Requisitions.');
1153 fnd_file.put_line(fnd_file.log, 'Return Status = ' || x_return_status);
1154 END IF;
1155 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1156 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Returned from AHL_OSP_PO_REQ_PVT.PO_Synch_All_Requisitions, Return Status = ' || x_return_status);
1157 END IF;
1158 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1159 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1160 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'AHL_OSP_PO_REQ_PVT.PO_Synch_All_Requisitions Did not succeed');
1161 END IF;
1162 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1163 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
1164 ELSE
1165 RAISE FND_API.G_EXC_UNEXPECTED_ERROR; -- Rollback and return error
1166 END IF;
1167 END IF;
1168 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1169 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Completed Processing Requisitions. About to check for errors.');
1170 END IF;
1171 IF (p_concurrent_flag = 'Y') THEN
1172 fnd_file.put_line(fnd_file.log, 'Completed Requisition Synch Process. Checking for errors');
1173 END IF;
1174 -- End changes by jaramana on January 7, 2008 for the Requisition ER 6034236
1175 -- Check Error Message stack.
1176 x_msg_count := FND_MSG_PUB.count_msg;
1177 IF x_msg_count > 0 THEN
1178 RAISE FND_API.G_EXC_ERROR; --Note that commit might already have taken place
1179 END IF;
1180
1181 -- Standard check of p_commit
1182 -- No need to commit: Individual procedures commit or rollback
1183 -- within themselves.
1184 -- IF FND_API.TO_BOOLEAN(p_commit) THEN
1185 -- COMMIT WORK; --Note that commit might already have taken place
1186 -- END IF;
1187
1188 -- Standard call to get message count and if count is 1, get message info
1189 FND_MSG_PUB.Count_And_Get
1190 ( p_count => x_msg_count,
1191 p_data => x_msg_data,
1192 p_encoded => fnd_api.g_false
1193 );
1194
1195 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1196 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1197 END IF;
1198
1199 EXCEPTION
1200 WHEN FND_API.G_EXC_ERROR THEN
1201 -- No need to rollback: Individual procedures commit or rollback
1202 -- within themselves.
1203 -- ROLLBACK TO PO_Synch_All_OSPs_pvt; --Note that commit might already have taken place
1204 x_return_status := FND_API.G_RET_STS_ERROR;
1205 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1206 p_data => x_msg_data,
1207 p_encoded => fnd_api.g_false);
1208 IF (p_concurrent_flag = 'Y') THEN
1209 fnd_file.put_line(fnd_file.log, 'Caught Execution Exception: ' || x_msg_data);
1210 END IF;
1211 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1212 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Execution Exception: ' || x_msg_data);
1213 END IF;
1214
1215 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1216 -- No need to rollback: Individual procedures commit or rollback
1217 -- within themselves.
1218 -- ROLLBACK TO PO_Synch_All_OSPs_pvt; --Note that commit might already have taken place
1219 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1220 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1221 p_data => x_msg_data,
1222 p_encoded => fnd_api.g_false);
1223 IF (p_concurrent_flag = 'Y') THEN
1224 fnd_file.put_line(fnd_file.log, 'Caught Unexpected Exception: ' || x_msg_data);
1225 END IF;
1226 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1227 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Unexpected Exception: ' || x_msg_data);
1228 END IF;
1229
1230 WHEN OTHERS THEN
1231 -- No need to rollback: Individual procedures commit or rollback
1232 -- within themselves.
1233 -- ROLLBACK TO PO_Synch_All_OSPs_pvt; --Note that commit might already have taken place
1234 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1235 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1236 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
1237 p_procedure_name => 'PO_Synch_All_OSPs',
1238 p_error_text => SUBSTR(SQLERRM,1,240));
1239 END IF;
1240 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1241 p_data => x_msg_data,
1242 p_encoded => fnd_api.g_false);
1243 IF (p_concurrent_flag = 'Y') THEN
1244 fnd_file.put_line(fnd_file.log, 'Caught Unknown Exception: ' || x_msg_data);
1245 END IF;
1246 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1247 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, 'Caught Unknown Exception: ' || x_msg_data);
1248 END IF;
1249
1250 END PO_Synch_All_OSPs;
1251 --------------------------------------
1252 -- End Public Procedure Definitions --
1253 --------------------------------------
1254
1255 ----------------------------------------
1256 -- Public Function Definitions follow --
1257 ----------------------------------------
1258
1259 ----------------------------------------
1260 -- This function determines if the specified Purchase Order is closed
1261 ----------------------------------------
1262 FUNCTION Is_PO_Closed(p_po_header_id IN NUMBER) RETURN VARCHAR2 IS
1263
1264 --Modified by mpothuku on 16-Nov-06 for fixing the Bug 5673483
1265 CURSOR l_get_po_cstatus_csr(p_po_header_id IN NUMBER) IS
1266 SELECT NVL(CLOSED_CODE, G_PO_OPEN), NVL(CANCEL_FLAG, 'N') FROM PO_HEADERS_ALL
1267 WHERE PO_HEADER_ID = p_po_header_id;
1268
1269 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Is_PO_Closed';
1270 l_closed_status VARCHAR2(30);
1271 l_cancel_flag VARCHAR2(1);
1272
1273 BEGIN
1274 IF (p_po_header_id IS NULL OR p_po_header_id = FND_API.G_MISS_NUM) THEN
1275 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_PO_ID_NULL');
1276 FND_MSG_PUB.ADD;
1277 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1278 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1279 END IF;
1280 RETURN 'N';
1281 END IF;
1282 OPEN l_get_po_cstatus_csr(p_po_header_id);
1283 FETCH l_get_po_cstatus_csr INTO l_closed_status,l_cancel_flag;
1284 IF (l_get_po_cstatus_csr%NOTFOUND) THEN
1285 --Modified by mpothuku on 16-Nov-06 for fixing the Bug 5673483
1286 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_PO_ID_INVALID');
1287 FND_MESSAGE.Set_Token('PO_ID', p_po_header_id);
1288 FND_MSG_PUB.ADD;
1289 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1290 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1291 END IF;
1292 --This would mean that the PO is deleted from PO forms and we may need to do a Synch
1293 CLOSE l_get_po_cstatus_csr;
1294 RETURN 'N';
1295 END IF;
1296 CLOSE l_get_po_cstatus_csr;
1297 IF ((l_closed_status = G_PO_CLOSED) OR (l_closed_status = G_PO_FINALLY_CLOSED) OR (l_cancel_flag = 'Y')) THEN
1298 RETURN 'Y';
1299 ELSE
1300 RETURN 'N';
1301 END IF;
1302 END Is_PO_Closed;
1303
1304 ----------------------------------------
1305 -- This function determines if the specified OSP Order has any new PO Line
1306 ----------------------------------------
1307 FUNCTION Has_New_PO_Line(p_osp_order_id IN NUMBER) RETURN VARCHAR2 IS
1308 CURSOR l_get_new_po_line_csr(p_osp_order_id IN NUMBER) IS
1309 SELECT PL.PO_LINE_ID
1310 FROM PO_LINES_ALL PL, AHL_OSP_ORDERS_B OSP
1311 WHERE PL.PO_HEADER_ID = OSP.PO_HEADER_ID AND
1312 OSP.OSP_ORDER_ID = p_osp_order_id AND
1313 NVL(PL.CANCEL_FLAG, 'N') <> 'Y' AND
1314 PL.PO_LINE_ID NOT IN (SELECT PO_LINE_ID from AHL_OSP_ORDER_LINES
1315 WHERE OSP_ORDER_ID = p_osp_order_id);
1316 l_po_line_id NUMBER;
1317
1318 BEGIN
1319 OPEN l_get_new_po_line_csr(p_osp_order_id);
1320 FETCH l_get_new_po_line_csr INTO l_po_line_id;
1321 IF (l_get_new_po_line_csr%NOTFOUND) THEN
1322 -- No new PO Line
1323 CLOSE l_get_new_po_line_csr;
1324 RETURN 'N';
1325 ELSE
1326 -- Has new PO Line(s)
1327 CLOSE l_get_new_po_line_csr;
1328 RETURN 'Y';
1329 END IF;
1330 END Has_New_PO_Line;
1331
1332 -------------------------------------
1333 -- End Public Function Definitions --
1334 -------------------------------------
1335
1336 ----------------------------------------
1337 -- Local Procedure Definitions follow --
1338 ----------------------------------------
1339
1340 ----------------------------------------
1341 -- This Procedure validates the OSP Order for PO Header Creation
1342 ----------------------------------------
1343 PROCEDURE Validate_PO_Header(
1344 p_po_header_rec IN PO_Header_Rec_Type) IS
1345
1346 CURSOR l_validate_osp_csr(p_osp_order_id IN NUMBER) IS
1347 SELECT 'x' FROM AHL_OSP_ORDERS_B
1348 WHERE OSP_ORDER_ID = p_osp_order_id
1349 -- The following condition commented out by jaramana on request of jeli
1350 -- on May 27, 2005 so that status update can be done later.
1351 -- AND STATUS_CODE = G_OSP_SUBMITTED_STATUS
1352 FOR UPDATE OF PO_BATCH_ID, PO_REQUEST_ID; -- Lock Row
1353
1354 CURSOR l_validate_supplier_csr(p_supplier_id IN NUMBER) IS
1355 SELECT 'x' FROM PO_VENDORS_VIEW
1356 WHERE VENDOR_ID = p_supplier_id
1357 AND ENABLED_FLAG = G_YES_FLAG
1358 AND NVL(VENDOR_START_DATE_ACTIVE, SYSDATE - 1) <= SYSDATE
1359 AND NVL(VENDOR_END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE;
1360
1361 CURSOR l_validate_supp_site_csr(p_supp_site_id IN NUMBER,
1362 p_supp_id IN NUMBER) IS
1363 SELECT 'x' FROM PO_VENDOR_SITES
1364 WHERE VENDOR_SITE_ID = p_supp_site_id
1365 AND VENDOR_ID = p_supp_id
1366 AND NVL(INACTIVE_DATE, SYSDATE + 1) > SYSDATE
1367 AND NVL(RFQ_ONLY_SITE_FLAG, G_NO_FLAG) = G_NO_FLAG
1368 AND PURCHASING_SITE_FLAG = G_YES_FLAG;
1369 -- NOTE: Organization filtering is done by the PO_VENDOR_SITES view itself
1370
1371 -- Added by jaramana on May 27, 2005 for Inventory Service Order
1372 CURSOR l_validate_vendor_contact_csr(p_vendor_contact_id IN NUMBER,
1373 p_supp_site_id IN NUMBER) IS
1374 SELECT 'x' FROM PO_VENDOR_CONTACTS
1375 WHERE VENDOR_CONTACT_ID = p_vendor_contact_id
1376 AND VENDOR_SITE_ID = p_supp_site_id;
1377 -- May have to check INACTIVE_DATE > SYSDATE also?
1378
1379 CURSOR l_validate_buyer_csr(p_buyer_id IN NUMBER) IS
1380 SELECT 'x' FROM PO_AGENTS_NAME_V
1381 WHERE BUYER_ID = p_buyer_id;
1382 -- NOTE: Effective Date filtering is done by the PO_AGENTS_NAME_V view itself
1383
1384 l_dummy VARCHAR2(1);
1385 l_temp_count NUMBER;
1386 l_org_id NUMBER := NULL;
1387 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Validate_PO_Header';
1388
1389 BEGIN
1390
1391 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1392 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1393 END IF;
1394
1395 -- OSP Order Id
1396 IF (p_po_header_rec.OSP_ORDER_ID IS NULL OR p_po_header_rec.OSP_ORDER_ID = FND_API.G_MISS_NUM) THEN
1397 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_NULL');
1398 FND_MSG_PUB.ADD;
1399 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1400 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1401 END IF;
1402 ELSE
1403 OPEN l_validate_osp_csr(p_po_header_rec.OSP_ORDER_ID);
1404 FETCH l_validate_osp_csr INTO l_dummy;
1405 IF (l_validate_osp_csr%NOTFOUND) THEN
1406 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_INVALID');
1407 FND_MESSAGE.Set_Token('OSP_ID', p_po_header_rec.OSP_ORDER_ID);
1408 FND_MSG_PUB.ADD;
1409 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1410 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1411 END IF;
1412 END IF;
1413 CLOSE l_validate_osp_csr;
1414 END IF;
1415
1416 -- Supplier
1417 IF (p_po_header_rec.VENDOR_ID IS NULL OR p_po_header_rec.VENDOR_ID = FND_API.G_MISS_NUM) THEN
1418 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SUPPLIER_ID_NULL');
1419 FND_MSG_PUB.ADD;
1420 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1421 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1422 END IF;
1423 ELSE
1424 OPEN l_validate_supplier_csr(p_po_header_rec.VENDOR_ID);
1425 FETCH l_validate_supplier_csr INTO l_dummy;
1426 IF (l_validate_supplier_csr%NOTFOUND) THEN
1427 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SUPP_INVALID');
1428 FND_MESSAGE.Set_Token('SUPP_ID', p_po_header_rec.VENDOR_ID);
1429 FND_MSG_PUB.ADD;
1430 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1431 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1432 END IF;
1433 END IF;
1434 CLOSE l_validate_supplier_csr;
1435 END IF;
1436
1437 -- Supplier Site
1438 IF (p_po_header_rec.VENDOR_SITE_ID IS NULL OR p_po_header_rec.VENDOR_SITE_ID = FND_API.G_MISS_NUM) THEN
1439 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SSITE_ID_NULL');
1440 FND_MSG_PUB.ADD;
1441 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1442 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1443 END IF;
1444 ELSE
1445 OPEN l_validate_supp_site_csr(p_po_header_rec.VENDOR_SITE_ID, p_po_header_rec.VENDOR_ID);
1446 FETCH l_validate_supp_site_csr INTO l_dummy;
1447 IF (l_validate_supp_site_csr%NOTFOUND) THEN
1448 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SSITE_INVALID');
1449 FND_MESSAGE.Set_Token('SS_ID', p_po_header_rec.VENDOR_SITE_ID);
1450 FND_MSG_PUB.ADD;
1451 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1452 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1453 END IF;
1454 END IF;
1455 CLOSE l_validate_supp_site_csr;
1456 END IF;
1457
1458 -- Added by jaramana on May 27, 2005 for Inventory Service Order
1459 -- Vendor Contact (Optional)
1460 IF (p_po_header_rec.VENDOR_CONTACT_ID IS NOT NULL AND p_po_header_rec.VENDOR_CONTACT_ID <> FND_API.G_MISS_NUM) THEN
1461 OPEN l_validate_vendor_contact_csr(p_po_header_rec.VENDOR_CONTACT_ID, p_po_header_rec.VENDOR_SITE_ID);
1462 FETCH l_validate_vendor_contact_csr INTO l_dummy;
1463 IF (l_validate_vendor_contact_csr%NOTFOUND) THEN
1464 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_VCONTACT_INVALID');
1465 FND_MESSAGE.Set_Token('V_CONTACT_ID', p_po_header_rec.VENDOR_CONTACT_ID);
1466 FND_MSG_PUB.ADD;
1467 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1468 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1469 END IF;
1470 END IF;
1471 CLOSE l_validate_vendor_contact_csr;
1472 END IF;
1473 -- End Change for Inventory Service Order
1474
1475 -- Buyer
1476 IF (p_po_header_rec.BUYER_ID IS NULL OR p_po_header_rec.BUYER_ID = FND_API.G_MISS_NUM) THEN
1477 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_BUYER_ID_NULL');
1478 FND_MSG_PUB.ADD;
1479 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1480 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1481 END IF;
1482 ELSE
1483 OPEN l_validate_buyer_csr(p_po_header_rec.BUYER_ID);
1484 FETCH l_validate_buyer_csr INTO l_dummy;
1485 IF (l_validate_buyer_csr%NOTFOUND) THEN
1486 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_BUYER_INVALID');
1487 FND_MESSAGE.Set_Token('BUYER_ID', p_po_header_rec.BUYER_ID);
1488 FND_MSG_PUB.ADD;
1489 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1490 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1491 END IF;
1492 END IF;
1493 CLOSE l_validate_buyer_csr;
1494 END IF;
1495
1496 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1497 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1498 END IF;
1499
1500 END Validate_PO_Header;
1501
1502 ----------------------------------------
1503 -- This Procedure validates the PO Lines
1504 ----------------------------------------
1505 PROCEDURE Validate_PO_Lines(
1506 p_po_line_tbl IN PO_Line_Tbl_Type,
1507 p_osp_order_id IN NUMBER) IS
1508
1509 CURSOR l_validate_item_csr(p_item_id IN NUMBER,
1510 p_org_id IN NUMBER) IS
1511 SELECT 'x' FROM MTL_SYSTEM_ITEMS_KFV
1512 WHERE INVENTORY_ITEM_ID = p_item_id
1513 AND ENABLED_FLAG = G_YES_FLAG
1514 AND PURCHASING_ENABLED_FLAG = G_YES_FLAG
1515 AND INVENTORY_ITEM_FLAG = G_NO_FLAG -- No Physical Items
1516 AND NVL(START_DATE_ACTIVE, SYSDATE - 1) <= SYSDATE
1517 AND NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE
1518 AND ORGANIZATION_ID = p_org_id
1519 AND NVL(OUTSIDE_OPERATION_FLAG, G_NO_FLAG) = G_NO_FLAG;
1520
1521 CURSOR l_validate_line_type_csr(p_line_type_id IN NUMBER) IS
1522 SELECT 'x' FROM PO_LINE_TYPES
1523 WHERE ORDER_TYPE_LOOKUP_CODE = G_PO_LINE_TYPE_QUANTITY
1524 AND NVL(OUTSIDE_OPERATION_FLAG, G_NO_FLAG) = G_NO_FLAG
1525 AND LINE_TYPE_ID = p_line_type_id;
1526
1527 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Validate_PO_Lines';
1528 l_org_id NUMBER := NULL;
1529 l_dummy VARCHAR2(1);
1530
1531 BEGIN
1532 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1533 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1534 END IF;
1535
1536 -- Get the current Org
1537 l_org_id := MO_GLOBAL.get_current_org_id();
1538
1539 IF (l_org_id IS NULL) THEN
1540 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_ORG_NOT_SET');
1541 FND_MSG_PUB.ADD;
1542 IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1543 FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED, L_DEBUG_KEY, FALSE);
1544 END IF;
1545 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1546 END IF;
1547
1548 --dbms_output.put_line('p_po_line_tbl.COUNT = ' || p_po_line_tbl.COUNT);
1549 -- Non zero count
1550 IF (p_po_line_tbl.COUNT = 0) THEN
1551 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NO_PO_LINES');
1552 FND_MSG_PUB.ADD;
1553 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1554 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1555 END IF;
1556 RETURN; -- Cannot do any further validation
1557 END IF;
1558
1559 FOR i IN p_po_line_tbl.FIRST..p_po_line_tbl.LAST LOOP
1560 -- Item
1561 IF (p_po_line_tbl(i).ITEM_ID IS NOT NULL AND p_po_line_tbl(i).ITEM_ID <> FND_API.G_MISS_NUM) THEN
1562 -- Non One-time Item
1563 -- Changed by jaramana on May 26, 2005 to fix Bug 4393374
1564 -- OPEN l_validate_item_csr(p_po_line_tbl(i).ITEM_ID, l_org_id);
1565 OPEN l_validate_item_csr(p_po_line_tbl(i).ITEM_ID, p_po_line_tbl(i).SHIP_TO_ORG_ID);
1566 FETCH l_validate_item_csr INTO l_dummy;
1567 IF (l_validate_item_csr%NOTFOUND) THEN
1568 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_ITEM_INVALID');
1569 FND_MESSAGE.Set_Token('ITEM', p_po_line_tbl(i).ITEM_ID);
1570 FND_MSG_PUB.ADD;
1571 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1572 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1573 END IF;
1574 END IF;
1575 CLOSE l_validate_item_csr;
1576 ELSE
1577 -- One-time Item: Description is mandatory
1578 IF (TRIM(p_po_line_tbl(i).ITEM_DESCRIPTION) IS NULL OR p_po_line_tbl(i).ITEM_DESCRIPTION = FND_API.G_MISS_CHAR) THEN
1579 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_IDESC_NULL');
1580 FND_MSG_PUB.ADD;
1581 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1582 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1583 END IF;
1584 END IF;
1585 -- One-time Item: UOM is mandatory
1586 IF (TRIM(p_po_line_tbl(i).UOM_CODE) IS NULL OR p_po_line_tbl(i).UOM_CODE = FND_API.G_MISS_CHAR) THEN
1587 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_UOM_CODE_NULL');
1588 FND_MSG_PUB.ADD;
1589 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1590 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1591 END IF;
1592 END IF;
1593 END IF;
1594
1595 -- Quantity
1596 IF (p_po_line_tbl(i).QUANTITY IS NULL OR p_po_line_tbl(i).QUANTITY = FND_API.G_MISS_NUM) THEN
1597 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_QUANTITY_NULL');
1598 FND_MSG_PUB.ADD;
1599 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1600 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1601 END IF;
1602 ELSE
1603 IF (p_po_line_tbl(i).QUANTITY <= 0) THEN
1604 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_QUANTITY_INVALID');
1605 FND_MESSAGE.Set_Token('QUANTITY', p_po_line_tbl(i).QUANTITY);
1606 FND_MSG_PUB.ADD;
1607 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1608 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1609 END IF;
1610 END IF;
1611 END IF;
1612
1613 -- Need By Date
1614 IF (p_po_line_tbl(i).NEED_BY_DATE IS NULL OR p_po_line_tbl(i).NEED_BY_DATE = FND_API.G_MISS_DATE) THEN
1615 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NEED_BY_DATE_NULL');
1616 FND_MSG_PUB.ADD;
1617 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1618 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1619 END IF;
1620 ELSE
1621 IF (TRUNC(p_po_line_tbl(i).NEED_BY_DATE) < TRUNC(SYSDATE)) THEN
1622 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_NBDATE_INVALID');
1623 FND_MESSAGE.Set_Token('NBDATE', p_po_line_tbl(i).NEED_BY_DATE);
1624 FND_MSG_PUB.ADD;
1625 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1626 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1627 END IF;
1628 END IF;
1629 END IF;
1630
1631 -- Ship To Organization
1632 IF (p_po_line_tbl(i).SHIP_TO_ORG_ID IS NULL OR p_po_line_tbl(i).SHIP_TO_ORG_ID = FND_API.G_MISS_NUM) THEN
1633 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SHIP_TO_ORG_NULL');
1634 FND_MSG_PUB.ADD;
1635 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1636 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1637 END IF;
1638 END IF;
1639
1640 -- Commented out by jaramana on May 27, 2005 for Inventory Service Orders.
1641 -- For Inventory based OSP Lines, it will not be possible to get this location.
1642 -- For workorder based lines, we get this from the workorder Department.
1643 -- Need to check if this field is mandatory for PO creation.
1644 -- Ship To Location
1645 /***
1646 IF (p_po_line_tbl(i).SHIP_TO_LOC_ID IS NULL OR p_po_line_tbl(i).SHIP_TO_LOC_ID = FND_API.G_MISS_NUM) THEN
1647 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_SHIP_TO_LOC_NULL');
1648 FND_MSG_PUB.ADD;
1649 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1650 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1651 END IF;
1652 END IF;
1653 ***/
1654 -- Line Type
1655 IF (p_po_line_tbl(i).PO_LINE_TYPE_ID IS NULL OR p_po_line_tbl(i).PO_LINE_TYPE_ID = FND_API.G_MISS_NUM) THEN
1656 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_LN_TYPE_ID_NULL');
1657 FND_MSG_PUB.ADD;
1658 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1659 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1660 END IF;
1661 ELSE
1662 OPEN l_validate_line_type_csr(p_po_line_tbl(i).PO_LINE_TYPE_ID);
1663 FETCH l_validate_line_type_csr INTO l_dummy;
1664 IF (l_validate_line_type_csr%NOTFOUND) THEN
1665 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_LN_TYPE_ID_INVALID');
1666 FND_MESSAGE.Set_Token('LINE_TYPE_ID', p_po_line_tbl(i).PO_LINE_TYPE_ID);
1667 FND_MSG_PUB.ADD;
1668 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1669 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1670 END IF;
1671 END IF;
1672 CLOSE l_validate_line_type_csr;
1673 END IF;
1674
1675 END LOOP;
1676 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1677 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1678 END IF;
1679 END Validate_PO_Lines;
1680
1681 ----------------------------------------
1682 -- This Procedure inserts a record into the PO_HEADERS_INTERFACE table
1683 ----------------------------------------
1684 PROCEDURE Insert_PO_Header(
1685 p_po_header_rec IN PO_Header_Rec_Type,
1686 x_intf_header_id OUT NOCOPY NUMBER,
1687 x_batch_id OUT NOCOPY NUMBER) IS
1688
1689 CURSOR l_get_osp_order_dtls_csr(p_osp_order_id IN NUMBER) IS
1690 SELECT OSP_ORDER_NUMBER, DESCRIPTION FROM AHL_OSP_ORDERS_VL
1691 WHERE OSP_ORDER_ID = p_osp_order_id;
1692
1693 l_description VARCHAR2(256);
1694 l_OSP_description VARCHAR2(256) := NULL;
1695 l_interface_src_code VARCHAR2(30);
1696 l_intf_hdr_id NUMBER;
1697 l_batch_id NUMBER;
1698 l_currency_code VARCHAR2(15) := NULL;
1699 l_temp_n NUMBER := 0;
1700 l_temp_v VARCHAR2(240) := NULL;
1701 l_curr_org_id NUMBER;
1702
1703 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Insert_PO_Header';
1704
1705 BEGIN
1706 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1707 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1708 END IF;
1709 -- Get Batch Id
1710 /*
1711 SELECT NVL(MAX(batch_id), 0) + 1 INTO l_batch_id FROM po_headers_interface;
1712 */
1713 -- Changes made by jaramana on December 19, 2005
1714 -- to improve the performace of this SQL by removing the Full Index Scan
1715 -- Since batch_id is optional, no need to get it using the max value.
1716 -- Instead, hard code it to the OSP Order Id
1717 l_batch_id := p_po_header_rec.OSP_ORDER_ID;
1718
1719 -- Generate PO Header Id
1720 SELECT PO_HEADERS_INTERFACE_S.NEXTVAL INTO l_intf_hdr_id FROM sys.dual;
1721
1722 -- Description
1723 OPEN l_get_osp_order_dtls_csr(p_po_header_rec.OSP_ORDER_ID);
1724 FETCH l_get_osp_order_dtls_csr INTO l_temp_n, l_OSP_description;
1725 CLOSE l_get_osp_order_dtls_csr;
1726 l_description := G_AHL_OSP_PREFIX || l_temp_n;
1727 IF(l_OSP_description IS NOT NULL) THEN
1728 l_description := l_description || ' - ' || SUBSTR(l_OSP_description, 1, 200);
1729 END IF;
1730
1731 -- Get currency if required
1732 -- If set either at Site or Supplier Level, no need to set.
1733 -- Else retrieve from Set-Of-Books and set explicitly
1734 BEGIN
1735 -- Check if currency is available at vendor site level
1736 SELECT invoice_currency_code INTO l_temp_v FROM po_vendor_sites
1737 WHERE vendor_site_id = p_po_header_rec.vendor_site_id AND
1738 vendor_id = p_po_header_rec.vendor_id;
1739 IF(l_temp_v IS NULL) THEN
1740 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1741 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Could not get currency for Supplier ' || p_po_header_rec.vendor_id || ' Trying at Site ' || p_po_header_rec.vendor_site_id);
1742 END IF;
1743 -- If not check if available at vendor level
1744 SELECT invoice_currency_code INTO l_temp_v FROM po_vendors
1745 WHERE vendor_id = p_po_header_rec.vendor_id;
1746 IF(l_temp_v IS NULL) THEN
1747 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1748 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Could not get currency for Supplier ' || p_po_header_rec.vendor_id || ' and Site ' || p_po_header_rec.vendor_site_id || ', Trying from set of Books.');
1749 END IF;
1750 -- If not, get currency from set_of_books and set l_currency_code
1751 SELECT GSB.currency_code INTO l_currency_code
1752 FROM FINANCIALS_SYSTEM_PARAMETERS FSP, GL_SETS_OF_BOOKS GSB
1753 WHERE FSP.set_of_books_id = GSB.set_of_books_id;
1754 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1755 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Got currency from Set Of Books: ' || l_currency_code);
1756 END IF;
1757 END IF;
1758 END IF;
1759 EXCEPTION
1760 WHEN OTHERS THEN
1761 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_CURRENCY_NOT_SET');
1762 FND_MSG_PUB.ADD;
1763 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1764 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
1765 END IF;
1766 RAISE;
1767 END;
1768
1769 -- Added by jaramana on Sep 9, 2005 for MOAC Uptake
1770 l_curr_org_id := MO_GLOBAL.get_current_org_id();
1771
1772 -- Insert row into PO_HEADERS_INTERFACE
1773 INSERT INTO PO_HEADERS_INTERFACE (
1774 INTERFACE_HEADER_ID,
1775 BATCH_ID,
1776 INTERFACE_SOURCE_CODE,
1777 PROCESS_CODE,
1778 ACTION,
1779 DOCUMENT_TYPE_CODE,
1780 CURRENCY_CODE,
1781 AGENT_ID,
1782 VENDOR_ID,
1783 VENDOR_SITE_ID,
1784 VENDOR_CONTACT_ID, -- Added by jaramana on May 27, 2005 for Inventory Service Orders
1785 COMMENTS,
1786 PROGRAM_ID,
1787 PROGRAM_APPLICATION_ID,
1788 REFERENCE_NUM,
1789 ORG_ID -- Added by jaramana on Sep 9, 2005 for MOAC Uptake
1790 ) VALUES (
1791 l_intf_hdr_id,
1792 l_batch_id,
1793 AHL_GLOBAL.AHL_APP_SHORT_NAME, -- INTERFACE_SOURCE_CODE = 'AHL'
1794 G_PROCESS_CODE, -- 'PENDING'
1795 G_ACTION_CODE, -- 'ORIGINAL'
1796 G_DOC_TYPE_CODE, -- 'STANDARD'
1797 l_currency_code,
1798 p_po_header_rec.BUYER_ID,
1799 p_po_header_rec.VENDOR_ID,
1800 p_po_header_rec.VENDOR_SITE_ID,
1801 p_po_header_rec.VENDOR_CONTACT_ID, -- Added by jaramana on May 27, 2005 for Inventory Service Orders
1802 l_description,
1803 AHL_GLOBAL.AHL_OSP_PROGRAM_ID,
1804 AHL_GLOBAL.AHL_APPLICATION_ID,
1805 p_po_header_rec.OSP_ORDER_ID,
1806 l_curr_org_id -- Added by jaramana on Sep 9, 2005 for MOAC Uptake
1807 );
1808
1809 -- Set Output parameters
1810 x_intf_header_id := l_intf_hdr_id;
1811 x_batch_id := l_batch_id;
1812
1813 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1814 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
1815 END IF;
1816
1817 END Insert_PO_Header;
1818
1819 ----------------------------------------
1820 -- This Procedure inserts a record into the PO_LINES_INTERFACE table
1821 ----------------------------------------
1822 PROCEDURE Insert_PO_Lines(
1823 p_po_line_tbl IN PO_Line_Tbl_Type,
1824 p_intf_header_id IN NUMBER) IS
1825
1826 -- Commented out by jaramana on June 22, 2005
1827 -- Calling the new utility method Get_Item_Price instead
1828 /*
1829 CURSOR l_chk_price_csr(p_item_id IN NUMBER,
1830 p_org_id IN NUMBER) IS
1831 SELECT 'x' FROM MTL_SYSTEM_ITEMS_KFV
1832 WHERE INVENTORY_ITEM_ID = p_item_id
1833 AND ORGANIZATION_ID = p_org_id
1834 AND LIST_PRICE_PER_UNIT IS NOT NULL;
1835 */
1836
1837 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
1838 CURSOR get_prj_task_comp_date_csr (c_task_id IN NUMBER) IS
1839 SELECT COMPLETION_DATE from pa_tasks
1840 where task_id = c_task_id;
1841 l_task_completion_date DATE;
1842
1843 --Added by mpothuku on 12-oct-2007 as until the ER 5758813 is implemented, the visit task dates will not be propagated to projects.
1844 CURSOR get_vst_task_comp_date_csr (c_osp_line_id IN NUMBER) IS
1845 SELECT vtsk.end_date_time
1846 from ahl_visit_tasks_b vtsk,
1847 ahl_osp_order_lines ospl,
1848 ahl_workorders wo
1849 where ospl.osp_order_line_id = c_osp_line_id
1850 and ospl.workorder_id = wo.workorder_id
1851 and wo.visit_task_id = vtsk.visit_task_id;
1852 l_vst_task_completion_date DATE;
1853
1854 l_expenditure_item_type pa_expenditure_types.expenditure_type%type;
1855
1856 l_org_id NUMBER := NULL;
1857 l_price NUMBER := NULL;
1858 l_category VARCHAR2(30) := NULL;
1859 l_dummy VARCHAR2(1);
1860 l_line_num NUMBER := 0;
1861 l_ship_to_org_id NUMBER := NULL;
1862 l_ship_to_loc_id NUMBER := NULL;
1863
1864 -- Added by jaramana on Nov 28, 2005 for ER 4736326
1865 -- To create distributions automatically
1866 l_intf_line_id NUMBER;
1867 --Added by mpothuku on 21-Aug-2007 to fix the Bug 6436184
1868 l_charge_acct_id NUMBER := NULL;
1869
1870 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Insert_PO_Lines';
1871
1872 BEGIN
1873
1874 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1875 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
1876 END IF;
1877
1878 -- Get the current Org to get Item Price
1879 l_org_id := MO_GLOBAL.get_current_org_id();
1880
1881 FOR i IN p_po_line_tbl.FIRST..p_po_line_tbl.LAST LOOP
1882 IF (p_po_line_tbl(i).ITEM_ID IS NULL) THEN
1883 -- One time items defaulting
1884 l_price := G_DEFAULT_PRICE;
1885 l_category := G_DEFAULT_CATEGORY;
1886 ELSE
1887 l_category := null; -- Purchasing defaults the category from the item
1888 -- Changed by jaramana on June 22, 2005
1889 l_price := Get_Item_Price(p_po_line_tbl(i).OSP_LINE_ID);
1890 END IF;
1891
1892 -- Added by jaramana on Nov 28, 2005 for ER 4736326
1893 -- Generate PO Line Interface Id
1894 SELECT PO_LINES_INTERFACE_S.NEXTVAL INTO l_intf_line_id FROM sys.dual;
1895 -- Insert row into PO_LINES_INTERFACE
1896 INSERT INTO PO_LINES_INTERFACE (
1897 INTERFACE_LINE_ID,
1898 INTERFACE_HEADER_ID,
1899 LINE_NUM,
1900 LINE_TYPE_ID,
1901 ITEM_ID,
1902 ITEM_DESCRIPTION,
1903 CATEGORY,
1904 UOM_CODE,
1905 UNIT_PRICE,
1906 QUANTITY,
1907 NEED_BY_DATE,
1908 LINE_REFERENCE_NUM,
1909 SHIP_TO_ORGANIZATION_ID,
1910 SHIP_TO_LOCATION_ID,
1911 PROGRAM_ID,
1912 PROGRAM_APPLICATION_ID
1913 ) VALUES (
1914 l_intf_line_id,
1915 p_intf_header_id,
1916 p_po_line_tbl(i).LINE_NUMBER,
1917 p_po_line_tbl(i).PO_LINE_TYPE_ID,
1918 p_po_line_tbl(i).ITEM_ID,
1919 p_po_line_tbl(i).ITEM_DESCRIPTION,
1920 l_category,
1921 p_po_line_tbl(i).UOM_CODE,
1922 l_price,
1923 p_po_line_tbl(i).QUANTITY,
1924 p_po_line_tbl(i).NEED_BY_DATE,
1925 p_po_line_tbl(i).OSP_LINE_ID,
1926 p_po_line_tbl(i).SHIP_TO_ORG_ID,
1927 p_po_line_tbl(i).SHIP_TO_LOC_ID,
1928 AHL_GLOBAL.AHL_OSP_PROGRAM_ID,
1929 AHL_GLOBAL.AHL_APPLICATION_ID
1930 );
1931 -- Added by jaramana on Jan 5, 2006 for ER 4736326
1932 -- Check the profile OSP Default PO Distribution Creation to see if the Distribution is to be created
1933 IF (NVL(FND_PROFILE.VALUE('AHL_OSP_DEF_PO_DIST'), 'N') = 'Y') THEN
1934 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
1935 -- Insert row into PO_DISTRIBUTIONS_INTERFACE to create a distribution
1936 IF p_po_line_tbl(i).task_id IS NOT NULL THEN
1937 OPEN get_prj_task_comp_date_csr(p_po_line_tbl(i).task_id);
1938 FETCH get_prj_task_comp_date_csr INTO l_task_completion_date;
1939 CLOSE get_prj_task_comp_date_csr;
1940 --If the project task completion is not populated (ER 5758813), then use the visit task's end date.
1941 IF(l_task_completion_date is NULL) THEN
1942 OPEN get_vst_task_comp_date_csr(p_po_line_tbl(i).osp_line_id);
1943 FETCH get_vst_task_comp_date_csr INTO l_task_completion_date;
1944 CLOSE get_vst_task_comp_date_csr;
1945 END IF;
1946 ELSE
1947 l_task_completion_date := NULL;
1948 END IF;
1949
1950 l_expenditure_item_type := FND_PROFILE.VALUE('AHL_OSP_EXPENDITURE_TYPE');
1951 IF(l_expenditure_item_type IS NULL) THEN
1952 l_expenditure_item_type := 'Outside Processing';
1953 END IF;
1954
1955 --Fix for the Bug 6436184
1956 l_charge_acct_id := get_charge_account_id(p_po_line_tbl(i).SHIP_TO_ORG_ID, p_po_line_tbl(i).ITEM_ID);
1957 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1958 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id before inserting: '|| l_charge_acct_id);
1959 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'));
1960 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_expenditure_item_type : '|| l_expenditure_item_type);
1961 END IF;
1962 --mpothuku End
1963
1964 INSERT INTO PO_DISTRIBUTIONS_INTERFACE (
1965 INTERFACE_HEADER_ID,
1966 INTERFACE_LINE_ID,
1967 INTERFACE_DISTRIBUTION_ID,
1968 QUANTITY_ORDERED,
1969 PROGRAM_ID,
1970 PROGRAM_APPLICATION_ID,
1971 CREATION_DATE,
1972 CREATED_BY
1973 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
1974 ,WIP_ENTITY_ID
1975 ,PROJECT_RELEATED_FLAG
1976 ,PROJECT_ACCOUNTING_CONTEXT
1977 ,PROJECT_ID
1978 ,TASK_ID
1979 ,EXPENDITURE_TYPE
1980 ,EXPENDITURE_ORGANIZATION_ID
1981 ,EXPENDITURE_ITEM_DATE
1982 ,CHARGE_ACCOUNT_ID
1983
1984 ) VALUES (
1985 p_intf_header_id,
1986 l_intf_line_id,
1987 PO_DISTRIBUTIONS_INTERFACE_S.NEXTVAL,
1988 p_po_line_tbl(i).QUANTITY,
1989 AHL_GLOBAL.AHL_OSP_PROGRAM_ID,
1990 AHL_GLOBAL.AHL_APPLICATION_ID,
1991 SYSDATE,
1992 FND_GLOBAL.USER_ID
1993 -- Added by mpothuku on 10-oct-2007 to fix bug 6431740
1994 ,p_po_line_tbl(i).wip_entity_id
1995 ,DECODE(p_po_line_tbl(i).project_id, null, null, 'Y')
1996 ,DECODE(p_po_line_tbl(i).project_id, null, null, 'Y')
1997 ,p_po_line_tbl(i).project_id
1998 ,p_po_line_tbl(i).task_id
1999 ,DECODE(p_po_line_tbl(i).project_id, null, null, l_expenditure_item_type)
2000 ,DECODE(p_po_line_tbl(i).project_id, null, null,p_po_line_tbl(i).SHIP_TO_ORG_ID)
2001 ,l_task_completion_date
2002 ,l_charge_acct_id
2003 );
2004 --Added by mpothuku on 10-oct-2007 to fix bug 6431740
2005 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2006 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
2007 ' Inserting into PO_DISTRIBUTIONS_INTERFACE. INTERFACE_HEADER_ID = ' || p_intf_header_id ||
2008 ', INTERFACE_LINE_ID = ' || l_intf_line_id ||
2009 ', WIP_ENTITY_ID = ' || p_po_line_tbl(i).wip_entity_id ||
2010 ', PROJECT_ID = ' || p_po_line_tbl(i).project_id ||
2011 ', TASK_ID = ' || p_po_line_tbl(i).task_id ||
2012 ', EXPENDITURE_TYPE = ' ||l_expenditure_item_type ||
2013 ', EXPENDITURE_ORGANIZATION_ID = ' || p_po_line_tbl(i).SHIP_TO_ORG_ID ||
2014 ', EXPENDITURE_ITEM_DATE = ' || to_char(l_task_completion_date, 'DD-MON-YYYY HH24:MI:SS'));
2015 END IF;
2016 END IF;
2017 END LOOP;
2018 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2019 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2020 END IF;
2021 END Insert_PO_Lines;
2022
2023 ----------------------------------------
2024 -- This Procedure calls the Concurrent Program to Create
2025 -- Purchase Order
2026 ----------------------------------------
2027 PROCEDURE Call_PDOI_Program(
2028 p_batch_id IN NUMBER,
2029 x_request_id OUT NOCOPY NUMBER) IS
2030
2031 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Call_PDOI_Program';
2032 l_curr_org_id NUMBER;
2033
2034 BEGIN
2035 -- Added by jaramana on Sep 9, 2005 for MOAC Uptake
2036 l_curr_org_id := MO_GLOBAL.get_current_org_id();
2037 FND_REQUEST.SET_ORG_ID(l_curr_org_id);
2038
2039 x_request_id := FND_REQUEST.SUBMIT_REQUEST(
2040 application => G_PO_APP_CODE,
2041 program => G_PDOI_CODE,
2042 argument1 => NULL, -- Buyer
2043 argument2 => G_DOC_TYPE_CODE, -- Document Type
2044 argument3 => NULL, -- Document Sub Type
2045 argument4 => G_NO_FLAG, -- Create or Update Items
2046 argument5 => NULL, -- Create Sourcing Rules
2047 argument6 => G_INCOMPLETE_STATUS, -- Approval Status
2048 argument7 => NULL, -- Release Generation Method
2049 argument8 => p_batch_id, -- Batch Id
2050 argument9 => NULL, --Org Id
2051 argument10 => NULL --global agreement flag
2052 );
2053
2054 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2055 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Request Submitted. Request Id = ' || x_request_id);
2056 END IF;
2057 END Call_PDOI_Program;
2058
2059 ----------------------------------------
2060 -- This Procedure calls the PDOI API directly to Create Purchase Order
2061 -- TO BE USED FOR DEBUGGING PURPOSE ONLY
2062 ----------------------------------------
2063 PROCEDURE Call_PDOI_API(p_batch_id IN NUMBER) IS
2064 BEGIN
2065 po_docs_interface_sv5.process_po_headers_interface(
2066 X_selected_batch_id => p_batch_id,
2067 X_buyer_id => NULL,
2068 X_document_type => G_DOC_TYPE_CODE,
2069 X_document_subtype => NULL,
2070 X_create_items => G_NO_FLAG,
2071 X_create_sourcing_rules_flag => G_NO_FLAG,
2072 X_rel_gen_method => NULL,
2073 X_approved_status => NULL,
2074 X_commit_interval => 1,
2075 X_process_code => G_PROCESS_CODE);
2076
2077 --dbms_output.enable;
2078 --dbms_output.put_line('==>PDOI completed at ' || fnd_date.date_to_chardt(SYSDATE));
2079 --dbms_output.put_line('See log file of comops/comfam in /sqlcom/log directory.');
2080
2081 END Call_PDOI_API;
2082
2083 ----------------------------------------
2084 -- This Local Procedure updates OSP Tables with
2085 -- PO Information for one OSP Order
2086 ----------------------------------------
2087 PROCEDURE Associate_OSP_PO(
2088 p_osp_order_id IN NUMBER,
2089 x_po_header_id OUT NOCOPY NUMBER) IS
2090
2091 /*
2092 CURSOR l_get_po_hdr_csr(p_osp_order_id IN NUMBER) IS
2093 SELECT PO_HEADER_ID FROM PO_HEADERS_ALL
2094 WHERE REFERENCE_NUM = p_osp_order_id AND
2095 INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME;
2096 */
2097 -- Changes made by jaramana on December 19, 2005
2098 -- to improve the performace of this SQL by removing the Full Table Access
2099 CURSOR l_get_po_hdr_csr(p_osp_order_id IN NUMBER) IS
2100 SELECT PO.PO_HEADER_ID FROM PO_HEADERS_ALL PO, AHL_OSP_ORDERS_B OSP
2101 WHERE PO.REFERENCE_NUM = p_osp_order_id AND
2102 OSP.OSP_ORDER_ID = p_osp_order_id AND
2103 PO.VENDOR_ID = OSP.VENDOR_ID AND
2104 PO.VENDOR_SITE_ID = OSP.VENDOR_SITE_ID AND
2105 PO.INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME;
2106
2107 CURSOR l_get_osp_lines_csr(p_osp_order_id IN NUMBER) IS
2108 SELECT OSP_ORDER_LINE_ID FROM AHL_OSP_ORDER_LINES
2109 WHERE PO_LINE_ID IS NULL
2110 AND OSP_ORDER_ID = p_osp_order_id;
2111
2112 CURSOR l_get_po_line_csr(p_osp_order_line_id IN NUMBER,
2113 p_po_header_id IN NUMBER) IS
2114 SELECT PO_LINE_ID FROM PO_LINES_ALL
2115 WHERE LINE_REFERENCE_NUM = p_osp_order_line_id AND
2116 PO_HEADER_ID = p_po_header_id;
2117
2118 CURSOR l_get_request_id_csr(p_osp_order_id IN NUMBER) IS
2119 SELECT PO_REQUEST_ID FROM AHL_OSP_ORDERS_B
2120 WHERE OSP_ORDER_ID = p_osp_order_id;
2121
2122 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Associate_OSP_PO';
2123 l_po_header_id NUMBER;
2124 l_osp_order_line_id NUMBER;
2125 l_po_line_id NUMBER;
2126 l_request_id NUMBER;
2127 l_phase VARCHAR2(100);
2128 l_status VARCHAR2(100);
2129 l_dev_phase VARCHAR2(100);
2130 l_dev_status VARCHAR2(100);
2131 l_message VARCHAR2(1000);
2132 l_retval BOOLEAN;
2133
2134 BEGIN
2135 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2136 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2137 END IF;
2138
2139 OPEN l_get_po_hdr_csr(p_osp_order_id);
2140 FETCH l_get_po_hdr_csr INTO x_po_header_id;
2141 IF (l_get_po_hdr_csr%FOUND) THEN
2142 -- Update AHL_OSP_ORDERS_B's PO_HEADER_ID
2143 --dbms_output.put_line('About to Update AHL_OSP_ORDERS_B.PO_HEADER_ID with ' || x_po_header_id);
2144 Set_PO_Header_Id(p_osp_order_id => p_osp_order_id,
2145 p_po_header_id => x_po_header_id);
2146
2147 --dbms_output.put_line('Updated po_header_id. Logging Transaction...');
2148 AHL_OSP_UTIL_PKG.Log_Transaction(p_trans_type_code => G_TXN_TYPE_PO_SYNCH,
2149 p_src_doc_id => p_osp_order_id,
2150 p_src_doc_type_code => G_DOC_TYPE_OSP,
2151 p_dest_doc_id => x_po_header_id,
2152 p_dest_doc_type_code => G_DOC_TYPE_PO);
2153
2154 -- Get PO Lines for all OSP Lines
2155 --dbms_output.put_line('About to get all lines...');
2156 OPEN l_get_osp_lines_csr(p_osp_order_id);
2157 LOOP
2158 FETCH l_get_osp_lines_csr INTO l_osp_order_line_id;
2159 EXIT WHEN l_get_osp_lines_csr%NOTFOUND;
2160 OPEN l_get_po_line_csr(l_osp_order_line_id, x_po_header_id);
2161 FETCH l_get_po_line_csr INTO l_po_line_id;
2162 IF (l_get_po_line_csr%FOUND) THEN
2163 --dbms_output.put_line('About to set po_line_id ' || l_po_line_id || ' for osp line ' || l_osp_order_line_id );
2164 Set_PO_Line_Id(p_osp_order_line_id => l_osp_order_line_id,
2165 p_po_line_id => l_po_line_id);
2166 ELSE
2167 --dbms_output.put_line('OSP Line Id ' || l_osp_order_line_id || ' is not yet associated with a PO Line.');
2168 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2169 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 Line');
2170 END IF;
2171 END IF;
2172 CLOSE l_get_po_line_csr;
2173 END LOOP;
2174 CLOSE l_get_osp_lines_csr;
2175 ELSE
2176 --dbms_output.put_line('No matching PO Header Id found.');
2177 -- Set Return PO Header Value to null
2178 x_po_header_id := null;
2179 -- Check if the Concurrent Program has completed
2180 OPEN l_get_request_id_csr(p_osp_order_id);
2181 FETCH l_get_request_id_csr INTO l_request_id;
2182 CLOSE l_get_request_id_csr;
2183 IF (l_request_id IS NOT NULL AND l_request_id <> 0) THEN
2184 --dbms_output.put_line('Getting Concurrent Program Status ');
2185 l_retval := FND_CONCURRENT.GET_REQUEST_STATUS(request_id => l_request_id,
2186 phase => l_phase,
2187 status => l_status,
2188 dev_phase => l_dev_phase,
2189 dev_status => l_dev_status,
2190 message => l_message);
2191 --dbms_output.put_line('l_dev_phase = ' || l_dev_phase || ', l_dev_status = ' || l_dev_status );
2192 --dbms_output.put_line('l_message = ' || l_message);
2193 -- IF ((l_retval = TRUE) AND (l_dev_phase = 'COMPLETE') AND (l_dev_status <> 'NORMAL')) THEN
2194 -- Status can be NORMAL even if the PO Creation had failed.
2195 -- So setting status to SUBMISSION_FAILED if the Concurrent Program has completed
2196 -- but the PO Header is not set
2197 IF ((l_retval = TRUE) AND (l_dev_phase = 'COMPLETE')) THEN
2198 -- Abnormal Termination
2199 --dbms_output.put_line('Concurrent Program has completed. Setting Status to SUBMISSION_FAILED.');
2200 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2201 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);
2202 END IF;
2203 -- Set the Status of OSP Order to Submission Failed
2204 Set_Submission_Failed(p_osp_order_id);
2205 END IF;
2206 END IF;
2207 END IF;
2208 CLOSE l_get_po_hdr_csr;
2209 --dbms_output.put_line('About to exit Associate_OSP_PO ');
2210 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2211 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2212 END IF;
2213 END Associate_OSP_PO;
2214
2215 ----------------------------------------
2216 -- This Procedure handles cancelled PO Lines and is Part of PO Synchronization.
2217 -- This procedure commits its work if p_commit is set to true and
2218 -- if there were no errors during the execution of this procedure.
2219 -- It does not check the message list for performing the commit action
2220 ----------------------------------------
2221 PROCEDURE Handle_Cancelled_PO_Lines(
2222 p_commit IN VARCHAR2,
2223 x_return_status OUT NOCOPY VARCHAR2) IS
2224
2225 CURSOR l_get_cancelled_po_lines_csr IS
2226 SELECT PL.PO_LINE_ID, OL.OSP_ORDER_LINE_ID, PO.REFERENCE_NUM,
2227 OL.OBJECT_VERSION_NUMBER, OSP.OBJECT_VERSION_NUMBER
2228 FROM PO_LINES_ALL PL, PO_HEADERS_ALL PO, AHL_OSP_ORDER_LINES OL,
2229 AHL_OSP_ORDERS_B OSP
2230 WHERE PL.CANCEL_FLAG = 'Y' AND -- Canceled PO Line
2231 PL.PO_HEADER_ID = PO.PO_HEADER_ID AND
2232 PO.INTERFACE_SOURCE_CODE = AHL_GLOBAL.AHL_APP_SHORT_NAME AND -- AHL Created PO
2233 PO.REFERENCE_NUM = OL.OSP_ORDER_ID AND -- Related to the OSP Order
2234 OSP.OSP_ORDER_ID = PO.REFERENCE_NUM AND
2235 -- Added by jaramana on April 7, 2008 for bug 6609988
2236 OSP.OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id() AND
2237 OL.PO_LINE_ID = PL.PO_LINE_ID AND
2238 NVL(OL.STATUS_CODE, ' ') <> G_OL_PO_CANCELLED_STATUS -- Not yet updated
2239 ORDER BY PO.REFERENCE_NUM; -- One OSP Order at a time
2240
2241 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Cancelled_PO_Lines';
2242 l_osp_order_id NUMBER := -1;
2243 l_osp_order_line_id NUMBER;
2244 l_po_line_id NUMBER;
2245 l_prev_osp_order_id NUMBER := -1;
2246 l_table_index NUMBER := 0;
2247 l_return_status VARCHAR2(1);
2248 l_msg_count NUMBER;
2249 l_msg_data VARCHAR2(1000);
2250 l_osp_order_rec AHL_OSP_ORDERS_PVT.osp_order_rec_type;
2251 l_osp_order_lines_tbl AHL_OSP_ORDERS_PVT.osp_order_lines_tbl_type;
2252 l_commit_flag BOOLEAN := true;
2253 l_osp_obj_ver_num NUMBER;
2254 l_ol_obj_ver_num NUMBER;
2255
2256 BEGIN
2257 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2258 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2259 END IF;
2260 -- Standard start of API savepoint
2261 SAVEPOINT Handle_Cancelled_PO_Lines_pvt;
2262
2263 -- Initialize API return status to success
2264 x_return_status := FND_API.G_RET_STS_SUCCESS;
2265
2266 OPEN l_get_cancelled_po_lines_csr;
2267 LOOP
2268 FETCH l_get_cancelled_po_lines_csr INTO l_po_line_id,
2269 l_osp_order_line_id,
2270 l_osp_order_id,
2271 l_ol_obj_ver_num,
2272 l_osp_obj_ver_num;
2273 EXIT WHEN l_get_cancelled_po_lines_csr%NOTFOUND;
2274 IF (l_osp_order_id <> l_prev_osp_order_id) THEN
2275 IF (l_prev_osp_order_id <> -1) THEN
2276 -- Cancel all OSP Lines pertaining to the previous OSP Order
2277 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2278 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Cancelling OSP Line for Order ' || l_prev_osp_order_id);
2279 END IF;
2280 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2281 p_init_msg_list => FND_API.G_FALSE,
2282 p_commit => FND_API.G_FALSE,
2283 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2284 p_x_osp_order_rec => l_osp_order_rec,
2285 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2286 x_return_status => l_return_status,
2287 x_msg_count => l_msg_count,
2288 x_msg_data => l_msg_data);
2289 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2290 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2291 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Cancelling OSP Line for OSP Order ' || l_prev_osp_order_id);
2292 END IF;
2293 l_commit_flag := false;
2294 END IF;
2295 -- Delete table used by prior call
2296 l_osp_order_lines_tbl.DELETE;
2297 END IF;
2298 -- Update API Record with new OSP Order Id
2299 l_osp_order_rec.OSP_ORDER_ID := l_osp_order_id;
2300 l_osp_order_rec.OBJECT_VERSION_NUMBER := l_osp_obj_ver_num;
2301 l_prev_osp_order_id := l_osp_order_id;
2302 l_table_index := 0;
2303 END IF;
2304 -- Copy OSP Line Id into API's Line Table at l_table_index
2305 l_osp_order_lines_tbl(l_table_index).OSP_ORDER_LINE_ID := l_osp_order_line_id;
2306 -- Copy Line's Object Version Nnumber into API's Line Table at l_table_index
2307 l_osp_order_lines_tbl(l_table_index).OBJECT_VERSION_NUMBER := l_ol_obj_ver_num;
2308 -- Set OSP Line Status to G_OL_PO_CANCELLED_STATUS in API's Line Table
2309 l_osp_order_lines_tbl(l_table_index).STATUS_CODE := G_OL_PO_CANCELLED_STATUS;
2310 -- Set Operation to Update in the line rec
2311 l_osp_order_lines_tbl(l_table_index).OPERATION_FLAG := AHL_OSP_ORDERS_PVT.G_OP_UPDATE;
2312
2313 l_table_index := l_table_index + 1;
2314 END LOOP;
2315 CLOSE l_get_cancelled_po_lines_csr;
2316 IF (l_prev_osp_order_id <> -1) THEN
2317 -- Save the Last Cancellation
2318 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2319 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Cancelling OSP Line for Order ' || l_prev_osp_order_id);
2320 END IF;
2321 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2322 p_init_msg_list => FND_API.G_FALSE,
2323 p_commit => FND_API.G_FALSE,
2324 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2325 p_x_osp_order_rec => l_osp_order_rec,
2326 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2327 x_return_status => l_return_status,
2328 x_msg_count => l_msg_count,
2329 x_msg_data => l_msg_data);
2330 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2331 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2332 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Cancelling OSP Line for OSP Order ' || l_prev_osp_order_id);
2333 END IF;
2334 l_commit_flag := false;
2335 END IF;
2336 END IF;
2337 IF (l_commit_flag = false) THEN
2338 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
2339 END IF;
2340 -- No errors in current procedure: Check only passed in flag
2341 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2342 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2343 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2344 END IF;
2345 COMMIT WORK;
2346 END IF;
2347 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2348 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2349 END IF;
2350 EXCEPTION
2351 WHEN FND_API.G_EXC_ERROR THEN
2352 ROLLBACK TO Handle_Cancelled_PO_Lines_pvt;
2353 x_return_status := FND_API.G_RET_STS_ERROR;
2354
2355 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2356 ROLLBACK TO Handle_Cancelled_PO_Lines_pvt;
2357 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2358
2359 WHEN OTHERS THEN
2360 ROLLBACK TO Handle_Cancelled_PO_Lines_pvt;
2361 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2362 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2363 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2364 p_procedure_name => 'Handle_Cancelled_PO_Lines',
2365 p_error_text => SUBSTR(SQLERRM,1,240));
2366 END IF;
2367
2368 END Handle_Cancelled_PO_Lines;
2369
2370 ----------------------------------------
2371 -- This Procedure handles deleted PO Lines and is Part of PO Synchronization.
2372 -- This procedure commits its work if p_commit is set to true and
2373 -- if there were no errors during the execution of this procedure.
2374 -- It does not check the message list for performing the commit action.
2375 ----------------------------------------
2376 PROCEDURE Handle_Deleted_PO_Lines(
2377 p_commit IN VARCHAR2,
2378 x_return_status OUT NOCOPY VARCHAR2) IS
2379
2380 CURSOR l_get_deleted_po_lines_csr IS
2381 SELECT OL.OSP_ORDER_ID, OL.OSP_ORDER_LINE_ID,
2382 OL.OBJECT_VERSION_NUMBER, OSP.OBJECT_VERSION_NUMBER
2383 FROM AHL_OSP_ORDER_LINES OL, AHL_OSP_ORDERS_B OSP
2384 WHERE OL.PO_LINE_ID IS NOT NULL AND -- PO Created
2385 NVL(OL.STATUS_CODE, ' ') <> G_OL_PO_DELETED_STATUS AND -- Not yet updated
2386 OSP.OSP_ORDER_ID = OL.OSP_ORDER_ID AND
2387 -- Added by jaramana on April 7, 2008 for bug 6609988
2388 OSP.OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id() AND
2389 NOT EXISTS (SELECT PO_LINE_ID FROM PO_LINES_ALL WHERE PO_LINE_ID = OL.PO_LINE_ID) -- PO Line Deleted
2390 ORDER BY OL.OSP_ORDER_ID; -- One OSP Order at a time
2391
2392 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Deleted_PO_Lines';
2393 l_osp_order_id NUMBER := -1;
2394 l_osp_order_line_id NUMBER;
2395 l_prev_osp_order_id NUMBER := -1;
2396 l_table_index NUMBER := 0;
2397 l_return_status VARCHAR2(1);
2398 l_msg_count NUMBER;
2399 l_msg_data VARCHAR2(1000);
2400 l_osp_order_rec AHL_OSP_ORDERS_PVT.osp_order_rec_type;
2401 l_osp_order_lines_tbl AHL_OSP_ORDERS_PVT.osp_order_lines_tbl_type;
2402 l_commit_flag BOOLEAN := true;
2403 l_osp_obj_ver_num NUMBER;
2404 l_ol_obj_ver_num NUMBER;
2405
2406 BEGIN
2407 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2408 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2409 END IF;
2410 -- Standard start of API savepoint
2411 SAVEPOINT Handle_Deleted_PO_Lines_pvt;
2412
2413 -- Initialize API return status to success
2414 x_return_status := FND_API.G_RET_STS_SUCCESS;
2415
2416 OPEN l_get_deleted_po_lines_csr;
2417 LOOP
2418 FETCH l_get_deleted_po_lines_csr INTO l_osp_order_id,
2419 l_osp_order_line_id,
2420 l_ol_obj_ver_num,
2421 l_osp_obj_ver_num;
2422 EXIT WHEN l_get_deleted_po_lines_csr%NOTFOUND;
2423 IF (l_osp_order_id <> l_prev_osp_order_id) THEN
2424 IF (l_prev_osp_order_id <> -1) THEN
2425 -- PO Delete all OSP Lines pertaining to the previous OSP Order
2426 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2427 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line for Order ' || l_prev_osp_order_id);
2428 END IF;
2429 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2430 p_init_msg_list => FND_API.G_FALSE,
2431 p_commit => FND_API.G_FALSE,
2432 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2433 p_x_osp_order_rec => l_osp_order_rec,
2434 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2435 x_return_status => l_return_status,
2436 x_msg_count => l_msg_count,
2437 x_msg_data => l_msg_data);
2438 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2439 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2440 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Deleting OSP Line for OSP Order ' || l_prev_osp_order_id);
2441 END IF;
2442 l_commit_flag := false;
2443 END IF;
2444 -- Delete table used by prior call
2445 l_osp_order_lines_tbl.DELETE;
2446 END IF;
2447 -- Update API Record with new OSP Order Id
2448 l_osp_order_rec.OSP_ORDER_ID := l_osp_order_id;
2449 l_osp_order_rec.OBJECT_VERSION_NUMBER := l_osp_obj_ver_num;
2450 l_prev_osp_order_id := l_osp_order_id;
2451 l_table_index := 0;
2452 END IF;
2453 -- Copy OSP Line Id into API's Line Table at l_table_index
2454 l_osp_order_lines_tbl(l_table_index).OSP_ORDER_LINE_ID := l_osp_order_line_id;
2455 -- Copy Line's Object Version Nnumber into API's Line Table at l_table_index
2456 l_osp_order_lines_tbl(l_table_index).OBJECT_VERSION_NUMBER := l_ol_obj_ver_num;
2457 -- Set OSP Line Status to G_OL_PO_DELETED_STATUS in API's Line Table
2458 l_osp_order_lines_tbl(l_table_index).STATUS_CODE := G_OL_PO_DELETED_STATUS;
2459 -- Set Operation to Update in the line rec
2460 l_osp_order_lines_tbl(l_table_index).OPERATION_FLAG := AHL_OSP_ORDERS_PVT.G_OP_UPDATE;
2461 l_table_index := l_table_index + 1;
2462 END LOOP;
2463 CLOSE l_get_deleted_po_lines_csr;
2464 IF (l_prev_osp_order_id <> -1) THEN
2465 -- Save the Last Deletion
2466 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2467 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line for Order ' || l_prev_osp_order_id);
2468 END IF;
2469 AHL_OSP_ORDERS_PVT.process_osp_order(p_api_version => 1.0,
2470 p_init_msg_list => FND_API.G_FALSE,
2471 p_commit => FND_API.G_FALSE,
2472 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2473 p_x_osp_order_rec => l_osp_order_rec,
2474 p_x_osp_order_lines_tbl => l_osp_order_lines_tbl,
2475 x_return_status => l_return_status,
2476 x_msg_count => l_msg_count,
2477 x_msg_data => l_msg_data);
2478 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2479 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2480 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Error while Deleting OSP Line for OSP Order ' || l_prev_osp_order_id);
2481 END IF;
2482 l_commit_flag := false;
2483 END IF;
2484 END IF;
2485
2486 IF (l_commit_flag = false) THEN
2487 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
2488 END IF;
2489 -- No errors in current procedure: Check only passed in flag
2490 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2491 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2492 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2493 END IF;
2494 COMMIT WORK;
2495 END IF;
2496 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2497 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2498 END IF;
2499 EXCEPTION
2500 WHEN FND_API.G_EXC_ERROR THEN
2501 ROLLBACK TO Handle_Deleted_PO_Lines_pvt;
2502 x_return_status := FND_API.G_RET_STS_ERROR;
2503
2504 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2505 ROLLBACK TO Handle_Deleted_PO_Lines_pvt;
2506 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2507
2508 WHEN OTHERS THEN
2509 ROLLBACK TO Handle_Deleted_PO_Lines_pvt;
2510 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2511 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2512 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2513 p_procedure_name => 'Handle_Deleted_PO_Lines',
2514 p_error_text => SUBSTR(SQLERRM,1,240));
2515 END IF;
2516
2517 END Handle_Deleted_PO_Lines;
2518
2519 ----------------------------------------
2520 -- This Procedure handles Approved POs and is Part of PO Synchronization.
2521 -- This procedure commits its work if p_commit is set to true and
2522 -- if there were no errors during the execution of this procedure.
2523 -- It does not check the message list for performing the commit action.
2524 ----------------------------------------
2525 PROCEDURE Handle_Approved_POs(
2526 p_commit IN VARCHAR2,
2527 x_return_status OUT NOCOPY VARCHAR2) IS
2528
2529 CURSOR l_get_approved_POs_csr IS
2530 SELECT OSP.OSP_ORDER_ID, OSP.PO_HEADER_ID, OSP.OE_HEADER_ID
2531 FROM AHL_OSP_ORDERS_B OSP, PO_HEADERS_ALL PO
2532 WHERE OSP.STATUS_CODE = G_OSP_PO_CREATED_STATUS AND -- PO Created
2533 OSP.PO_HEADER_ID = PO.PO_HEADER_ID AND -- Join
2534 -- Added by jaramana on April 7, 2008 for bug 6609988
2535 OSP.OPERATING_UNIT_ID = MO_GLOBAL.get_current_org_id() AND
2536 PO.APPROVED_FLAG = G_YES_FLAG AND -- Approved PO
2537 NVL(PO.CANCEL_FLAG, G_NO_FLAG) <> G_YES_FLAG AND -- Not Cancelled
2538 NVL(PO.CLOSED_CODE, G_PO_OPEN) NOT LIKE '%CLOSED'; -- Not Closed
2539
2540 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Approved_POs';
2541 l_osp_order_id NUMBER;
2542 l_po_header_id NUMBER;
2543 l_oe_header_id NUMBER;
2544 l_temp_num NUMBER := 0;
2545 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2546 l_msg_count NUMBER;
2547 l_msg_data VARCHAR2(1000);
2548
2549 l_shipment_IDs_Tbl AHL_OSP_SHIPMENT_PUB.Ship_ID_Tbl_Type;
2550
2551 BEGIN
2552 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2553 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2554 END IF;
2555 -- Standard start of API savepoint
2556 SAVEPOINT Handle_Approved_POs_pvt;
2557
2558 -- Initialize API return status to success
2559 x_return_status := FND_API.G_RET_STS_SUCCESS;
2560
2561 OPEN l_get_approved_pos_csr;
2562 LOOP
2563 FETCH l_get_approved_POs_csr INTO l_osp_order_id,
2564 l_po_header_id,
2565 l_oe_header_id;
2566 EXIT WHEN l_get_approved_POs_csr%NOTFOUND;
2567 IF (l_oe_header_id IS NOT NULL) THEN
2568 l_temp_num := l_temp_num + 1; -- One based index
2569 -- Populate the table with this Shipment Id
2570 l_shipment_IDs_Tbl(l_temp_num) := l_oe_header_id;
2571 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2572 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Booking Shipment with Id: ' || l_oe_header_id);
2573 END IF;
2574 END IF;
2575 END LOOP;
2576 CLOSE l_get_approved_POs_csr;
2577 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2578 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Number of Approvals to be submitted: ' || l_temp_num);
2579 END IF;
2580 IF (l_temp_num > 0) THEN
2581 -- Call Shipment API. This API will not throw an error or
2582 -- re-book if the shipment is already booked
2583 AHL_OSP_SHIPMENT_PUB.Book_Order(p_api_version => 1.0,
2584 p_init_msg_list => FND_API.G_FALSE,
2585 p_commit => FND_API.G_FALSE,
2586 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2587 p_oe_header_tbl => l_shipment_IDs_Tbl,
2588 x_return_status => l_return_status,
2589 x_msg_count => l_msg_count,
2590 x_msg_data => l_msg_data);
2591 END IF;
2592
2593 x_return_status := l_return_status;
2594 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2595 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2596 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'AHL_OSP_SHIPMENT_PUB.Book_Order Did not succeed');
2597 END IF;
2598 RAISE FND_API.G_EXC_ERROR; -- Rollback and return error
2599 END IF;
2600 -- No errors in current procedure: Check only passed in flag
2601 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2602 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2603 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'AHL_OSP_SHIPMENT_PUB.Book_Order Succeeded. About to COMMIT work.');
2604 END IF;
2605 COMMIT WORK;
2606 END IF;
2607 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2608 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2609 END IF;
2610 EXCEPTION
2611 WHEN FND_API.G_EXC_ERROR THEN
2612 ROLLBACK TO Handle_Approved_POs_pvt;
2613 x_return_status := FND_API.G_RET_STS_ERROR;
2614
2615 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2616 ROLLBACK TO Handle_Approved_POs_pvt;
2617 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2618
2619 WHEN OTHERS THEN
2620 ROLLBACK TO Handle_Approved_POs_pvt;
2621 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2622 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2623 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2624 p_procedure_name => 'Handle_Approved_POs',
2625 p_error_text => SUBSTR(SQLERRM,1,240));
2626 END IF;
2627
2628 END Handle_Approved_POs;
2629
2630 /** The following two procedures Handle_Deleted_PO_Headers and Handle_Deleted_Sales_Orders
2631 * were added by jaramana on March 31, 2006 to implement the ER 5074660
2632 ***/
2633 ----------------------------------------
2634 -- This Procedure handles Deleted PO Headers and is Part of PO Synchronization.
2635 -- This procedure commits its work if p_commit is set to true and
2636 -- if there were no errors during the execution of this procedure.
2637 -- It does not check the message list for performing the commit action.
2638 -- Functionality:
2639 -- After a PO has been created for an OSP Order, it is possible for the PO
2640 -- to be manually deleted (using Purchasing responsibility) before the PO is approved.
2641 -- Since this deletion will result in an OSP Order referring to a non-existent PO,
2642 -- we need to change the OSP order to bring it to a consistent state.
2643 -- This procedure basically looks for OSP Orders for which the PO has been deleted
2644 -- and resets some values and corrects the status of the order as well as the lines
2645 -- so that the OSP Order can be resubmitted and a different PO can be created.
2646 -- This procedure does a direct update of the AHL_OSP_ORDERS_B and the AHL_OSP_ORDER_LINES
2647 -- tables and does not call the process_osp_order API to avoid unwanted validations
2648 ----------------------------------------
2649 PROCEDURE Handle_Deleted_PO_Headers(
2650 p_commit IN VARCHAR2,
2651 x_return_status OUT NOCOPY VARCHAR2) IS
2652
2653 CURSOR get_po_deleted_osps_csr IS
2654 SELECT osp.osp_order_id,
2655 osp.object_version_number,
2656 osp.po_header_id,
2657 osp.status_code,
2658 osp.order_type_code
2659 FROM ahl_osp_orders_b osp
2660 WHERE osp.status_code = G_OSP_PO_CREATED_STATUS AND
2661 osp.order_type_code in ('SERVICE', 'EXCHANGE') AND
2662 -- Added by jaramana on April 7, 2008 for bug 6609988
2663 osp.operating_unit_id = MO_GLOBAL.get_current_org_id() AND
2664 NOT EXISTS (SELECT 1 FROM po_headers_all where po_header_id = osp.po_header_id);
2665
2666 CURSOR get_osp_line_dtls_csr(c_osp_order_id IN NUMBER) IS
2667 SELECT ospl.osp_order_id,
2668 ospl.osp_order_line_id,
2669 ospl.object_version_number,
2670 ospl.status_code,
2671 ospl.po_line_id
2672 FROM ahl_osp_order_lines ospl
2673 WHERE ospl.osp_order_id = c_osp_order_id;
2674
2675 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Deleted_PO_Headers';
2676 l_temp_num NUMBER := 0;
2677 l_osp_details_rec get_po_deleted_osps_csr%ROWTYPE;
2678 l_osp_line_details_rec get_osp_line_dtls_csr%ROWTYPE;
2679
2680 BEGIN
2681 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2682 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2683 END IF;
2684 -- Standard start of API savepoint
2685 SAVEPOINT Handle_Deleted_PO_Headers_pvt;
2686
2687 -- Initialize API return status to success
2688 x_return_status := FND_API.G_RET_STS_SUCCESS;
2689 -- Get all OSP Orders for which the PO Header has been deleted
2690 OPEN get_po_deleted_osps_csr;
2691 LOOP
2692 FETCH get_po_deleted_osps_csr into l_osp_details_rec;
2693 EXIT WHEN get_po_deleted_osps_csr%NOTFOUND;
2694 l_temp_num := l_temp_num + 1;
2695 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2696 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processing PO Deletion for OSP Order ' || l_osp_details_rec.osp_order_id);
2697 END IF;
2698 -- Get the Line Details
2699 OPEN get_osp_line_dtls_csr(c_osp_order_id => l_osp_details_rec.osp_order_id);
2700 LOOP
2701 FETCH get_osp_line_dtls_csr into l_osp_line_details_rec;
2702 EXIT WHEN get_osp_line_dtls_csr%NOTFOUND;
2703 IF (l_osp_line_details_rec.status_code IS NULL) THEN
2704 IF (l_osp_line_details_rec.po_line_id IS NOT NULL) THEN
2705 -- Reset the value of PO_LINE_ID and increment OVN (status_code is already null)
2706 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2707 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Updating OSP Line with Id ' || l_osp_line_details_rec.osp_order_line_id);
2708 END IF;
2709 Set_PO_Line_ID(p_osp_order_line_id => l_osp_line_details_rec.osp_order_line_id,
2710 p_po_line_id => null);
2711 END IF;
2712 ELSE
2713 -- Physically delete this line (PO_DELETED or PO_CANCELLED)
2714 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2715 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Deleting OSP Line with Id ' || l_osp_line_details_rec.osp_order_line_id);
2716 END IF;
2717 DELETE FROM ahl_osp_order_lines
2718 WHERE osp_order_line_id = l_osp_line_details_rec.osp_order_line_id;
2719 END IF;
2720 END LOOP;
2721 CLOSE get_osp_line_dtls_csr;
2722 -- Now for the OSP Order Header, reset PO_HEADER_ID, PO_BATCH_ID, PO_REQUEST_ID and PO_INTERFACE_HEADER_ID.
2723 -- set STATUS_CODE to "ENTERED" and increment OVN
2724 update ahl_osp_orders_b
2725 set po_header_id = null,
2726 po_batch_id = null,
2727 po_request_id = null,
2728 po_interface_header_id = null,
2729 status_code = G_OSP_ENTERED_STATUS,
2730 object_version_number = l_osp_details_rec.object_version_number + 1,
2731 last_update_date = TRUNC(sysdate),
2732 last_updated_by = fnd_global.user_id,
2733 last_update_login = fnd_global.login_id
2734 where osp_order_id = l_osp_details_rec.osp_order_id;
2735 END LOOP;
2736 CLOSE get_po_deleted_osps_csr;
2737
2738 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2739 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processed PO Deletion for ' || l_temp_num || ' OSP Orders');
2740 END IF;
2741
2742 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2743 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2744 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2745 END IF;
2746 COMMIT WORK;
2747 END IF;
2748 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2749 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2750 END IF;
2751 EXCEPTION
2752 WHEN FND_API.G_EXC_ERROR THEN
2753 ROLLBACK TO Handle_Deleted_PO_Headers_pvt;
2754 x_return_status := FND_API.G_RET_STS_ERROR;
2755
2756 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2757 ROLLBACK TO Handle_Deleted_PO_Headers_pvt;
2758 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2759
2760 WHEN OTHERS THEN
2761 ROLLBACK TO Handle_Deleted_PO_Headers_pvt;
2762 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2763 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2764 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2765 p_procedure_name => 'Handle_Deleted_PO_Headers',
2766 p_error_text => SUBSTR(SQLERRM,1,240));
2767 END IF;
2768
2769 END Handle_Deleted_PO_Headers;
2770
2771 ----------------------------------------
2772 -- This Procedure handles Deleted Sales Orders and is Part of PO Synchronization.
2773 -- This procedure commits its work if p_commit is set to true and
2774 -- if there were no errors during the execution of this procedure.
2775 -- It does not check the message list for performing the commit action.
2776 -- Functionality:
2777 -- After a Sales Order has been created for an OSP Order, it is possible for the SO
2778 -- to be manually deleted (using Order Management responsibility) before the SO is booked.
2779 -- Since this deletion will result in an OSP Order referring to a non-existent SO,
2780 -- we need to change the OSP order to bring it to a consistent state.
2781 -- This procedure basically looks for OSP Orders for which the SO has been deleted
2782 -- and resets some values of the order as well as the lines so that a new shipment
2783 -- can be created for the OSP Order if required.
2784 -- This procedure does a direct update of the AHL_OSP_ORDERS_B and the AHL_OSP_ORDER_LINES
2785 -- tables and does not call the process_osp_order API to avoid unwanted validations.
2786 ----------------------------------------
2787 PROCEDURE Handle_Deleted_Sales_Orders(
2788 p_commit IN VARCHAR2,
2789 x_return_status OUT NOCOPY VARCHAR2) IS
2790
2791 CURSOR get_so_deleted_osps_csr IS
2792 SELECT osp.osp_order_id,
2793 osp.object_version_number,
2794 osp.oe_header_id,
2795 osp.status_code
2796 FROM ahl_osp_orders_b osp
2797 WHERE osp.status_code <> 'CLOSED' AND
2798 osp.oe_header_id IS NOT NULL AND
2799 -- Added by jaramana on April 7, 2008 for bug 6609988
2800 osp.operating_unit_id = MO_GLOBAL.get_current_org_id() AND
2801 NOT EXISTS (SELECT 1 FROM oe_order_headers_all where header_id = osp.oe_header_id);
2802
2803 CURSOR get_osp_line_dtls_csr(c_osp_order_id IN NUMBER) IS
2804 SELECT ospl.osp_order_line_id,
2805 ospl.object_version_number,
2806 ospl.oe_ship_line_id,
2807 ospl.oe_return_line_id
2808 FROM ahl_osp_order_lines ospl
2809 WHERE ospl.osp_order_id = c_osp_order_id AND
2810 (ospl.oe_ship_line_id IS NOT NULL OR ospl.oe_return_line_id IS NOT NULL);
2811
2812 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Handle_Deleted_Sales_Orders';
2813 l_temp_num NUMBER := 0;
2814 l_osp_details_rec get_so_deleted_osps_csr%ROWTYPE;
2815 l_osp_line_details_rec get_osp_line_dtls_csr%ROWTYPE;
2816
2817 BEGIN
2818 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2819 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2820 END IF;
2821 -- Standard start of API savepoint
2822 SAVEPOINT Handle_Deleted_SOs_pvt;
2823
2824 -- Initialize API return status to success
2825 x_return_status := FND_API.G_RET_STS_SUCCESS;
2826
2827 -- Get all OSP Orders for which the PO Header has been deleted
2828 OPEN get_so_deleted_osps_csr;
2829 LOOP
2830 FETCH get_so_deleted_osps_csr into l_osp_details_rec;
2831 EXIT WHEN get_so_deleted_osps_csr%NOTFOUND;
2832 l_temp_num := l_temp_num + 1;
2833 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2834 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processing SO Deletion for OSP Order ' || l_osp_details_rec.osp_order_id);
2835 END IF;
2836 -- Get the Details of lines that have a ship or a return line
2837 OPEN get_osp_line_dtls_csr(c_osp_order_id => l_osp_details_rec.osp_order_id);
2838 LOOP
2839 FETCH get_osp_line_dtls_csr into l_osp_line_details_rec;
2840 EXIT WHEN get_osp_line_dtls_csr%NOTFOUND;
2841 -- Reset the value of oe_ship_line_id and oe_return_line_id and increment OVN
2842 update ahl_osp_order_lines
2843 set oe_ship_line_id = null,
2844 oe_return_line_id = null,
2845 object_version_number = l_osp_line_details_rec.object_version_number + 1,
2846 last_update_date = TRUNC(sysdate),
2847 last_updated_by = fnd_global.user_id,
2848 last_update_login = fnd_global.login_id
2849 where osp_order_line_id = l_osp_line_details_rec.osp_order_line_id;
2850 END LOOP;
2851 CLOSE get_osp_line_dtls_csr;
2852 -- Now for the OSP Order Header, reset OE_HEADER_ID and increment OVN
2853 update ahl_osp_orders_b
2854 set OE_HEADER_ID = null,
2855 object_version_number = l_osp_details_rec.object_version_number + 1,
2856 last_update_date = TRUNC(sysdate),
2857 last_updated_by = fnd_global.user_id,
2858 last_update_login = fnd_global.login_id
2859 where osp_order_id = l_osp_details_rec.osp_order_id;
2860 END LOOP;
2861 CLOSE get_so_deleted_osps_csr;
2862
2863 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2864 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Processed SO Deletion for ' || l_temp_num || ' OSP Orders');
2865 END IF;
2866
2867 -- No errors in current procedure: Check only passed in flag
2868 IF (FND_API.TO_BOOLEAN(p_commit)) THEN
2869 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2870 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'About to COMMIT work.');
2871 END IF;
2872 COMMIT WORK;
2873 END IF;
2874 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2875 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
2876 END IF;
2877 EXCEPTION
2878 WHEN FND_API.G_EXC_ERROR THEN
2879 ROLLBACK TO Handle_Deleted_SOs_pvt;
2880 x_return_status := FND_API.G_RET_STS_ERROR;
2881
2882 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2883 ROLLBACK TO Handle_Deleted_SOs_pvt;
2884 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2885
2886 WHEN OTHERS THEN
2887 ROLLBACK TO Handle_Deleted_SOs_pvt;
2888 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2889 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2890 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2891 p_procedure_name => 'Handle_Deleted_Sales_Orders',
2892 p_error_text => SUBSTR(SQLERRM,1,240));
2893 END IF;
2894
2895 END Handle_Deleted_Sales_Orders;
2896
2897 ----------------------------------------
2898 -- This Procedure updates AHL_OSP_ORDERS_B with the Batch Id, Request Id and Interface Header Id
2899 ----------------------------------------
2900 PROCEDURE Record_OSP_Submission(
2901 p_osp_order_id IN NUMBER,
2902 p_batch_id IN NUMBER,
2903 p_request_id IN NUMBER,
2904 p_intf_hdr_id IN NUMBER) IS
2905 BEGIN
2906 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
2907 p_batch_id => p_batch_id,
2908 p_request_id => p_request_id,
2909 p_intf_hdr_id => p_intf_hdr_id);
2910 END Record_OSP_Submission;
2911
2912 ----------------------------------------
2913 -- This Procedure updates AHL_OSP_ORDERS_B's PO_HEADER_ID and sets STATUS_CODE to PO_CREATED
2914 ----------------------------------------
2915 PROCEDURE Set_PO_Header_ID(
2916 p_osp_order_id IN NUMBER,
2917 p_po_header_id IN NUMBER) IS
2918 BEGIN
2919 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
2920 p_po_header_id => p_po_header_id,
2921 p_status_code => G_OSP_PO_CREATED_STATUS);
2922 END Set_PO_Header_ID;
2923
2924 ----------------------------------------
2925 -- This Procedure updates AHL_OSP_ORDERS_B.STATUS_CODE to SUBMISSION_FAILED
2926 ----------------------------------------
2927 PROCEDURE Set_Submission_Failed(
2928 p_osp_order_id IN NUMBER) IS
2929 BEGIN
2930 Update_OSP_Order(p_osp_order_id => p_osp_order_id,
2931 p_status_code => G_OSP_SUB_FAILED_STATUS);
2932 END Set_Submission_Failed;
2933
2934 ----------------------------------------
2935 -- This Procedure updates AHL_OSP_ORDER_LINES.PO_LINE_ID
2936 ----------------------------------------
2937 PROCEDURE Set_PO_Line_ID(
2938 p_osp_order_line_id IN NUMBER,
2939 p_po_line_id IN NUMBER) IS
2940
2941 CURSOR l_osp_line_dtls_csr(p_osp_line_id IN NUMBER) IS
2942 SELECT
2943 OBJECT_VERSION_NUMBER,
2944 OSP_ORDER_ID,
2945 OSP_LINE_NUMBER,
2946 STATUS_CODE,
2947 PO_LINE_TYPE_ID,
2948 SERVICE_ITEM_ID,
2949 SERVICE_ITEM_DESCRIPTION,
2950 SERVICE_ITEM_UOM_CODE,
2951 NEED_BY_DATE,
2952 SHIP_BY_DATE,
2953 PO_LINE_ID,
2954 OE_SHIP_LINE_ID,
2955 OE_RETURN_LINE_ID,
2956 WORKORDER_ID,
2957 OPERATION_ID,
2958 QUANTITY,
2959 EXCHANGE_INSTANCE_ID,
2960 INVENTORY_ITEM_ID,
2961 INVENTORY_ORG_ID,
2962 INVENTORY_ITEM_UOM,
2963 INVENTORY_ITEM_QUANTITY,
2964 SUB_INVENTORY,
2965 LOT_NUMBER,
2966 SERIAL_NUMBER,
2967 ATTRIBUTE_CATEGORY,
2968 ATTRIBUTE1,
2969 ATTRIBUTE2,
2970 ATTRIBUTE3,
2971 ATTRIBUTE4,
2972 ATTRIBUTE5,
2973 ATTRIBUTE6,
2974 ATTRIBUTE7,
2975 ATTRIBUTE8,
2976 ATTRIBUTE9,
2977 ATTRIBUTE10,
2978 ATTRIBUTE11,
2979 ATTRIBUTE12,
2980 ATTRIBUTE13,
2981 ATTRIBUTE14,
2982 ATTRIBUTE15,
2983 -- Begin Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
2984 PO_REQ_LINE_ID
2985 -- End Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
2986 FROM AHL_OSP_ORDER_LINES
2987 WHERE OSP_ORDER_LINE_ID = p_osp_order_line_id;
2988
2989 l_osp_line_dtls_rec l_osp_line_dtls_csr%ROWTYPE;
2990 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Set_PO_Line_ID';
2991
2992 BEGIN
2993 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2994 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
2995 END IF;
2996 -- Retrieve the current record
2997 OPEN l_osp_line_dtls_csr(p_osp_order_line_id);
2998 FETCH l_osp_line_dtls_csr INTO l_osp_line_dtls_rec;
2999 IF (l_osp_line_dtls_csr%NOTFOUND) THEN
3000 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_LINE_ID_INVALID');
3001 FND_MESSAGE.Set_Token('OSP_LINE_ID', p_osp_order_line_id);
3002 FND_MSG_PUB.ADD;
3003 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3004 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
3005 END IF;
3006 CLOSE l_osp_line_dtls_csr;
3007 RAISE FND_API.G_EXC_ERROR;
3008 END IF;
3009 CLOSE l_osp_line_dtls_csr;
3010
3011 -- Update cursor variable's PO Line ID
3012 l_osp_line_dtls_rec.PO_LINE_ID := p_po_line_id;
3013
3014 -- Call Table Handler
3015 AHL_OSP_ORDER_LINES_PKG.UPDATE_ROW(
3016 P_OSP_ORDER_LINE_ID => p_osp_order_line_id,
3017 P_OBJECT_VERSION_NUMBER => l_osp_line_dtls_rec.OBJECT_VERSION_NUMBER + 1, -- Updated
3018 P_OSP_ORDER_ID => l_osp_line_dtls_rec.OSP_ORDER_ID,
3019 P_OSP_LINE_NUMBER => l_osp_line_dtls_rec.OSP_LINE_NUMBER,
3020 P_STATUS_CODE => l_osp_line_dtls_rec.STATUS_CODE,
3021 P_PO_LINE_TYPE_ID => l_osp_line_dtls_rec.PO_LINE_TYPE_ID,
3022 P_SERVICE_ITEM_ID => l_osp_line_dtls_rec.SERVICE_ITEM_ID,
3023 P_SERVICE_ITEM_DESCRIPTION => l_osp_line_dtls_rec.SERVICE_ITEM_DESCRIPTION,
3024 P_SERVICE_ITEM_UOM_CODE => l_osp_line_dtls_rec.SERVICE_ITEM_UOM_CODE,
3025 P_NEED_BY_DATE => l_osp_line_dtls_rec.NEED_BY_DATE,
3026 P_SHIP_BY_DATE => l_osp_line_dtls_rec.SHIP_BY_DATE,
3027 P_PO_LINE_ID => l_osp_line_dtls_rec.PO_LINE_ID, -- Updated
3028 P_OE_SHIP_LINE_ID => l_osp_line_dtls_rec.OE_SHIP_LINE_ID,
3029 P_OE_RETURN_LINE_ID => l_osp_line_dtls_rec.OE_RETURN_LINE_ID,
3030 P_WORKORDER_ID => l_osp_line_dtls_rec.WORKORDER_ID,
3031 P_OPERATION_ID => l_osp_line_dtls_rec.OPERATION_ID,
3032 P_QUANTITY => l_osp_line_dtls_rec.QUANTITY,
3033 P_EXCHANGE_INSTANCE_ID => l_osp_line_dtls_rec.EXCHANGE_INSTANCE_ID,
3034 P_INVENTORY_ITEM_ID => l_osp_line_dtls_rec.INVENTORY_ITEM_ID,
3035 P_INVENTORY_ORG_ID => l_osp_line_dtls_rec.INVENTORY_ORG_ID,
3036 P_INVENTORY_ITEM_UOM => l_osp_line_dtls_rec.INVENTORY_ITEM_UOM,
3037 P_INVENTORY_ITEM_QUANTITY => l_osp_line_dtls_rec.INVENTORY_ITEM_QUANTITY,
3038 P_SUB_INVENTORY => l_osp_line_dtls_rec.SUB_INVENTORY,
3039 P_LOT_NUMBER => l_osp_line_dtls_rec.LOT_NUMBER,
3040 P_SERIAL_NUMBER => l_osp_line_dtls_rec.SERIAL_NUMBER,
3041 P_ATTRIBUTE_CATEGORY => l_osp_line_dtls_rec.ATTRIBUTE_CATEGORY,
3042 P_ATTRIBUTE1 => l_osp_line_dtls_rec.ATTRIBUTE1,
3043 P_ATTRIBUTE2 => l_osp_line_dtls_rec.ATTRIBUTE2,
3044 P_ATTRIBUTE3 => l_osp_line_dtls_rec.ATTRIBUTE3,
3045 P_ATTRIBUTE4 => l_osp_line_dtls_rec.ATTRIBUTE4,
3046 P_ATTRIBUTE5 => l_osp_line_dtls_rec.ATTRIBUTE5,
3047 P_ATTRIBUTE6 => l_osp_line_dtls_rec.ATTRIBUTE6,
3048 P_ATTRIBUTE7 => l_osp_line_dtls_rec.ATTRIBUTE7,
3049 P_ATTRIBUTE8 => l_osp_line_dtls_rec.ATTRIBUTE8,
3050 P_ATTRIBUTE9 => l_osp_line_dtls_rec.ATTRIBUTE9,
3051 P_ATTRIBUTE10 => l_osp_line_dtls_rec.ATTRIBUTE10,
3052 P_ATTRIBUTE11 => l_osp_line_dtls_rec.ATTRIBUTE11,
3053 P_ATTRIBUTE12 => l_osp_line_dtls_rec.ATTRIBUTE12,
3054 P_ATTRIBUTE13 => l_osp_line_dtls_rec.ATTRIBUTE13,
3055 P_ATTRIBUTE14 => l_osp_line_dtls_rec.ATTRIBUTE14,
3056 P_ATTRIBUTE15 => l_osp_line_dtls_rec.ATTRIBUTE15,
3057 -- Begin Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
3058 P_PO_REQ_LINE_ID => l_osp_line_dtls_rec.PO_REQ_LINE_ID,
3059 -- End Changes by jaramana on January 7, 2008 for the Requisition ER 6034236
3060 P_LAST_UPDATE_DATE => TRUNC(sysdate), -- Updated
3061 P_LAST_UPDATED_BY => fnd_global.user_id, -- Updated
3062 P_LAST_UPDATE_LOGIN => fnd_global.login_id); -- Updated
3063
3064 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3065 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
3066 END IF;
3067 END Set_PO_Line_ID;
3068
3069 ----------------------------------------
3070 -- This Procedure updates a record of AHL_OSP_ORDERS_B using the table handler
3071 -- All updates to this table from this Package should go through this procedure only
3072 ----------------------------------------
3073 PROCEDURE Update_OSP_Order(
3074 p_osp_order_id IN NUMBER,
3075 p_batch_id IN NUMBER := NULL,
3076 p_request_id IN NUMBER := NULL,
3077 p_status_code IN VARCHAR2 := NULL,
3078 p_po_header_id IN NUMBER := NULL,
3079 p_intf_hdr_id IN NUMBER := NULL
3080 ) IS
3081
3082 CURSOR l_osp_dtls_csr(p_osp_order_id IN NUMBER) IS
3083 SELECT
3084 OBJECT_VERSION_NUMBER,
3085 OSP_ORDER_NUMBER,
3086 ORDER_TYPE_CODE,
3087 SINGLE_INSTANCE_FLAG,
3088 PO_HEADER_ID,
3089 OE_HEADER_ID,
3090 VENDOR_ID,
3091 VENDOR_SITE_ID,
3092 VENDOR_CONTACT_ID,
3093 CUSTOMER_ID,
3094 ORDER_DATE,
3095 CONTRACT_ID,
3096 CONTRACT_TERMS,
3097 OPERATING_UNIT_ID,
3098 PO_SYNCH_FLAG,
3099 STATUS_CODE,
3100 PO_BATCH_ID,
3101 PO_INTERFACE_HEADER_ID,
3102 PO_REQUEST_ID,
3103 PO_AGENT_ID,
3104 ATTRIBUTE_CATEGORY,
3105 ATTRIBUTE1,
3106 ATTRIBUTE2,
3107 ATTRIBUTE3,
3108 ATTRIBUTE4,
3109 ATTRIBUTE5,
3110 ATTRIBUTE6,
3111 ATTRIBUTE7,
3112 ATTRIBUTE8,
3113 ATTRIBUTE9,
3114 ATTRIBUTE10,
3115 ATTRIBUTE11,
3116 ATTRIBUTE12,
3117 ATTRIBUTE13,
3118 ATTRIBUTE14,
3119 ATTRIBUTE15,
3120 DESCRIPTION,
3121 PO_REQ_HEADER_ID -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
3122 FROM AHL_OSP_ORDERS_VL
3123 WHERE OSP_ORDER_ID = p_osp_order_id;
3124
3125 l_osp_dtls_rec l_osp_dtls_csr%ROWTYPE;
3126 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Update_OSP_Order';
3127
3128 BEGIN
3129 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3130 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.begin', 'Entering Procedure');
3131 END IF;
3132 -- Retrieve the current record
3133 OPEN l_osp_dtls_csr(p_osp_order_id);
3134 FETCH l_osp_dtls_csr INTO l_osp_dtls_rec;
3135 IF (l_osp_dtls_csr%NOTFOUND) THEN
3136 FND_MESSAGE.Set_Name('AHL', 'AHL_OSP_OSP_ID_INVALID');
3137 FND_MESSAGE.Set_Token('OSP_ID', p_osp_order_id);
3138 FND_MSG_PUB.ADD;
3139 IF (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3140 FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR, L_DEBUG_KEY, FALSE);
3141 END IF;
3142 CLOSE l_osp_dtls_csr;
3143 RAISE FND_API.G_EXC_ERROR;
3144 END IF;
3145 CLOSE l_osp_dtls_csr;
3146
3147 -- Update non-null local variables into cursor variable
3148 IF (p_batch_id IS NOT NULL) THEN
3149 l_osp_dtls_rec.PO_BATCH_ID := p_batch_id;
3150 END IF;
3151 IF (p_request_id IS NOT NULL) THEN
3152 l_osp_dtls_rec.PO_REQUEST_ID := p_request_id;
3153 END IF;
3154 IF (p_status_code IS NOT NULL) THEN
3155 l_osp_dtls_rec.STATUS_CODE := p_status_code;
3156 END IF;
3157 IF (p_po_header_id IS NOT NULL) THEN
3158 l_osp_dtls_rec.PO_HEADER_ID := p_po_header_id;
3159 END IF;
3160 IF (p_intf_hdr_id IS NOT NULL) THEN
3161 l_osp_dtls_rec.PO_INTERFACE_HEADER_ID := p_intf_hdr_id;
3162 END IF;
3163
3164 -- Call Table Handler
3165 AHL_OSP_ORDERS_PKG.UPDATE_ROW(
3166 X_OSP_ORDER_ID => p_osp_order_id,
3167 X_OBJECT_VERSION_NUMBER => l_osp_dtls_rec.OBJECT_VERSION_NUMBER + 1, -- Updated
3168 X_OSP_ORDER_NUMBER => l_osp_dtls_rec.OSP_ORDER_NUMBER,
3169 X_ORDER_TYPE_CODE => l_osp_dtls_rec.ORDER_TYPE_CODE,
3170 X_SINGLE_INSTANCE_FLAG => l_osp_dtls_rec.SINGLE_INSTANCE_FLAG,
3171 X_PO_HEADER_ID => l_osp_dtls_rec.PO_HEADER_ID, -- Updated
3172 X_OE_HEADER_ID => l_osp_dtls_rec.OE_HEADER_ID,
3173 X_VENDOR_ID => l_osp_dtls_rec.VENDOR_ID,
3174 X_VENDOR_SITE_ID => l_osp_dtls_rec.VENDOR_SITE_ID,
3175 X_VENDOR_CONTACT_ID => l_osp_dtls_rec.VENDOR_CONTACT_ID,
3176 X_CUSTOMER_ID => l_osp_dtls_rec.CUSTOMER_ID,
3177 X_ORDER_DATE => l_osp_dtls_rec.ORDER_DATE,
3178 X_CONTRACT_ID => l_osp_dtls_rec.CONTRACT_ID,
3179 X_CONTRACT_TERMS => l_osp_dtls_rec.CONTRACT_TERMS,
3180 X_OPERATING_UNIT_ID => l_osp_dtls_rec.OPERATING_UNIT_ID,
3181 X_PO_SYNCH_FLAG => l_osp_dtls_rec.PO_SYNCH_FLAG,
3182 X_STATUS_CODE => l_osp_dtls_rec.STATUS_CODE, -- Updated
3183 X_PO_BATCH_ID => l_osp_dtls_rec.PO_BATCH_ID, -- Updated
3184 X_PO_REQUEST_ID => l_osp_dtls_rec.PO_REQUEST_ID, -- Updated
3185 X_PO_INTERFACE_HEADER_ID => l_osp_dtls_rec.PO_INTERFACE_HEADER_ID, -- Updated
3186 X_PO_AGENT_ID => l_osp_dtls_rec.PO_AGENT_ID,
3187 X_ATTRIBUTE_CATEGORY => l_osp_dtls_rec.ATTRIBUTE_CATEGORY,
3188 X_ATTRIBUTE1 => l_osp_dtls_rec.ATTRIBUTE1,
3189 X_ATTRIBUTE2 => l_osp_dtls_rec.ATTRIBUTE2,
3190 X_ATTRIBUTE3 => l_osp_dtls_rec.ATTRIBUTE3,
3191 X_ATTRIBUTE4 => l_osp_dtls_rec.ATTRIBUTE4,
3192 X_ATTRIBUTE5 => l_osp_dtls_rec.ATTRIBUTE5,
3193 X_ATTRIBUTE6 => l_osp_dtls_rec.ATTRIBUTE6,
3194 X_ATTRIBUTE7 => l_osp_dtls_rec.ATTRIBUTE7,
3195 X_ATTRIBUTE8 => l_osp_dtls_rec.ATTRIBUTE8,
3196 X_ATTRIBUTE9 => l_osp_dtls_rec.ATTRIBUTE9,
3197 X_ATTRIBUTE10 => l_osp_dtls_rec.ATTRIBUTE10,
3198 X_ATTRIBUTE11 => l_osp_dtls_rec.ATTRIBUTE11,
3199 X_ATTRIBUTE12 => l_osp_dtls_rec.ATTRIBUTE12,
3200 X_ATTRIBUTE13 => l_osp_dtls_rec.ATTRIBUTE13,
3201 X_ATTRIBUTE14 => l_osp_dtls_rec.ATTRIBUTE14,
3202 X_ATTRIBUTE15 => l_osp_dtls_rec.ATTRIBUTE15,
3203 X_DESCRIPTION => l_osp_dtls_rec.DESCRIPTION,
3204 X_PO_REQ_HEADER_ID => l_osp_dtls_rec.PO_REQ_HEADER_ID, -- Added by jaramana on January 7, 2008 for the Requisition ER 6034236
3205 X_LAST_UPDATE_DATE => TRUNC(sysdate), -- Updated
3206 X_LAST_UPDATED_BY => fnd_global.user_id, -- Updated
3207 X_LAST_UPDATE_LOGIN => fnd_global.login_id); -- Updated
3208 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3209 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, L_DEBUG_KEY || '.end', 'Exiting Procedure');
3210 END IF;
3211 END Update_OSP_Order;
3212
3213 ----------------------------------------
3214 -- This Function gets the price of an item.
3215 -- The current logic is very simple: If the price is set at the inventory org,
3216 -- this price is returned. If not, it returns null, letting Purchasing default in this case.
3217 -- This has been made a separate function rather than inlining so that in case this logic
3218 -- needs to be changed in the future, the impact will be localized.
3219 ----------------------------------------
3220
3221 FUNCTION Get_Item_Price(p_osp_line_id IN NUMBER) RETURN NUMBER IS
3222
3223 CURSOR l_get_org_price_csr IS
3224 SELECT LIST_PRICE_PER_UNIT FROM MTL_SYSTEM_ITEMS_B MSIB, AHL_OSP_ORDER_LINES ospl
3225 WHERE MSIB.INVENTORY_ITEM_ID = ospl.service_item_id
3226 AND MSIB.ORGANIZATION_ID = ospl.inventory_org_id
3227 AND ospl.osp_order_line_id = p_osp_line_id;
3228 /*
3229 CURSOR l_get_master_price_csr IS
3230 SELECT MSIK.LIST_PRICE_PER_UNIT FROM MTL_SYSTEM_ITEMS_KFV MSIK, MTL_PARAMETERS MP
3231 WHERE MSIK.INVENTORY_ITEM_ID = p_item_id
3232 AND MSIK.ORGANIZATION_ID = MP.MASTER_ORGANIZATION_ID
3233 AND MP.ORGANIZATION_ID = p_org_id;
3234 */
3235 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.Get_Item_Price';
3236 l_price NUMBER := NULL;
3237
3238 BEGIN
3239 OPEN l_get_org_price_csr;
3240 FETCH l_get_org_price_csr INTO l_price;
3241 CLOSE l_get_org_price_csr;
3242 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3243 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_osp_line_id: ' || p_osp_line_id || ', Price: ' || l_price);
3244 END IF;
3245 RETURN l_price;
3246 END Get_Item_Price;
3247
3248 --Added by mpothuku on 10-Oct-2007 for fixing the Bug 6436184
3249 ----------------------------------------
3250 -- This function derived the charge_account_id
3251 ----------------------------------------
3252 FUNCTION get_charge_account_id(
3253 p_inv_org_id IN NUMBER,
3254 p_item_id IN NUMBER
3255 ) RETURN NUMBER IS
3256
3257 CURSOR get_exp_acct_item_csr(c_inv_org_id IN NUMBER, c_item_id IN NUMBER) IS
3258 SELECT expense_account
3259 FROM mtl_system_items_b
3260 WHERE organization_id = c_inv_org_id
3261 AND inventory_item_id = c_item_id;
3262
3263 CURSOR get_mtl_acct_org_csr(c_inv_org_id IN NUMBER) IS
3264 SELECT material_account
3265 FROM mtl_parameters
3266 WHERE organization_id = c_inv_org_id;
3267
3268 L_DEBUG_KEY CONSTANT VARCHAR2(150) := G_LOG_PREFIX || '.get_charge_account_id';
3269 l_charge_acct_id NUMBER := null;
3270 l_item_account_set BOOLEAN := FALSE;
3271
3272 BEGIN
3273 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3274 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_inv_org_id: '|| p_inv_org_id);
3275 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'p_item_id: '|| p_item_id);
3276 END IF;
3277
3278 IF(p_item_id is NULL) THEN
3279 --It is a one-time item
3280 l_item_account_set := FALSE;
3281 ELSE
3282 --Item is present, retrieve the item's expense account.
3283 OPEN get_exp_acct_item_csr(p_inv_org_id, p_item_id);
3284 FETCH get_exp_acct_item_csr INTO l_charge_acct_id;
3285 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3286 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id from item: '|| l_charge_acct_id);
3287 END IF;
3288 CLOSE get_exp_acct_item_csr;
3289 IF(l_charge_acct_id is not NULL) THEN
3290 l_item_account_set := TRUE;
3291 ELSE
3292 --Expense account not set at the Item Level.
3293 l_item_account_set := FALSE;
3294 END IF;
3295
3296 END IF;
3297
3298 IF (l_item_account_set = FALSE) THEN
3299 --Retrieve the Org's Material Account Id
3300 OPEN get_mtl_acct_org_csr(p_inv_org_id);
3301 FETCH get_mtl_acct_org_csr INTO l_charge_acct_id;
3302 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3303 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id from Org: '|| l_charge_acct_id);
3304 END IF;
3305 CLOSE get_mtl_acct_org_csr;
3306 END IF;
3307
3308 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3309 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'l_charge_acct_id: '|| l_charge_acct_id);
3310 END IF;
3311
3312 RETURN l_charge_acct_id;
3313
3314 END get_charge_account_id;
3315 --mpothuku End
3316
3317 -------------------------------
3318 -- End Local Procedures --
3319 -------------------------------
3320
3321 END AHL_OSP_PO_PVT;