Advertisement
aadddrr

f_recalculate_product_balance_stock

Dec 28th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Adrian, Dec 28, 2017
  3.  * Function untuk melakukan recalculate p_product_balance stock
  4.  */
  5.  
  6. CREATE OR REPLACE FUNCTION f_recalculate_product_balance_stock(character varying, bigint, bigint, bigint, character varying)
  7.   RETURNS void AS
  8. $BODY$
  9. DECLARE
  10.     pSessionId                  ALIAS FOR $1;
  11.     pTenantId                   ALIAS FOR $2;
  12.     pOuId                       ALIAS FOR $3;
  13.     pUserId                     ALIAS FOR $4;
  14.     pDatetime                   ALIAS FOR $5;
  15.    
  16.     vSpaceValue                 character varying(1);
  17.     vFlagYes                    character varying(1);
  18.     vFlagNo                     character varying(1);
  19.     vFlagError                  character varying(1);
  20.     vStatusDraft                character varying(1);
  21.     vEmptyId                    bigint;
  22.     vDefaultSummaryPeriod       character varying(6);
  23.    
  24.     vLastSummaryPeriod          character varying(6);
  25.     vStartTrx                   character varying(8);
  26.    
  27. BEGIN  
  28.    
  29.     vSpaceValue := ' ';
  30.     vFlagYes := 'Y';
  31.     vFlagNo := 'N';
  32.     vFlagError := 'E';
  33.     vStatusDraft := 'D';
  34.     vEmptyId := -99;
  35.     vDefaultSummaryPeriod := '200001';
  36.    
  37.     /* Year month summary terakhir */
  38.     SELECT COALESCE(MAX(date_year_month), vDefaultSummaryPeriod) FROM p_summary_monthly_qty INTO vLastSummaryPeriod;
  39.     SELECT vLastSummaryPeriod || '01' INTO vStartTrx;
  40.    
  41.     /* Kosongkan semua tabel temporary */
  42.     DELETE FROM tt_recalculate_product_balance_stock_for_log WHERE session_id = pSessionId;
  43.     DELETE FROM tt_recalculate_product_balance_stock_for_temp WHERE session_id = pSessionId;
  44.    
  45.     /* Cek Apakah ada Dokumen yang masih dalam progress */
  46.     IF EXISTS(
  47.             SELECT 1 FROM p_trx_inventory A WHERE A.status IN (vStatusDraft)  
  48.         ) THEN
  49.             RAISE EXCEPTION 'Cannot do recalculate for there is in progress document(s)';
  50.     END IF;
  51.    
  52.     /* 1. Simpan stock awal product, doc_type_id dibuat -99 */
  53.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  54.         (session_id, tenant_id, warehouse_id,
  55.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  56.         product_id, product_balance_id, product_status, base_uom_id, summary_qty)
  57.     SELECT pSessionId, tenant_id, warehouse_id,
  58.         sub_ou_id, vEmptyId, summary_monthly_qty_id, vSpaceValue, date_year_month,
  59.         product_id, product_balance_id, product_status, base_uom_id, qty
  60.     FROM p_summary_monthly_qty
  61.     WHERE tenant_id = pTenantId AND
  62.         sub_ou_id = pOuId AND
  63.         date_year_month = vLastSummaryPeriod;
  64.    
  65.        
  66.     /* 2. Simpan perubahan qty product dari log */
  67.     /* 2.a. Simpan perubahan qty product dari log untuk qty > 0 */
  68.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  69.         (session_id, tenant_id, warehouse_id,
  70.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  71.         product_id, product_balance_id, product_status, base_uom_id, add_qty)
  72.     SELECT pSessionId, tenant_id, warehouse_id,
  73.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  74.         product_id, product_balance_id, product_status, base_uom_id, qty
  75.     FROM p_log_product_balance_stock
  76.     WHERE tenant_id = pTenantId AND
  77.         ou_id = pOuId AND
  78.         doc_date >= vStartTrx AND
  79.         qty > 0;   
  80.        
  81.     /* 2.b. Simpan perubahan qty product dari log untuk qty < 0 */
  82.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  83.         (session_id, tenant_id, warehouse_id,
  84.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  85.         product_id, product_balance_id, product_status, base_uom_id, sub_qty)
  86.     SELECT pSessionId, tenant_id, warehouse_id,
  87.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  88.         product_id, product_balance_id, product_status, base_uom_id, qty
  89.     FROM p_log_product_balance_stock
  90.     WHERE tenant_id = pTenantId AND
  91.         ou_id = pOuId AND
  92.         doc_date >= vStartTrx AND
  93.         qty < 0;   
  94.        
  95.     /* 3. Simpan ke dalam table temp, group by unique index p_product_balance stock */
  96.     INSERT INTO tt_recalculate_product_balance_stock_for_temp
  97.         (session_id, product_balance_stock_id, tenant_id, warehouse_id,
  98.         product_id, product_balance_id, product_status, base_uom_id,
  99.         summary_qty, add_qty, sub_qty)
  100.     SELECT session_id, vEmptyId, tenant_id, warehouse_id,
  101.         product_id, product_balance_id, product_status, base_uom_id,
  102.         SUM(summary_qty), SUM(add_qty), SUM(sub_qty)
  103.     FROM tt_recalculate_product_balance_stock_for_log
  104.     WHERE session_id = pSessionId AND
  105.         tenant_id = pTenantId AND
  106.         ou_id = pOuId
  107.     GROUP BY session_id, tenant_id, warehouse_id,
  108.         product_id, product_balance_id, product_status, base_uom_id;
  109.        
  110.     /* 4.a. Update total qty yang diharapkan pada table temp */
  111.     UPDATE tt_recalculate_product_balance_stock_for_temp Z
  112.     SET expected_qty = Z.summary_qty + Z.add_qty + Z.sub_qty
  113.     FROM p_product_balance_stock A
  114.     WHERE Z.session_id = pSessionId AND
  115.         Z.tenant_id = pTenantId;
  116.        
  117.     /* 4.b. Update product balance stock id dan qty yang tersimpan */
  118.     UPDATE tt_recalculate_product_balance_stock_for_temp Z
  119.     SET product_balance_stock_id = A.product_balance_stock_id,
  120.         actual_qty = A.qty
  121.     FROM p_product_balance_stock A
  122.     WHERE A.tenant_id = Z.tenant_id AND
  123.         A.warehouse_id = Z.warehouse_id AND
  124.         A.product_id = Z.product_id AND
  125.         A.product_balance_id = Z.product_balance_id AND
  126.         A.product_status = Z.product_status AND
  127.         Z.session_id = pSessionId AND
  128.         Z.tenant_id = pTenantId;
  129.        
  130.     /* 5. Simpan ke dalam table update untuk data yang tidak ditemukan/tidak sesuai */
  131.     INSERT INTO p_recalculate_product_balance_stock
  132.         (product_balance_stock_id, tenant_id, warehouse_id,
  133.         product_id, product_balance_id, product_status, base_uom_id,
  134.         summary_qty, add_qty, sub_qty, expected_qty, actual_qty, flg_update,
  135.         version, create_datetime, create_user_id, update_datetime, update_user_id)
  136.     SELECT product_balance_stock_id, tenant_id, warehouse_id,
  137.         product_id, product_balance_id, product_status, base_uom_id,
  138.         summary_qty, add_qty, sub_qty, expected_qty, actual_qty, vFlagNo,
  139.         0, pDatetime, pUserId, pDatetime, pUserId
  140.     FROM tt_recalculate_product_balance_stock_for_temp
  141.     WHERE session_id = pSessionId AND
  142.         tenant_id = pTenantId AND
  143.         (product_balance_stock_id = vEmptyId OR
  144.         expected_qty <> actual_qty);
  145.    
  146.     /* 6. Update flg_update menjadi E untuk expected qty yang minus */
  147.     UPDATE p_recalculate_product_balance_stock
  148.         SET flg_update = vFlagError
  149.     WHERE tenant_id = pTenantId
  150.         AND flg_update = vFlagNo
  151.         AND expected_qty < 0;
  152.        
  153.     /* 7. Update product_balance stock yang tidak sesuai */
  154.     UPDATE p_product_balance_stock Z
  155.         SET qty = A.expected_qty,
  156.             update_datetime = pDatetime,
  157.             update_user_id = pUserId,
  158.             version = Z.version + 1
  159.     FROM p_recalculate_product_balance_stock A
  160.     WHERE A.tenant_id = pTenantId AND
  161.         A.flg_update = vFlagNo AND
  162.         A.product_balance_stock_id = Z.product_balance_stock_id AND
  163.         A.expected_qty <> A.actual_qty;
  164.        
  165.     /* 8. Insert untuk product balance stock yang tidak ditemukan */
  166.     INSERT INTO p_product_balance_stock(
  167.         tenant_id, warehouse_id, product_id,
  168.         product_balance_id, product_status, base_uom_id, qty, version,
  169.         create_datetime, create_user_id, update_datetime, update_user_id)
  170.     SELECT A.tenant_id, A.warehouse_id, A.product_id,
  171.         A.product_balance_id, A.product_status, A.base_uom_id, A.expected_qty, 0,
  172.         pDatetime, pUserId, pDatetime, pUserId
  173.     FROM p_recalculate_product_balance_stock A
  174.     WHERE A.tenant_id = pTenantId AND
  175.         A.flg_update = vFlagNo AND
  176.         A.product_balance_stock_id = vEmptyId;
  177.        
  178.     /* 8. Update flg_update menjadi Y */
  179.     UPDATE p_recalculate_product_balance_stock
  180.         SET flg_update = vFlagYes
  181.     WHERE tenant_id = pTenantId AND
  182.         flg_update = vFlagNo;
  183.            
  184.     /* Kosongkan semua tabel temporary */
  185.     DELETE FROM tt_recalculate_product_balance_stock_for_log WHERE session_id = pSessionId;
  186.     DELETE FROM tt_recalculate_product_balance_stock_for_temp WHERE session_id = pSessionId;
  187.        
  188. END;   
  189. $BODY$
  190.   LANGUAGE plpgsql VOLATILE
  191.   COST 100;
  192.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement