Advertisement
aadddrr

f_recalculate_product_balance_stock

Jan 1st, 2018
90
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 tutup bulan terakhir */
  38.     SELECT TO_CHAR(TO_DATE(MAX(date_year_month),'YYYYMM') + interval '1 Month','YYYYMM') INTO vLastSummaryPeriod
  39.     FROM p_admin_monthly_process
  40.     WHERE tenant_id = pTenantId AND
  41.         ou_id = pOuId AND
  42.         flg_process = vFlagYes;
  43.     SELECT vLastSummaryPeriod || '01' INTO vStartTrx;
  44.    
  45.     /* Kosongkan semua tabel temporary */
  46.     DELETE FROM tt_recalculate_product_balance_stock_for_log WHERE session_id = pSessionId;
  47.     DELETE FROM tt_recalculate_product_balance_stock_for_temp WHERE session_id = pSessionId;
  48.    
  49.     /* Cek Apakah ada Dokumen yang masih dalam progress */
  50.     IF EXISTS(
  51.             SELECT 1 FROM p_trx_inventory A WHERE A.status IN (vStatusDraft)  
  52.         ) THEN
  53.             RAISE EXCEPTION 'POS-cannot.do.recalculate.for.there.is.in.progress.document';
  54.     END IF;
  55.    
  56.     /* 1. Simpan stock awal product, doc_type_id dibuat -99 */
  57.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  58.         (session_id, tenant_id, warehouse_id,
  59.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  60.         product_id, product_balance_id, product_status, base_uom_id, summary_qty)
  61.     SELECT pSessionId, tenant_id, warehouse_id,
  62.         sub_ou_id, vEmptyId, summary_monthly_qty_id, vSpaceValue, date_year_month,
  63.         product_id, product_balance_id, product_status, base_uom_id, qty
  64.     FROM p_summary_monthly_qty
  65.     WHERE tenant_id = pTenantId AND
  66.         sub_ou_id = pOuId AND
  67.         date_year_month = vLastSummaryPeriod;
  68.    
  69.        
  70.     /* 2. Simpan perubahan qty product dari log */
  71.     /* 2.a. Simpan perubahan qty product dari log untuk qty > 0 */
  72.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  73.         (session_id, tenant_id, warehouse_id,
  74.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  75.         product_id, product_balance_id, product_status, base_uom_id, add_qty)
  76.     SELECT pSessionId, tenant_id, warehouse_id,
  77.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  78.         product_id, product_balance_id, product_status, base_uom_id, qty
  79.     FROM p_log_product_balance_stock
  80.     WHERE tenant_id = pTenantId AND
  81.         ou_id = pOuId AND
  82.         doc_date >= vStartTrx AND
  83.         qty > 0;   
  84.        
  85.     /* 2.b. Simpan perubahan qty product dari log untuk qty < 0 */
  86.     INSERT INTO tt_recalculate_product_balance_stock_for_log
  87.         (session_id, tenant_id, warehouse_id,
  88.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  89.         product_id, product_balance_id, product_status, base_uom_id, sub_qty)
  90.     SELECT pSessionId, tenant_id, warehouse_id,
  91.         ou_id, doc_type_id, ref_id, doc_no, doc_date,
  92.         product_id, product_balance_id, product_status, base_uom_id, qty
  93.     FROM p_log_product_balance_stock
  94.     WHERE tenant_id = pTenantId AND
  95.         ou_id = pOuId AND
  96.         doc_date >= vStartTrx AND
  97.         qty < 0;   
  98.        
  99.     /* 3. Simpan ke dalam table temp, group by unique index p_product_balance stock */
  100.     INSERT INTO tt_recalculate_product_balance_stock_for_temp
  101.         (session_id, product_balance_stock_id, tenant_id, warehouse_id,
  102.         product_id, product_balance_id, product_status, base_uom_id,
  103.         summary_qty, add_qty, sub_qty)
  104.     SELECT session_id, vEmptyId, tenant_id, warehouse_id,
  105.         product_id, product_balance_id, product_status, base_uom_id,
  106.         SUM(summary_qty), SUM(add_qty), SUM(sub_qty)
  107.     FROM tt_recalculate_product_balance_stock_for_log
  108.     WHERE session_id = pSessionId AND
  109.         tenant_id = pTenantId AND
  110.         ou_id = pOuId
  111.     GROUP BY session_id, tenant_id, warehouse_id,
  112.         product_id, product_balance_id, product_status, base_uom_id;
  113.        
  114.     /* 4.a. Update total qty yang diharapkan pada table temp */
  115.     UPDATE tt_recalculate_product_balance_stock_for_temp Z
  116.     SET expected_qty = Z.summary_qty + Z.add_qty + Z.sub_qty
  117.     FROM p_product_balance_stock A
  118.     WHERE Z.session_id = pSessionId AND
  119.         Z.tenant_id = pTenantId;
  120.        
  121.     /* 4.b. Update product balance stock id dan qty yang tersimpan */
  122.     UPDATE tt_recalculate_product_balance_stock_for_temp Z
  123.     SET product_balance_stock_id = A.product_balance_stock_id,
  124.         actual_qty = A.qty
  125.     FROM p_product_balance_stock A
  126.     WHERE A.tenant_id = Z.tenant_id AND
  127.         A.warehouse_id = Z.warehouse_id AND
  128.         A.product_id = Z.product_id AND
  129.         A.product_balance_id = Z.product_balance_id AND
  130.         A.product_status = Z.product_status AND
  131.         Z.session_id = pSessionId AND
  132.         Z.tenant_id = pTenantId;
  133.        
  134.     /* 5. Simpan ke dalam table update untuk data yang tidak ditemukan/tidak sesuai */
  135.     INSERT INTO p_recalculate_product_balance_stock
  136.         (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, flg_update,
  139.         version, create_datetime, create_user_id, update_datetime, update_user_id)
  140.     SELECT product_balance_stock_id, tenant_id, warehouse_id,
  141.         product_id, product_balance_id, product_status, base_uom_id,
  142.         summary_qty, add_qty, sub_qty, expected_qty, actual_qty, vFlagNo,
  143.         0, pDatetime, pUserId, pDatetime, pUserId
  144.     FROM tt_recalculate_product_balance_stock_for_temp
  145.     WHERE session_id = pSessionId AND
  146.         tenant_id = pTenantId AND
  147.         (product_balance_stock_id = vEmptyId OR
  148.         expected_qty <> actual_qty);
  149.    
  150.     /* 6. Update flg_update menjadi E untuk expected qty yang minus */
  151.     UPDATE p_recalculate_product_balance_stock
  152.         SET flg_update = vFlagError
  153.     WHERE tenant_id = pTenantId
  154.         AND flg_update = vFlagNo
  155.         AND expected_qty < 0;
  156.        
  157.     /* 7. Update product_balance stock yang tidak sesuai */
  158.     UPDATE p_product_balance_stock Z
  159.         SET qty = A.expected_qty,
  160.             update_datetime = pDatetime,
  161.             update_user_id = pUserId,
  162.             version = Z.version + 1
  163.     FROM p_recalculate_product_balance_stock A
  164.     WHERE A.tenant_id = pTenantId AND
  165.         A.flg_update = vFlagNo AND
  166.         A.product_balance_stock_id = Z.product_balance_stock_id AND
  167.         A.expected_qty <> A.actual_qty;
  168.        
  169.     /* 8. Insert untuk product balance stock yang tidak ditemukan */
  170.     INSERT INTO p_product_balance_stock(
  171.         tenant_id, warehouse_id, product_id,
  172.         product_balance_id, product_status, base_uom_id, qty, version,
  173.         create_datetime, create_user_id, update_datetime, update_user_id)
  174.     SELECT A.tenant_id, A.warehouse_id, A.product_id,
  175.         A.product_balance_id, A.product_status, A.base_uom_id, A.expected_qty, 0,
  176.         pDatetime, pUserId, pDatetime, pUserId
  177.     FROM p_recalculate_product_balance_stock A
  178.     WHERE A.tenant_id = pTenantId AND
  179.         A.flg_update = vFlagNo AND
  180.         A.product_balance_stock_id = vEmptyId;
  181.        
  182.     /* 8. Update flg_update menjadi Y */
  183.     UPDATE p_recalculate_product_balance_stock
  184.         SET flg_update = vFlagYes
  185.     WHERE tenant_id = pTenantId AND
  186.         flg_update = vFlagNo;
  187.            
  188.     /* Kosongkan semua tabel temporary */
  189.     DELETE FROM tt_recalculate_product_balance_stock_for_log WHERE session_id = pSessionId;
  190.     DELETE FROM tt_recalculate_product_balance_stock_for_temp WHERE session_id = pSessionId;
  191.        
  192. END;   
  193. $BODY$
  194.   LANGUAGE plpgsql VOLATILE
  195.   COST 100;
  196.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement