Advertisement
aadddrr

CANCEL APPROVE GOODS RECEIVE CONSIGNMENT

Mar 17th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Adrian, Mar 17, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION pu_cancel_submit_gr_consignment(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  4.   RETURNS void AS
  5. $BODY$
  6. DECLARE
  7.     pTenantId                           ALIAS FOR $1;
  8.     pSessionId                          ALIAS FOR $2;
  9.     pUserId                             ALIAS FOR $3;
  10.     pDatetime                           ALIAS FOR $4;
  11.     pRgId                               ALIAS FOR $5;
  12.     pRemarkApproval                     ALIAS FOR $6;
  13.     pPrevProcessNo                      ALIAS FOR $7;
  14.    
  15.     vStatusDocRelease       character varying := 'R';
  16.     vStatusDocDraft         character varying := 'D';
  17.     vStatusDocInProgress    character varying := 'I';
  18.     vStatusDocFinal         character varying := 'F';
  19.     vWorkflowStatusDraft    character varying := 'DRAFT';
  20.    
  21.     vDocTypeId              bigint;
  22.     vOuId                   bigint;
  23.     vDocNo                  character varying;
  24.     vScheme                 character varying;
  25.     vStatusDoc              character varying;
  26.     vPoId                   bigint;
  27.    
  28.     vEmptyId                bigint := -99;
  29.     vEmptyValue                 character varying := ' ';
  30.     vInProgress             character varying := 'I';
  31.     vYes                    character varying := 'Y';
  32.     vDocDate                character varying ;
  33.     vStatusLedgerNotDone    character varying := '0';
  34.     vProductStatus          character varying(50);
  35.    
  36.     vFunctionSubmit         character varying := 'pu_submit_gr_consignment';
  37.     vOutletId               bigint;
  38.     vOuWarehouseId          bigint;
  39.     vDbVersion              character varying(10);
  40.     vUnfinishedItem         bigint;
  41.    
  42. BEGIN
  43.  
  44.     SELECT product_status_code INTO vProductStatus
  45.     FROM m_product_status
  46.     WHERE flg_buy = 'Y';
  47.    
  48.     --RAISE EXCEPTION 'Function Cancel submit for Goods Receive Consignment is not yet Created';
  49.    
  50.     /**
  51.      * 1. Cek document
  52.      * 2. If doc exists and status doc = R
  53.      */
  54.     SELECT A.ou_id, A.doc_date, A.doc_type_id, A.doc_no, A.status_doc, A.ref_id, B.scheme
  55.     INTO vOuId, vDocDate, vDocTypeId, vDocNo, vStatusDoc, vPoId, vScheme  
  56.     FROM pu_receive_goods_consignment A
  57.     INNER JOIN m_document B ON A.doc_type_id = B.doc_type_id
  58.     WHERE A.receive_goods_consignment_id = pRgId
  59.         AND A.status_doc = vStatusDocRelease;
  60.        
  61.     IF FOUND THEN  
  62.        
  63.         -- check document already used in claim note
  64.         IF EXISTS (
  65.             SELECT 1
  66.             FROM in_balance_receive_goods_consignment_item
  67.             WHERE receive_goods_consignment_id = pRgId
  68.                 AND po_id = vPoId
  69.                 AND (qty_return <> 0 OR status_item <> 'R')
  70.             ) THEN
  71.                 RAISE EXCEPTION 'Purchase Order already claim';
  72.         ELSE
  73.        
  74.             /**
  75.              * validasi tidak sedang digunakan oleh dokumen lain
  76.              */
  77.             IF NOT EXISTS (
  78.                 SELECT (1)
  79.                 FROM pu_po_balance_item_consignment A, pu_receive_goods_consignment_item B
  80.                 WHERE A.po_item_id = B.ref_id
  81.                     AND A.tenant_id = B.tenant_id
  82.                     AND B.receive_goods_consignment_id = pRgId
  83.                     AND A.status_item <> vStatusDocRelease
  84.             ) THEN
  85.    
  86.                 /*
  87.                  * 1. delete pu_log_po_balance_item_consignment
  88.                  * 4. delete in_product_balance
  89.                  * 6. delete/update in_product_balance_stock
  90.                  * 7. delete in_log_product_consignment_balance_stock
  91.                  * 9. update status pu_receive_goods_consignment
  92.                  * 10.update status pu_po_balance_item_consignment
  93.                  * 10b.update status pu_po
  94.                  * 11.delete balance receive goods item  
  95.                  */
  96.            
  97.                 -- 1. delete pu_log_po_balance_item_consignment
  98.                 DELETE FROM pu_log_po_balance_item_consignment Z
  99.                 WHERE EXISTS (
  100.                     SELECT (1)
  101.                     FROM pu_receive_goods_consignment A, pu_receive_goods_consignment_item B, pu_po_item C
  102.                     WHERE Z.tenant_id = A.tenant_id
  103.                         AND Z.po_id = C.po_id
  104.                         AND Z.po_item_id = C.po_item_id
  105.                         AND Z.ref_doc_type_id = A.doc_type_id
  106.                         AND Z.ref_id = pRgId
  107.                         AND Z.ref_item_id = B.receive_goods_consignment_item_id
  108.                         AND Z.qty_trx = B.qty_rcv_po * -1
  109.                         AND Z.trx_uom_id = B.po_uom_id
  110.                         AND Z.qty_int = B.qty_rcv_int * -1
  111.                         AND Z.base_uom_id = B.base_uom_id
  112.                         AND Z.remark = B.remark
  113.                         AND A.receive_goods_consignment_id = pRgId
  114.                         AND A.receive_goods_consignment_id = B.receive_goods_consignment_id
  115.                         AND B.ref_id = C.po_item_id
  116.                 );
  117.                
  118.                 -- Insert untuk data product yang memiliki serial number dan serial number tidak di-generate
  119.                 INSERT INTO tt_pu_product_balance
  120.                 (session_id, warehouse_id, product_balance_id, tenant_id, ou_id, product_id,
  121.                 serial_number, lot_number, product_expired_date, product_year_made,
  122.                 product_price_balance_id, product_buy_date, partner_id,
  123.                 doc_type_id, ref_id, ref_item_id, doc_no, doc_date,
  124.                 po_id, po_no, po_date, po_item_id,
  125.                 curr_code, price, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  126.                 SELECT pSessionId, A.warehouse_id, vEmptyId, A.tenant_id, A.ou_id, B.product_id,
  127.                     C.serial_number, C.lot_number, C.product_expired_date, C.product_year_made,
  128.                     vEmptyId, A.doc_date, A.partner_id,
  129.                     A.doc_type_id, A.receive_goods_consignment_id, B.receive_goods_consignment_item_id, A.doc_no, A.doc_date,
  130.                     E.po_id, E.doc_no, E.doc_date, D.po_item_id,       
  131.                     D.curr_code, D.gross_price_po - D.discount_amount, SUM(C.qty_rcv_po), D.po_uom_id, SUM(C.qty_rcv_int), D.base_uom_id, D.flg_stock
  132.                 FROM pu_receive_goods_consignment A, pu_receive_goods_consignment_item B, pu_receive_goods_consignment_product C, pu_po_item D, pu_po E
  133.                 WHERE A.receive_goods_consignment_id = pRgId AND
  134.                     A.receive_goods_consignment_id = B.receive_goods_consignment_id AND
  135.                     B.receive_goods_consignment_item_id = C.receive_goods_consignment_item_id AND
  136.                     B.ref_id = D.po_item_id AND
  137.                     D.po_id = E.po_id
  138.                 GROUP BY A.warehouse_id, A.tenant_id, A.ou_id, B.product_id,
  139.                     C.serial_number, C.lot_number, C.product_expired_date, C.product_year_made,
  140.                     A.doc_date, A.partner_id, A.doc_type_id, a.receive_goods_consignment_id, B.receive_goods_consignment_item_id, A.doc_no,
  141.                     E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  142.                     D.curr_code, D.nett_price_po, D.po_uom_id, D.base_uom_id, D.flg_stock;
  143.                
  144.                 -- validasi item tidak digunakan pada DO, GTO atau Adjs Stock
  145.                 IF EXISTS (
  146.                     SELECT 1
  147.                     FROM sl_do_product
  148.                     WHERE product_balance_id IN (
  149.                         SELECT A.product_balance_id
  150.                         FROM tt_pu_product_balance A
  151.                         WHERE A.session_id = pSessionId
  152.                     )
  153.                 )  
  154.                 THEN
  155.                     RAISE EXCEPTION 'Product already used in delivery order';
  156.                 END IF;
  157.                
  158.                 IF EXISTS (
  159.                     SELECT 1
  160.                     FROM in_inventory_item
  161.                     WHERE product_balance_id IN (
  162.                         SELECT A.product_balance_id
  163.                         FROM tt_pu_product_balance A
  164.                         WHERE A.session_id = pSessionId
  165.                     )
  166.                 )  
  167.                 THEN
  168.                     RAISE EXCEPTION 'Product already used in GTO or Adjustment Stock';
  169.                 END IF;
  170.                
  171.                 /*
  172.                  * update product_balance_id dari in_product_balance
  173.                  */    
  174.                 UPDATE tt_pu_product_balance SET product_balance_id = A.product_balance_id
  175.                 FROM in_product_balance A
  176.                 WHERE tt_pu_product_balance.session_id = pSessionId AND
  177.                     tt_pu_product_balance.tenant_id = A.tenant_id AND
  178.                     tt_pu_product_balance.product_id = A.product_id AND
  179.                     tt_pu_product_balance.serial_number = A.serial_number AND
  180.                     tt_pu_product_balance.lot_number = A.lot_number;
  181.                    
  182.                 -- 4. delete in_product_balance
  183.                 DELETE FROM in_product_balance A
  184.                 WHERE A.tenant_id = pTenantId
  185.                     AND product_balance_id IN (
  186.                         SELECT A.product_balance_id
  187.                         FROM tt_pu_product_balance A
  188.                         WHERE A.session_id = pSessionId
  189.                     );
  190.                    
  191.                 -- 6. delete/update in_product_balance_stock
  192.                 DELETE FROM in_product_balance_stock
  193.                 WHERE tenant_id = pTenantId
  194.                     AND product_balance_id IN (
  195.                         SELECT A.product_balance_id
  196.                         FROM tt_pu_product_balance A
  197.                         WHERE A.session_id = pSessionId
  198.                             AND A.flg_stock = 'Y'
  199.                     );
  200.                
  201.                 -- Insert untuk data product yang tidak memiliki serial number
  202.                 INSERT INTO tt_pu_product_balance
  203.                     (session_id, warehouse_id, product_balance_id, tenant_id, ou_id, product_id,
  204.                     serial_number, lot_number, product_expired_date, product_year_made,
  205.                     product_price_balance_id, product_buy_date, partner_id,
  206.                     doc_type_id, ref_id, ref_item_id, doc_no, doc_date,
  207.                     po_id, po_no, po_date, po_item_id,
  208.                     curr_code, price, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  209.                 SELECT pSessionId, A.warehouse_id, vEmptyId, A.tenant_id, A.ou_id, B.product_id,
  210.                     vEmptyValue, vEmptyValue, vEmptyValue, vEmptyValue,
  211.                     vEmptyId, A.doc_date, A.partner_id,
  212.                     A.doc_type_id, A.receive_goods_consignment_id, B.receive_goods_consignment_item_id, A.doc_no, A.doc_date,
  213.                     E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  214.                     D.curr_code, D.gross_price_po - D.discount_amount, SUM(B.qty_rcv_po), D.po_uom_id, SUM(B.qty_rcv_int), D.base_uom_id, D.flg_stock
  215.                 FROM pu_receive_goods_consignment A, pu_receive_goods_consignment_item B, pu_po_item D, pu_po E
  216.                 WHERE A.receive_goods_consignment_id = pRgId AND
  217.                     A.receive_goods_consignment_id = B.receive_goods_consignment_id AND
  218.                     NOT EXISTS (SELECT 1 FROM pu_receive_goods_consignment_product C
  219.                                 WHERE B.receive_goods_consignment_item_id = C.receive_goods_consignment_item_id) AND
  220.                     NOT EXISTS (SELECT 1 FROM pu_receive_goods_consignment_product_auto_sn C
  221.                                 WHERE B.receive_goods_consignment_item_id = C.receive_goods_consignment_item_id) AND
  222.                     B.ref_id = D.po_item_id AND
  223.                     D.po_id = E.po_id
  224.                 GROUP BY A.warehouse_id, A.tenant_id, A.ou_id, B.product_id,
  225.                     A.doc_date, A.partner_id, A.doc_type_id, A.receive_goods_consignment_id, B.receive_goods_consignment_item_id, A.doc_no,
  226.                     E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  227.                     D.curr_code, D.nett_price_po, D.po_uom_id, D.base_uom_id, D.flg_stock;
  228.                
  229.                 /*
  230.                  * update product_balance_id dari in_product_balance
  231.                  */    
  232.                 UPDATE tt_pu_product_balance SET product_balance_id = A.product_balance_id
  233.                 FROM in_product_balance A
  234.                 WHERE tt_pu_product_balance.session_id = pSessionId AND
  235.                     tt_pu_product_balance.tenant_id = A.tenant_id AND
  236.                     tt_pu_product_balance.product_id = A.product_id AND
  237.                     tt_pu_product_balance.serial_number = A.serial_number AND
  238.                     tt_pu_product_balance.lot_number = A.lot_number;
  239.                
  240.                 /*
  241.                  * create summary dari tt_pu_product_balance untuk update yg sudah ada di in_product_balance_stock
  242.                  */
  243.                 INSERT INTO tt_pu_product_balance_summary_stock
  244.                         (session_id, warehouse_id, product_balance_id, tenant_id, product_id,
  245.                         product_price_balance_id, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  246.                 SELECT  pSessionId, A.warehouse_id, A.product_balance_id, A.tenant_id, A.product_id,
  247.                         vEmptyId, SUM(A.qty_rcv), A.po_uom_id, SUM(A.qty_int_rcv), A.base_uom_id, A.flg_stock
  248.                 FROM    tt_pu_product_balance A
  249.                 WHERE   A.session_id = pSessionId
  250.                 GROUP BY A.warehouse_id, A.product_balance_id, A.tenant_id, A.product_id,
  251.                          A.po_uom_id, A.base_uom_id, A.flg_stock;
  252.                    
  253.                 -- 6. delete/update in_product_balance_stock
  254.                 UPDATE in_product_balance_stock
  255.                 SET qty = qty - A.qty_int_rcv,
  256.                     update_datetime = pDatetime,
  257.                     update_user_id = pUserId
  258.                 FROM tt_pu_product_balance_summary_stock A
  259.                 WHERE A.session_id = pSessionId AND
  260.                     in_product_balance_stock.product_id = A.product_id AND
  261.                     in_product_balance_stock.tenant_id = A.tenant_id AND
  262.                     in_product_balance_stock.warehouse_id = A.warehouse_id AND
  263.                     in_product_balance_stock.product_balance_id = A.product_balance_id AND
  264.                     in_product_balance_stock.product_status = vProductStatus AND
  265.                     A.flg_stock = 'Y';
  266.                    
  267.                 -- QTY tidak boleh < 0
  268.                 IF EXISTS (
  269.                     SELECT 1
  270.                     FROM in_product_balance_stock A
  271.                     INNER JOIN tt_pu_product_balance B ON A.product_balance_id = B.product_balance_id
  272.                     WHERE B.session_id = pSessionId
  273.                         AND A.qty < 0
  274.                 )  
  275.                 THEN
  276.                     RAISE EXCEPTION 'Qty product in stock product less than zero';
  277.                 END IF;
  278.                
  279.                 -- 7. delete in_log_product_consignment_balance_stock
  280.                 DELETE FROM in_log_product_consignment_balance_stock Z
  281.                 WHERE EXISTS (
  282.                     SELECT (1)
  283.                     FROM tt_pu_product_balance A
  284.                     WHERE Z.tenant_id = A.tenant_id
  285.                         AND Z.ou_id = A.ou_id
  286.                         AND Z.doc_type_id = A.doc_type_id
  287.                         AND Z.ref_id = A.ref_id
  288.                         AND Z.doc_no = A.doc_no
  289.                         AND Z.doc_date = A.doc_date
  290.                         AND Z.warehouse_id = A.warehouse_id
  291.                         AND Z.product_id = A.product_id
  292.                         AND Z.product_balance_id = A.product_balance_id
  293.                         AND Z.product_status = vProductStatus
  294.                         AND A.session_id = pSessionId
  295.                         AND A.flg_stock = 'Y'
  296.                 );
  297.                
  298.                 DELETE FROM in_balance_receive_goods_consignment_item
  299.                 WHERE tenant_id = pTenantId
  300.                     AND receive_goods_consignment_item_id IN (
  301.                         SELECT A.ref_item_id
  302.                         FROM tt_pu_product_balance A
  303.                         WHERE A.session_id = pSessionId
  304.                     );
  305.                
  306.                 -- 9. update status pu_receive_goods_consignment
  307.                 UPDATE pu_receive_goods_consignment
  308.                 SET status_doc = vStatusDocDraft,
  309.                     workflow_status = vWorkflowStatusDraft,
  310.                     update_datetime = pDatetime,
  311.                     update_user_id = pUserId
  312.                 WHERE receive_goods_consignment_id = pRgId
  313.                     AND status_doc = vStatusDocRelease;
  314.                
  315.                 -- 10.update status pu_po_balance_item_consignment
  316.                 UPDATE pu_po_balance_item_consignment
  317.                 SET status_item = vStatusDocInProgress,
  318.                     update_datetime = pDatetime,
  319.                     update_user_id = pUserId
  320.                 FROM pu_receive_goods_consignment_item A
  321.                 WHERE pu_po_balance_item_consignment.po_item_id = A.ref_id AND
  322.                     pu_po_balance_item_consignment.tenant_id = A.tenant_id AND
  323.                     A.receive_goods_consignment_id = pRgId;
  324.                    
  325.                 -- do reset approval to draft
  326.                 PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pRgId, vDocNo, pDatetime, pRemarkApproval);
  327.        
  328.                 -- update previous process no
  329.                 UPDATE t_process_message
  330.                 SET process_no = pPrevProcessNo,
  331.                     update_datetime = pDatetime,
  332.                     update_user_id = pUserId,
  333.                     version = version + 1
  334.                 WHERE tenant_id = pTenantId
  335.                     AND process_name = vFunctionSubmit
  336.                     AND process_no = pRgId || '_' || vDocNo;
  337.  
  338.            
  339.             ELSE
  340.                 RAISE EXCEPTION 'Item in purchase order with id % is already used in other document', vPoId;
  341.             END IF;
  342.                    
  343.         END IF;
  344.        
  345.     ELSE
  346.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pRgId;
  347.     END IF;
  348.    
  349. END;
  350. $BODY$
  351.   LANGUAGE plpgsql VOLATILE
  352.   COST 100;
  353.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement