1 Package Body PO_CREATE_REQUISITION_SV AS
2 /* $Header: POXCARQB.pls 120.8.12010000.3 2008/09/22 18:19:05 rohbansa ship $ */
3 --
4 -- Purpose: Create Internal Requisitions
5 --
6 -- MODIFICATION HISTORY
7 -- Person Date Comments
8 -- --------- ------ ------------------------------------------
9 -- kperiasa 08/01/01 Created new package body
10
11 G_PKG_NAME CONSTANT VARCHAR2(30) := 'PO_CREATE_REQUISITION_SV';
12 G_FILE_NAME CONSTANT VARCHAR2(30) := 'POXCARQB.pls';
13
14 -- Logging global constants
15 D_PACKAGE_BASE CONSTANT VARCHAR2(100) := PO_LOG.get_package_base(G_PKG_NAME);
16
17 -- This procedure is to get the Unit Price for Internal Requisition
18 -- If the Currency Code is same for both Source and Destination Organization
19 -- get the Unit Cost for the Source Organization, otherwise
20 -- derive Unit Price based on the List Price and Conversion Rate
21 -- This procedure will have 2 OUT parameters viz. Currency Code and Unit Price
22
23 PROCEDURE get_unit_price_prc (p_item_id IN NUMBER,
24 p_source_organization_id IN NUMBER,
25 p_destination_organization_id IN NUMBER,
26 p_set_of_books_id IN NUMBER,
27 x_chart_of_account_id IN OUT NOCOPY NUMBER,
28 x_currency_code IN OUT NOCOPY VARCHAR2,
29 x_unit_price IN OUT NOCOPY NUMBER) IS
30
31 -- Get Functional Currency and Chart of Accounts ID of the SOB for Internal Requsitions
32 CURSOR currency_code_cur (p_organization_id NUMBER) IS
33 SELECT glsob.currency_code
34 ,glsob.chart_of_accounts_id
35 FROM gl_sets_of_books glsob,
36 org_organization_definitions ood
37 WHERE glsob.set_of_books_id = ood.set_of_books_id
38 AND ood.organization_id = p_organization_id;
39
40 -- Get Unit Price for Internal Requsitions
41 CURSOR unit_price_cur (p_item_id NUMBER, p_source_organization_id NUMBER) IS
42 SELECT cic.item_cost
43 FROM cst_item_costs_for_gl_view cic,
44 mtl_parameters mp
45 WHERE cic.inventory_item_id = p_item_id
46 AND cic.organization_id = mp.cost_organization_id
47 AND cic.inventory_asset_flag = 1
48 AND mp.organization_id= p_source_organization_id;
49
50 -- Get Converted Unit Price for Purchase Requsitions
51 CURSOR converted_unit_price_int_csr (p_item_id NUMBER, p_source_organization_id NUMBER,
52 s_currency_code VARCHAR2, d_currency_code varchar2 ) IS
53 SELECT cic.item_cost *
54 round(gl_currency_api.get_closest_rate_sql
55 (s_currency_code,
56 d_currency_code,
57 trunc(sysdate),
58 psp.DEFAULT_RATE_TYPE,
59 30),10)
60 FROM cst_item_costs_for_gl_view cic,
61 mtl_parameters mp,
62 po_system_parameters psp
63 WHERE cic.inventory_item_id = p_item_id
64 AND cic.organization_id = mp.cost_organization_id
65 AND cic.inventory_asset_flag = 1
66 AND mp.organization_id= p_source_organization_id;
67
68 -- Get Converted Unit Price for Purchase Requsitions
69 CURSOR converted_unit_price_pur_cur (p_item_id NUMBER, p_source_organization_id NUMBER,
70 p_set_of_books_id NUMBER) IS
71 SELECT msi.list_price_per_unit *
72 round(gl_currency_api.get_closest_rate_sql
73 (p_set_of_books_id,
74 glsob.currency_code,
75 trunc(sysdate),
76 psp.DEFAULT_RATE_TYPE,
77 30),10)
78 FROM mtl_system_items msi,
79 gl_sets_of_books glsob,
80 org_organization_definitions ood,
81 po_system_parameters psp
82 WHERE msi.inventory_item_id = p_item_id
83 AND ood.organization_id = p_source_organization_id
84 AND msi.organization_id = ood.organization_id
85 AND glsob.set_of_books_id = ood.set_of_books_id;
86
87 s_currency_code VARCHAR2(15);
88 d_currency_code VARCHAR2(15);
89 d_chart_of_accounts_id NUMBER;
90 s_chart_of_accounts_id NUMBER;
91 l_unit_price NUMBER;
92 UNIT_PRICE_LT_0 EXCEPTION;
93 INVALID_UNIT_PRICE EXCEPTION;
94
95 l_module_name CONSTANT VARCHAR2(100) := 'get_unit_price_prc';
96 d_module_base CONSTANT VARCHAR2(100) := PO_LOG.get_subprogram_base(D_PACKAGE_BASE, l_module_name);
97 d_progress NUMBER;
98
99 BEGIN
100
101 IF (PO_LOG.d_proc) THEN
102 PO_LOG.proc_begin(d_module_base);
103 PO_LOG.proc_begin(d_module_base, 'p_item_id', p_item_id);
104 PO_LOG.proc_begin(d_module_base, 'p_source_organization_id', p_source_organization_id);
105 PO_LOG.proc_begin(d_module_base, 'p_destination_organization_id', p_destination_organization_id);
106 PO_LOG.proc_begin(d_module_base, 'p_set_of_books_id', p_set_of_books_id);
107 PO_LOG.proc_begin(d_module_base, 'x_chart_of_account_id', x_chart_of_account_id);
108 PO_LOG.proc_begin(d_module_base, 'x_currency_code', x_currency_code);
109 PO_LOG.proc_begin(d_module_base, 'x_unit_price', x_unit_price);
110 END IF;
111
112 -- Get the SOB Currency Code of the Source Organization ID
113 OPEN currency_code_cur(p_source_organization_id);
114 FETCH currency_code_cur INTO s_currency_code, s_chart_of_accounts_id;
115 CLOSE currency_code_cur;
116
117
118
119 -- Get SOB Currency Code of the Destination (Inventory) Organization
120 OPEN currency_code_cur(p_destination_organization_id);
121 FETCH currency_code_cur INTO d_currency_code, d_chart_of_accounts_id;
122 CLOSE currency_code_cur;
123
124 x_chart_of_account_id := d_chart_of_accounts_id; -- Bug 5637277
125
126 -- If Currency Code is same for both Destination and Source Organization
127 -- Get Item Cost of the Source Organization ID from cst_item_costs__for_gl_view
128 IF NVL(s_currency_code,'X') = NVL(d_currency_code,'X') THEN
129 -- Get Unit Cost
130 OPEN unit_price_cur (p_item_id, p_source_organization_id);
131 FETCH unit_price_cur INTO l_unit_price;
132 IF unit_price_cur%NOTFOUND THEN
133 CLOSE unit_price_cur;
134 Raise INVALID_UNIT_PRICE;
135 END IF;
136 CLOSE unit_price_cur;
137 IF l_unit_price < 0 THEN
138 Raise UNIT_PRICE_LT_0;
139 END IF;
140 ELSE /* Currency Code is different for Source and Destination Organization */
141 -- Get converted Unit price for internal requisition
142 -- Bug 7313047 - When creating internal requisition from Advance Planning workbench if the
143 -- source and destination org, have different functional currency,
144 -- then, we need to get the item cost from source org and convert it
145 -- to destination org's currency type.
146 IF p_source_organization_id IS NOT NULL THEN -- Bug 7313047
147 OPEN converted_unit_price_int_csr (p_item_id, p_source_organization_id, s_currency_code, d_currency_code);
148 FETCH converted_unit_price_int_csr INTO l_unit_price;
149 IF converted_unit_price_int_csr%NOTFOUND THEN
150 CLOSE converted_unit_price_int_csr; -- Bug 3468739
151 Raise INVALID_UNIT_PRICE;
152 END IF;
153 CLOSE converted_unit_price_int_csr; -- Bug 3468739
154 IF l_unit_price < 0 THEN
155 Raise UNIT_PRICE_LT_0;
156 END IF;
157 ELSE
158 -- Get converted Unit price for purchase requisition
159 OPEN converted_unit_price_pur_cur (p_item_id, p_source_organization_id, p_set_of_books_id);
160 FETCH converted_unit_price_pur_cur INTO l_unit_price;
161 IF converted_unit_price_pur_cur%NOTFOUND THEN
162 CLOSE converted_unit_price_pur_cur; -- Bug 3468739
163 Raise INVALID_UNIT_PRICE;
164 END IF;
165 CLOSE converted_unit_price_pur_cur; -- Bug 3468739
166 IF l_unit_price < 0 THEN
167 Raise UNIT_PRICE_LT_0;
168 END IF;
169 END IF; /* p_source_organization_id check */
170 END IF; /* Currency Check */
171
172 x_currency_code := d_currency_code;
173 x_unit_price := l_unit_price;
174 x_chart_of_account_id := d_chart_of_accounts_id; /* bug 5637277 replaced s_chart_of_accounts_id with d_chart_of_accounts_id */
175
176 IF (PO_LOG.d_proc) THEN
177 PO_LOG.proc_end(d_module_base);
178 PO_LOG.proc_end(d_module_base, 'x_currency_code',x_currency_code);
179 PO_LOG.proc_end(d_module_base, 'x_unit_price',x_unit_price);
180 PO_LOG.proc_end(d_module_base, 'x_chart_of_account_id',x_chart_of_account_id);
181 END IF;
182
183 EXCEPTION
184
185 WHEN UNIT_PRICE_LT_0 THEN
186 po_message_s.app_error('PO_RI_UNIT_PRICE_LT_0');
187 raise;
188
189 WHEN INVALID_UNIT_PRICE THEN
190 x_unit_price := 0;
191
192 END get_unit_price_prc;
193
194 -- This function is to check the subinventory type to derive
195 -- Code Combinatin ID. Function Returns Sub Inventory Type
196 -- 'ASSET' or 'EXPENSE'. If EXCEPTION, Returns 'X'
197
198 FUNCTION check_sub_inv_type_fun (p_destination_subinventory IN VARCHAR2,
199 p_destination_organization_id IN NUMBER )
200 RETURN VARCHAR2 IS
201
202 CURSOR asset_inventory_cur IS
203 SELECT asset_inventory
204 FROM mtl_secondary_inventories
205 WHERE secondary_inventory_name = NVL(p_destination_subinventory,'X')
206 AND organization_id = p_destination_organization_id;
207
208 l_asset_inventory NUMBER;
209 l_subinventory_type VARCHAR2(10) := 'X';
210
211 BEGIN
212 OPEN asset_inventory_cur;
213 FETCH asset_inventory_cur INTO l_asset_inventory;
214 CLOSE asset_inventory_cur;
215
216 IF (l_asset_inventory = 1) THEN
217 l_subinventory_type := 'ASSET';
218 ELSIF (l_asset_inventory = 2) then
219 l_subinventory_type := 'EXPENSE';
220 END IF;
221
222 RETURN l_subinventory_type;
223
224 EXCEPTION
225
226 WHEN OTHERS THEN
227 RETURN 'X';
228
229 END check_sub_inv_type_fun ;
230
231 -- This function is to check the item type to derive
232 -- Code Combinatin ID. Function Returns Item Type
233 -- 'ASSET' or 'EXPENSE'. If EXCEPTION, Returns 'X'
234
235 FUNCTION check_inv_item_type_fun ( p_destination_organization_id IN NUMBER,
236 p_item_id IN NUMBER)
237 RETURN VARCHAR2 IS
238
239 CURSOR item_type_cur IS
240 SELECT inventory_asset_flag
241 FROM mtl_system_items
242 WHERE organization_id = p_destination_organization_id
243 AND inventory_item_id = p_item_id;
244
245 l_item_type VARCHAR2(10) := 'X';
246 l_asset_flag VARCHAR2(1);
247
248 BEGIN
249
250 OPEN item_type_cur;
251 FETCH item_type_cur INTO l_asset_flag;
252 CLOSE item_type_cur;
253
254 IF l_asset_flag = 'Y' then
255 l_item_type := 'ASSET';
256 ELSE
257 l_item_type := 'EXPENSE';
258 END IF;
259
260 RETURN l_item_type;
261
262 EXCEPTION
263
264 WHEN OTHERS THEN
265 RETURN 'X';
266
267 END check_inv_item_type_fun;
268
269 -- This function is to default Code Combination ID for
270 -- Destination Type Code INVENTORY
271 -- Called in Process_Requisition
272
273 FUNCTION get_charge_account_fun (p_destination_organization_id IN NUMBER,
274 p_item_id IN NUMBER,
275 p_destination_subinventory IN VARCHAR DEFAULT NULL)
276 RETURN NUMBER IS
277
278 l_charge_account NUMBER := NULL;
279 l_item_type VARCHAR2(10);
280 l_subinventory_type VARCHAR2(10) := 'X';
281
282 l_module_name CONSTANT VARCHAR2(100) := 'get_charge_account_fun';
283 d_module_base CONSTANT VARCHAR2(100) := PO_LOG.get_subprogram_base(D_PACKAGE_BASE, l_module_name);
284 d_progress NUMBER;
285
286 BEGIN
287
288 d_progress := 10;
289
290 IF (PO_LOG.d_proc) THEN
291 PO_LOG.proc_begin(d_module_base);
292 PO_LOG.proc_begin(d_module_base, 'p_destination_organization_id', p_destination_organization_id);
293 PO_LOG.proc_begin(d_module_base, 'p_item_id', p_item_id);
294 PO_LOG.proc_begin(d_module_base, 'p_destination_subinventory', p_destination_subinventory);
295 END IF;
296
297 d_progress := 20;
298
299 l_item_type := check_inv_item_type_fun (p_destination_organization_id, p_item_id);
300
301 IF PO_LOG.d_stmt THEN
302 PO_LOG.stmt(d_module_base,d_progress,'l_item_type='||l_item_type);
303 END IF;
304
305 d_progress := 30;
306 IF l_item_type = 'EXPENSE' then
307
308 d_progress := 40;
309 -- Subinventory is provided
310 IF (p_destination_subinventory IS NOT NULL) THEN
311 BEGIN
312 d_progress := 50;
313 SELECT expense_account
314 INTO l_charge_account
315 FROM mtl_secondary_inventories
316 WHERE secondary_inventory_name = p_destination_subinventory
317 AND organization_id = p_destination_organization_id;
318 EXCEPTION
319 WHEN OTHERS THEN
320 NULL;
321 d_progress := 60;
322 END;
323 END IF;
324
325 IF PO_LOG.d_stmt THEN
326 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
327 END IF;
328
329 -- If Expense Account not available for the Subinventory and Org,
330 -- get expense account from Item Master for the Item and the Org
331 IF (l_charge_account IS NULL) THEN
332 BEGIN
333 d_progress := 70;
334 SELECT expense_account
335 INTO l_charge_account
336 FROM mtl_system_items
337 WHERE organization_id = p_destination_organization_id
338 AND inventory_item_id = p_item_id;
339 EXCEPTION
340 WHEN OTHERS THEN
341 NULL;
342 d_progress := 80;
343 END;
344 END IF;
345
346 IF PO_LOG.d_stmt THEN
347 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
348 END IF;
349
350 -- If Expense Account not available in Item Master, get account
351 -- from MTL_PARAMETERS for the Destination Organization
352 IF (l_charge_account IS NULL) THEN
353 BEGIN
354 d_progress := 90;
355 SELECT expense_account
356 INTO l_charge_account
357 FROM mtl_parameters
358 WHERE organization_id = p_destination_organization_id;
359 EXCEPTION
360 WHEN OTHERS THEN
361 NULL;
362 d_progress := 100;
363 END;
364 END IF;
365
366 IF PO_LOG.d_stmt THEN
367 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
368 END IF;
369
370 ELSE -- item type is ASSET
371
372 d_progress := 110;
373 --Check subinventory for Asset or Expense tracking.
374 IF (p_destination_subinventory IS NOT NULL) THEN
375 d_progress := 120;
376 l_subinventory_type := check_sub_inv_type_fun(p_destination_subinventory,
377 p_destination_organization_id);
378 END IF;
379
380 IF PO_LOG.d_stmt THEN
381 PO_LOG.stmt(d_module_base,d_progress,'l_subinventory_type' , l_subinventory_type);
382 END IF;
383
384 d_progress := 130;
385 -- Get the default account from the Organization if Subinventory Type is NOT
386 -- EXPENSE or ASSET
387 IF l_subinventory_type = 'X' then
388 BEGIN
389 d_progress := 140;
390 SELECT material_account
391 INTO l_charge_account
392 FROM mtl_parameters
393 WHERE organization_id = p_destination_organization_id;
394 EXCEPTION
395 WHEN OTHERS THEN
396 NULL;
397 d_progress := 150;
398 END;
399
400 IF PO_LOG.d_stmt THEN
401 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
402 END IF;
403
404 ELSIF l_subinventory_type = 'EXPENSE' THEN
405 -- Get Expense Account for the Subinventory
406 BEGIN
407 d_progress := 160;
408 SELECT expense_account
409 INTO l_charge_account
410 FROM mtl_secondary_inventories
411 WHERE secondary_inventory_name = p_destination_subinventory
412 AND organization_id = p_destination_organization_id;
413 EXCEPTION
414 WHEN OTHERS THEN
415 NULL;
416 d_progress := 170;
417 END;
418
419 IF PO_LOG.d_stmt THEN
420 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
421 END IF;
422
423 -- If charge account is NULL for the Subinventory, get the default account
424 -- for the Organization from MTL_PARAMETERS
425 IF (l_charge_account is NULL) THEN
426 BEGIN
427 d_progress := 180;
428 SELECT expense_account
429 INTO l_charge_account
430 FROM mtl_parameters
431 WHERE organization_id = p_destination_organization_id;
432 EXCEPTION
433 WHEN OTHERS THEN
434 NULL;
435 d_progress := 190;
436 END;
437 END IF;
438
439 IF PO_LOG.d_stmt THEN
440 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
441 END IF;
442
443 ELSE -- destination sub inventory type is ASSET
444 -- Get the Charge_Account for the Subinventory
445 BEGIN
446 d_progress := 200;
447 SELECT material_account
448 INTO l_charge_account
449 FROM mtl_secondary_inventories
450 WHERE secondary_inventory_name = p_destination_subinventory
451 AND organization_id = p_destination_organization_id;
452 EXCEPTION
453 WHEN OTHERS THEN
454 NULL;
455 d_progress := 210;
456 END;
457
458 IF PO_LOG.d_stmt THEN
459 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
460 END IF;
461
462 -- If Charge_account is not availabe for the Subinventory,
463 -- get it for the Destination Organization from MTL_PARAMETERS
464 IF (l_charge_account IS NULL) THEN
465 BEGIN
466 d_progress := 220;
467 SELECT material_account
468 INTO l_charge_account
469 FROM mtl_parameters
470 WHERE organization_id = p_destination_organization_id;
471 EXCEPTION
472 WHEN OTHERS THEN
473 NULL;
474 d_progress := 230;
475 END;
476 END IF;
477
478 IF PO_LOG.d_stmt THEN
479 PO_LOG.stmt(d_module_base,d_progress,'l_charge_account',l_charge_account);
480 END IF;
481 END IF; /* Sub Inventory Type */
482 END IF; /* Item Type Check */
483
484 IF (PO_LOG.d_proc) THEN
485 PO_LOG.proc_end(d_module_base);
486 PO_LOG.proc_end(d_module_base, 'l_charge_account',l_charge_account);
487 END IF;
488
489 RETURN (l_charge_account);
490 EXCEPTION
491 WHEN OTHERS THEN
492 IF (PO_LOG.d_exc) THEN
493 PO_LOG.exc(d_module_base, d_progress, 'Unhandled exception in '||l_module_name||': '||SQLERRM);
494 END IF;
495 NULL;
496 END get_charge_account_fun;
497
498
499 /*
500 Function to validate Code Combination IDs.
501 If INVALID function will return FALSE
502 */
503
504 FUNCTION valid_account_id_fun (p_ccid IN NUMBER,
505 p_gl_date IN DATE,
506 p_chart_of_accounts_id IN NUMBER)
507 RETURN BOOLEAN IS
508
509
510 l_module_name CONSTANT VARCHAR2(100) := 'valid_account_id_fun';
511 d_module_base CONSTANT VARCHAR2(100) := PO_LOG.get_subprogram_base(D_PACKAGE_BASE, l_module_name);
512 d_progress NUMBER;
513
514 CURSOR validate_ccid_cur IS
515 SELECT 'X'
516 FROM gl_code_combinations gcc
517 WHERE gcc.code_combination_id = p_ccid
518 AND gcc.enabled_flag = 'Y'
519 AND trunc(nvl(p_gl_date,SYSDATE))
520 BETWEEN trunc(nvl(start_date_active, nvl(p_gl_date,SYSDATE) ))
521 AND trunc(nvl (end_date_active, SYSDATE+1))
522 AND gcc.detail_posting_allowed_flag = 'Y'
523 AND gcc.chart_of_accounts_id= p_chart_of_accounts_id
524 AND gcc.summary_flag = 'N';
525
526 l_dummy VARCHAR2(1);
527
528 BEGIN
529
530 d_progress := 10;
531
532 IF (PO_LOG.d_proc) THEN
533 PO_LOG.proc_begin(d_module_base);
534 PO_LOG.proc_begin(d_module_base, 'p_ccid', p_ccid);
535 PO_LOG.proc_begin(d_module_base, 'p_gl_date', p_gl_date);
536 PO_LOG.proc_begin(d_module_base, 'p_chart_of_accounts_id', p_chart_of_accounts_id);
537 END IF;
538
539 d_progress := 20;
540 OPEN validate_ccid_cur;
541
542 d_progress := 30;
543 FETCH validate_ccid_cur INTO l_dummy;
544 d_progress := 40;
545 IF validate_ccid_cur%FOUND THEN
546 CLOSE validate_ccid_cur;
547
548 d_progress := 50;
549 IF (PO_LOG.d_proc) THEN
550 PO_LOG.proc_end(d_module_base);
551 PO_LOG.proc_end(d_module_base, 'return TRUE',0);
552 END IF;
553
554
555 RETURN TRUE;
556 ELSE
557 CLOSE validate_ccid_cur;
558
559 d_progress := 60;
560 IF (PO_LOG.d_proc) THEN
561 PO_LOG.proc_end(d_module_base);
562 PO_LOG.proc_end(d_module_base, 'return FALSE',1);
563 END IF;
564
565 RETURN FALSE;
566 END IF;
567
568 EXCEPTION
569
570 WHEN OTHERS THEN
571 IF (PO_LOG.d_exc) THEN
572 PO_LOG.exc(d_module_base, d_progress, 'Unhandled exception in '||l_module_name||': '||SQLERRM);
573 END IF;
574
575 return (FALSE);
576
577 END valid_account_id_fun;
578
579
580 /* Procedure to Process Internal Requisition. Most of the values will come from
581 the colling routine, however, PO_REQ_DISTRIBUTIONS table will be populated
582 within this Package.
583
584 This package assumes that there is only one distribution per order line, since
585 Order Line cannot be shipped to multiple locations.
586
587 Minimum validations are considered when populating PO_REQUISITION_HEADERS and
588 PO_REQUISITION_LINES. However, when populating PO_REQ_DISTRIBUTIONS,validations
589 related to ACCOUNTS are done.
590
591 This package assumes that Inventory Item ID will always be passed from the
592 calling routine, since ITEM_DESCRIPTION is a mandatory column in PO_REQUISITION_LINES.
593 */
594
595 PROCEDURE process_requisition(
596 p_api_version IN NUMBER := 1.0
597 ,p_Init_Msg_List IN VARCHAR2 := FND_API.G_TRUE
598 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
599 ,px_header_rec IN OUT NOCOPY po_create_requisition_sv.header_rec_type
600 ,px_line_table IN OUT NOCOPY po_create_requisition_sv.Line_Tbl_type
601 ,x_return_status OUT NOCOPY VARCHAR2
602 ,x_msg_count OUT NOCOPY NUMBER
603 ,x_msg_data OUT NOCOPY VARCHAR2
604 )
605 IS
606
607 l_api_version_number CONSTANT NUMBER := 1.0;
608 l_api_name CONSTANT VARCHAR2(30) := 'process_requisition';
609 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
610 l_msg_count NUMBER;
611 l_msg_data VARCHAR2(2000);
612 l_commit VARCHAR2(1) := FND_API.G_FALSE;
613 l_user_id NUMBER;
614 l_login_id NUMBER;
615 l_today DATE;
616
617 EXCP_USER_DEFINED EXCEPTION;
618 INVALID_ITEM EXCEPTION;
619 INVALID_ITEM_CATEGORY EXCEPTION;
620 INVALID_QUANTITY EXCEPTION;
621 INVALID_SOURCE_TYPE EXCEPTION;
622 INVALID_DESTINATION_TYPE EXCEPTION;
623 UNIT_PRICE_LT_0 EXCEPTION;
624 INVALID_UNIT_PRICE EXCEPTION;
625 INVALID_CHARGE_ACCOUNT EXCEPTION;
626 INVALID_ACCRUAL_ACCOUNT EXCEPTION;
627 INVALID_BUDGET_ACCOUNT EXCEPTION;
628 INVALID_VARIANCE_ACCOUNT EXCEPTION;
629 INVALID_AUTH_STATUS EXCEPTION;
630 INVALID_PREPARER_ID EXCEPTION;
631 INVALID_LOCATION_ID EXCEPTION;
632 INVALID_DESTINATION_ORG EXCEPTION;
633 INVALID_UNIT_OF_MEASURE EXCEPTION;
634
635 s_chart_of_accounts_id NUMBER;
636 s_currency_code VARCHAR2(15);
637 l_dummy VARCHAR2(1);
638 l_line_type_id po_requisition_lines.line_type_id%TYPE;
639 l_create_req_supply BOOLEAN;
640 l_set_of_books_id NUMBER;
641
642 l_header_rec po_create_requisition_sv.Header_Rec_Type;
643 l_line_rec po_create_requisition_sv.Line_Rec_Type;
644 l_line_tbl po_create_requisition_sv.Line_tbl_Type;
645 l_dist_rec po_create_requisition_sv.Dist_rec_Type;
646
647 l_msg varchar2(2000);
648
649 d_chart_of_accounts_id NUMBER; /* bug 5637277 - Please refer the bug for the details */
650
651
652 l_manufacturer_id po_requisition_lines_All.MANUFACTURER_ID%TYPE;
653 l_manufacturer_name PO_ATTRIBUTE_VALUES_TLP.manufacturer%TYPE;
654 l_manufacturer_pn PO_ATTRIBUTE_VALUES.manufacturer_part_num%TYPE;
655 l_lead_time PO_ATTRIBUTE_VALUES.lead_time%TYPE;
656
657
658
659 -- bug5176308
660 -- removed the cursor to get req number as the logic is moved to
661 -- an API
662
663 -- Cursor to get unique Requisition_Header_ID
664 CURSOR req_header_id_cur IS
665 SELECT po_requisition_headers_s.nextval
666 FROM sys.dual;
667
668 -- Cursor to get unique Requisition_Line_ID
669 CURSOR req_line_id_cur IS
670 SELECT po_requisition_lines_s.nextval
671 FROM sys.dual;
672
673 -- Cursor to get unique Distribution_id
674 CURSOR dist_line_id_cur IS
675 SELECT po_req_distributions_s.nextval
676 FROM sys.dual;
677
678 -- Cursor to get Accrual Account ID and Variance Account ID
679 -- For Destination Type Code INVENTORY get accrual account id
680 -- from MTL_PARAMETERS
681 -- Per Requisition Import program (pocis.opc).
682 CURSOR accrual_account_id_cur (p_destination_organization_id NUMBER) IS
683 SELECT mp.ap_accrual_account,
684 mp.invoice_price_var_account
685 FROM mtl_parameters mp
686 WHERE mp.organization_id = p_destination_organization_id;
687
688 -- Get Default Line Type
689 CURSOR line_type_cur (p_org_id NUMBER) IS
690 SELECT line_type_id
691 FROM PO_SYSTEM_PARAMETERS
692 WHERE org_id = p_org_id;
693
694 -- Get Item Description for a given Item ID
695 -- For the purpose of creating Approve Internal Requisition
696 -- it is assumed that the calling procedure will always pass the Item ID
697 -- so that Item Description can be derived.
698 CURSOR item_desc_cur(p_item_id NUMBER, p_orgn_id NUMBER) IS
699 SELECT description
700 FROM mtl_system_items_b
701 WHERE inventory_item_id = p_item_id
702 AND organization_id = p_orgn_id;
703
704 -- Get Item Category ID
705 -- As in Requisition Import
706 CURSOR item_category_cur(p_item_id NUMBER, p_destination_org_id NUMBER) IS
707 SELECT mic.category_id
708 FROM mtl_item_categories mic,
709 mtl_default_sets_view mdsv
710 WHERE mic.inventory_item_id = p_item_id
711 AND mic.organization_id = p_destination_org_id
712 AND mic.category_set_id = mdsv.category_set_id
713 AND mdsv.functional_area_id = 2;
714
715 -- For Source Type Code validation, if passed to the procedure
716 CURSOR source_type_cur (p_source_type_code VARCHAR2) IS
717 SELECT 'X'
718 FROM po_lookup_codes plc
719 WHERE plc.lookup_type = 'REQUISITION SOURCE TYPE'
720 AND plc.lookup_code = p_source_type_code;
721
722 -- For Destination Type Code validation, if passed to the procedure
723 CURSOR destination_type_cur (p_destination_type_code VARCHAR2) IS
724 SELECT 'X'
725 FROM po_lookup_codes plc
726 WHERE plc.lookup_type = 'DESTINATION TYPE'
727 AND plc.lookup_code = p_destination_type_code;
728
729 -- For Authorization Status validation, if passed to the procedure
730 CURSOR authorization_status_cur (p_authorization_status VARCHAR2) IS
731 SELECT 'X'
732 FROM po_lookup_codes plc
733 WHERE plc.lookup_type = 'AUTHORIZATION STATUS'
734 AND plc.lookup_code = p_authorization_status;
735
736 -- Get Set of Books ID for a given Org_ID - Mandatory in PO_REQ_DISTRIBUTIONS
737 CURSOR set_of_books_cur (p_organization_id NUMBER) IS
738 SELECT set_of_books_id
739 FROM hr_operating_units
740 WHERE organization_id = p_organization_id;
741
742 -- If encumbrance flag is 'Y' get the budget account
743 -- For Internal Req, Destination Type Code will be INVENTORY
744 -- Hence, it is assumed that the budget account will come
745 -- from MTL_PARAMETERS for the Item and the Destination Organization
746 CURSOR budget_account_cur (p_destination_organization_id NUMBER,
747 p_item_id NUMBER) IS
748 SELECT nvl (msi.encumbrance_account,mp.encumbrance_account)
749 FROM mtl_system_items msi,
750 mtl_parameters mp
751 WHERE msi.inventory_item_id = p_item_id
752 AND msi.organization_id = p_destination_organization_id
753 AND mp.organization_id = msi.organization_id;
754
755 -- Get Requisition Encumbrance Flag for the Set of Books
756 -- Based of this flag Budget Account will be populated
757 -- in PO_REQ_DISTRIBUTIONS
758 CURSOR req_encumbrance_cur (p_set_of_books_id NUMBER) IS
759 SELECT nvl (fsp.req_encumbrance_flag,'N')
760 FROM financials_system_parameters fsp
761 WHERE fsp.set_of_books_id = p_set_of_books_id;
762
763 -- Get Charge Account for the Item and Organization
764 CURSOR charge_account_cur (p_destination_organization_id NUMBER,
765 p_item_id NUMBER) IS
766 SELECT NVL(expense_account,-1)
767 FROM mtl_system_items
768 WHERE inventory_item_id = p_item_id
769 AND organization_id = p_destination_organization_id;
770
771 -- Get Unit_of_Measure from MTL_UNIT_OF_MEASURES, since OM passes
772 -- only UOM_CODE and PO requires UNIT_OF_MEASURE. This is being done
773 -- to fix the problem of line not showing up from POXRQVRQ form
774 CURSOR unit_of_measure_cur (p_uom_code VARCHAR2) IS
775 SELECT mum.unit_of_measure
776 FROM mtl_units_of_measure mum
777 WHERE mum.uom_code = p_uom_code;
778
779 BEGIN
780
781 IF fnd_api.to_boolean(P_Init_Msg_List) THEN
782 -- initialize message list
783 FND_MSG_PUB.initialize;
784 END IF;
785
786 -- Standard call to check for call compatibility.
787
788 IF NOT FND_API.Compatible_API_Call ( l_api_version_number,
789 p_api_version,
790 l_api_name,
791 G_PKG_NAME)
792 THEN
793 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
794 END IF;
795
796 -- initialize return status
797 x_return_status := FND_API.G_RET_STS_SUCCESS;
798
799 l_header_rec := px_header_rec;
800 l_line_tbl := px_line_table;
801
802 -- get all the values required to insert into po_requisition_header table
803 SELECT Sysdate INTO l_today FROM dual;
804
805 l_user_id := fnd_global.user_id;
806 l_login_id := fnd_global.login_id;
807
808
809 -- Get Requisition_header_id
810 OPEN req_header_id_cur;
811 FETCH req_header_id_cur into l_header_rec.requisition_header_id;
812 CLOSE req_header_id_cur;
813
814 -- bug5176308
815 l_header_rec.segment1 :=
816 PO_CORE_SV1.default_po_unique_identifier
817 ( x_table_name => 'PO_REQUISITION_HEADERS'
818 );
819
820 -- check for uniqueness of requisition_number
821 BEGIN
822
823 SELECT 'X' INTO l_dummy
824 FROM DUAL
825 WHERE NOT EXISTS
826 ( SELECT 'X'
827 FROM po_requisition_headers
828 WHERE Segment1 = l_header_rec.segment1);
829
830 EXCEPTION
831 WHEN NO_DATA_FOUND THEN
832 po_message_s.app_error('PO_ALL_ENTER_UNIQUE_VAL');
833 raise;
834 WHEN OTHERS THEN
835 po_message_s.sql_error('check_unique','010',sqlcode);
836 raise;
837 END;
838
839 -- Raise Error, if preparer_id IS NULL
840 IF l_header_rec.preparer_id IS NULL THEN
841 Raise INVALID_PREPARER_ID;
842 END IF;
843
844 -- Default Summary Flag to 'N', if NULL
845 IF l_header_rec.summary_flag IS NULL THEN
846 l_header_rec.summary_flag := 'N';
847 END IF;
848
849 -- Default Enabled Flag to 'Y', if NULL
850 IF l_header_rec.enabled_flag IS NULL THEN
851 l_header_rec.enabled_flag := 'Y';
852 END IF;
853
854 -- Default Transferred to OE Flag to 'Y', if NULL
855 -- This is done to make sure that these requisitions don't get
856 -- picked up at the time of populating order interface
857 IF l_header_rec.transferred_to_oe_flag IS NULL THEN
858 l_header_rec.transferred_to_oe_flag := 'Y';
859 END IF;
860
861 -- Default Authorization to APPROVED, if NULL
862 IF l_header_rec.authorization_status IS NULL THEN
863 l_header_rec.authorization_status := 'APPROVED';
864 ELSE
865 OPEN authorization_status_cur (l_header_rec.authorization_status);
866 FETCH authorization_status_cur INTO l_dummy;
867 IF authorization_status_cur%NOTFOUND THEN
868 CLOSE authorization_status_cur;
869 Raise INVALID_AUTH_STATUS;
870 END IF;
871 CLOSE authorization_status_cur;
872 END IF;
873
874 -- create approved requisition headers
875 -- insert into PO_REQUISITION_HEADERS
876 INSERT INTO po_requisition_headers(
877 org_id,
878 requisition_header_id,
879 preparer_id,
880 last_update_date,
881 last_updated_by,
882 segment1,
883 summary_flag,
884 enabled_flag,
885 segment2,
886 segment3,
887 segment4,
888 segment5,
889 start_date_active,
890 end_date_active,
891 last_update_login,
892 creation_date,
893 created_by,
894 description,
895 authorization_status,
896 note_to_authorizer,
897 type_lookup_code,
898 transferred_to_oe_flag,
899 attribute_category,
900 attribute1,
901 attribute2,
902 attribute3,
903 attribute4,
904 attribute5,
905 attribute6,
906 attribute7,
907 attribute8,
908 attribute9,
909 attribute10,
910 attribute11,
911 attribute12,
912 attribute13,
913 attribute14,
914 attribute15,
915 government_context,
916 closed_code,
917 tax_attribute_update_code --<eTax Integration R12>
918 ) VALUES (
919 l_header_rec.org_id,
920 l_header_rec.requisition_header_id,
921 l_header_rec.preparer_id,
922 l_today,
923 l_user_id,
924 l_header_rec.segment1,
925 l_header_rec.summary_flag,
926 l_header_rec.enabled_flag,
927 l_header_rec.segment2,
928 l_header_rec.segment3,
929 l_header_rec.segment4,
930 l_header_rec.segment5,
931 l_header_rec.start_date_active,
932 l_header_rec.end_date_active,
933 l_header_rec.last_update_login,
934 l_today,
935 l_user_id,
936 l_header_rec.description,
937 l_header_rec.authorization_status,
938 l_header_rec.note_to_authorizer,
939 l_header_rec.type_lookup_code,
940 l_header_rec.transferred_to_oe_flag,
941 l_header_rec.attribute_category,
942 l_header_rec.attribute1,
943 l_header_rec.attribute2,
944 l_header_rec.attribute3,
945 l_header_rec.attribute4,
946 l_header_rec.attribute5,
947 l_header_rec.attribute6,
948 l_header_rec.attribute7,
949 l_header_rec.attribute8,
950 l_header_rec.attribute9,
951 l_header_rec.attribute10,
952 l_header_rec.attribute11,
953 l_header_rec.attribute12,
954 l_header_rec.attribute13,
955 l_header_rec.attribute14,
956 l_header_rec.attribute15,
957 l_header_rec.government_context,
958 l_header_rec.closed_code ,
959 'CREATE' --<eTax Integration R12>
960 );
961
962 -- get all the values required to insert into po_requisition_lines table
963
964 -- line_type_id for Requisition
965 OPEN line_type_cur (l_header_rec.org_id);
966 FETCH line_type_cur INTO l_line_type_id;
967 CLOSE line_type_cur;
968
969 FOR I IN 1..l_line_tbl.COUNT LOOP
970
971 -- Get Set of Books Id
972 OPEN set_of_books_cur (l_line_tbl(i).org_id);
973 FETCH set_of_books_cur INTO l_set_of_books_id;
974 CLOSE set_of_books_cur;
975
976 -- get requisition_line_id
977 IF (l_line_tbl(i).Requisition_Line_Id is NULL) THEN
978 OPEN req_line_id_cur;
979 FETCH req_line_id_cur INTO l_line_tbl(i).requisition_line_id;
980 CLOSE req_line_id_cur;
981 END IF;
982
983 -- Assign Requisition Header ID
984 IF (l_line_tbl(i).requisition_header_id IS NULL) THEN
985 l_line_tbl(i).requisition_header_id := l_header_rec.requisition_header_id;
986 END IF;
987
988 -- Assign the default line_type_id if there isn't one
989 IF (l_line_tbl(i).line_type_id IS NULL) THEN
990 l_line_tbl(i).line_type_id := l_line_type_id;
991 END IF;
992
993 -- <SERVICES FPJ START>
994 -- Populate the values of order_type_lookup_code, purchase_basis
995 -- and matching_basis based on the line_type_id
996 BEGIN
997 SELECT order_type_lookup_code,
998 purchase_basis,
999 matching_basis
1000 INTO l_line_tbl(i).order_type_lookup_code,
1001 l_line_tbl(i).purchase_basis,
1002 l_line_tbl(i).matching_basis
1003 FROM po_line_types
1004 WHERE line_type_id = l_line_tbl(i).line_type_id;
1005 EXCEPTION
1006 WHEN OTHERS THEN
1007 null;
1008 END;
1009 -- <SERVICES FPJ END>
1010
1011 -- INVALID_LOCATION_ID and INVALID_DESTINATION_ORG exceptions
1012 -- were added as part of this package to avoid seeding new messages
1013 -- in OM when validating deliver_to_location_id and destination_organization_id
1014
1015 IF l_line_tbl(i).deliver_to_location_id IS NULL THEN
1016 Raise INVALID_LOCATION_ID;
1017 END IF;
1018
1019 IF l_line_tbl(i).destination_organization_id IS NULL THEN
1020 Raise INVALID_DESTINATION_ORG;
1021 END IF;
1022
1023 -- Get Item Description, if NULL
1024 -- It is assumed that whenever this procedure is called, Item ID will be
1025 -- passed. If Item Description is NULL, Raise ERROR.
1026 IF (l_line_tbl(i).item_description IS NULL) THEN
1027 OPEN item_desc_cur(l_line_tbl(i).item_id, l_line_tbl(i).destination_organization_id);
1028 FETCH item_desc_cur INTO l_line_tbl(i).item_description;
1029 IF item_desc_cur%NOTFOUND THEN
1030 CLOSE item_desc_cur;
1031 Raise INVALID_ITEM;
1032 END IF;
1033 CLOSE item_desc_cur;
1034 END IF;
1035
1036 -- Get Category ID of the Item
1037 IF (l_line_tbl(i).category_id IS NULL) THEN
1038 OPEN item_category_cur (l_line_tbl(i).item_id, l_line_tbl(i).destination_organization_id);
1039 FETCH item_category_cur INTO l_line_tbl(i).category_id;
1040 IF item_category_cur%NOTFOUND THEN
1041 CLOSE item_category_cur;
1042 Raise INVALID_ITEM_CATEGORY;
1043 END IF;
1044 CLOSE item_category_cur;
1045 END IF;
1046
1047 -- Derive Unit_of_Measure from Uom_Code passed from OM
1048 OPEN unit_of_measure_cur(l_line_tbl(i).uom_code);
1049 FETCH unit_of_measure_cur INTO l_line_tbl(i).unit_meas_lookup_code;
1050 IF unit_of_measure_cur%NOTFOUND THEN
1051 CLOSE unit_of_measure_cur;
1052 Raise INVALID_UNIT_OF_MEASURE;
1053 ELSE
1054 CLOSE unit_of_measure_cur;
1055 END IF;
1056
1057 /* Get Unit Price and Currency Code*/
1058 get_unit_price_prc (l_line_tbl(i).item_id
1059 ,l_line_tbl(i).source_organization_id
1060 ,l_line_tbl(i).destination_organization_id
1061 ,l_set_of_books_id
1062 ,d_chart_of_accounts_id
1063 ,l_line_tbl(i).currency_code
1064 ,l_line_tbl(i).unit_price );
1065
1066 -- Quantity MUST be > 0 for Requisition
1067 IF (l_line_tbl(i).quantity <= 0) THEN
1068 Raise INVALID_QUANTITY;
1069 END IF;
1070
1071 -- Default INVENTORY as Source_Type_Code for Internal Requisitions if not passed
1072 -- If passed, validate Source Type Code from PO_LOOKUP_CODES
1073 -- If Invalid, Raise Error
1074 IF (l_line_tbl(i).source_type_code IS NULL ) THEN
1075 l_line_tbl(i).source_type_code := 'INVENTORY';
1076 ELSE
1077 OPEN source_type_cur(l_line_tbl(i).source_type_code);
1078 FETCH source_type_cur INTO l_dummy;
1079 IF source_type_cur%NOTFOUND THEN
1080 CLOSE source_type_cur;
1081 Raise INVALID_SOURCE_TYPE;
1082 END IF;
1083 CLOSE source_type_cur;
1084 END IF;
1085
1086 -- Default Encumbered_Flag to 'N'
1087 -- Since the funds reservation API is not called from here, this flag is
1088 -- set to 'N'
1089 IF (l_line_tbl(i).encumbered_flag IS NULL) THEN
1090 l_line_tbl(i).encumbered_flag := 'N';
1091 END IF;
1092
1093 -- Default Cancel_flag to 'N'
1094 IF (l_line_tbl(i).cancel_flag IS NULL) THEN
1095 l_line_tbl(i).cancel_flag := 'N';
1096 END IF;
1097
1098 -- Default INVENTORY as Destination_Type_Code for Internal Requisitions if not passed
1099 -- If passed, validate Destination Type Code from PO_LOOKUP_CODES
1100 -- If Invalid, Raise Error
1101 IF (l_line_tbl(i).destination_type_code IS NULL ) THEN
1102 l_line_tbl(i).destination_type_code := 'INVENTORY';
1103 ELSE
1104 OPEN destination_type_cur(l_line_tbl(i).destination_type_code);
1105 FETCH destination_type_cur INTO l_dummy;
1106 IF destination_type_cur%NOTFOUND THEN
1107 CLOSE destination_type_cur;
1108 Raise INVALID_DESTINATION_TYPE;
1109 END IF;
1110 CLOSE destination_type_cur;
1111 END IF;
1112
1113 -- insert into po_requisition_lines table
1114 -- <SERVICES FPJ>
1115 -- Added order_type_lookup_code, purchase_basis and
1116 -- matching_basis
1117
1118
1119 IF (l_line_tbl(i).item_id IS NOT NULL) Then
1120
1121
1122 po_attribute_values_pvt.get_item_attributes_values(l_line_tbl(i).item_id, l_manufacturer_pn,l_manufacturer_name,
1123 l_lead_time,l_manufacturer_id) ;
1124
1125 END IF ;
1126
1127
1128 INSERT INTO po_requisition_lines(
1129 requisition_line_id,
1130 requisition_header_id,
1131 line_num,
1132 line_type_id,
1133 category_id,
1134 item_description,
1135 unit_meas_lookup_code,
1136 unit_price,
1137 quantity,
1138 deliver_to_location_id,
1139 to_person_id,
1140 last_update_date,
1141 last_updated_by,
1142 source_type_code,
1143 last_update_login,
1144 creation_date,
1145 created_by,
1146 item_id,
1147 item_revision,
1148 encumbered_flag,
1149 rfq_required_flag,
1150 need_by_date,
1151 source_organization_id,
1152 source_subinventory,
1153 destination_type_code,
1154 destination_organization_id,
1155 destination_subinventory,
1156 line_location_id,
1157 modified_by_agent_flag,
1158 parent_req_line_id,
1159 justification,
1160 note_to_agent,
1161 note_to_receiver,
1162 purchasing_agent_id,
1163 document_type_code,
1164 blanket_po_header_id,
1165 blanket_po_line_num,
1166 currency_code,
1167 rate_type,
1168 rate_date,
1169 rate,
1170 currency_unit_price,
1171 suggested_vendor_name,
1172 suggested_vendor_location,
1173 suggested_vendor_contact,
1174 suggested_vendor_phone,
1175 suggested_vendor_product_code,
1176 un_number_id,
1177 hazard_class_id,
1178 must_use_sugg_vendor_flag,
1179 reference_num,
1180 on_rfq_flag,
1181 urgent_flag,
1182 cancel_flag,
1183 quantity_cancelled,
1184 cancel_date,
1185 cancel_reason,
1186 closed_code,
1187 agent_return_note,
1188 changed_after_research_flag,
1189 vendor_id,
1190 vendor_site_id,
1191 vendor_contact_id,
1192 research_agent_id,
1193 wip_entity_id,
1194 wip_line_id,
1195 wip_repetitive_schedule_id,
1196 wip_operation_seq_num,
1197 wip_resource_seq_num,
1198 attribute_category,
1199 destination_context,
1200 inventory_source_context,
1201 vendor_source_context,
1202 attribute1,
1203 attribute2,
1204 attribute3,
1205 attribute4,
1206 attribute5,
1207 attribute6,
1208 attribute7,
1209 attribute8,
1210 attribute9,
1211 attribute10,
1212 attribute11,
1213 attribute12,
1214 attribute13,
1215 attribute14,
1216 attribute15,
1217 bom_resource_id,
1218 government_context,
1219 closed_reason,
1220 closed_date,
1221 transaction_reason_code,
1222 quantity_received,
1223 order_type_lookup_code,
1224 purchase_basis,
1225 matching_basis,
1226 org_id, -- <R12 MOAC>
1227 tax_attribute_update_code, --<eTax Integration R12>
1228 MANUFACTURER_ID, --bug 7387487
1229 MANUFACTURER_NAME,
1230 MANUFACTURER_PART_NUMBER
1231 ) VALUES (
1232 l_line_tbl(i).requisition_line_id,
1233 l_line_tbl(i).requisition_header_id,
1234 l_line_tbl(i).line_num,
1235 l_line_tbl(i).line_type_id,
1236 l_line_tbl(i).category_id,
1237 l_line_tbl(i).item_description,
1238 l_line_tbl(i).unit_meas_lookup_code,
1239 l_line_tbl(i).unit_price,
1240 l_line_tbl(i).quantity,
1241 l_line_tbl(i).deliver_to_location_id,
1242 l_line_tbl(i).to_person_id,
1243 l_today, -- last_update_date
1244 l_user_id, --last_updated_by
1245 l_line_tbl(i).source_type_code,
1246 l_login_id, --last_update_login
1247 l_today, --creation_date
1248 l_user_id, --created_by
1249 l_line_tbl(i).item_id,
1250 l_line_tbl(i).item_revision,
1251 l_line_tbl(i).encumbered_flag,
1252 l_line_tbl(i).rfq_required_flag,
1253 l_line_tbl(i).need_by_date,
1254 l_line_tbl(i).source_organization_id,
1255 l_line_tbl(i).source_subinventory,
1256 l_line_tbl(i).destination_type_code,
1257 l_line_tbl(i).destination_organization_id,
1258 l_line_tbl(i).destination_subinventory,
1259 l_line_tbl(i).line_location_id,
1260 l_line_tbl(i).modified_by_agent_flag,
1261 l_line_tbl(i).parent_req_line_id,
1262 l_line_tbl(i).justification,
1263 l_line_tbl(i).note_to_agent,
1264 l_line_tbl(i).note_to_receiver,
1265 l_line_tbl(i).purchasing_agent_id,
1266 l_line_tbl(i).document_type_code,
1267 l_line_tbl(i).blanket_po_header_id,
1268 l_line_tbl(i).blanket_po_line_num,
1269 l_line_tbl(i).currency_code,
1270 l_line_tbl(i).rate_type,
1271 l_line_tbl(i).rate_date,
1272 l_line_tbl(i).rate,
1273 l_line_tbl(i).currency_unit_price,
1274 l_line_tbl(i).suggested_vendor_name,
1275 l_line_tbl(i).suggested_vendor_location,
1276 l_line_tbl(i).suggested_vendor_contact,
1277 l_line_tbl(i).suggested_vendor_phone,
1278 l_line_tbl(i).suggested_vendor_product_code,
1279 l_line_tbl(i).un_number_id,
1280 l_line_tbl(i).hazard_class_id,
1281 l_line_tbl(i).must_use_sugg_vendor_flag,
1282 l_line_tbl(i).reference_num,
1283 l_line_tbl(i).on_rfq_flag,
1284 l_line_tbl(i).urgent_flag,
1285 l_line_tbl(i).cancel_flag,
1286 l_line_tbl(i).quantity_cancelled,
1287 l_line_tbl(i).cancel_date,
1288 l_line_tbl(i).cancel_reason,
1289 l_line_tbl(i).closed_code,
1290 l_line_tbl(i).agent_return_note,
1291 l_line_tbl(i).changed_after_research_flag,
1292 l_line_tbl(i).vendor_id,
1293 l_line_tbl(i).vendor_site_id,
1294 l_line_tbl(i).vendor_contact_id,
1295 l_line_tbl(i).research_agent_id,
1296 l_line_tbl(i).wip_entity_id,
1297 l_line_tbl(i).wip_line_id,
1298 l_line_tbl(i).wip_repetitive_schedule_id,
1299 l_line_tbl(i).wip_operation_seq_num,
1300 l_line_tbl(i).wip_resource_seq_num,
1301 l_line_tbl(i).attribute_category,
1302 l_line_tbl(i).destination_context,
1303 l_line_tbl(i).inventory_source_context,
1304 l_line_tbl(i).vendor_source_context,
1305 l_line_tbl(i).attribute1,
1306 l_line_tbl(i).attribute2,
1307 l_line_tbl(i).attribute3,
1308 l_line_tbl(i).attribute4,
1309 l_line_tbl(i).attribute5,
1310 l_line_tbl(i).attribute6,
1311 l_line_tbl(i).attribute7,
1312 l_line_tbl(i).attribute8,
1313 l_line_tbl(i).attribute9,
1314 l_line_tbl(i).attribute10,
1315 l_line_tbl(i).attribute11,
1316 l_line_tbl(i).attribute12,
1317 l_line_tbl(i).attribute13,
1318 l_line_tbl(i).attribute14,
1319 l_line_tbl(i).attribute15,
1320 l_line_tbl(i).bom_resource_id,
1321 l_line_tbl(i).government_context,
1322 l_line_tbl(i).closed_reason,
1323 l_line_tbl(i).closed_date,
1324 l_line_tbl(i).transaction_reason_code,
1325 l_line_tbl(i).quantity_received,
1326 l_line_tbl(i).order_type_lookup_code,
1327 l_line_tbl(i).purchase_basis,
1328 l_line_tbl(i).matching_basis,
1329 l_line_tbl(i).org_id, -- <R12 MOAC>
1330 'CREATE', --<eTax Integration R12>
1331 l_manufacturer_id,
1332 l_manufacturer_name,
1333 l_manufacturer_pn
1334 );
1335
1336 l_dist_rec.org_id := l_line_tbl(i).org_id; -- <R12 MOAC>
1337
1338 -- It is assumed that only 1 dIstribution line will be there for each
1339 -- INTERNAL Requisition. If Multiple Distributions Lines are to created
1340 -- This procedure should be modified
1341
1342 -- Get Distribution ID from the Distribution Sequence
1343 OPEN dist_line_id_cur;
1344 FETCH dist_line_id_cur INTO l_dist_rec.distribution_id;
1345 CLOSE dist_line_id_cur;
1346
1347 -- Assign Requisition Line ID if NULL
1348 l_dist_rec.requisition_line_id := l_line_tbl(i).requisition_line_id;
1349
1350 -- Assign Requisition Quantity if NULL
1351 l_dist_rec.req_line_quantity := l_line_tbl(i).quantity;
1352
1353 -- Assign Requisition Line Number as Distribution Number
1354 l_dist_rec.distribution_num := l_line_tbl(i).line_num;
1355
1356 -- Assign SYSDATE to gl_encumbered_date
1357 l_dist_rec.gl_encumbered_date := l_today;
1358 --s_chart_of_accounts_id := 101;
1359
1360 -- Get Charge Account ID
1361 l_dist_rec.code_combination_id := get_charge_account_fun
1362 (l_line_tbl(i).destination_organization_id,
1363 l_line_tbl(i).item_id,
1364 l_line_tbl(i).destination_subinventory);
1365
1366 -- Check for valid charge account. If Invalid Raise ERROR
1367 IF NOT valid_account_id_fun (l_dist_rec.code_combination_id,
1368 l_dist_rec.gl_encumbered_date,
1369 d_chart_of_accounts_id) THEN /* bug 5637277 replaced s_chart_of_accounts_id with d_chart_of_accounts_id */
1370 Raise INVALID_CHARGE_ACCOUNT;
1371 END IF;
1372
1373 -- Get Accrual Account ID and Variance Account ID for the
1374 --Destination Organization from MTL_PARAMETERS
1375
1376 OPEN accrual_account_id_cur (l_line_tbl(i).destination_organization_id);
1377 FETCH accrual_account_id_cur
1378 INTO l_dist_rec.accrual_account_id,
1379 l_dist_rec.variance_account_id;
1380 CLOSE accrual_account_id_cur;
1381
1382 -- Check for valid accrual account. If Invalid Raise ERROR
1383 IF NOT valid_account_id_fun (l_dist_rec.accrual_account_id,
1384 l_dist_rec.gl_encumbered_date,
1385 d_chart_of_accounts_id) THEN /* bug 5637277 replaced s_chart_of_accounts_id with d_chart_of_accounts_id */
1386 Raise INVALID_ACCRUAL_ACCOUNT;
1387 END IF;
1388
1389 -- Check for valid variance account. If Invalid Raise ERROR
1390 IF NOT valid_account_id_fun (l_dist_rec.variance_account_id,
1391 l_dist_rec.gl_encumbered_date,
1392 d_chart_of_accounts_id) THEN /* bug 5637277 replaced s_chart_of_accounts_id with d_chart_of_accounts_id */
1393 Raise INVALID_VARIANCE_ACCOUNT;
1394 END IF;
1395
1396 -- Assign Set of Books ID
1397 l_dist_rec.set_of_books_id := l_set_of_books_id;
1398
1399 -- Get Requisition Encumbrance Flag for Financial System Parameters
1400 -- If Req_Encumbrance_flag = 'Y' populate Budget Account ID for
1401 -- Req Distribution
1402 -- If gl_encumbered_flag = 'N' then don't populate gl_encumbered_date
1403 OPEN req_encumbrance_cur (l_dist_rec.set_of_books_id);
1404 FETCH req_encumbrance_cur INTO l_dist_rec.encumbered_flag;
1405 CLOSE req_encumbrance_cur;
1406 IF l_dist_rec.encumbered_flag = 'Y' THEN
1407 OPEN budget_account_cur (l_line_tbl(i).destination_organization_id,
1408 l_line_tbl(i).item_id);
1409 FETCH budget_account_cur INTO l_dist_rec.budget_account_id;
1410 CLOSE budget_account_cur;
1411 -- Check for valid budget account. If Invalid Raise ERROR
1412 IF NOT valid_account_id_fun (l_dist_rec.budget_account_id,
1413 l_dist_rec.gl_encumbered_date,
1414 d_chart_of_accounts_id) THEN /* bug 5637277 replaced s_chart_of_accounts_id with d_chart_of_accounts_id */
1415 Raise INVALID_BUDGET_ACCOUNT;
1416 END IF;
1417 ELSE
1418 l_dist_rec.gl_encumbered_date := '';
1419 END IF;
1420
1421
1422 INSERT INTO po_req_distributions
1423 (
1424 distribution_id
1425 ,last_update_date
1426 ,last_updated_by
1427 ,requisition_line_id
1428 ,set_of_books_id
1429 ,code_combination_id
1430 ,req_line_quantity
1431 ,last_update_login
1432 ,creation_date
1433 ,created_by
1434 ,encumbered_flag
1435 ,gl_encumbered_date
1436 ,gl_encumbered_period_name
1437 ,gl_cancelled_date
1438 ,failed_funds_lookup_code
1439 ,encumbered_amount
1440 ,budget_account_id
1441 ,accrual_account_id
1442 ,variance_account_id
1443 ,prevent_encumbrance_flag
1444 ,attribute_category
1445 ,attribute1
1446 ,attribute2
1447 ,attribute3
1448 ,attribute4
1449 ,attribute5
1450 ,attribute6
1451 ,attribute7
1452 ,attribute8
1453 ,attribute9
1454 ,attribute10
1455 ,attribute11
1456 ,attribute12
1457 ,attribute13
1458 ,attribute14
1459 ,attribute15
1460 ,government_context
1461 ,project_id
1462 ,task_id
1463 ,expenditure_type
1464 ,project_accounting_context
1465 ,expenditure_organization_id
1466 ,gl_closed_date
1467 ,source_req_distribution_id
1468 ,distribution_num
1469 ,project_related_flag
1470 ,expenditure_item_date
1471 ,org_id
1472 ,allocation_type
1473 ,allocation_value
1474 ,award_id
1475 ,end_item_unit_number
1476 ,recoverable_tax
1477 ,nonrecoverable_tax
1478 ,recovery_rate
1479 ,tax_recovery_override_flag
1480 ,oke_contract_line_id
1481 ,oke_contract_deliverable_id
1482 )
1483 VALUES
1484 (
1485 l_dist_rec.distribution_id
1486 ,l_today --last_update_date
1487 ,l_user_id --last_updated_by
1488 ,l_dist_rec.requisition_line_id
1489 ,l_dist_rec.set_of_books_id
1490 ,l_dist_rec.code_combination_id
1491 ,l_dist_rec.req_line_quantity
1492 ,l_login_id --last_update_login
1493 ,l_today --creation_date
1494 ,l_user_id --created_by
1495 ,l_dist_rec.encumbered_flag
1496 ,l_dist_rec.gl_encumbered_date
1497 ,l_dist_rec.gl_encumbered_period_name
1498 ,l_dist_rec.gl_cancelled_date
1499 ,l_dist_rec.failed_funds_lookup_code
1500 ,l_dist_rec.encumbered_amount
1501 ,l_dist_rec.budget_account_id
1502 ,l_dist_rec.accrual_account_id
1503 ,l_dist_rec.variance_account_id
1504 ,l_dist_rec.prevent_encumbrance_flag
1505 ,l_dist_rec.attribute_category
1506 ,l_dist_rec.attribute1
1507 ,l_dist_rec.attribute2
1508 ,l_dist_rec.attribute3
1509 ,l_dist_rec.attribute4
1510 ,l_dist_rec.attribute5
1511 ,l_dist_rec.attribute6
1512 ,l_dist_rec.attribute7
1513 ,l_dist_rec.attribute8
1514 ,l_dist_rec.attribute9
1515 ,l_dist_rec.attribute10
1516 ,l_dist_rec.attribute11
1517 ,l_dist_rec.attribute12
1518 ,l_dist_rec.attribute13
1519 ,l_dist_rec.attribute14
1520 ,l_dist_rec.attribute15
1521 ,l_dist_rec.government_context
1522 ,l_dist_rec.project_id
1523 ,l_dist_rec.task_id
1524 ,l_dist_rec.expenditure_type
1525 ,l_dist_rec.project_accounting_context
1526 ,l_dist_rec.expenditure_organization_id
1527 ,l_dist_rec.gl_closed_date
1528 ,l_dist_rec.source_req_distribution_id
1529 ,l_dist_rec.distribution_num
1530 ,l_dist_rec.project_related_flag
1531 ,l_dist_rec.expenditure_item_date
1532 ,l_dist_rec.org_id
1533 ,l_dist_rec.allocation_type
1534 ,l_dist_rec.allocation_value
1535 ,l_dist_rec.award_id
1536 ,l_dist_rec.end_item_unit_number
1537 ,l_dist_rec.recoverable_tax
1538 ,l_dist_rec.nonrecoverable_tax
1539 ,l_dist_rec.recovery_rate
1540 ,l_dist_rec.tax_recovery_override_flag
1541 ,l_dist_rec.oke_contract_line_id
1542 ,l_dist_rec.oke_contract_deliverable_id
1543 );
1544
1545 END LOOP;
1546
1547 -- Create Supply Record for the Requisition.
1548
1549 l_create_req_supply := PO_SUPPLY.create_req(l_header_rec.requisition_header_id,
1550 'REQ HDR');
1551
1552 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1553 RAISE FND_API.G_EXC_ERROR;
1554 END IF;
1555
1556
1557 fnd_msg_pub.count_and_get
1558 ( p_count => x_msg_count
1559 , p_data => x_msg_data);
1560
1561 px_header_rec := l_header_rec;
1562 px_line_table := l_line_tbl;
1563
1564
1565 EXCEPTION
1566 WHEN INVALID_ITEM THEN
1567 po_message_s.app_error('PO_RI_ITEM_DESC_MISMATCH');
1568 raise;
1569
1570 WHEN UNIT_PRICE_LT_0 THEN
1571 po_message_s.app_error('PO_RI_UNIT_PRICE_LT_0');
1572 raise;
1573
1574 WHEN INVALID_ITEM_CATEGORY THEN
1575 po_message_s.app_error('PO_RI_INVALID_CATEGORY_ID');
1576 raise;
1577
1578 WHEN INVALID_QUANTITY THEN
1579 po_message_s.app_error('PO_RI_QUANTITY_LE_0');
1580 raise;
1581
1582 WHEN INVALID_SOURCE_TYPE THEN
1583 po_message_s.app_error('PO_RI_INVALID_SOURCE_TYPE_CODE');
1584 raise;
1585
1586 WHEN INVALID_CHARGE_ACCOUNT THEN
1587 po_message_s.app_error('PO_RI_INVALID_CHARGE_ACC_ID');
1588 raise;
1589
1590 WHEN INVALID_ACCRUAL_ACCOUNT THEN
1591 po_message_s.app_error('PO_RI_INVALID_ACCRUAL_ACC_ID');
1592 raise;
1593
1594 WHEN INVALID_BUDGET_ACCOUNT THEN
1595 po_message_s.app_error('PO_RI_INVALID_BUDGET_ACC_ID');
1596 raise;
1597
1598 WHEN INVALID_VARIANCE_ACCOUNT THEN
1599 po_message_s.app_error('PO_RI_INVALID_VARIANCE_ACC_ID');
1600 raise;
1601
1602 WHEN INVALID_AUTH_STATUS THEN
1603 po_message_s.app_error('PO_RI_INVALID_AUTH_STATUS');
1604 raise;
1605
1606 WHEN INVALID_PREPARER_ID THEN
1607 po_message_s.app_error('PO_RI_INACTIVE_PREPARER');
1608 raise;
1609
1610 WHEN INVALID_LOCATION_ID THEN
1611 po_message_s.app_error('PO_RI_INVALID_LOCATION');
1612 raise;
1613
1614 WHEN INVALID_DESTINATION_ORG THEN
1615 po_message_s.app_error('PO_RI_INVALID_DEST_ORG');
1616 raise;
1617
1618 WHEN INVALID_UNIT_OF_MEASURE THEN
1619 po_message_s.app_error('PO_RI_M_INVALID_UOM');
1620 raise;
1621
1622 WHEN FND_API.G_EXC_ERROR THEN
1623 NULL;
1624
1625 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1626 FND_MESSAGE.SET_NAME('PO', 'PO_UNEXPECTED_EXEC_ERRORS');
1627 FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
1628 FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
1629 FND_MSG_PUB.ADD;
1630 fnd_msg_pub.count_and_get
1631 ( p_count => x_msg_count
1632 , p_data => x_msg_data);
1633 x_return_status := FND_API.G_RET_STS_ERROR;
1634
1635 WHEN OTHERS THEN
1636 FND_MESSAGE.SET_NAME('PO', 'PO_UNEXPECTED_EXEC_ERRORS');
1637 FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
1638 FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
1639 FND_MSG_PUB.ADD;
1640 fnd_msg_pub.count_and_get
1641 ( p_count => x_msg_count
1642 , p_data => x_msg_data);
1643 x_return_status := FND_API.G_RET_STS_ERROR;
1644
1645 END;
1646
1647 END PO_CREATE_REQUISITION_SV;