Advertisement
aadddrr

f_check_product_balance_stock

Aug 11th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Adrian, Aug 10, 2017
  3.  * Function untuk cek apakah in_product_balance stock sesuai
  4.  */
  5.  
  6. CREATE OR REPLACE FUNCTION f_check_product_balance_stock(character varying, bigint, bigint)
  7.   RETURNS void AS
  8. $BODY$
  9. DECLARE
  10.     pSessionId                  ALIAS FOR $1;
  11.     pTenantId                   ALIAS FOR $2;
  12.     pWarehouseId                ALIAS FOR $3;
  13.  
  14.     vDocTypeIdPOInternal        bigint;
  15.     vDocTypeIdDeliveryOrder     bigint;
  16.     vDocTypeIdReturnNote        bigint;
  17.     vDocTypeIdClaimNote         bigint;
  18.     vDocTypeIdAdjStockQty       bigint;
  19.     vDocTypeIdDoReceipt         bigint;
  20.     vDocTypeIdGoodsTrfOutOutlet bigint;
  21.     vDocTypeIdGoodsTrfOut       bigint;
  22.     vDocTypeIdGoodsBorrowing bigint;
  23.     vDocTypeIdGoodsOutOther bigint;
  24.    
  25.     vStatusRelease              character varying(1);
  26.     vSpaceValue                 character varying(1);
  27.     vFlagYes                    character varying(1);
  28.     vFlagNo                     character varying(1);
  29.     vFlagLost                   character varying(1);
  30.     vFlagMissing                character varying(1);
  31.     vFlagRejected               character varying(1);
  32.     vFlagCorrection             character varying(1);
  33.     vStatusS                    character varying(1);
  34.     vEmptyId                    bigint;
  35.     vStatusVoid                 character varying(1);
  36.    
  37.     vLastSummaryPeriod          character varying(6);
  38.     vStartTrx                   character varying(8);
  39.    
  40. BEGIN
  41.    
  42.     vDocTypeIdPOInternal := 151;
  43.     vDocTypeIdDeliveryOrder := 311;
  44.     vDocTypeIdClaimNote := 511;
  45.     vDocTypeIdAdjStockQty := 521;
  46.     vDocTypeIdGoodsTrfOutOutlet := 532;
  47.     vDocTypeIdGoodsTrfOut := 533;
  48.     vDocTypeIdGoodsBorrowing := 551;
  49.     vDocTypeIdGoodsOutOther := 568;
  50.    
  51.     vStatusRelease := 'R';
  52.     vSpaceValue := ' ';
  53.     vFlagYes := 'Y';
  54.     vFlagNo := 'N';
  55.     vFlagLost := 'L';
  56.     vFlagMissing := 'M';
  57.     vFlagRejected := 'R';
  58.     vFlagCorrection := 'C';
  59.     vStatusS := 'S';
  60.     vEmptyId := -99;
  61.     vStatusVoid := 'V';
  62.    
  63.     /* Year month summary terakhir */
  64.     SELECT MAX (date_year_month) FROM in_summary_monthly_qty WHERE warehouse_id = pWarehouseId INTO vLastSummaryPeriod;
  65.     SELECT vLastSummaryPeriod || '01' INTO vStartTrx;
  66.    
  67.     /* Kosongkan semua tabel temporary */
  68.     DELETE FROM tt_check_product_balance_stock_for_trx WHERE session_id = pSessionId;
  69.     DELETE FROM tt_check_product_balance_stock_for_temp WHERE session_id = pSessionId;
  70.     DELETE FROM tt_check_product_balance_stock_for_result WHERE session_id = pSessionId;
  71.    
  72.    
  73.     /* 1. Simpan stock awal product, doc_type_id dibuat -99 */
  74.     INSERT INTO tt_check_product_balance_stock_for_trx
  75.         (session_id, tenant_id, warehouse_id,
  76.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  77.         product_id, product_balance_id, product_status, base_uom_id, summary_qty)
  78.     SELECT pSessionId, tenant_id, warehouse_id,
  79.         sub_ou_id, vEmptyId, vEmptyId, summary_monthly_qty_id, vSpaceValue, date_year_month, vSpaceValue,
  80.         product_id, product_balance_id, product_status, base_uom_id, qty
  81.     FROM in_summary_monthly_qty
  82.     WHERE tenant_id = pTenantId AND
  83.         date_year_month = vLastSummaryPeriod AND
  84.         warehouse_id = pWarehouseId;
  85.    
  86.        
  87.     /* 2. Simpan perubahan qty product dari log */
  88.     /* 2.a. Simpan perubahan qty product dari log untuk qty > 0 */
  89.     INSERT INTO tt_check_product_balance_stock_for_trx
  90.         (session_id, tenant_id, warehouse_id,
  91.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  92.         product_id, product_balance_id, product_status, base_uom_id, add_qty)
  93.     SELECT pSessionId, tenant_id, warehouse_id,
  94.         ou_id, doc_type_id, ref_id, log_product_balance_stock_id, doc_no, doc_date, vSpaceValue,
  95.         product_id, product_balance_id, product_status, base_uom_id, qty
  96.     FROM in_log_product_balance_stock
  97.     WHERE tenant_id = pTenantId AND
  98.         doc_date >= vStartTrx AND
  99.         qty > 0 AND
  100.         warehouse_id = pWarehouseId;   
  101.        
  102.     /* 2.b. Simpan perubahan qty product dari log untuk qty < 0 */
  103.     INSERT INTO tt_check_product_balance_stock_for_trx
  104.         (session_id, tenant_id, warehouse_id,
  105.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  106.         product_id, product_balance_id, product_status, base_uom_id, sub_qty)
  107.     SELECT pSessionId, tenant_id, warehouse_id,
  108.         ou_id, doc_type_id, ref_id, log_product_balance_stock_id, doc_no, doc_date, vSpaceValue,
  109.         product_id, product_balance_id, product_status, base_uom_id, qty
  110.     FROM in_log_product_balance_stock
  111.     WHERE tenant_id = pTenantId AND
  112.         doc_date >= vStartTrx AND
  113.         qty < 0 AND
  114.         warehouse_id = pWarehouseId;
  115.    
  116.        
  117.     /* 3. Simpan perubahan qty product dari dokumen yang masih DRAFT dan IN PROGRESS (bukan R) */
  118.     /* 3.a. PO INTERNAL */
  119.     INSERT INTO tt_check_product_balance_stock_for_trx
  120.         (session_id, tenant_id, warehouse_id,
  121.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  122.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  123.     SELECT pSessionId, A.tenant_id, B.warehouse_sell_id,
  124.         B.ou_sell_id, B.doc_type_id, B.po_internal_id, A.po_internal_item_id, B.doc_no, B.doc_date, B.status_doc,
  125.         A.product_id, C.product_balance_id, C.product_status, C.base_uom_id, C.qty_int * -1
  126.     FROM pu_po_internal_item A
  127.     INNER JOIN pu_po_internal B ON A.tenant_id = B.tenant_id AND A.po_internal_id = B.po_internal_id
  128.     INNER JOIN pu_po_internal_product C ON A.tenant_id = C.tenant_id AND A.po_internal_item_id = C.po_internal_item_id
  129.     WHERE A.tenant_id = pTenantId AND
  130.         B.doc_date >= vStartTrx AND
  131.         B.doc_type_id = vDocTypeIdPOInternal AND
  132.         B.status_doc <> vStatusRelease AND
  133.         B.warehouse_sell_id = pWarehouseId;
  134.        
  135.     /* 3.b. DELIVERY ORDER */
  136.     INSERT INTO tt_check_product_balance_stock_for_trx
  137.         (session_id, tenant_id, warehouse_id,
  138.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  139.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  140.     SELECT pSessionId, A.tenant_id, B.warehouse_id,
  141.         B.ou_id, B.doc_type_id, B.do_id, A.do_item_id, B.doc_no, B.doc_date, B.status_doc,
  142.         A.product_id, C.product_balance_id, C.product_status, C.base_uom_id, C.qty_dlv_int * -1
  143.     FROM sl_do_item A
  144.     INNER JOIN sl_do B ON A.tenant_id = B.tenant_id AND A.do_id = B.do_id
  145.     INNER JOIN sl_do_product C ON A.tenant_id = C.tenant_id AND A.do_item_id = C.do_item_id
  146.     WHERE A.tenant_id = pTenantId AND
  147.         B.doc_date >= vStartTrx AND
  148.         B.doc_type_id = vDocTypeIdDeliveryOrder AND
  149.         B.status_doc <> vStatusRelease AND
  150.         B.warehouse_id = pWarehouseId;
  151.  
  152.        
  153.     /* 3.c. CLAIM NOTE */
  154.     INSERT INTO tt_check_product_balance_stock_for_trx
  155.         (session_id, tenant_id, warehouse_id,
  156.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  157.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  158.     SELECT pSessionId, A.tenant_id, B.warehouse_from_id,
  159.         B.ou_from_id, B.doc_type_id, B.inventory_id, A.inventory_item_id, B.doc_no, B.doc_date, B.status_doc,
  160.         A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty_realization * -1
  161.     FROM in_inventory_item A
  162.     INNER JOIN in_inventory B ON A.tenant_id = B.tenant_id AND A.inventory_id = B.inventory_id
  163.     WHERE A.tenant_id = pTenantId AND
  164.         B.doc_date >= vStartTrx AND
  165.         B.doc_type_id = vDocTypeIdClaimNote AND
  166.         B.status_doc <> vStatusRelease AND
  167.         B.warehouse_from_id = pWarehouseId;
  168.        
  169.        
  170.     /* 3.c. ADJUSTMENT STOCK QTY dengan qty < 0 */
  171.     INSERT INTO tt_check_product_balance_stock_for_trx
  172.         (session_id, tenant_id, warehouse_id,
  173.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  174.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  175.     SELECT pSessionId, A.tenant_id, B.warehouse_from_id,
  176.         B.ou_from_id, B.doc_type_id, B.inventory_id, A.inventory_item_id, B.doc_no, B.doc_date, B.status_doc,
  177.         A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty_realization
  178.     FROM in_inventory_item A
  179.     INNER JOIN in_inventory B ON A.tenant_id = B.tenant_id AND A.inventory_id = B.inventory_id
  180.     WHERE A.tenant_id = pTenantId AND
  181.         B.doc_date >= vStartTrx AND
  182.         B.doc_type_id = vDocTypeIdAdjStockQty AND
  183.         B.status_doc <> vStatusRelease AND
  184.         A.qty_realization < 0 AND
  185.         B.warehouse_from_id = pWarehouseId;
  186.        
  187.        
  188.     /* 3.d. GOODS TRANSFER OUT */
  189.     INSERT INTO tt_check_product_balance_stock_for_trx
  190.         (session_id, tenant_id, warehouse_id,
  191.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  192.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  193.     SELECT pSessionId, A.tenant_id, B.warehouse_from_id,
  194.         B.ou_from_id, B.doc_type_id, B.inventory_id, A.inventory_item_id, B.doc_no, B.doc_date, B.status_doc,
  195.         A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty_realization * -1
  196.     FROM in_inventory_item A
  197.     INNER JOIN in_inventory B ON A.tenant_id = B.tenant_id AND A.inventory_id = B.inventory_id
  198.     WHERE A.tenant_id = pTenantId AND
  199.         B.doc_date >= vStartTrx AND
  200.         B.doc_type_id = vDocTypeIdGoodsTrfOut AND
  201.         B.status_doc <> vStatusRelease AND
  202.         B.warehouse_from_id = pWarehouseId;
  203.        
  204.        
  205.     /* 3.e. DELIVERY GOODS BORROWING */
  206.     INSERT INTO tt_check_product_balance_stock_for_trx
  207.         (session_id, tenant_id, warehouse_id,
  208.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  209.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  210.     SELECT pSessionId, A.tenant_id, B.warehouse_from_id,
  211.         B.ou_from_id, B.doc_type_id, B.inventory_id, A.inventory_item_id, B.doc_no, B.doc_date, B.status_doc,
  212.         A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty_realization * -1
  213.     FROM in_inventory_item A
  214.     INNER JOIN in_inventory B ON A.tenant_id = B.tenant_id AND A.inventory_id = B.inventory_id
  215.     WHERE A.tenant_id = pTenantId AND
  216.         B.doc_date >= vStartTrx AND
  217.         B.doc_type_id = vDocTypeIdGoodsBorrowing AND
  218.         B.status_doc <> vStatusRelease AND
  219.         B.warehouse_from_id = pWarehouseId;
  220.        
  221.        
  222.     /* 3.f. DELIVERY GOODS BORROWING */
  223.     INSERT INTO tt_check_product_balance_stock_for_trx
  224.         (session_id, tenant_id, warehouse_id,
  225.         ou_id, doc_type_id, ref_id, ref_item_id, doc_no, doc_date, status_doc,
  226.         product_id, product_balance_id, product_status, base_uom_id, os_qty)
  227.     SELECT pSessionId, A.tenant_id, B.warehouse_from_id,
  228.         B.ou_from_id, B.doc_type_id, B.inventory_id, A.inventory_item_id, B.doc_no, B.doc_date, B.status_doc,
  229.         A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty_realization * -1
  230.     FROM in_inventory_item A
  231.     INNER JOIN in_inventory B ON A.tenant_id = B.tenant_id AND A.inventory_id = B.inventory_id
  232.     WHERE A.tenant_id = pTenantId AND
  233.         B.doc_date >= vStartTrx AND
  234.         B.doc_type_id = vDocTypeIdGoodsOutOther AND
  235.         B.status_doc <> vStatusRelease AND
  236.         B.warehouse_from_id = pWarehouseId;
  237.        
  238.        
  239.     /* 4. Simpan ke dalam table temp, group by unique index in_product_balance stock */
  240.     INSERT INTO tt_check_product_balance_stock_for_temp
  241.         (session_id, product_balance_stock_id, tenant_id, warehouse_id,
  242.         product_id, product_balance_id, product_status, base_uom_id,
  243.         summary_qty, add_qty, sub_qty, os_qty)
  244.     SELECT session_id, vEmptyId, tenant_id, warehouse_id,
  245.         product_id, product_balance_id, product_status, base_uom_id,
  246.         SUM(summary_qty), SUM(add_qty), SUM(sub_qty), SUM(os_qty)
  247.     FROM tt_check_product_balance_stock_for_trx
  248.     WHERE session_id = pSessionId AND
  249.         tenant_id = pTenantId AND
  250.         warehouse_id = pWarehouseId
  251.     GROUP BY session_id, tenant_id, warehouse_id,
  252.         product_id, product_balance_id, product_status, base_uom_id;
  253.        
  254.        
  255.     /* 5. Update product balance stock id,
  256.      *  qty yang tersimpan,
  257.      *  dan total qty yang diharapkan pada table temp */
  258.     UPDATE tt_check_product_balance_stock_for_temp Z
  259.     SET product_balance_stock_id = A.product_balance_stock_id,
  260.         actual_qty = A.qty,
  261.         expected_qty = summary_qty + add_qty + sub_qty + os_qty
  262.     FROM in_product_balance_stock A
  263.     WHERE A.tenant_id = Z.tenant_id AND
  264.         A.warehouse_id = Z.warehouse_id AND
  265.         A.product_id = Z.product_id AND
  266.         A.product_balance_id = Z.product_balance_id AND
  267.         A.product_status = Z.product_status AND
  268.         Z.session_id = pSessionId AND
  269.         Z.tenant_id = pTenantId AND
  270.         Z.warehouse_id = pWarehouseId;
  271.        
  272.    
  273.     /* 6. Simpan ke dalam table result untuk data yang tidak ditemukan/tidak sesuai */
  274.     INSERT INTO tt_check_product_balance_stock_for_result
  275.         (session_id, product_balance_stock_id, tenant_id, warehouse_id,
  276.         product_id, product_balance_id, product_status, base_uom_id,
  277.         summary_qty, add_qty, sub_qty, os_qty, expected_qty, actual_qty)
  278.     SELECT session_id, product_balance_stock_id, tenant_id, warehouse_id,
  279.         product_id, product_balance_id, product_status, base_uom_id,
  280.         summary_qty, add_qty, sub_qty, os_qty, expected_qty, actual_qty
  281.     FROM tt_check_product_balance_stock_for_temp
  282.     WHERE session_id = pSessionId AND
  283.         tenant_id = pTenantId AND
  284.         warehouse_id = pWarehouseId AND
  285.         (product_balance_stock_id = vEmptyId OR
  286.         expected_qty <> actual_qty);
  287.        
  288.        
  289. END;   
  290. $BODY$
  291.   LANGUAGE plpgsql VOLATILE
  292.   COST 100;
  293.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement