Advertisement
tercnem

pu_remove_approved_receive_goods_item_for_dlg

Apr 25th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --function untuk remove item receive good yg sudah approved
  2. --fitra 2018-04-26
  3. CREATE OR REPLACE FUNCTION pu_remove_approved_receive_goods_item_for_dlg(character varying, bigint, character varying, character varying, bigint, character varying)
  4.   RETURNS void AS
  5. $BODY$
  6. DECLARE
  7.     pSessionId          ALIAS FOR $1;
  8.     pTenantId           ALIAS FOR $2;
  9.     pRgDocNo            ALIAS FOR $3;
  10.     pProductCode        ALIAS FOR $4;
  11.     pUserId             ALIAS for $5;
  12.     pDatetime           ALIAS for $6;
  13.    
  14.     vDraft          character varying := 'D';
  15.     vRelease            character varying := 'R';
  16.     vFinal              character varying := 'F';
  17.     vRgId               bigint;
  18.     vRgItemId           bigint;
  19.     vRgDocDate          character varying;
  20.     vPurchLedgerCode    character varying := 'PURCH';
  21.     vStatusLedgerDone   character varying := '1';
  22.     vSpaceValue         character varying := ' ';
  23.     vProductStatus      character varying(50);
  24.     vRgDocTypeId        bigint;
  25.     vOuId               bigint;
  26.     vEmptyId            bigint := -99;
  27.    
  28.     vRtoNonOutletDocTypeId bigint := 538;
  29.    
  30. BEGIN
  31.     DELETE FROM tt_pu_product_balance WHERE session_id = pSessionId;
  32.     DELETE FROM tt_pu_product_balance_summary_stock WHERE session_id = pSessionId;
  33.    
  34.     -- mendapatkan product status code
  35.     SELECT product_status_code INTO vProductStatus
  36.     FROM m_product_status
  37.     WHERE flg_buy = 'Y';
  38.    
  39.     SELECT receive_goods_id, doc_date, doc_type_id, ou_id INTO vRgId, vRgDocDate, vRgDocTypeId, vOuId
  40.     FROM pu_receive_goods
  41.     WHERE tenant_id = pTenantId AND
  42.           doc_no = pRgDocNo AND
  43.           status_doc = vRelease;
  44.    
  45.     --validasi status dokumen receive goods harus R
  46.     IF NOT FOUND THEN
  47.         RAISE EXCEPTION 'Document Receive Goods with doc no % is not found or document is on approval progress', pRgDocNo;
  48.     END IF;
  49.    
  50.     --validasi belum tutup bulan purch
  51.     IF EXISTS (SELECT 1 FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  52.             WHERE e.tenant_id = pTenantId AND e.ou_id = f.ou_bu_id AND f.ou_id = vOuId AND
  53.                 e.date_year_month = SUBSTR(vRgDocDate, 1, 6) AND e.ledger_code = vPurchLedgerCode AND
  54.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerDone) THEN
  55.         RAISE EXCEPTION 'Admin Process Ledger for Purchasing in year month % is already closed', SUBSTR(vRgDocDate, 1, 6)
  56.     END IF;
  57.    
  58.     -- validasi item belum dibuatkan claim note
  59.     SELECT receive_goods_item_id INTO vRgItemId
  60.     FROM pu_receive_goods_item
  61.     WHERE receive_goods_id = vRgId AND f_get_product_code(product_id) = pProductCode;
  62.     IF EXISTS (
  63.                 SELECT 1
  64.                 FROM in_balance_receive_goods_item
  65.                 WHERE receive_goods_item_id = vRgItemId AND
  66.                       (qty_return <> 0 OR status_item <> 'R')
  67.               )
  68.     THEN
  69.         RAISE EXCEPTION 'Receive Good Item with product code % Already claimed',pProductCode;  
  70.     END IF;
  71.                
  72.     -- validasi item belum dibuatkan invoice
  73.     IF EXISTS (SELECT 1 FROM pu_po_balance_invoice WHERE ref_id = vRgId AND ref_item_id = vRgItemId AND flg_invoice <> 'N') THEN
  74.         RAISE EXCEPTION 'Receive Good Item with product code % already invoiced', pProductCode;
  75.     END IF;
  76.    
  77.     -- mendapatkan data untuk delete data balance, yang produknya punya serial numbernya
  78.     INSERT INTO tt_pu_product_balance
  79.     (session_id, warehouse_id, product_balance_id, tenant_id, ou_id, product_id,
  80.     serial_number, lot_number, product_expired_date, product_year_made,
  81.     product_price_balance_id, product_buy_date, partner_id,
  82.     doc_type_id, ref_id, ref_item_id, doc_no, doc_date,
  83.     po_id, po_no, po_date, po_item_id,
  84.     curr_code, price, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  85.     SELECT pSessionId, A.warehouse_id, F.product_balance_id, A.tenant_id, A.ou_id, B.product_id,
  86.         C.serial_number, C.lot_number, C.product_expired_date, C.product_year_made,
  87.         G.product_price_balance_id, A.doc_date, A.partner_id,
  88.         A.doc_type_id, A.receive_goods_id, B.receive_goods_item_id, A.doc_no, A.doc_date,
  89.         E.po_id, E.doc_no, E.doc_date, D.po_item_id,       
  90.         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
  91.     FROM pu_receive_goods A
  92.     INNER JOIN pu_receive_goods_item B ON A.receive_goods_id = B.receive_goods_id AND B.receive_goods_item_id = vRgItemId
  93.     INNER JOIN pu_receive_goods_product C ON B.receive_goods_item_id = C.receive_goods_item_id
  94.     INNER JOIN pu_po_item D ON B.ref_id = D.po_item_id
  95.     INNER JOIN pu_po E ON D.po_id = E.po_id
  96.     INNER JOIN in_product_balance F ON B.product_id = F.product_id AND C.serial_number = F.serial_number AND C.lot_number = F.lot_number
  97.     INNER JOIN in_product_price_balance G ON A.ou_id = G.ou_id AND F.product_balance_id = G.product_balance_id AND A.partner_id = G.partner_id AND
  98.         A.doc_type_id = G.doc_type_id AND B.receive_goods_item_id = G.ref_id AND A.doc_no = G.doc_no
  99.         AND A.doc_date = G.doc_date AND B.product_id = G.product_id
  100.     WHERE A.receive_goods_id = vRgId
  101.     GROUP BY A.warehouse_id, F.product_balance_id, A.tenant_id, A.ou_id, B.product_id,
  102.         C.serial_number, C.lot_number, C.product_expired_date, C.product_year_made, G.product_price_balance_id,
  103.         A.doc_date, A.partner_id, A.doc_type_id, a.receive_goods_id, B.receive_goods_item_id, A.doc_no,
  104.         E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  105.         D.curr_code, D.nett_price_po, D.po_uom_id, D.base_uom_id, D.flg_stock;
  106.                                    
  107.     -- validasi item tidak digunakan pada DO, GTO atau Adjs Stock
  108.     IF EXISTS (SELECT 1
  109.             FROM sl_do_product
  110.             WHERE EXISTS (
  111.                     SELECT 1
  112.                     FROM tt_pu_product_balance A
  113.                     WHERE A.session_id = pSessionId AND
  114.                     sl_do_product.product_balance_id = A.product_balance_id ))  
  115.     THEN
  116.         RAISE EXCEPTION 'Product code % already used in delivery order', pProductCode;
  117.     END IF;
  118.    
  119.     IF EXISTS (SELECT 1
  120.             FROM in_inventory_item
  121.             WHERE EXISTS (SELECT 1
  122.                     FROM tt_pu_product_balance A
  123.                     WHERE A.session_id = pSessionId AND
  124.                     in_inventory_item.product_balance_id = A.product_balance_id))  
  125.     THEN
  126.         RAISE EXCEPTION 'Product code % already used in GTO or Adjustment Stock', pProductCode;
  127.     END IF;
  128.    
  129.    
  130.    
  131.     -- DELETE in_product_balance_stock yg ada serial nya
  132.     DELETE FROM in_product_balance_stock
  133.     WHERE tenant_id = pTenantId
  134.         AND EXISTS (SELECT 1
  135.                     FROM tt_pu_product_balance A
  136.                     WHERE A.session_id = pSessionId
  137.                         AND A.flg_stock = 'Y'
  138.                         AND in_product_balance_stock.product_balance_id = A.product_balance_id);
  139.                                    
  140.     -- DELETE in_product_balance  yg ada serial nya
  141.     DELETE FROM in_product_balance A
  142.     WHERE A.tenant_id = pTenantId
  143.         AND EXISTS (SELECT 1
  144.                     FROM tt_pu_product_balance B
  145.                     WHERE B.session_id = pSessionId
  146.                           AND A.product_balance_id = B.product_balance_id);
  147.    
  148.    
  149.     -- mendapatkan data untuk delete data balance, yang produknya tidak punya serial numbernya
  150.     INSERT INTO tt_pu_product_balance
  151.     (session_id, warehouse_id, product_balance_id, tenant_id, ou_id, product_id,
  152.     serial_number, lot_number, product_expired_date, product_year_made,
  153.     product_price_balance_id, product_buy_date, partner_id,
  154.     doc_type_id, ref_id, ref_item_id, doc_no, doc_date,
  155.     po_id, po_no, po_date, po_item_id,
  156.     curr_code, price, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  157.     SELECT pSessionId, A.warehouse_id, F.product_balance_id, A.tenant_id, A.ou_id, B.product_id,
  158.         vSpaceValue, vSpaceValue, vSpaceValue, vSpaceValue,
  159.         G.product_price_balance_id, A.doc_date, A.partner_id,
  160.         A.doc_type_id, A.receive_goods_id, B.receive_goods_item_id, A.doc_no, A.doc_date,
  161.         E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  162.         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
  163.     FROM pu_receive_goods A
  164.     INNER JOIN pu_receive_goods_item B ON A.receive_goods_id = B.receive_goods_id AND B.receive_goods_item_id = vRgItemId
  165.     INNER JOIN pu_po_item D ON B.ref_id = D.po_item_id
  166.     INNER JOIN pu_po E ON D.po_id = E.po_id
  167.     INNER JOIN in_product_balance F ON B.product_id = F.product_id AND F.serial_number = vSpaceValue AND F.lot_number = vSpaceValue
  168.     INNER JOIN in_product_price_balance G ON A.ou_id = G.ou_id AND F.product_balance_id = G.product_balance_id AND A.partner_id = G.partner_id AND
  169.         A.doc_type_id = G.doc_type_id AND B.receive_goods_item_id = G.ref_id AND A.doc_no = G.doc_no
  170.         AND A.doc_date = G.doc_date AND B.product_id = G.product_id
  171.     WHERE A.receive_goods_id = vRgId AND
  172.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product C
  173.                     WHERE B.receive_goods_item_id = C.receive_goods_item_id) AND
  174.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product_auto_sn C
  175.                     WHERE B.receive_goods_item_id = C.receive_goods_item_id)
  176.     GROUP BY A.warehouse_id, F.product_balance_id, A.tenant_id, A.ou_id, B.product_id, G.product_price_balance_id,
  177.         A.doc_date, A.partner_id, A.doc_type_id, A.receive_goods_id, B.receive_goods_item_id, A.doc_no,
  178.         E.po_id, E.doc_no, E.doc_date, D.po_item_id,
  179.         D.curr_code, D.nett_price_po, D.po_uom_id, D.base_uom_id, D.flg_stock;
  180.    
  181.     -- menyiapkan data untuk update tabel in_product_balance_stock
  182.     INSERT INTO tt_pu_product_balance_summary_stock
  183.             (session_id, warehouse_id, product_balance_id, tenant_id, product_id,
  184.             product_price_balance_id, qty_rcv, po_uom_id, qty_int_rcv, base_uom_id, flg_stock)
  185.     SELECT  pSessionId, A.warehouse_id, A.product_balance_id, A.tenant_id, A.product_id,
  186.             vEmptyId, SUM(A.qty_rcv), A.po_uom_id, SUM(A.qty_int_rcv), A.base_uom_id, A.flg_stock
  187.     FROM    tt_pu_product_balance A
  188.     WHERE   A.session_id = pSessionId
  189.     GROUP BY A.warehouse_id, A.product_balance_id, A.tenant_id, A.product_id,
  190.              A.po_uom_id, A.base_uom_id, A.flg_stock;
  191.              
  192.     -- validasi QTY balance stock tidak boleh < 0
  193.     IF EXISTS (SELECT 1
  194.             FROM in_product_balance_stock A
  195.             INNER JOIN tt_pu_product_balance B ON A.product_balance_id = B.product_balance_id
  196.             WHERE B.session_id = pSessionId AND
  197.                   A.qty - B.qty_int_rcv < 0 AND
  198.                   A.warehouse_id = B.warehouse_id AND
  199.                   A.tenant_id = B.tenant_id AND
  200.                   A.product_id = B.product_id AND
  201.                   A.product_status = vProductStatus )  
  202.     THEN
  203.         RAISE EXCEPTION 'Qty product code % in balance product stock less than zero', pProductCode;
  204.     END IF;
  205.    
  206.     -- UPDATE in_product_balance_stock
  207.     UPDATE in_product_balance_stock
  208.     SET qty = qty - A.qty_int_rcv,
  209.         update_user_id = pUserId,
  210.         update_datetime = pDatetime,
  211.         version = version + 1
  212.     FROM tt_pu_product_balance_summary_stock A
  213.     WHERE A.session_id = pSessionId AND
  214.         in_product_balance_stock.product_id = A.product_id AND
  215.         in_product_balance_stock.tenant_id = A.tenant_id AND
  216.         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  217.         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  218.         in_product_balance_stock.product_status = vProductStatus AND
  219.         A.flg_stock = 'Y';
  220.            
  221.     -- UPDATE pu_po
  222.     UPDATE pu_po SET
  223.         status_doc = vRelease,
  224.         update_user_id = pUserId,
  225.         update_datetime = pDatetime,
  226.         version = A.version + 1
  227.     FROM pu_receive_goods A
  228.     WHERE pu_po.po_id = A.ref_id AND
  229.         pu_po.status_doc = vFinal AND
  230.         A.receive_goods_id = vRgId
  231.         ;
  232.        
  233.     -- DELETE pu_log_po_balance_item
  234.     DELETE FROM  pu_log_po_balance_item
  235.     WHERE tenant_id = pTenantId
  236.         AND ref_id = vRgId
  237.         AND ref_doc_type_id = vRgDocTypeId
  238.         AND ref_item_id = vRgItemId;
  239.        
  240.     -- DELETE pu_po_balance_invoice
  241.     DELETE FROM pu_po_balance_invoice
  242.     WHERE tenant_id = pTenantId
  243.         AND ref_id = vRgId
  244.         AND ref_doc_type_id = vRgDocTypeId
  245.         AND ref_item_id = vRgItemId;
  246.        
  247.     -- DELETE pu_po_balance_invoice_tax
  248.     DELETE FROM pu_po_balance_invoice_tax
  249.     WHERE tenant_id = pTenantId
  250.         AND ref_id = vRgId
  251.         AND ref_doc_type_id = vRgDocTypeId
  252.         AND ref_item_id = vRgItemId;
  253.        
  254.     -- DELETE pu_receive_goods_product (dengan serial number yg di generate)
  255.     DELETE FROM pu_receive_goods_product               
  256.     WHERE tenant_id = pTenantId
  257.         AND EXISTS (SELECT 1
  258.                     FROM pu_receive_goods A
  259.                     INNER JOIN pu_receive_goods_item B ON A.receive_goods_id = B.receive_goods_id AND B.receive_goods_item_id = vRgItemId
  260.                     INNER JOIN pu_receive_goods_product_auto_sn C ON B.receive_goods_item_id = C.receive_goods_item_id
  261.                     WHERE A.receive_goods_id = vRgId AND
  262.                           B.receive_goods_item_id = pu_receive_goods_product.receive_goods_item_id);
  263.    
  264.     -- DELETE in_product_price_balance
  265.     DELETE FROM in_product_price_balance A
  266.     WHERE A.tenant_id = pTenantId
  267.         AND EXISTS (
  268.             SELECT 1
  269.             FROM tt_pu_product_balance B
  270.             WHERE B.session_id = pSessionId
  271.                 AND A.product_price_balance_id = B.product_price_balance_id);
  272.                                    
  273.     -- DELETE in_product_price_balance_stock
  274.     DELETE FROM in_product_price_balance_stock A
  275.     WHERE A.tenant_id = pTenantId
  276.         AND EXISTS (
  277.             SELECT 1
  278.             FROM tt_pu_product_balance B
  279.             WHERE B.session_id = pSessionId
  280.                 AND A.warehouse_id = B.warehouse_id
  281.                 AND A.product_id = B.product_id
  282.                 AND A.product_balance_id = B.product_balance_id
  283.                 AND A.product_price_balance_id = B.product_price_balance_id
  284.                 AND A.product_status = vProductStatus
  285.                 AND B.flg_stock = 'Y');
  286.                
  287.     -- DELETE in_log_product_balance_stock
  288.     DELETE FROM in_log_product_balance_stock A
  289.     WHERE A.tenant_id = pTenantId
  290.         AND EXISTS (
  291.             SELECT 1
  292.             FROM tt_pu_product_balance B
  293.             WHERE B.session_id = pSessionId
  294.                 AND A.ou_id = B.ou_id
  295.                 AND A.doc_type_id = B.doc_type_id
  296.                 AND A.ref_id = B.ref_id
  297.                 AND A.doc_no = B.doc_no
  298.                 AND A.doc_date = B.doc_date
  299.                 AND A.warehouse_id = B.warehouse_id
  300.                 AND A.product_id = B.product_id
  301.                 AND A.product_balance_id = B.product_balance_id
  302.                 AND A.product_status = vProductStatus
  303.                 AND B.flg_stock = 'Y');
  304.                
  305.     -- DELETE in_log_product_price_balance_stock
  306.     DELETE FROM in_log_product_price_balance_stock A
  307.     WHERE A.tenant_id = pTenantId
  308.         AND EXISTS (SELECT 1
  309.                     FROM tt_pu_product_balance B
  310.                     WHERE B.session_id = pSessionId
  311.                     AND A.ou_id = B.ou_id
  312.                     AND A.doc_type_id = B.doc_type_id
  313.                     AND A.ref_id = B.ref_id
  314.                     AND A.doc_no = B.doc_no
  315.                     AND A.doc_date = B.doc_date
  316.                     AND A.warehouse_id = B.warehouse_id
  317.                     AND A.product_id = B.product_id
  318.                     AND A.product_balance_id = B.product_balance_id
  319.                     AND A.product_price_balance_id = B.product_price_balance_id
  320.                     AND B.flg_stock = 'Y');
  321.    
  322.     -- DELETE in_balance_receive_goods_item
  323.     DELETE FROM in_balance_receive_goods_item
  324.     WHERE tenant_id = pTenantId
  325.         AND receive_goods_id = vRgId
  326.         AND receive_goods_item_id =vRgItemId;
  327.        
  328.    
  329.     --Update Balance item RTO Non Outlet -- RG dari PO
  330.     UPDATE in_req_trf_out_po_balance_item A SET
  331.         qty_rcv_int = A.qty_rcv_int - B.qty_rcv_int,
  332.         update_user_id = pUserId,
  333.         update_datetime = pDatetime,
  334.         version = A.version + 1
  335.     FROM pu_receive_goods_item B
  336.     INNER JOIN pu_po_item C ON B.ref_id = C.po_item_id AND C.ref_doc_type_id = vRtoNonOutletDocTypeId
  337.     WHERE A.inventory_item_id = C.ref_id AND
  338.           B.receive_goods_id = vRgId AND B.receive_goods_item_id = vRgItemId;
  339.          
  340.    
  341.     -- UPDATE gl_journal_trx_mapping
  342.     UPDATE gl_journal_trx_mapping A
  343.     SET amount = A.amount - B.amount,
  344.         update_user_id = pUserId,
  345.         update_datetime = pDatetime,
  346.         version = A.version + 1
  347.     FROM gl_journal_trx_item B
  348.     INNER JOIN gl_journal_trx C ON C.journal_trx_id = B.journal_trx_id
  349.     WHERE A.journal_trx_id = B.journal_trx_id
  350.         AND C.doc_type_id = vRgDocTypeId
  351.         AND C.doc_id = vRgId
  352.         AND B.ref_id = vRgItemId;    
  353.          
  354.     -- DELETE gl_journal_trx_item
  355.     DELETE FROM gl_journal_trx_item A
  356.     WHERE A.ref_id = vRgItemId AND
  357.           EXISTS( SELECT 1 FROM gl_journal_trx B
  358.                   WHERE A.journal_trx_id  = B.journal_trx_id
  359.                         AND B.doc_type_id = vRgDocTypeId
  360.                         AND B.doc_id = vRgId
  361.                 );
  362.  
  363.     -- UPDATE gl_journal_trx
  364.     UPDATE gl_journal_trx
  365.     SET status_doc = vDraft,
  366.         update_user_id = pUserId,
  367.         update_datetime = pDatetime,
  368.         version = version + 1
  369.     WHERE doc_type_id = vRgDocTypeId AND
  370.          doc_id = vRgId;
  371.          
  372. ---------------------------------PROCESS DELETE ITEM-----------------------------------------------
  373.     --update pu_po_balance_item
  374.     UPDATE pu_po_balance_item A
  375.     SET qty_rcv = A.qty_rcv - B.qty_rcv_po,
  376.         qty_int_rcv = A.qty_int_rcv - B.qty_rcv_int,
  377.         status_item = vRelease,
  378.         update_user_id = pUserId,
  379.         update_datetime = pDatetime,
  380.         version = A.version + 1
  381.     FROM pu_receive_goods_item B
  382.     WHERE A.po_item_id = b.ref_id
  383.         AND b.receive_goods_item_id = vRgItemId;
  384.        
  385.     --delete pu_receive_goods_item
  386.     DELETE FROM pu_receive_goods_item
  387.     WHERE receive_goods_item_id = vRgItemId;
  388.    
  389.     --delete pu_receive_goods_item_additional_for_dlg
  390.     DELETE FROM pu_receive_goods_item_additional_for_dlg
  391.     WHERE receive_goods_item_id = vRgItemId;
  392.  
  393.     DELETE FROM tt_pu_product_balance WHERE session_id = pSessionId;
  394.     DELETE FROM tt_pu_product_balance_summary_stock WHERE session_id = pSessionId;
  395. END;   
  396. $BODY$
  397. LANGUAGE plpgsql VOLATILE
  398. COST 100;
  399. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement