1: PACKAGE BODY po_supply AS
2: /* $Header: RCVRCSUB.pls 120.22.12020000.2 2012/07/10 09:28:25 ptkumar ship $ */
3:
4:
5:
72: l_return_status VARCHAR2(1);
73: l_action VARCHAR2(200);
74: --
75:
76: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.po_req_supply';
77: d_progress NUMBER;
78: l_doc_id NUMBER;
79:
80: l_return_value BOOLEAN;
162: p_lineid => p_lineid
163: , p_receipt_date => p_receipt_date
164: );
165:
166: ELSIF (p_action = 'Approve_PO_Supply') THEN
167:
168: d_progress := 110;
169: l_return_value := approve_po_supply(p_docid => p_docid);
170:
165:
166: ELSIF (p_action = 'Approve_PO_Supply') THEN
167:
168: d_progress := 110;
169: l_return_value := approve_po_supply(p_docid => p_docid);
170:
171: ELSIF (p_action = 'Approve_Blanket_Release_Supply') THEN
172:
173: d_progress := 120;
177:
178: d_progress := 130;
179: l_return_value := approve_planned_supply(p_docid => p_docid);
180:
181: ELSIF (p_action = 'Create_PO_Supply') THEN
182:
183: d_progress := 140;
184: l_return_value := create_po_supply(
185: p_entity_id => p_docid
180:
181: ELSIF (p_action = 'Create_PO_Supply') THEN
182:
183: d_progress := 140;
184: l_return_value := create_po_supply(
185: p_entity_id => p_docid
186: , p_entity_type => 'PO'
187: );
188:
188:
189: ELSIF (p_action = 'Create_Release_Supply') THEN
190:
191: d_progress := 150;
192: l_return_value := create_po_supply(
193: p_entity_id => p_docid
194: , p_entity_type => 'RELEASE'
195: );
196:
196:
197: ELSIF (p_action = 'Create_PO_Line_Supply') THEN
198:
199: d_progress := 160;
200: l_return_value := create_po_supply(
201: p_entity_id => p_lineid
202: , p_entity_type => 'PO LINE'
203: );
204:
204:
205: ELSIF (p_action = 'Create_PO_Shipment_Supply') THEN
206:
207: d_progress := 170;
208: l_return_value := create_po_supply(
209: p_entity_id => p_shipid
210: , p_entity_type => 'PO SHIPMENT'
211: );
212:
212:
213: ELSIF (p_action = 'Create_Release_Shipment_Supply') THEN
214:
215: d_progress := 180;
216: l_return_value := create_po_supply(
217: p_entity_id => p_shipid
218: , p_entity_type => 'RELEASE SHIPMENT'
219: );
220:
217: p_entity_id => p_shipid
218: , p_entity_type => 'RELEASE SHIPMENT'
219: );
220:
221: ELSIF (p_action = 'Remove_PO_Supply') THEN
222:
223: d_progress := 190;
224: l_return_value := delete_supply(
225: p_entity_id => p_docid
258: , p_entity_type => 'RELEASE SHIPMENT'
259: , p_shipid => p_shipid
260: );
261:
262: ELSIF (p_action = 'Cancel_PO_Supply') THEN
263:
264: d_progress := 240;
265: l_return_value := cancel_supply(
266: p_entity_id => p_docid
406: );
407:
408: --Bug5060175 END
409:
410: ELSIF p_action NOT IN ( 'Remove_PO_Supply'
411: ,'Remove_PO_Line_Supply'
412: ,'Remove_PO_Shipment_Supply'
413: ) THEN
414:
482: /* */
483: /* ----------------------------------------------------------------------- */
484:
485:
486: FUNCTION approve_po_supply(p_docid IN NUMBER) RETURN BOOLEAN IS
487:
488: l_auth_status po_headers.authorization_status%TYPE;
489:
490: --
497: SELECT poh.authorization_status
498: FROM po_headers_all poh
499: WHERE poh.po_header_id = header_id;
500:
501: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.approve_po_supply';
502: d_progress NUMBER;
503:
504: l_return_value BOOLEAN := FALSE;
505:
519: d_progress := 20;
520:
521: BEGIN
522:
523: -- Create PO Supply if the PO has been Approved
524:
525: IF (l_auth_status = 'APPROVED') THEN
526:
527: d_progress := 30;
525: IF (l_auth_status = 'APPROVED') THEN
526:
527: d_progress := 30;
528:
529: l_return_value := create_po_supply(
530: p_entity_id => p_docid
531: , p_entity_type => 'PO'
532: );
533:
533:
534: IF (NOT l_return_value) THEN
535:
536: IF (PO_LOG.d_stmt) THEN
537: PO_LOG.stmt(d_module, d_progress, 'create_po_supply not successful');
538: END IF;
539:
540: RAISE PO_CORE_S.g_early_return_exc;
541: END IF;
593: END IF;
594:
595: return(FALSE);
596:
597: END approve_po_supply;
598:
599:
600:
601: /* ----------------------------------------------------------------------- */
617: SELECT por.authorization_status
618: FROM po_releases_all por
619: WHERE por.po_release_id = release_id;
620:
621: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.approve_blanket_supply';
622: d_progress NUMBER;
623:
624: l_return_value BOOLEAN := FALSE;
625:
645: IF (l_auth_status = 'APPROVED') THEN
646:
647: d_progress := 30;
648:
649: l_return_value := create_po_supply(
650: p_entity_id => p_docid
651: , p_entity_type => 'RELEASE'
652: );
653:
653:
654: IF (NOT l_return_value) THEN
655:
656: IF (PO_LOG.d_stmt) THEN
657: PO_LOG.stmt(d_module, d_progress, 'create_po_supply not successful');
658: END IF;
659:
660: RAISE PO_CORE_S.g_early_return_exc;
661: END IF;
737: SELECT por.authorization_status, por.po_header_id
738: FROM po_releases_all por
739: WHERE por.po_release_id = release_id;
740:
741: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.approve_planned_supply';
742: d_progress NUMBER;
743:
744: l_return_value BOOLEAN := FALSE;
745:
766: IF (l_auth_status = 'APPROVED') THEN
767:
768: d_progress := 30;
769:
770: l_return_value := create_po_supply(
771: p_entity_id => p_docid
772: , p_entity_type => 'RELEASE'
773: );
774:
774:
775: IF (NOT l_return_value) THEN
776:
777: IF (PO_LOG.d_stmt) THEN
778: PO_LOG.stmt(d_module, d_progress, 'create_po_supply not successful');
779: END IF;
780:
781: RAISE PO_CORE_S.g_early_return_exc;
782: END IF;
784:
785: d_progress := 40;
786:
787:
788: -- Remove Planned PO Supply
789:
790: --
791: -- conflicted in how planned PO supply was removed. The
792: -- Pro*C version was used. Calling create_supply will
787:
788: -- Remove Planned PO Supply
789:
790: --
791: -- conflicted in how planned PO supply was removed. The
792: -- Pro*C version was used. Calling create_supply will
793: -- do the necessary subtractions.
794:
795: l_return_value := create_po_supply(
791: -- conflicted in how planned PO supply was removed. The
792: -- Pro*C version was used. Calling create_supply will
793: -- do the necessary subtractions.
794:
795: l_return_value := create_po_supply(
796: p_entity_id => l_po_header_id
797: , p_entity_type => 'PO'
798: );
799:
799:
800: IF (NOT l_return_value) THEN
801:
802: IF (PO_LOG.d_stmt) THEN
803: PO_LOG.stmt(d_module, d_progress, 'create_po_supply not successful');
804: END IF;
805:
806: RAISE PO_CORE_S.g_early_return_exc;
807: END IF;
844:
845:
846: /* ----------------------------------------------------------------------- */
847: /* */
848: /* Create PO Supply */
849: /* */
850: /* Insert new PO Supply into mtl_supply for Standard or Planned PO */
851: /* Approval, Blanket or Planned Release Approval, Standard or Planned */
852: /* PO Line Approval, Standard or Planned PO Shipment Approval, Blanket */
846: /* ----------------------------------------------------------------------- */
847: /* */
848: /* Create PO Supply */
849: /* */
850: /* Insert new PO Supply into mtl_supply for Standard or Planned PO */
851: /* Approval, Blanket or Planned Release Approval, Standard or Planned */
852: /* PO Line Approval, Standard or Planned PO Shipment Approval, Blanket */
853: /* or Planned Release Shipment */
854: /* */
851: /* Approval, Blanket or Planned Release Approval, Standard or Planned */
852: /* PO Line Approval, Standard or Planned PO Shipment Approval, Blanket */
853: /* or Planned Release Shipment */
854: /* */
855: /* New PO Supply is inserted based on Entity Type */
856: /* */
857: /* Entity Type Action */
858: /* ----------- --------------------------------------------- */
859: /* PO New PO Supply for Standard or Planned PO */
855: /* New PO Supply is inserted based on Entity Type */
856: /* */
857: /* Entity Type Action */
858: /* ----------- --------------------------------------------- */
859: /* PO New PO Supply for Standard or Planned PO */
860: /* Approval */
861: /* */
862: /* RELEASE New PO Supply for Blanket or Planned Release */
863: /* Approval */
858: /* ----------- --------------------------------------------- */
859: /* PO New PO Supply for Standard or Planned PO */
860: /* Approval */
861: /* */
862: /* RELEASE New PO Supply for Blanket or Planned Release */
863: /* Approval */
864: /* */
865: /* PO LINE New PO Supply for Standard or Planned PO Line */
866: /* Approval */
861: /* */
862: /* RELEASE New PO Supply for Blanket or Planned Release */
863: /* Approval */
864: /* */
865: /* PO LINE New PO Supply for Standard or Planned PO Line */
866: /* Approval */
867: /* */
868: /* PO SHIPMENT New PO Supply for Standard or Planned PO */
869: /* Shipment Approval */
864: /* */
865: /* PO LINE New PO Supply for Standard or Planned PO Line */
866: /* Approval */
867: /* */
868: /* PO SHIPMENT New PO Supply for Standard or Planned PO */
869: /* Shipment Approval */
870: /* */
871: /* RELEASE New PO Supply for Blanket or Planned Release */
872: /* SHIPMENT Shipment */
867: /* */
868: /* PO SHIPMENT New PO Supply for Standard or Planned PO */
869: /* Shipment Approval */
870: /* */
871: /* RELEASE New PO Supply for Blanket or Planned Release */
872: /* SHIPMENT Shipment */
873: /* */
874: /* ----------------------------------------------------------------------- */
875:
872: /* SHIPMENT Shipment */
873: /* */
874: /* ----------------------------------------------------------------------- */
875:
876: --
878: -- to reflect the logic in Pro*C wherever there is a conflict.
879:
880: FUNCTION create_po_supply(
876: --
877: -- vs. the Pro*C code. The latter is more accurate, so the method has been changed
878: -- to reflect the logic in Pro*C wherever there is a conflict.
879:
880: FUNCTION create_po_supply(
881: p_entity_id IN NUMBER
882: , p_entity_type IN VARCHAR2
883: ) RETURN BOOLEAN
884: IS
912: GROUP BY to_org_primary_uom, nvl(item_id, -1);
913:
914: l_prev_line_loc_id NUMBER := -9999;
915:
916: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.create_po_supply';
917: d_progress NUMBER;
918:
919: l_return_value BOOLEAN := FALSE;
920:
1212: END IF; -- IF (l_line_loc_id <> l_prev_line_loc_id)
1213:
1214: --
1215: /* this is for std receipt against multi dists for CLM POs
1216: * the PO supply qty should be consume against specific dist_id, not in FIFO manner for line_loc_id
1217: */
1218: IF (p_entity_type = 'PO SHIPMENT' AND l_dist_count > 1) AND
1219: (l_is_clm_po = 'Y' AND l_partial_funded_flag = 'Y') THEN
1220:
1265: PO_LOG.stmt(d_module, d_progress, 'l_supply_qty_in_pouom', l_supply_qty_in_pouom);
1266: PO_LOG.stmt(d_module, d_progress, 'l_out_poqty', l_out_poqty);
1267: END IF;
1268:
1269: -- Create PO Supply
1270: /*Bug 4537860:Hit the _all tables instead of the striped views.*/
1271:
1272: INSERT INTO mtl_supply(supply_type_code,
1273: supply_source_id,
1386: END IF;
1387:
1388: return(FALSE);
1389:
1390: END create_po_supply;
1391:
1392:
1393: /* ----------------------------------------------------------------------- */
1394: /* */
1393: /* ----------------------------------------------------------------------- */
1394: /* */
1395: /* Delete Supply for PO Header or PO Release */
1396: /* */
1397: /* New PO Supply is inserted based on Entity Type */
1398: /* */
1399: /* Entity Type Action */
1400: /* ----------- ----------------------------------------- */
1401: /* PO Remove PO Supply for PO Header */
1397: /* New PO Supply is inserted based on Entity Type */
1398: /* */
1399: /* Entity Type Action */
1400: /* ----------- ----------------------------------------- */
1401: /* PO Remove PO Supply for PO Header */
1402: /* */
1403: /* RELEASE Remove PO Supply for PO Release */
1404: /* */
1405: /* PO LINE Remove PO Supply for PO Line */
1399: /* Entity Type Action */
1400: /* ----------- ----------------------------------------- */
1401: /* PO Remove PO Supply for PO Header */
1402: /* */
1403: /* RELEASE Remove PO Supply for PO Release */
1404: /* */
1405: /* PO LINE Remove PO Supply for PO Line */
1406: /* */
1407: /* PO SHIPMENT Remove PO Supply for PO Shipment */
1401: /* PO Remove PO Supply for PO Header */
1402: /* */
1403: /* RELEASE Remove PO Supply for PO Release */
1404: /* */
1405: /* PO LINE Remove PO Supply for PO Line */
1406: /* */
1407: /* PO SHIPMENT Remove PO Supply for PO Shipment */
1408: /* */
1409: /* RELEASE SHIPMENT Remove PO Supply for Release Shipment */
1403: /* RELEASE Remove PO Supply for PO Release */
1404: /* */
1405: /* PO LINE Remove PO Supply for PO Line */
1406: /* */
1407: /* PO SHIPMENT Remove PO Supply for PO Shipment */
1408: /* */
1409: /* RELEASE SHIPMENT Remove PO Supply for Release Shipment */
1410: /* */
1411: /* ----------------------------------------------------------------------- */
1405: /* PO LINE Remove PO Supply for PO Line */
1406: /* */
1407: /* PO SHIPMENT Remove PO Supply for PO Shipment */
1408: /* */
1409: /* RELEASE SHIPMENT Remove PO Supply for Release Shipment */
1410: /* */
1411: /* ----------------------------------------------------------------------- */
1412:
1413:
1416: , p_entity_type IN VARCHAR2
1417: ) RETURN BOOLEAN
1418: IS
1419:
1420: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.delete_supply';
1421: d_progress NUMBER;
1422:
1423: BEGIN
1424:
1489: /* */
1490: /* Update Supply Quantity to 0 for PO Line, PO Shipment or Release */
1491: /* Shipment */
1492: /* */
1493: /* PO Supply is Updated based on the Entity Type */
1494: /* */
1495: /* Entity Type Action */
1496: /* ----------- --------------------------------------------- */
1497: /* PO LINE Update Supply Quantity for PO Line */
1510: , p_shipid IN NUMBER DEFAULT 0
1511: ) RETURN BOOLEAN
1512: IS
1513:
1514: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.update_supply';
1515: d_progress NUMBER;
1516:
1517: BEGIN
1518:
1582: /* ----------------------------------------------------------------------- */
1583: /* */
1584: /* Cancel Supply for PO Header, Line or Shipment */
1585: /* */
1586: /* PO Supply is Cancelled based on Entity Type */
1587: /* */
1588: /* Entity Type Action */
1589: /* ----------- --------------------------------------- */
1590: /* PO Cancel PO Supply for PO Header */
1586: /* PO Supply is Cancelled based on Entity Type */
1587: /* */
1588: /* Entity Type Action */
1589: /* ----------- --------------------------------------- */
1590: /* PO Cancel PO Supply for PO Header */
1591: /* */
1592: /* PO LINE Cancel PO Supply for PO Line */
1593: /* */
1594: /* PO SHIPMENT Cancel PO Supply for PO Shipment */
1588: /* Entity Type Action */
1589: /* ----------- --------------------------------------- */
1590: /* PO Cancel PO Supply for PO Header */
1591: /* */
1592: /* PO LINE Cancel PO Supply for PO Line */
1593: /* */
1594: /* PO SHIPMENT Cancel PO Supply for PO Shipment */
1595: /* */
1596: /* RELEASE Cancel PO Supply for PO Release */
1590: /* PO Cancel PO Supply for PO Header */
1591: /* */
1592: /* PO LINE Cancel PO Supply for PO Line */
1593: /* */
1594: /* PO SHIPMENT Cancel PO Supply for PO Shipment */
1595: /* */
1596: /* RELEASE Cancel PO Supply for PO Release */
1597: /* */
1598: /* RELEASE SHIPMENT Cancel PO Supply for Release Shipment */
1592: /* PO LINE Cancel PO Supply for PO Line */
1593: /* */
1594: /* PO SHIPMENT Cancel PO Supply for PO Shipment */
1595: /* */
1596: /* RELEASE Cancel PO Supply for PO Release */
1597: /* */
1598: /* RELEASE SHIPMENT Cancel PO Supply for Release Shipment */
1599: /* */
1600: /* ----------------------------------------------------------------------- */
1594: /* PO SHIPMENT Cancel PO Supply for PO Shipment */
1595: /* */
1596: /* RELEASE Cancel PO Supply for PO Release */
1597: /* */
1598: /* RELEASE SHIPMENT Cancel PO Supply for Release Shipment */
1599: /* */
1600: /* ----------------------------------------------------------------------- */
1601:
1602: FUNCTION cancel_supply(
1605: , p_shipid IN NUMBER
1606: ) RETURN BOOLEAN
1607: IS
1608:
1609: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.cancel_supply';
1610: d_progress NUMBER;
1611:
1612: l_return_value BOOLEAN := FALSE;
1613:
1622:
1623: d_progress := 10;
1624:
1625: -- Requisition Line Supply is created in Cancel PO Routine. We just remove
1626: -- the existing PO Supply
1627:
1628: IF (p_entity_type = 'PO') THEN
1629:
1630: l_return_value := delete_supply(
1721: SELECT por.po_header_id
1722: FROM po_releases_all por
1723: WHERE por.po_release_id = release_id;
1724:
1725: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.cancel_planned';
1726: d_progress NUMBER;
1727:
1728: l_return_value BOOLEAN := FALSE;
1729:
1740: d_progress := 10;
1741:
1742: BEGIN
1743:
1744: -- Remove Planned PO Supply
1745:
1746: IF (p_entity_type = 'RELEASE') THEN
1747:
1748: d_progress := 20;
1764: IF (p_recreate_flag) THEN
1765:
1766: d_progress := 30;
1767:
1768: -- Add to existing Planned PO Supply
1769:
1770: l_return_value := update_planned_po(
1771: p_docid => p_entity_id
1772: , p_entity_type => 'ADD PLANNED'
1780:
1781: RAISE PO_CORE_S.g_early_return_exc;
1782: END IF;
1783:
1784: -- Insert Planned PO Supply if it does not exist
1785:
1786: IF (NOT l_supply_flag) THEN
1787:
1788: d_progress := 40;
1805: CLOSE rel;
1806:
1807: d_progress := 60;
1808:
1809: l_return_value := create_po_supply(
1810: p_entity_id => p_entity_id
1811: , p_entity_type => 'PO'
1812: );
1813:
1837: IF (p_recreate_flag) THEN
1838:
1839: d_progress := 80;
1840:
1841: -- Add to existing Planned PO Supply
1842:
1843: l_return_value := update_planned_po(
1844: p_docid => p_entity_id
1845: , p_shipid => p_shipid
1855: RAISE PO_CORE_S.g_early_return_exc;
1856: END IF;
1857:
1858:
1859: -- Insert Planned PO Supply if it does not exist
1860:
1861: IF (NOT l_supply_flag) THEN
1862:
1863: d_progress := 90;
1861: IF (NOT l_supply_flag) THEN
1862:
1863: d_progress := 90;
1864:
1865: l_return_value := create_po_supply(
1866: p_entity_id => p_shipid
1867: , p_entity_type => 'PO SHIPMENT'
1868: );
1869:
1979: FROM mtl_system_items
1980: WHERE inventory_item_id = item_id
1981: AND organization_id = to_org;
1982:
1983: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.maintain_mtl_supply';
1984: d_progress NUMBER;
1985:
1986: BEGIN
1987:
2165: WHERE requisition_header_id = header_id;
2166:
2167: l_auth_status po_requisition_headers.authorization_status%TYPE;
2168:
2169: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.approve_req';
2170: d_progress NUMBER;
2171:
2172: l_return_value BOOLEAN := FALSE;
2173:
2232: , p_entity_type IN VARCHAR2
2233: ) RETURN BOOLEAN
2234: IS
2235:
2236: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.remove_req';
2237: d_progress NUMBER;
2238:
2239: BEGIN
2240:
2299:
2300:
2301: FUNCTION remove_req_vend_lines(p_docid IN NUMBER) RETURN BOOLEAN IS
2302:
2303: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.remove_req_vend_lines';
2304: d_progress NUMBER;
2305:
2306: BEGIN
2307:
2364: , p_entity_type IN VARCHAR2
2365: ) RETURN BOOLEAN
2366: IS
2367:
2368: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.create_req';
2369: d_progress NUMBER;
2370: l_conformed_id NUMBER;
2371:
2372: l_return_value BOOLEAN := FALSE;
2606: /* ----------------------------------------------------------------------- */
2607:
2608: FUNCTION explode(p_lineid IN NUMBER) RETURN BOOLEAN IS
2609:
2610: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.explode';
2611: d_progress NUMBER;
2612:
2613: l_return_value BOOLEAN := FALSE;
2614:
2752: , p_qty IN NUMBER
2753: ) RETURN BOOLEAN
2754: IS
2755:
2756: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.update_req_line_qty';
2757: d_progress NUMBER;
2758:
2759: BEGIN
2760:
2807: , p_receipt_date IN DATE
2808: ) RETURN BOOLEAN
2809: IS
2810:
2811: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.update_req_line_date';
2812: d_progress NUMBER;
2813:
2814: BEGIN
2815:
2878: , p_supply_flag IN OUT NOCOPY BOOLEAN
2879: ) RETURN BOOLEAN
2880: IS
2881:
2882: d_module VARCHAR2(70) := 'po.plsql.PO_SUPPLY.update_planned_po';
2883: d_progress NUMBER;
2884:
2885: l_ppo_dist_id_tbl po_tbl_number;
2886: l_ppo_dist_qty_tbl po_tbl_number;
3005: END get_debug;
3006:
3007:
3008:
3009: END PO_SUPPLY;