Advertisement
setiadi

f_confirm_goods_receipt

May 15th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION pb.f_confirm_goods_receipt(bigint, character varying, character varying, character varying, character varying, text)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.  
  6.   pReceiveGoodsId           ALIAS FOR $1;
  7.   pUsername             ALIAS FOR $2;  
  8.   pDateTime             ALIAS FOR $3;
  9.   pSessionId                ALIAS FOR $4;
  10.   pDateConfirm              ALIAS FOR $5;
  11.   pRemarkConfirm            ALIAS FOR $6;    
  12.  
  13.   vStatusRelease            character varying := 'R';
  14.   vStatusFinal              character varying := 'F';
  15.   vUnfinishedItem           bigint;
  16.   vPoId                 bigint;
  17.   vProductStatusGood            character varying := 'GOOD';
  18.   vModeActionUpdate         character varying := 'U';
  19.   vModeActionAdd            character varying := 'A';
  20.   vEmptySpace               character varying := '';
  21.  
  22. BEGIN          
  23.  
  24.     SELECT ref_id INTO vPoId FROM pu_receive_goods WHERE receive_goods_id = pReceiveGoodsId;
  25.  
  26.     -- update status item menjadi R jika qty_rcv < qty_po
  27.     UPDATE pu_po_balance_item A SET status_item = vStatusRelease, version = A.version+1, update_datetime = pDateTime, update_username = pUsername
  28.         FROM pu_receive_goods_item B
  29.         WHERE A.po_item_id = B.ref_item_id AND     
  30.         B.receive_goods_id = pReceiveGoodsId AND
  31.         A.qty_po - A.qty_cancel + A.qty_add - A.qty_rcv > 0;
  32.  
  33.     -- update status item menjadi F jika qty_rcv = qty_po
  34.     UPDATE pu_po_balance_item A SET status_item = vStatusFinal, version = A.version+1, update_datetime = pDateTime, update_username = pUsername
  35.         FROM pu_receive_goods_item B
  36.         WHERE A.po_item_id = B.ref_item_id AND     
  37.         B.receive_goods_id = pReceiveGoodsId AND
  38.         A.qty_po - A.qty_cancel + A.qty_add - A.qty_rcv <= 0;
  39.  
  40.     -- Update pu_receive_goods ubah status menjadi R, doc_date & remark_confirm
  41.     UPDATE pu_receive_goods set status_doc = vStatusRelease, doc_date = pDateConfirm, remark_confirm = pRemarkConfirm, update_datetime = pDateTime, update_username = pUsername
  42.         WHERE receive_goods_id = pReceiveGoodsId;      
  43.  
  44.     SELECT COUNT(1) INTO vUnfinishedItem
  45.         FROM pu_po_balance_item A, pu_po_item B
  46.         WHERE A.po_item_id = B.po_item_id AND
  47.         B.po_id = vPoId AND
  48.         A.status_item = vStatusRelease;
  49.        
  50.     IF vUnfinishedItem = 0 THEN
  51.         UPDATE pu_po SET status_doc = vStatusFinal, update_datetime = pDateTime, update_username = pUsername
  52.         WHERE po_id = vPoId;
  53.     END IF;        
  54.    
  55.     -- insert ke table pu_po_balance_invoice
  56.     INSERT INTO pu_po_balance_invoice(
  57.         record_owner_id, ref_doc_type_id, ref_id, qty_recieve, buy_price, total_gross_amount, flg_invoice, invoice_id,
  58.         version, create_datetime, create_username, update_datetime, update_username)
  59.     SELECT A.record_owner_id, A.doc_type_id, A.receive_goods_id, B.qty_receive, D.unit_price, D.unit_price * B.qty_receive, 'N', -99,
  60.         0, pDateTime, pUsername, pDateTime, pUsername
  61.     FROM pu_receive_goods A
  62.     INNER JOIN pu_receive_goods_item B ON B.receive_goods_id = A.receive_goods_id
  63.     INNER JOIN pu_po_balance_item C ON C.po_item_id = B.ref_item_id
  64.     INNER JOIN pu_po_item D ON D.po_item_id = C.po_item_id
  65.     WHERE A.receive_goods_id = pReceiveGoodsId;
  66.  
  67.     -- insert ke table in_product_balance
  68.     INSERT INTO in_product_balance(
  69.         record_owner_id, product_id, serial_number, lot_number, expired_date, year_made,
  70.         version, create_datetime, create_username, update_datetime, update_username)
  71.     SELECT A.record_owner_id, B.product_id, vEmptySpace, vEmptySpace, vEmptySpace, vEmptySpace,
  72.     0, pDateTime, pUsername, pDateTime, pUsername
  73.     FROM pu_receive_goods A
  74.     INNER JOIN pu_receive_goods_item B ON B.receive_goods_id = A.receive_goods_id      
  75.     WHERE A.receive_goods_id = pReceiveGoodsId
  76.     AND NOT EXISTS (SELECT 1 FROM in_product_balance C WHERE C.record_owner_id = A.record_owner_id AND C.product_id = B.product_id);
  77.  
  78.     -- insert ke table temp dengan mode Add
  79.     INSERT INTO tt_product_balance(
  80.         session_id, record_owner_id, ref_doc_type_id, ref_doc_id, ref_item_id, ref_doc_no, ref_doc_date, product_balance_id,
  81.         product_balance_stock_id, product_id, qty, warehouse_id, serial_number, lot_number, expired_date, year_made, product_status, mode_action)
  82.         SELECT pSessionId, A.record_owner_id, A.doc_type_id, A.receive_goods_id, B.receive_goods_item_id, A.doc_no, A.doc_date, C.product_balance_id,
  83.         -99, B.product_id, B.qty_receive, E.warehouse_id, vEmptySpace, vEmptySpace, vEmptySpace, vEmptySpace, vProductStatusGood, vModeActionAdd       
  84.     FROM pu_receive_goods A
  85.     INNER JOIN pu_receive_goods_item B ON B.receive_goods_id = A.receive_goods_id
  86.     INNER JOIN in_product_balance C ON C.product_id = B.product_id     
  87.     INNER JOIN m_record_owner E ON E.record_owner_id = A.record_owner_id
  88.     WHERE A.receive_goods_id = pReceiveGoodsId AND A.record_owner_id = C.record_owner_id
  89.     AND NOT EXISTS (SELECT 1 FROM in_product_balance_stock F
  90.         WHERE F.record_owner_id = A.record_owner_id AND F.product_balance_id = C.product_balance_id AND F.product_id = C.product_id);
  91.  
  92.     -- insert ke table temp dengan mode Update
  93.     INSERT INTO tt_product_balance(
  94.         session_id, record_owner_id, ref_doc_type_id, ref_doc_id, ref_item_id, ref_doc_no, ref_doc_date, product_balance_id,
  95.         product_balance_stock_id, product_id, qty, warehouse_id, serial_number, lot_number, expired_date, year_made, product_status, mode_action)
  96.         SELECT pSessionId, A.record_owner_id, A.doc_type_id, A.receive_goods_id, B.receive_goods_item_id, A.doc_no, A.doc_date, C.product_balance_id,
  97.         D.product_balance_stock_id, B.product_id, B.qty_receive, E.warehouse_id, vEmptySpace, vEmptySpace, vEmptySpace, vEmptySpace, vProductStatusGood, vModeActionUpdate     
  98.     FROM pu_receive_goods A
  99.     INNER JOIN pu_receive_goods_item B ON B.receive_goods_id = A.receive_goods_id
  100.     INNER JOIN in_product_balance C ON C.product_id = B.product_id     
  101.     INNER JOIN in_product_balance_stock D ON D.product_balance_id = C.product_balance_id
  102.     INNER JOIN m_record_owner E ON E.record_owner_id = A.record_owner_id
  103.     WHERE A.receive_goods_id = pReceiveGoodsId AND A.record_owner_id = C.record_owner_id;  
  104.        
  105.     -- insert ke table in_product_balance_stock
  106.     INSERT INTO in_product_balance_stock(
  107.         record_owner_id, product_balance_id, product_id, warehouse_id, product_status, qty,
  108.         version, create_datetime, create_username, update_datetime, update_username)    
  109.     SELECT record_owner_id, product_balance_id, product_id, warehouse_id, vProductStatusGood, qty,
  110.         0, pDateTime, pUsername, pDateTime, pUsername
  111.     FROM tt_product_balance
  112.     WHERE session_id = pSessionId AND mode_action = vModeActionAdd;
  113.  
  114.     -- update ke table in_product_balance_stock
  115.     UPDATE in_product_balance_stock A SET qty = A.qty + B.qty , version = version+1, update_datetime = pDateTime, update_username = pUsername    
  116.     FROM tt_product_balance B
  117.     WHERE B.session_id = pSessionId AND
  118.     A.product_balance_id = B.product_balance_id AND
  119.     A.product_id = B.product_id
  120.     AND B.mode_action = vModeActionUpdate;
  121.  
  122.     -- insert log
  123.     INSERT INTO in_log_product_balance_stock(
  124.         record_owner_id, product_balance_id, product_id, warehouse_id, product_status, ref_doc_type_id, ref_id,
  125.         ref_doc_no, ref_doc_date, qty, version, create_datetime, create_username, update_datetime, update_username)
  126.     SELECT record_owner_id, product_balance_id, product_id, warehouse_id, product_status, ref_doc_type_id, ref_doc_id,
  127.         ref_doc_no, ref_doc_date, qty, 0,  pDateTime, pUsername, pDateTime, pUsername
  128.     FROM tt_product_balance
  129.     WHERE session_id = pSessionId;
  130.  
  131.     -- delete table temp
  132.     DELETE FROM tt_product_balance WHERE session_id = pSessionId;
  133.  
  134. END;
  135. $BODY$
  136.   LANGUAGE plpgsql VOLATILE
  137.   SET search_path = public, mstr, pb, batch
  138.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement